a
    zeTR                     @   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 )*    Nc                 C   s   t | }|S N)marshalloads)msco r   !/usr/lib/python3.9/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   s   d S r   r   r!   r   r   r   server_bindP   s    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]   s    zRPCServer.get_requestc                 C   s   z W n t y    Y n   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 n0 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_error)N)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   )	r0   r1   
sockthread	debuggingsockobjecttableobjtable	responsescvars)r!   r>   r@   r=   r   r   r   r       s    
zSocketIO.__init__c                 C   s    | j }d | _ |d ur|  d S r   )r>   close)r!   r>   r   r   r   rC      s    zSocketIO.closec                 C   s   t d d S Nr   )r6   r7   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strr0   r1   r2   r/   r-   r.   )r!   argssar   r   r   debug   s    zSocketIO.debugc                 C   s   || j |< d S r   )r@   )r!   oidobjectr   r   r   register   s    zSocketIO.registerc                 C   s$   z| j |= W n ty   Y n0 d S r   )r@   KeyErrorr!   rM   r   r   r   
unregister   s    zSocketIO.unregisterc              
   C   s  |  d| z|\}\}}}}W n ty4   Y dS 0 || jvrNdd|f fS | j| }|dkrvi }	t||	 d|	fS |dkri }
t||
 d|
fS t||sdd|f fS t||}zh|d	kr||i |}t|trt	|}d|fW S |d
krt
||||ff W dS dd| fW S W n ty4    Y n tyH    Y nx ty\    Y nd ty } zd|fW  Y d }~S d }~0    d}t||||f tjd tjtjd Y dS 0 d S )Nz
localcall:)ERRORzBad request formatrS   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)rL   	TypeErrorr@   _getmethods_getattributeshasattrgetattr
isinstanceRemoteObject	remoterefrequest_queueputr,   KeyboardInterruptOSError	Exceptionr/   r-   r.   r4   r5   )r!   seqr8   howrM   
methodnamerI   kwargsr   methods
attributesmethodretexmsgr   r   r   	localcall   sT    








zSocketIO.localcallc                 C   s(   |  d|| | ||||}| |S )Nzremotecall:asynccall: )rL   	asynccallasyncreturnr!   rM   rk   rI   rl   ri   r   r   r   
remotecall   s    zSocketIO.remotecallc                 C   s(   |  d|| | ||||}| |S )Nzremotequeue:asyncqueue: )rL   
asyncqueueru   rv   r   r   r   remotequeue   s    zSocketIO.remotequeuec                 C   s`   d||||ff}|   }t | jkr8t }|| j|< | d| |||| | ||f |S )NrW   zasynccall:%d:newseqr0   r1   r<   	ConditionrB   rL   
putmessager!   rM   rk   rI   rl   r8   ri   cvarr   r   r   rt      s    
zSocketIO.asynccallc                 C   s`   d||||ff}|   }t | jkr8t }|| j|< | d| |||| | ||f |S )NrX   zasyncqueue:%d:rz   r~   r   r   r   rx      s    
zSocketIO.asyncqueuec                 C   s6   |  d|  | j|dd}|  d| | | |S )Nz#asyncreturn:%d:call getresponse(): 皙?)waitzasyncreturn:%d:response: )rL   getresponsedecoderesponse)r!   ri   responser   r   r   ru      s    zSocketIO.asyncreturnc                 C   s   |\}}|dkr|S |dkr d S |dkr6|  d d S |dkrT|  d |   d S |dkrp|  d| t||d	kr|  d
| |t||d S )NrU   rY   r[   zdecoderesponse: EXCEPTIONEOFzdecoderesponse: EOFrS   zdecoderesponse: Internal ERROR:rZ   zdecoderesponse: Call Exception:)rL   decode_interrupthookRuntimeErrorSystemError)r!   r   rj   whatr   r   r   r      s&    

zSocketIO.decoderesponsec                 C   s   t d S r   )EOFErrorr#   r   r   r   r     s    zSocketIO.decode_interrupthookc                 C   s6   z| j d dd W n ty0   | d Y d S 0 d S )Nr   )myseqr   zmainloop:return)r   r   rL   r#   r   r   r   mainloop  s
    
zSocketIO.mainloopc                 C   s6   |  ||}|d ur2|\}}|dkr2|| |f}|S )NrU   )_getresponse_proxify)r!   r   r   r   rj   r   r   r   r   r   "  s    zSocketIO.getresponsec                 C   s4   t |trt| |jS t |tr0tt| j|S |S r   )ra   RemoteProxyRPCProxyrM   listmapr   )r!   r   r   r   r   r   *  s
    

zSocketIO._proxifyc                 C   s   |  d| t | ju r6| ||}|d ur|S qn^| j| }|  || jvr\|  qH| j| }|  d||f  | j|= | j|= |	  |S d S )Nz_getresponse:myseq:z-_getresponse:%s: thread woke up: response: %s)
rL   r0   r1   r<   pollresponserB   acquirerA   r   release)r!   r   r   r   r   r   r   r   r   2  s"    



zSocketIO._getresponsec                 C   s   | j d  | _ }|S )N   )nextseq)r!   ri   r   r   r   r{   H  s    zSocketIO.newseqc              	   C   s   |  d|d   zt|}W n* tjyH   tdt|tjd  Y n0 t	dt
|| }t
|dkrz0tg | jgg \}}}| j|d t }W n ttfy   tdY n0 ||d  }q^d S )Nzputmessage:%d:r   zCannot pickle:r*   <izsocket no longer exists)rL   r
   picklePicklingErrorr/   r3   r-   r.   structpacklenselectr>   sendBUFSIZEAttributeErrorr\   rg   )r!   messagerJ   rwxnr   r   r   r}   L  s    zSocketIO.putmessage       c                 C   s   |    t| j| jk rt| j gg g |\}}}t|dkrFd S z| jt}W n t	yl   t
Y n0 t|dkr~t
|  j|7  _|    |  S rD   )_stage0r   buffbufneedr   r>   filenorecvr   rg   r   _stage1)r!   r   r   r   r   rJ   r   r   r   
pollpacket`  s    
zSocketIO.pollpacketc                 C   sR   | j dkrNt| jdkrN| jd d }| jdd  | _td|d | _d| _ d S )Nr   r   r      )bufstater   r   r   unpackr   )r!   rJ   r   r   r   r   p  s
    zSocketIO._stage0c                 C   sP   | j dkrLt| j| jkrL| jd | j }| j| jd  | _d| _d| _ |S d S )Nr   r   r   )r   r   r   r   )r!   packetr   r   r   r   w  s    zSocketIO._stage1c                 C   s~   |  |}|d u rd S zt|}W nT tjyx   tdtjd tdt|tjd tj	tjd tdtjd  Y n0 |S )Nz-----------------------r*   zcannot unpickle packet:)
r   r   r   UnpicklingErrorr/   r-   r.   r3   r4   print_stack)r!   r   r   r   r   r   r   pollmessage  s    
zSocketIO.pollmessagec           
      C   sZ  zt d}W n tjy"   Y n 0 |\}}|d|ff}| | z| |}|d u r\W d S W n. tyz   |   Y d S  ty   Y d S 0 |\}}|d }| 	d||f  |dv r| 	d|  | 
||}| 	d||f  |dkr | ||f q |dkr q q ||kr|S | j|d }	|	d ur |	  || j|< |	  |	  q q d S )	Nr   rU   zpollresponse:%d:myseq:%s)rW   rX   zpollresponse:%d:localcall:call:z%pollresponse:%d:localcall:response:%srW   rX   )response_queuegetqueueEmptyr}   r   r   
handle_EOFr   rL   rs   rB   r   rA   notifyr   )
r!   r   r   Zqmsgri   r   r   Zresqrj   cvr   r   r   r     sL    






zSocketIO.pollresponsec                 C   sV   |    | d | jD ]0}| j| }|  d| j|< |  |  q|   d S )Nr   )r   N)EOFhookrL   rB   r   rA   r   r   rE   )r!   keyr   r   r   r   r     s    




zSocketIO.handle_EOFc                 C   s   d S r   r   r#   r   r   r   r     s    zSocketIO.EOFhook)NN)"r   r   r   r   r    rC   rE   rL   rO   rR   rs   rw   ry   rt   rx   ru   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 )rb   N)r   r   r   r   r   r   r   rb     s   rb   c                 C   s   t | }| t|< t|S r   )idr?   r   )r   rM   r   r   r   rc     s    rc   c                   @   s   e Zd Zdd ZdS )r   c                 C   s
   || _ d S r   )rM   rQ   r   r   r   r      s    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!   r>   r"   Zsvrr   r   r   r      s    zRPCHandler.__init__c                 C   s   |    d S r   )r   r#   r   r   r   handle  s    zRPCHandler.handlec                 C   s
   t | |S r   r   rQ   r   r   r   get_remote_proxy  s    zRPCHandler.get_remote_proxyN)r   r   r   r=   rG   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   sV   | j  \}}| jr$td|tjd |d tkr>t| | ntd|tjd t	d S )Nz****** Connection request from r*   r   z** Invalid host: )
r   acceptr=   r/   r-   r.   	LOCALHOSTr;   r    rg   )r!   Zworking_sockr   r   r   r   r     s    zRPCClient.acceptc                 C   s
   t | |S r   r   rQ   r   r   r   r   "  s    zRPCClient.get_remote_proxyN)r   r   r   r=   rG   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   )sockiorM   )r!   r   rM   r   r   r   r    +  s    zRPCProxy.__init__c                 C   sp   | j d u r|   | j |r.t| j| j|S | jd u r@|   || jv rd| j| jd|fi }|S t	|d S )N__getattribute__)
_RPCProxy__methods_RPCProxy__getmethodsr   MethodProxyr   rM   _RPCProxy__attributes_RPCProxy__getattributesrw   r   )r!   r2   valuer   r   r   __getattr__/  s    


zRPCProxy.__getattr__c                 C   s   | j | jddi | _d S )NrV   r   )r   rw   rM   r   r#   r   r   r   Z__getattributes=  s    
zRPCProxy.__getattributesc                 C   s   | j | jddi | _d S )NrT   r   )r   rw   rM   r   r#   r   r   r   Z__getmethodsA  s    
zRPCProxy.__getmethods)	r   r   r   r   r   r    r   r   r   r   r   r   r   r   &  s   r   c                 C   sL   t | D ]}t| |}t|rd||< qt| trH| jD ]}t|| q8d S r   )dirr`   callablera   r   	__bases__r]   )r   rm   r2   attrsuperr   r   r   r]   E  s    



r]   c                 C   s,   t | D ]}t| |}t|sd||< qd S r   )r   r`   r   )r   rn   r2   r   r   r   r   r^   P  s    
r^   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _|| _d S r   )r   rM   r2   )r!   r   rM   r2   r   r   r   r    Y  s    zMethodProxy.__init__c                O   s   | j | j| j||}|S r   )r   rw   rM   r2   )r!   rI   rl   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yd   d}||d}||d}tj| Y n0 tjd | t _d S )Nasciibackslashreplacestrict
)	builtins_r3   r-   stdoutwriteUnicodeEncodeErrorencodedecode)r   textencodingbytesr   r   r   displayhookf  s    r   __main__)mainzidlelib.idle_test.test_rpcr   )	verbosity)N)+r   r   r   r   r6   r   r   r   r%   r   r   r-   r0   r4   r   r	   r   r
   Picklerr   r   r   r   r   r?   Queuerd   r   r;   rb   rc   r   r   r   r   r   r]   r^   r   r   r   Zunittestr   r   r   r   r   <module>   sP   
	2

  k
