o
    BŠ]¡   ã                   @   sX   d dl Z d dlmZ G dd„ deƒZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZdS )é    N)Úerrorc                   @   st   e Z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
ejdkr8edd„ ƒZejdd„ ƒZdS dS )ÚTimerCallablec                 C   s*   || _ d| _tjdkr|| _d S || _d S )Nr   ©é   é   )Ú_TimerCallable__cbFunÚ_TimerCallable__nextCallÚsysÚversion_infoÚ_TimerCallable__callIntervalÚinterval)ÚselfÚcbFunÚcallInterval© r   ú5/usr/lib/python3/dist-packages/pysnmp/carrier/base.pyÚ__init__   s
   


zTimerCallable.__init__c                 C   s(   | j |kr|  |¡ || j | _ d S d S ©N)r   r   r   )r   ÚtimeNowr   r   r   Ú__call__   s   

þzTimerCallable.__call__c                 C   s
   | j |kS r   ©r   ©r   r   r   r   r   Ú__eq__   ó   
zTimerCallable.__eq__c                 C   s
   | j |kS r   r   r   r   r   r   Ú__ne__   r   zTimerCallable.__ne__c                 C   s
   | j |k S r   r   r   r   r   r   Ú__lt__!   r   zTimerCallable.__lt__c                 C   s
   | j |kS r   r   r   r   r   r   Ú__le__$   r   zTimerCallable.__le__c                 C   s
   | j |kS r   r   r   r   r   r   Ú__gt__'   r   zTimerCallable.__gt__c                 C   s
   | j |kS r   r   r   r   r   r   Ú__ge__*   r   zTimerCallable.__ge__r   c                 C   ó   | j S r   ©r   ©r   r   r   r   r   .   s   zTimerCallable.intervalc                 C   s
   || _ d S r   r    )r   r   r   r   r   r   2   s   
N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r	   r
   Úpropertyr   Úsetterr   r   r   r   r      s    	

úr   c                   @   sÂ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd.d
d„Zd.dd„Zd.d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#d$„Zd/d%d&„Zd'd(„ Zd0d*d+„Zd,d-„ Zd	S )1ÚAbstractTransportDispatcherc                 C   sF   i | _ i | _i | _i | _g | _d| _d| _| jd | _d| _d | _	d S )Nr   g      à?çš™™™™™©?)
Ú(_AbstractTransportDispatcher__transportsÚ0_AbstractTransportDispatcher__transportDomainMapÚ"_AbstractTransportDispatcher__jobsÚ+_AbstractTransportDispatcher__recvCallablesÚ,_AbstractTransportDispatcher__timerCallablesÚ#_AbstractTransportDispatcher__ticksÚ-_AbstractTransportDispatcher__timerResolutionÚ(_AbstractTransportDispatcher__timerDeltaÚ&_AbstractTransportDispatcher__nextTimeÚ*_AbstractTransportDispatcher__routingCbFunr!   r   r   r   r   8   s   
z$AbstractTransportDispatcher.__init__c                 C   sr   || j v r| j | }nt d|f ¡‚| jr|  |||¡}nd }|| jv r1| j| | |||ƒ d S t d|f ¡‚)NzUnregistered transport %sz3No callback for "%r" found - loosing incoming event)r*   r   ÚCarrierErrorr2   r,   )r   ZincomingTransportÚtransportAddressZincomingMessageÚtransportDomainÚrecvIdr   r   r   Ú_cbFunD   s"   
ÿÿ
ÿÿz"AbstractTransportDispatcher._cbFunc                 C   s   | j rt d¡‚|| _ d S )Nz(Data routing callback already registered)r2   r   r3   )r   ZroutingCbFunr   r   r   ÚregisterRoutingCbFun^   s
   ÿ
z0AbstractTransportDispatcher.registerRoutingCbFunc                 C   s   | j rd | _ d S d S r   )r2   r!   r   r   r   ÚunregisterRoutingCbFune   s   
ÿz2AbstractTransportDispatcher.unregisterRoutingCbFunNc                 C   s4   || j v rt d|d u rdp|f ¡‚|| j |< d S )Nz&Receive callback %r already registeredz	<default>)r,   r   r3   )r   ZrecvCbr6   r   r   r   ÚregisterRecvCbFuni   s
   
ÿz-AbstractTransportDispatcher.registerRecvCbFunc                 C   s   || j v r| j |= d S d S r   )r,   )r   r6   r   r   r   ÚunregisterRecvCbFunp   s   
ÿz/AbstractTransportDispatcher.unregisterRecvCbFunc                 C   s    |s| j }| j t||ƒ¡ d S r   )r/   r-   Úappendr   )r   Ú
timerCbFunZtickIntervalr   r   r   ÚregisterTimerCbFunt   s   z.AbstractTransportDispatcher.registerTimerCbFunc                 C   s   |r
| j  |¡ d S g | _ d S r   )r-   Úremove)r   r=   r   r   r   ÚunregisterTimerCbFuny   s   
z0AbstractTransportDispatcher.unregisterTimerCbFunc                 C   s>   || j v rt d|f ¡‚| | j¡ || j |< || j|< d S )NzTransport %s already registered)r)   r   r3   ÚregisterCbFunr7   r*   )r   ÚtDomainZ	transportr   r   r   ÚregisterTransport   s   
ÿ
z-AbstractTransportDispatcher.registerTransportc                 C   sB   || j vrt d|f ¡‚| j |  ¡  | j| j | = | j |= d S ©NzTransport %s not registered)r)   r   r3   ÚunregisterCbFunr*   ©r   rB   r   r   r   ÚunregisterTransportˆ   s   
ÿz/AbstractTransportDispatcher.unregisterTransportc                 C   s$   || j v r
| j | S t d|f ¡‚rD   )r)   r   r3   )r   r5   r   r   r   ÚgetTransport‘   s
   

ÿz(AbstractTransportDispatcher.getTransportc                 C   s0   || j v r| j |  ||¡ d S t d|f ¡‚)Nz#No suitable transport domain for %s)r)   ÚsendMessager   r3   )r   ÚoutgoingMessager5   r4   r   r   r   rI   ˜   s   

ÿÿz'AbstractTransportDispatcher.sendMessagec                 C   r   r   )r/   r!   r   r   r   ÚgetTimerResolution£   ó   z.AbstractTransportDispatcher.getTimerResolutionc                 C   sL   |dk s|dkrt  d¡‚| jD ]}|j| jkr||_q|| _|d | _d S )Ng{®Gáz„?é
   zImpossible timer resolutionr(   )r   r3   r-   r   r/   r0   )r   ZtimerResolutionÚtimerCallabler   r   r   ÚsetTimerResolution¦   s   

€z.AbstractTransportDispatcher.setTimerResolutionc                 C   r   r   )r.   r!   r   r   r   ÚgetTimerTicks²   rL   z)AbstractTransportDispatcher.getTimerTicksc                 C   sb   | j dkr|| j | j | _ | j |krd S |  jd7  _|| j | j | _ | jD ]}||ƒ q(d S )Nr   é   )r1   r/   r0   r.   r-   )r   r   rN   r   r   r   ÚhandleTimerTickµ   s   



ÿz+AbstractTransportDispatcher.handleTimerTickrQ   c                 C   s.   || j v r| j |  |7  < d S || j |< d S r   ©r+   ©r   ZjobIdÚcountr   r   r   Ú
jobStartedÂ   s   
z&AbstractTransportDispatcher.jobStartedc                 C   s0   | j |  |8  < | j | dkr| j |= d S d S )Nr   rS   rT   r   r   r   ÚjobFinishedÈ   s   ÿz'AbstractTransportDispatcher.jobFinishedc                 C   s
   t | jƒS r   )Úboolr+   r!   r   r   r   ÚjobsArePendingÍ   r   z*AbstractTransportDispatcher.jobsArePendingç        c                 C   ó
   t  d¡‚©NzMethod not implemented©r   r3   )r   Ztimeoutr   r   r   ÚrunDispatcherÐ   r   z)AbstractTransportDispatcher.runDispatcherc                 C   sF   t | jƒD ]}| j|  ¡  |  |¡ q| j ¡  |  ¡  |  ¡  d S r   )Úlistr)   ÚcloseTransportrG   Úclearr;   r@   rF   r   r   r   ÚcloseDispatcherÓ   s   
z+AbstractTransportDispatcher.closeDispatcherr   )rQ   )rZ   )r"   r#   r$   r   r7   r8   r9   r:   r;   r>   r@   rC   rG   rH   rI   rK   rO   rP   rR   rV   rW   rY   r^   rb   r   r   r   r   r'   7   s,    



		


r'   c                   @   s*   e Zd ZdZdd„ Zdd„ Zddd„ZdS )	ÚAbstractTransportAddressNc                 C   s
   || _ | S r   ©Ú_localAddress)r   Úsr   r   r   ÚsetLocalAddressß   s   z(AbstractTransportAddress.setLocalAddressc                 C   r   r   rd   r!   r   r   r   ÚgetLocalAddressã   rL   z(AbstractTransportAddress.getLocalAddressc                 C   s    |   | ¡ |d u r|  ¡ p|¡S r   )Ú	__class__rg   rh   )r   ZlocalAddressr   r   r   Úcloneæ   s    zAbstractTransportAddress.cloner   )r"   r#   r$   re   rg   rh   rj   r   r   r   r   rc   Ü   s
    rc   c                   @   sV   e Zd ZdZeZdZedd„ ƒZdd„ Z	dd„ Z
dd	„ Zdd
d„Zdd„ Zdd„ ZdS )ÚAbstractTransportNc                 C   s   t || jƒS r   )Ú
isinstanceÚprotoTransportDispatcher)ÚclsZtransportDispatcherr   r   r   ÚisCompatibleWithDispatcherï   s   z,AbstractTransport.isCompatibleWithDispatcherc                 C   s$   | j rt d| j | f ¡‚|| _ d S )Nz-Callback function %s already registered at %s)r7   r   r3   r   r   r   r   rA   ó   s
   ÿ
zAbstractTransport.registerCbFunc                 C   s
   d | _ d S r   )r7   r!   r   r   r   rE   ú   r   z!AbstractTransport.unregisterCbFunc                 C   s   |   ¡  d S r   )rE   r!   r   r   r   r`   ý   s   z AbstractTransport.closeTransportc                 C   r[   r\   r]   ©r   Zifacer   r   r   ÚopenClientMode  r   z AbstractTransport.openClientModec                 C   r[   r\   r]   rp   r   r   r   ÚopenServerMode  r   z AbstractTransport.openServerModec                 C   r[   r\   r]   )r   rJ   r4   r   r   r   rI     r   zAbstractTransport.sendMessager   )r"   r#   r$   rm   rc   ZaddressTyper7   Úclassmethodro   rA   rE   r`   rq   rr   rI   r   r   r   r   rk   ê   s    

rk   )r	   Zpysnmp.carrierr   Úobjectr   r'   rc   rk   r   r   r   r   Ú<module>   s   + &