o
    Òó·iW  ã                   @  s|   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ ddd„ZG dd„ dƒZdS )é    )ÚannotationsN)ÚAny)ÚisIPAddressÚisIPv6Address)ÚDeferredÚsucceed)ÚMulticastJoinError)ÚIReactorCoreÚreactorr	   ÚaddrÚstrÚreturnúDeferred[str]c                 C  s"   t |ƒst|ƒrt|ƒS |  |¡S ©N)r   r   r   Úresolve)r
   r   © r   úaC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/_multicast.pyÚ_maybeResolve   s   
r   c                   @  sØ   e Zd ZU dZded< ded< ded< d6dd„Zed7dd„ƒZed7dd„ƒZed7dd„ƒZ	ed7dd„ƒZ
ed7dd„ƒZd8dd„Zd9dd„Zd:d d!„Zd;d$d%„Zd7d&d'„Zd<d)d*„Zd=d.d/„Zd>d?d1d2„Zd>d?d3d4„Zd5S )@ÚMulticastMixinz,
    Implement multicast functionality.
    zsocket.AddressFamilyÚaddressFamilyr   r
   zsocket.socketÚsocketr   r   r   Úbytesc                 C  s>   zt  | j|¡W S  ty   tdt  | j¡j› d|›�ƒ‚w )zs
        Pack an IP address literal into bytes, according to the address family
        of this transport.
        zinvalid address literal for z: N)r   Ú	inet_ptonr   ÚOSErrorr   ÚAddressFamilyÚname)Úselfr   r   r   r   Ú	_addrpack    s   ÿÿzMulticastMixin._addrpackÚintc                 C  ó   | j tjkr	tjS tjS r   )r   r   ÚAF_INETÚ
IPPROTO_IPÚIPPROTO_IPV6©r   r   r   r   Ú_ipproto,   ó
   
ÿÿýzMulticastMixin._ipprotoc                 C  r   r   )r   r   r    ÚIP_MULTICAST_LOOPÚIPV6_MULTICAST_LOOPr#   r   r   r   Ú
_multiloop4   r%   zMulticastMixin._multiloopc                 C  r   r   )r   r   r    ÚIP_MULTICAST_IFÚIPV6_MULTICAST_IFr#   r   r   r   Ú_multiif<   r%   zMulticastMixin._multiifc                 C  r   r   )r   r   r    ÚIP_ADD_MEMBERSHIPÚIPV6_JOIN_GROUPr#   r   r   r   Ú
_joingroupD   r%   zMulticastMixin._joingroupc                 C  r   r   )r   r   r    ÚIP_DROP_MEMBERSHIPÚIPV6_LEAVE_GROUPr#   r   r   r   Ú_leavegroupL   r%   zMulticastMixin._leavegroupú	str | intc                 C  sb   | j tjkrdnd}| j}| j}| j |||¡}ddlm} | j tjkr*t	 
||¡S t | j |¡S )Né   é   r   )Ú	byteorder)r   r   r    r$   r+   Ú
getsockoptÚsysr5   ÚAF_INET6r   Ú
from_bytesÚ	inet_ntop)r   ÚblenZipprotoZmultiifÚir5   r   r   r   ÚgetOutgoingInterfaceT   s   z#MulticastMixin.getOutgoingInterfaceúDeferred[int]c                   s   d‡ ‡fdd„}t  |ƒ ¡S )zC
        @see: L{IMulticastTransport.setOutgoingInterface}
        r   r   c                  “  sh   �ˆj tjkrtˆ tƒsJ dƒ‚ˆ tˆjˆ ƒI d H ¡} ntˆ tƒs&J dƒ‚ˆ } ˆj 	ˆj
ˆj| ¡ dS )Nz*IPv4 interfaces are specified as addressesz)IPv6 interfaces are specified as integersé   )r   r   r    Ú
isinstancer   r   r   r
   r   Ú
setsockoptr$   r+   )r<   ©r   r   r   r   Úasynchronouslyd   s    €ÿþÿþz;MulticastMixin.setOutgoingInterface.<locals>.asynchronouslyN©r   r   )r   ÚfromCoroutine)r   r   rC   r   rB   r   ÚsetOutgoingInterface_   s   z#MulticastMixin.setOutgoingInterfaceÚboolc                 C  s   t | j | j| j¡ƒS r   )rG   r   r6   r$   r(   r#   r   r   r   ÚgetLoopbackModeu   s   zMulticastMixin.getLoopbackModeÚmodeÚNonec                 C  s(   | j }| j}| j ||tt|ƒƒ¡ d S r   )r$   r(   r   rA   r   rG   )r   rI   ÚaÚbr   r   r   ÚsetLoopbackModex   s   zMulticastMixin.setLoopbackModec                 C  s   | j  t jt j¡S r   )r   r6   r!   ÚIP_MULTICAST_TTLr#   r   r   r   ÚgetTTL~   s   zMulticastMixin.getTTLÚttlc                 C  s$   t  d|¡}| j tjtj|¡ d S )NÚB)ÚstructÚpackr   rA   r!   rN   )r   rP   Zbttlr   r   r   ÚsetTTL�   s   zMulticastMixin.setTTLÚ	interfaceÚjoinúDeferred[None]c                   sH   |rˆj nˆj‰ˆsˆjtjkrdnd‰d‡ ‡‡‡fdd„}t |ƒ ¡S )Nz0.0.0.0z::r   rJ   c               
   “  s†   �t ˆjˆ ƒI d H } t ˆjˆƒI d H }ˆ | ¡}ˆ |¡}zˆj ˆjˆ|| ¡ W d S  tyB } ztˆ ˆg|j¢R Ž |‚d }~ww r   )	r   r
   r   r   rA   r$   r   r   Úargs)ZresaddrZresifZpackaddrZpackifÚe©r   ÚcmdrU   r   r   r   ÚimplŠ   s   €

€ÿz'MulticastMixin._joinleave.<locals>.impl)r   rJ   )r.   r1   r   r   r    r   rE   )r   r   rU   rV   r\   r   rZ   r   Ú
_joinleave…   s
   zMulticastMixin._joinleaveÚ c                 C  ó   |   ||d¡S )z8
        @see: L{IMulticastTransport.joinGroup}
        TN©r]   ©r   r   rU   r   r   r   Ú	joinGroup—   ó   zMulticastMixin.joinGroupc                 C  r_   )z9
        @see: L{IMulticastTransport.leaveGroup}
        FNr`   ra   r   r   r   Ú
leaveGroup�   rc   zMulticastMixin.leaveGroupN)r   r   r   r   rD   )r   r2   )r   r2   r   r>   )r   rG   )rI   r   r   rJ   )rP   r   r   rJ   )r   r   rU   r   rV   rG   r   rW   )r^   )r   r   rU   r   r   rW   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úpropertyr$   r(   r+   r.   r1   r=   rF   rH   rM   rO   rT   r]   rb   rd   r   r   r   r   r      s2   
 







r   )r
   r	   r   r   r   r   )Ú
__future__r   r   rR   Útypingr   Ztwisted.internet.abstractr   r   Ztwisted.internet.deferr   r   Ztwisted.internet.errorr   Ztwisted.internet.interfacesr	   r   r   r   r   r   r   Ú<module>   s   
