o
    B]G                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ zd dl	Z	W n e
y1   d dlZ	Y nw e dkZG dd de	jeZdS )    N)AbstractAsyncioTransport)error)debug)34r   c                   @   sl   e Zd ZdZdZdd ZdZdddZdd Zd	d
 Z	dd Z
dddZdd Zdd Zdd Zdd ZdS )DgramAsyncioProtocolzBBase Asyncio datagram Transport, to be used with AsyncioDispatcherNc                 C   s   | S N )xr	   r	   C/usr/lib/python3/dist-packages/pysnmp/carrier/asyncio/dgram/base.py<lambda>3       zDgramAsyncioProtocol.<lambda>c                 C   s&   g | _ d | _|d u rt }|| _d S r   )_writeQ_lportasyncioZget_event_looploop)selfZsockZsockMapr   r	   r	   r   __init__6   s
   
zDgramAsyncioProtocol.__init__c                 C   s,   | j d u r
td| j| j | || d S )NzUnable to call cbFun)Z_cbFunr   CarrierErrorr   Z	call_soon)r   ZdatagramtransportAddressr	   r	   r   datagram_received=   s   

z&DgramAsyncioProtocol.datagram_receivedc              
   C   s   || _ tjtj@ otd | jrQ| jd\}}tjtj@ o*td|t|f  z| j || | W n t	yK   t
dtjt  w | jsd S d S )Nzconnection_made: invokedr   z7connection_made: transportAddress %r outgoingMessage %s;)	transportr   loggerflagIOr   pophexdumpsendtonormalizeAddress	Exceptionr   r   join	tracebackformat_exceptionsysexc_info)r   r   outgoingMessager   r	   r	   r   connection_madeC   s   z$DgramAsyncioProtocol.connection_madec                 C   s    t jt j@ ot d d S  d S )Nzconnection_lost: invoked)r   r   r   )r   excr	   r	   r   connection_lostO   s    z$DgramAsyncioProtocol.connection_lostc              
      r   z$ j j fdd| jd}trt| _W  S ttd| _W  S  ty8   t	
dtjt  w )Nc                          S r   r	   r	   r   r	   r   r   W   r   z5DgramAsyncioProtocol.openClientMode.<locals>.<lambda>Z
local_addrZfamilyasyncr   r   Zcreate_datagram_endpoint
sockFamilyIS_PYTHON_344_PLUSr   Zensure_futurer   getattrr   r   r   r    r!   r"   r#   r$   r   Zifacecr	   r+   r   openClientModeT   s   z#DgramAsyncioProtocol.openClientModec              
      r)   )Nc                      r*   r   r	   r	   r+   r	   r   r   f   r   z5DgramAsyncioProtocol.openServerMode.<locals>.<lambda>r,   r-   r   r.   r2   r	   r+   r   openServerModec   s   z#DgramAsyncioProtocol.openServerModec                 C   s6   | j d ur
| j   | jd ur| j  t|  d S r   )r   Zcancelr   closer   closeTransportr+   r	   r	   r   r7   q   s
   



z#DgramAsyncioProtocol.closeTransportc              
   C   s   t jt j@ ot d| jd u rdpd|t |f  | jd u r)| j||f d S z| j|| | W d S  t	yJ   t
dtjt  w )Nz6sendMessage: %s transportAddress %r outgoingMessage %sZqueuingZsendingr   )r   r   r   r   r   r   appendr   r   r   r   r   r    r!   r"   r#   r$   )r   r%   r   r	   r	   r   sendMessagex   s   

z DgramAsyncioProtocol.sendMessagec                 C   s   t || js| |}|S r   )
isinstanceaddressType)r   r   r	   r	   r   r      s   
z%DgramAsyncioProtocol.normalizeAddress)NNNr   )__name__
__module____qualname____doc__r/   r;   r   r   r   r&   r(   r4   r5   r7   r9   r   r	   r	   r	   r   r   0   s    

r   )r#   platformr!   Zpysnmp.carrier.asyncio.baser   Zpysnmp.carrierr   Zpysnmpr   r   ImportErrorZtrolliusZpython_version_tupler0   ZDatagramProtocolr   r	   r	   r	   r   <module>   s    