o
     JAfZR                     @   s  	 d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZdd Zdd Zd)ddZG dd	 d	ejZd
ZdZG dd de	jZi Zed Zed ZG dd dZG dd dZdd ZG dd dZG dd de	j eZ!G dd deZ"G dd dZ#dd Z$dd Z%G d d! d!Z&d"d# Z'e(d$krd d%l)m*Z* e*d&d'd( dS dS )*    Nc                 C   s   	 t | }|S N)marshalloads)msco r   "/usr/lib/python3.10/idlelib/rpc.pyunpickle_code-   s   
r	   c                 C   s   	 t | }t|ffS r   )r   dumpsr	   )r   r   r   r   r   pickle_code3   s   

r   c                 C   s&   	 t  }t||}||  | S r   )ioBytesIOCodePicklerdumpgetvalue)objprotocolfpr   r   r   r
   9   s
   

r
   c                   @   s   e Zd ZejeiejZdS )r   N)__name__
__module____qualname__typesCodeTyper   copyregdispatch_tabler   r   r   r   r   B   s    r   i    z	127.0.0.1c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )	RPCServerNc                 C   s    |d u rt }tj| || d S r   )
RPCHandlersocketserver	TCPServer__init__)selfaddrZhandlerclassr   r   r   r    K   s   zRPCServer.__init__c                 C      	 d S r   r   r!   r   r   r   server_bindP      zRPCServer.server_bindc                 C   s   	 | j | j d S r   )socketconnectserver_addressr$   r   r   r   server_activateT   s   zRPCServer.server_activatec                 C   s   	 | j | jfS r   )r'   r)   r$   r   r   r   get_request]      zRPCServer.get_requestc                 C   s   	 z  t y
       tj}td|d td|d tdt j |d td||d tdt||d tj	|d td|d td|d t
d	 Y d S )
Nz)
----------------------------------------filezUnhandled server exception!z
Thread: %szClient Address: z	Request: z#
*** Unrecoverable, server exiting!z(----------------------------------------r   )
SystemExitsys
__stderr__print	threadingcurrent_threadnamerepr	traceback	print_excos_exit)r!   requestZclient_addresserfr   r   r   handle_errora   s    zRPCServer.handle_errorr   )r   r   r   r    r%   r*   r+   r=   r   r   r   r   r   I   s    
	r   c                   @   s   e Zd ZdZd;ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+Zd,ZdZd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!dS )<SocketIOr   Nc                 C   s@   t  | _|d ur|| _|| _|d u rt}|| _i | _i | _d S r   )	r3   r4   
sockthread	debuggingsockobjecttableobjtable	responsescvars)r!   rA   rC   r@   r   r   r   r       s   

zSocketIO.__init__c                 C   s$   | j }d | _ |d ur|  d S d S r   )rA   close)r!   rA   r   r   r   rF      s
   zSocketIO.closec                 C   s   	 t d d S Nr   )r9   r:   r$   r   r   r   exithook   s   zSocketIO.exithookc                 G   sN   | j sd S | jd tt j }|D ]
}|d t| }qt|tjd d S )N r-   )	r@   locationstrr3   r4   r5   r2   r0   r1   )r!   argssar   r   r   debug   s   zSocketIO.debugc                 C   s   || j |< d S r   )rC   )r!   oidobjectr   r   r   register   s   zSocketIO.registerc                 C   s$   z| j |= W d S  ty   Y d S w r   )rC   KeyErrorr!   rP   r   r   r   
unregister   s
   zSocketIO.unregisterc              
   C   s  |  d| z
|\}\}}}}W n
 ty   Y dS w || jvr'dd|f fS | j| }|dkr;i }	t||	 d|	fS |dkrJi }
t||
 d|
fS t||sVdd|f fS t||}z1|d	kru||i |}t|trpt	|}d|fW S |d
krt
||||ff W dS dd| fW S  ty     ty     ty     ty } z
d|fW  Y d }~S d }~w   d}t||||f tjd tjtjd Y dS )Nz
localcall:)ERRORzBad request formatrV   zUnknown object id: %r__methods__OK__attributes__zUnsupported method name: %rCALLQUEUE)QUEUEDNzUnsupported message type: %sCALLEXCzU*** Internal Error: rpc.py:SocketIO.localcall()

 Object: %s 
 Method: %s 
 Args: %s
r-   )	EXCEPTIONN)rO   	TypeErrorrC   _getmethods_getattributeshasattrgetattr
isinstanceRemoteObject	remoterefrequest_queueputr/   KeyboardInterruptOSError	Exceptionr2   r0   r1   r7   r8   )r!   seqr;   howrP   
methodnamerL   kwargsr   methods
attributesmethodretexmsgr   r   r   	localcall   sX   







zSocketIO.localcallc                 C   (   |  d|| | ||||}| |S )Nzremotecall:asynccall: )rO   	asynccallasyncreturnr!   rP   rn   rL   ro   rl   r   r   r   
remotecall      
zSocketIO.remotecallc                 C   rw   )Nzremotequeue:asyncqueue: )rO   
asyncqueuery   rz   r   r   r   remotequeue   r|   zSocketIO.remotequeuec                 C   `   d||||ff}|   }t | jkrt }|| j|< | d| |||| | ||f |S )NrZ   zasynccall:%d:newseqr3   r4   r?   	ConditionrE   rO   
putmessager!   rP   rn   rL   ro   r;   rl   cvarr   r   r   rx         
zSocketIO.asynccallc                 C   r   )Nr[   zasyncqueue:%d:r   r   r   r   r   r}      r   zSocketIO.asyncqueuec                 C   s6   |  d|  | j|dd}|  d| | | |S )Nz#asyncreturn:%d:call getresponse(): 皙?)waitzasyncreturn:%d:response: )rO   getresponsedecoderesponse)r!   rl   responser   r   r   ry      s   
zSocketIO.asyncreturnc                 C   s   |\}}|dkr
|S |dkrd S |dkr|  d d S |dkr*|  d |   d S |dkr8|  d| t||d	krD|  d
| |t||)NrX   r\   r^   zdecoderesponse: EXCEPTIONEOFzdecoderesponse: EOFrV   zdecoderesponse: Internal ERROR:r]   zdecoderesponse: Call Exception:)rO   decode_interrupthookRuntimeErrorSystemError)r!   r   rm   whatr   r   r   r      s&   


zSocketIO.decoderesponsec                 C   s   	 t r   )EOFErrorr$   r   r   r   r     r&   zSocketIO.decode_interrupthookc                 C   s6   	 z
| j d dd W d S  ty   | d Y d S w )Nr   )myseqr   zmainloop:return)r   r   rO   r$   r   r   r   mainloop  s   
zSocketIO.mainloopc                 C   s6   |  ||}|d ur|\}}|dkr|| |f}|S )NrX   )_getresponse_proxify)r!   r   r   r   rm   r   r   r   r   r   "  s   zSocketIO.getresponsec                 C   s4   t |trt| |jS t |trtt| j|S |S r   )rd   RemoteProxyRPCProxyrP   listmapr   )r!   r   r   r   r   r   *  s
   

zSocketIO._proxifyc                 C   s   |  d| t | ju r	 | ||}|d ur|S q| j| }|  || jvr2|  || jvs)| j| }|  d||f  | j|= | j|= |	  |S )Nz_getresponse:myseq:Tz-_getresponse:%s: thread woke up: response: %s)
rO   r3   r4   r?   pollresponserE   acquirerD   r   release)r!   r   r   r   r   r   r   r   r   2  s(   



zSocketIO._getresponsec                 C   s   | j d  | _ }|S )N   )nextseq)r!   rl   r   r   r   r   H  s   zSocketIO.newseqc              	   C   s   |  d|d   zt|}W n tjy"   tdt|tjd  w t	dt
|| }t
|dkrgztg | jgg \}}}| j|d t }W n ttfyX   tdw ||d  }t
|dks3d S d S )Nzputmessage:%d:r   zCannot pickle:r-   <izsocket no longer exists)rO   r
   picklePicklingErrorr2   r6   r0   r1   structpacklenselectrA   sendBUFSIZEAttributeErrorr_   rj   )r!   messagerM   rwxnr   r   r   r   L  s"   zSocketIO.putmessage       c                 C   s   |    t| j| jk rHt| j gg g |\}}}t|dkr#d S z| jt}W n	 t	y4   t
w t|dkr=t
|  j|7  _|    |  S rG   )_stage0r   buffbufneedr   rA   filenorecvr   rj   r   _stage1)r!   r   r   r   r   rM   r   r   r   
pollpacket`  s   zSocketIO.pollpacketc                 C   sZ   | j dkr)t| jdkr+| jd d }| jdd  | _td|d | _d| _ d S d S d S )Nr   r   r      )bufstater   r   r   unpackr   )r!   rM   r   r   r   r   p  s   
zSocketIO._stage0c                 C   sT   | j dkr&t| j| jkr(| jd | j }| j| jd  | _d| _d| _ |S d S d S )Nr   r   r   )r   r   r   r   )r!   packetr   r   r   r   w  s   zSocketIO._stage1c                 C   sx   |  |}|d u rd S zt|}W |S  tjy;   tdtjd tdt|tjd tj	tjd tdtjd  w )Nz-----------------------r-   zcannot unpickle packet:)
r   r   r   UnpicklingErrorr2   r0   r1   r6   r7   print_stack)r!   r   r   r   r   r   r   pollmessage  s   
zSocketIO.pollmessagec           
      C   sR  	 	 zt d}W n
 tjy   Y nw |\}}|d|ff}| | z| |}|d u r0W d S W n ty?   |   Y d S  tyH   Y d S w |\}}|d }| 	d||f  |dv r| 	d|  | 
||}| 	d||f  |dkr| ||f n|d	kr	 q||kr|S | j|d }	|	d ur|	  || j|< |	  |	  q)
NTr   rX   zpollresponse:%d:myseq:%s)rZ   r[   zpollresponse:%d:localcall:call:z%pollresponse:%d:localcall:response:%srZ   r[   )response_queuegetqueueEmptyr   r   r   
handle_EOFr   rO   rv   rE   r   rD   notifyr   )
r!   r   r   Zqmsgrl   r   r   Zresqrm   cvr   r   r   r     sX   


zSocketIO.pollresponsec                 C   sX   	 |    | d | jD ]}| j| }|  d| j|< |  |  q|   d S )Nr   )r   N)EOFhookrO   rE   r   rD   r   r   rH   )r!   keyr   r   r   r   r     s   




zSocketIO.handle_EOFc                 C   r#   r   r   r$   r   r   r   r     r&   zSocketIO.EOFhook)NN)"r   r   r   r   r    rF   rH   rO   rR   rU   rv   r{   r~   rx   r}   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>      s@    
.

Ir>   c                   @   s   e Zd ZdS )re   N)r   r   r   r   r   r   r   re     s    re   c                 C   s   t | }| t|< t|S r   )idrB   r   )r   rP   r   r   r   rf     s   rf   c                   @   s   e Zd Zdd ZdS )r   c                 C   s
   || _ d S r   )rP   rT   r   r   r   r         
zRemoteProxy.__init__N)r   r   r   r    r   r   r   r   r     s    r   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
r   Fz#Sc                 C   s(   | |_ t| | tj| ||| d S r   )Zcurrent_handlerr>   r    r   BaseRequestHandler)r!   rA   r"   Zsvrr   r   r   r      s   zRPCHandler.__init__c                 C   s   	 |    d S r   )r   r$   r   r   r   handle  r,   zRPCHandler.handlec                 C   
   t | |S r   r   rT   r   r   r   get_remote_proxy  r   zRPCHandler.get_remote_proxyN)r   r   r   r@   rJ   r    r   r   r   r   r   r   r     s    r   c                   @   s:   e Zd ZdZdZdZejejfddZ	dd Z
dd	 Zd
S )	RPCClientFz#Cr   c                 C   s*   t  ||| _| j| | jd d S Nr   )r'   listening_sockbindlisten)r!   addressfamilytyper   r   r   r      s   zRPCClient.__init__c                 C   sT   | j  \}}| jrtd|tjd |d tkr t| | d S td|tjd t	)Nz****** Connection request from r-   r   z** Invalid host: )
r   acceptr@   r2   r0   r1   	LOCALHOSTr>   r    rj   )r!   Zworking_sockr   r   r   r   r     s   zRPCClient.acceptc                 C   r   r   r   rT   r   r   r   r   "  r   zRPCClient.get_remote_proxyN)r   r   r   r@   rJ   r   r'   AF_INETSOCK_STREAMr    r   r   r   r   r   r   r     s    
r   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zdd	 ZdS )
r   Nc                 C   s   || _ || _d S r   )sockiorP   )r!   r   rP   r   r   r   r    +  s   
zRPCProxy.__init__c                 C   sl   | j d u r	|   | j |rt| j| j|S | jd u r |   || jv r2| j| jd|fi }|S t	|)N__getattribute__)
_RPCProxy__methods_RPCProxy__getmethodsr   MethodProxyr   rP   _RPCProxy__attributes_RPCProxy__getattributesr{   r   )r!   r5   valuer   r   r   __getattr__/  s   


zRPCProxy.__getattr__c                 C      | j | jddi | _d S )NrY   r   )r   r{   rP   r   r$   r   r   r   Z__getattributes=     

zRPCProxy.__getattributesc                 C   r   )NrW   r   )r   r{   rP   r   r$   r   r   r   Z__getmethodsA  r   zRPCProxy.__getmethods)	r   r   r   r   r   r    r   r   r   r   r   r   r   r   &  s    r   c                 C   sP   t | D ]}t| |}t|rd||< qt| tr$| jD ]	}t|| qd S d S r   )dirrc   callablerd   r   	__bases__r`   )r   rp   r5   attrsuperr   r   r   r`   E  s   


r`   c                 C   s,   t | D ]}t| |}t|sd||< qd S r   )r   rc   r   )r   rq   r5   r   r   r   r   ra   P  s   
ra   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _|| _d S r   )r   rP   r5   )r!   r   rP   r5   r   r   r   r    Y  s   
zMethodProxy.__init__c                O   s   | j | j| j||}|S r   )r   r{   rP   r5   )r!   rL   ro   r   r   r   r   __call__^  s   zMethodProxy.__call__N)r   r   r   r    r   r   r   r   r   r   W  s    r   c                 C   s~   	 | d u rd S d t _t| }ztj| W n ty3   d}||d}||d}tj| Y nw tjd | t _d S )Nasciibackslashreplacestrict
)	builtins_r6   r0   stdoutwriteUnicodeEncodeErrorencodedecode)r   textencodingbytesr   r   r   displayhookf  s   
r   __main__)mainzidlelib.idle_test.test_rpcr   )	verbosityr   )+r   r   r   r   r9   r   r   r   r'   r   r   r0   r3   r7   r   r	   r   r
   Picklerr   r   r   r   r   rB   Queuerg   r   r>   re   rf   r   r   r   r   r   r`   ra   r   r   r   Zunittestr   r   r   r   r   <module>   sV    
	2

  k