o
    ]i                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZmZm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ZdZedZe
jjdB Zdefdd	Zd
edefddZG dd de jZdefddZ dS )    N)OptionalUnioncastz224.0.0.251i  z^[a-zA-Z0-9-]{1,63}\.local$i   returnc                   C   s   t t d S )Nz.local)struuiduuid4 r	   r	   ?/home/ubuntu/.local/lib/python3.10/site-packages/aioice/mdns.pycreate_mdns_hostname   s   r   namec                 C   s   t | d uS N)MDNS_HOSTNAME_REmatch)r   r	   r	   r
   is_mdns_hostname   s   r   c                   @   s   e Zd ZdejddfddZdeddfddZd	ejddfd
dZ	de
eef deddfddZdddZdededdfddZ	ddedee dee fddZdS )MDnsProtocoltx_transportr   Nc                 C   s4   t  | _tjjddtd| _i | _d | _|| _	d S )N F)
relativizerdclass)
asyncioFuture_MDnsProtocol__closeddnszoneZoneMDNS_RDCLASSqueriesrx_transportr   )selfr   r	   r	   r
   __init__"   s
   

zMDnsProtocol.__init__excc                 C   s>   t | j D ]\}}|D ]}|tj qq| jd d S )NT)listr   itemsset_exceptionr   TimeoutErrorr   
set_result)r   r!   r   futuresfuturer	   r	   r
   connection_lost*   s
   zMDnsProtocol.connection_lost	transportc                 C   s   t tj|| _d S r   )r   r   DatagramTransportr   )r   r*   r	   r	   r
   connection_made1   s   zMDnsProtocol.connection_madedataaddrc              
   C   s  zt jtt|}W n t jjy   Y d S w t|t jjr|j	D ]`}g }|j
t jjt jjt jjfv r>|t jjt jjg7 }t jjdd}| jt jjO  _| jt jjO  _|D ]}z|j| jj|j|d W qY tys   Y qYw |jr| j| ttf q"|jD ]L}|D ]E}	|	 }	t|	t jjr|	j t!kr|	j
t jjt jjfv r|	j
t jjkrt"#t"j$|	j%}
nt"#t"j&|	j%}
| j'(|jg D ]}|)|
 qqqd S d S )Nr   )id)r   rdtype)*r   message	from_wirer   bytes	exception	FormError
isinstanceQueryMessagequestionr0   	rdatatypeANYAAAAAflagsQRAAanswerappendr   
find_rrsetr   KeyErrorr   sendtoto_wireMDNS_ADDRESS	MDNS_PORT
to_genericrdataGenericRdatar   r   socket	inet_ntopAF_INETr-   AF_INET6r   popr&   )r   r-   r.   r1   r8   rdtypesresponser0   r@   itemresultr(   r	   r	   r
   datagram_received4   s\   


zMDnsProtocol.datagram_receivedc                    s&   | j   | j  | jI d H  d S r   )r   closer   r   )r   r	   r	   r
   rU   h   s   

zMDnsProtocol.closehostnamec                    s   t j|}zttj|}t jj}W n ty(   ttj	|}t jj
}Y nw t jjt||d}| j|t jd| d S )N)r   r0   r-   x   )r   r   	from_textrK   	inet_ptonrM   r9   r;   OSErrorrN   r<   rI   rJ   r   r   replace_rdatasetrdataset
from_rdata)r   rV   r.   r   r-   r0   rI   r	   r	   r
   publishm   s   zMDnsProtocol.publish      ?timeoutc              	      s>  t j|}t }|| jv r| j| | n#t|g| j|< t jj	|t j
jd}d|_d|_| j| ttf zKz$tj||dI d H W W || jv r`| j| | | j| sa| j|= S S S  tjy   Y W || jv r| j| | | j| s| j|= d S d S d S w || jv r| j| | | j| s| j|= w )N)r0   r   )r`   )r   r   rX   r   r   r   addsetr1   
make_queryr9   r;   r/   r=   r   rD   rE   rF   rG   wait_fordiscardr%   )r   rV   r`   r   r(   r1   r	   r	   r
   resolvey   s>   








zMDnsProtocol.resolve)r   N)r_   )__name__
__module____qualname__r   r+   r    	Exceptionr)   BaseTransportr,   r   r3   r   tuplerT   rU   r^   r   floatrf   r	   r	   r	   r
   r   !   s    
4r   c                     s  t  } ttjtj}|tjtjd ttdr$|tjtj	d |
dtf | jdd |dI dH \ }ttjtj}|tjtjd ttdrX|tjtj	d |tjtjttd  tjd	krs|
dtf n|
ttf | j fd
d|dI dH \}}|S )z
    Using a single socket works fine on Linux, but on OS X we need to use
    separate sockets for sending and receiving.
       SO_REUSEPORTr   c                   S   s   t  S r   )r   DatagramProtocolr	   r	   r	   r
   <lambda>   s    z&create_mdns_protocol.<locals>.<lambda>)sockNs       win32c                      s
   t  dS )Nr   )r   r	   rt   r	   r
   rq      s   
 )r   get_event_looprK   rM   
SOCK_DGRAM
setsockopt
SOL_SOCKETSO_REUSEADDRhasattrro   bindrG   create_datagram_endpoint
IPPROTO_IPIP_ADD_MEMBERSHIP	inet_atonrF   sysplatform)looptx_sock_rx_sockprotocolr	   rt   r
   create_mdns_protocol   s8   



r   )!r   rerK   r   r   typingr   r   r   dns.exceptionr   	dns.flagsdns.messagedns.name	dns.rdatadns.rdataclassdns.rdatasetdns.rdatatypedns.zonerF   rG   compiler   
rdataclassINr   r   r   boolr   rp   r   r   r	   r	   r	   r
   <module>   s.    
t