B
    v9aR                 @   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eZG dd deZdd ZG dd deZ G dd de	j!eZ"G dd deZ#G dd deZ$dd Z%dd Z&G d d! d!e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.7/rpc.pyunpickle_code-   s    
r   c             C   s   t | }t|ffS )N)r   dumpsr   )r   r   r   r   r   pickle_code3   s    
r
   c             C   s$   t  }t||}||  | S )N)ioBytesIOCodePicklerdumpgetvalue)objZprotocolfpr   r   r   r	   9   s    

r	   c               @   s"   e Zd ZejeiZeej dS )r   N)	__name__
__module____qualname__typesCodeTyper
   dispatch_tableupdatecopyregr   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 krt }tj| || d S )N)
RPCHandlersocketserver	TCPServer__init__)selfaddrZhandlerclassr   r   r   r   L   s    zRPCServer.__init__c             C   s   d S )Nr   )r    r   r   r   server_bindQ   s    zRPCServer.server_bindc             C   s   | j | j d S )N)socketZconnectserver_address)r    r   r   r   server_activateU   s    zRPCServer.server_activatec             C   s   | j | jfS )N)r#   r$   )r    r   r   r   get_request^   s    zRPCServer.get_requestc             C   s   y W n t k
r    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X 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_addressZerfr   r   r   handle_errorb   s    zRPCServer.handle_error)N)r   r   r   r   r"   r%   r&   r5   r   r   r   r   r   J   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 k	r|| _|| _|d kr*t}|| _i | _i | _d S )N)	r,   r-   
sockthread	debuggingsockobjecttableobjtable	responsescvars)r    r9   r;   r8   r   r   r   r      s    
zSocketIO.__init__c             C   s    | j }d | _ |d k	r|  d S )N)r9   close)r    r9   r   r   r   r>      s    zSocketIO.closec             C   s   t d d S )Nr   )r2   r3   )r    r   r   r   exithook   s    zSocketIO.exithookc             G   sR   | j s
d S | jd tt j }x|D ]}|d t| }q(W t|tjd d S )N )r'   )	r8   locationstrr,   r-   r.   r+   r)   r*   )r    argssar   r   r   debug   s    
zSocketIO.debugc             C   s   || j |< d S )N)r;   )r    oidobjectr   r   r   register   s    zSocketIO.registerc             C   s&   y| j |= W n tk
r    Y nX d S )N)r;   KeyError)r    rG   r   r   r   
unregister   s    zSocketIO.unregisterc          
   C   s  |  d| y|\}\}}}}W n tk
r4   dS X || jk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||}y^|d	kr|||}t|trt	|}d|fS |d
krt
||||ff dS dd| fS W n tk
r,    Y n tk
rB    Y np tk
rX    Y nZ tk
r~ } zd|fS d }~X Y n4   d}t||||f tjd tjtjd dS d S )Nz
localcall:)ERRORzBad request formatrL   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)rF   	TypeErrorr;   _getmethods_getattributeshasattrgetattr
isinstanceRemoteObject	remoterefrequest_queueZputr(   KeyboardInterruptOSError	Exceptionr+   r)   r*   r0   r1   )r    seqr4   howrG   
methodnamerC   kwargsr   methods
attributesmethodretZexmsgr   r   r   	localcall   sT    








zSocketIO.localcallc             C   s(   |  d|| | ||||}| |S )Nzremotecall:asynccall: )rF   	asynccallasyncreturn)r    rG   rc   rC   rd   ra   r   r   r   
remotecall   s    zSocketIO.remotecallc             C   s(   |  d|| | ||||}| |S )Nzremotequeue:asyncqueue: )rF   
asyncqueuerl   )r    rG   rc   rC   rd   ra   r   r   r   remotequeue   s    zSocketIO.remotequeuec             C   s`   d||||ff}|   }t | jkr8t }|| j|< | d| |||| | ||f |S )NrP   zasynccall:%d:)newseqr,   r-   r7   	Conditionr=   rF   
putmessage)r    rG   rc   rC   rd   r4   ra   cvarr   r   r   rk      s    
zSocketIO.asynccallc             C   s`   d||||ff}|   }t | jkr8t }|| j|< | d| |||| | ||f |S )NrQ   zasyncqueue:%d:)rp   r,   r-   r7   rq   r=   rF   rr   )r    rG   rc   rC   rd   r4   ra   rs   r   r   r   rn      s    
zSocketIO.asyncqueuec             C   s6   |  d|  | j|dd}|  d| | | |S )Nz#asyncreturn:%d:call getresponse(): g?)waitzasyncreturn:%d:response: )rF   getresponsedecoderesponse)r    ra   responser   r   r   rl      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 )NrN   rR   rT   zdecoderesponse: EXCEPTIONEOFzdecoderesponse: EOFrL   zdecoderesponse: Internal ERROR:rS   zdecoderesponse: Call Exception:)rF   decode_interrupthookRuntimeErrorSystemError)r    rw   rb   whatr   r   r   rv      s&    

zSocketIO.decoderesponsec             C   s   t d S )N)EOFError)r    r   r   r   ry     s    zSocketIO.decode_interrupthookc             C   s6   y| j d dd W n tk
r0   | d d S X d S )Ng?)myseqrt   zmainloop:return)ru   r}   rF   )r    r   r   r   mainloop  s
    
zSocketIO.mainloopc             C   s6   |  ||}|d k	r2|\}}|dkr2|| |f}|S )NrN   )_getresponse_proxify)r    r~   rt   rw   rb   r|   r   r   r   ru   #  s    zSocketIO.getresponsec             C   s4   t |trt| |jS t |tr0tt| j|S |S )N)rZ   RemoteProxyRPCProxyrG   listmapr   )r    r   r   r   r   r   +  s
    

zSocketIO._proxifyc             C   s   |  d| t | jkr:x| ||}|d k	r|S qW nb| j| }|  x|| jkrb|  qNW | j| }|  d||f  | j|= | j|= |	  |S d S )Nz_getresponse:myseq:z-_getresponse:%s: thread woke up: response: %s)
rF   r,   r-   r7   pollresponser=   acquirer<   rt   release)r    r~   rt   rw   rs   r   r   r   r   3  s"    


zSocketIO._getresponsec             C   s   | j d  | _ }|S )N   )nextseq)r    ra   r   r   r   rp   I  s    zSocketIO.newseqc          	   C   s   |  d|d   yt|}W n, tjk
rJ   tdt|tjd  Y nX t	dt
|| }xnt
|dkry0tg | jgg \}}}| j|d t }W n  ttfk
r   tdY nX ||d  }qbW d S )Nzputmessage:%d:r   zCannot pickle:)r'   z<izsocket no longer exists)rF   r	   pickleZPicklingErrorr+   r/   r)   r*   structpacklenselectr9   sendBUFSIZEAttributeErrorrU   r_   )r    messagerD   rwxnr   r   r   rr   M  s    zSocketIO.putmessage       c             C   s   |    t| j| jk rt| j gg g |\}}}t|dkrFd S y| jt}W n t	k
rn   t
Y nX t|dkrt
|  j|7  _|    |  S )Nr   )_stage0r   buffbufneedr   r9   filenoZrecvr   r_   r}   _stage1)r    rt   r   r   r   rD   r   r   r   
pollpacketa  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   z<i   )bufstater   r   r   unpackr   )r    rD   r   r   r   r   q  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   x  s    zSocketIO._stage1c             C   s   |  |}|d krd S yt|}W nV tjk
rz   tdtjd tdt|tjd tj	tjd tdtjd  Y nX |S )Nz-----------------------)r'   zcannot unpickle packet:)
r   r   r   ZUnpicklingErrorr+   r)   r*   r/   r0   print_stack)r    rt   r   r   r   r   r   pollmessage  s    
zSocketIO.pollmessagec       
      C   s`  xXyt d}W n tjk
r(   Y n X |\}}|d|ff}| | y| |}|d kr`d S W n. tk
r~   |   d S  tk
r   d S X |\}}|d }| 	d||f  |dkr| 	d|  | 
||}| 	d||f  |dkr| ||f q|dkrqq||kr|S | j|d }	|	d k	r|	  || j|< |	  |	  qqW d S )	Nr   rN   zpollresponse:%d:myseq:%s)rP   rQ   zpollresponse:%d:localcall:call:z%pollresponse:%d:localcall:response:%srP   rQ   )response_queuegetqueueZEmptyrr   r   r}   
handle_EOFr   rF   rj   r=   r   r<   notifyr   )
r    r~   rt   Zqmsgra   rw   r   Zresqrb   cvr   r   r   r     sL    





zSocketIO.pollresponsec             C   sZ   |    | d x:| jD ]0}| j| }|  d| j|< |  |  qW |   d S )Nr   )rx   N)EOFhookrF   r=   r   r<   r   r   r?   )r    keyr   r   r   r   r     s    


zSocketIO.handle_EOFc             C   s   d S )Nr   )r    r   r   r   r     s    zSocketIO.EOFhook)NN)"r   r   r   r   r   r>   r?   rF   rI   rK   rj   rm   ro   rk   rn   rl   rv   ry   r   ru   r   r   rp   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6      s>   
.

Ir6   c               @   s   e Zd ZdS )r[   N)r   r   r   r   r   r   r   r[     s   r[   c             C   s   t | }| t|< t|S )N)idr:   r   )r   rG   r   r   r   r\     s    r\   c               @   s   e Zd Zdd ZdS )r   c             C   s
   || _ d S )N)rG   )r    rG   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 )N)Zcurrent_handlerr6   r   r   BaseRequestHandler)r    r9   r!   Zsvrr   r   r   r      s    zRPCHandler.__init__c             C   s   |    d S )N)r   )r    r   r   r   handle  s    zRPCHandler.handlec             C   s
   t | |S )N)r   )r    rG   r   r   r   get_remote_proxy	  s    zRPCHandler.get_remote_proxyN)r   r   r   r8   rA   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_sockZbindZlisten)r    addressZ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   acceptr8   r+   r)   r*   	LOCALHOSTr6   r   r_   )r    Zworking_sockr   r   r   r   r     s    zRPCClient.acceptc             C   s
   t | |S )N)r   )r    rG   r   r   r   r   #  s    zRPCClient.get_remote_proxyN)r   r   r   r8   rA   r   r#   ZAF_INETZ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 )N)sockiorG   )r    r   rG   r   r   r   r   ,  s    zRPCProxy.__init__c             C   sp   | j d kr|   | j |r.t| j| j|S | jd kr@|   || jkrd| j| jd|fi }|S t	|d S )N__getattribute__)
_RPCProxy__methods_RPCProxy__getmethodsr   MethodProxyr   rG   _RPCProxy__attributes_RPCProxy__getattributesrm   r   )r    r.   valuer   r   r   __getattr__0  s    



zRPCProxy.__getattr__c             C   s   | j | jddi | _d S )NrO   r   )r   rm   rG   r   )r    r   r   r   Z__getattributes>  s    
zRPCProxy.__getattributesc             C   s   | j | jddi | _d S )NrM   r   )r   rm   rG   r   )r    r   r   r   Z__getmethodsB  s    
zRPCProxy.__getmethods)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   '  s   r   c             C   sT   x*t | D ]}t| |}t|r
d||< q
W t| trPx| jD ]}t|| q>W d S )Nr   )dirrY   callablerZ   r   	__bases__rV   )r   re   r.   attrsuperr   r   r   rV   F  s    

rV   c             C   s0   x*t | D ]}t| |}t|s
d||< q
W d S )Nr   )r   rY   r   )r   rf   r.   r   r   r   r   rW   Q  s    
rW   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s   || _ || _|| _d S )N)r   rG   r.   )r    r   rG   r.   r   r   r   r   Z  s    zMethodProxy.__init__c             O   s   | j | j| j||}|S )N)r   rm   rG   r.   )r    rC   rd   r   r   r   r   __call___  s    zMethodProxy.__call__N)r   r   r   r   r   r   r   r   r   r   X  s   r   c             C   s~   | d krd S d t _t| }ytj| W n< tk
rf   d}||d}||d}tj| Y nX tjd | t _d S )Nasciibackslashreplacestrict
)	builtins_r/   r)   stdoutwriteUnicodeEncodeErrorencodedecode)r   textencodingbytesr   r   r   displayhookg  s    r   __main__)mainzidlelib.idle_test.test_rpcr   )	verbosity)N),r   r   r   r   r2   r   r   r   r#   r   r   r)   r,   r0   r   r   r
   r	   ZPicklerr   r   r   r   r   r:   ZQueuer]   r   rH   r6   r[   r\   r   r   r   r   r   rV   rW   r   r   r   Zunittestr   r   r   r   r   <module>   sP   
	2

  k
