U
    ˆjW  ã                   @  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
dœdd„ZG dd„ dƒZdS )é    )ÚannotationsN)ÚAny)ÚisIPAddressÚisIPv6Address)ÚDeferredÚsucceed)ÚMulticastJoinError)ÚIReactorCorer	   ÚstrzDeferred[str])ÚreactorÚaddrÚreturnc                 C  s"   t |ƒst|ƒrt|ƒS |  |¡S ©N)r   r   r   Úresolve)r   r   © r   ú?/tmp/pip-unpacked-wheel-j5h_c8_q/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< dd	d
œdd„Zeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZ	eddœdd„ƒZ
eddœdd„ƒZddœdd„Zddd
œdd„Zddœd d!„Zdd"d#œd$d%„Zddœd&d'„Zdd"d(œd)d*„Zdddd+d,œd-d.„Zd6ddd+d0œd1d2„Zd7ddd+d0œd3d4„Zd5S )8ÚMulticastMixinz,
    Implement multicast functionality.
    zsocket.AddressFamilyÚaddressFamilyr   r   zsocket.socketÚsocketr
   Úbytes)r   r   c                 C  sH   zt  | j|¡W S  tk
rB   tdt  | j¡j› d|›�ƒ‚Y nX dS )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Úint©r   c                 C  s   | 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,   s    
ÿýzMulticastMixin._ipprotoc                 C  s   | j tjkrtjS tjS r   )r   r   r   ÚIP_MULTICAST_LOOPÚIPV6_MULTICAST_LOOPr"   r   r   r   Ú
_multiloop4   s    
ÿýzMulticastMixin._multiloopc                 C  s   | j tjkrtjS tjS r   )r   r   r   ÚIP_MULTICAST_IFÚIPV6_MULTICAST_IFr"   r   r   r   Ú_multiif<   s    
ÿýzMulticastMixin._multiifc                 C  s   | j tjkrtjS tjS r   )r   r   r   ÚIP_ADD_MEMBERSHIPÚIPV6_JOIN_GROUPr"   r   r   r   Ú
_joingroupD   s    
ÿýzMulticastMixin._joingroupc                 C  s   | j tjkrtjS tjS r   )r   r   r   ÚIP_DROP_MEMBERSHIPÚIPV6_LEAVE_GROUPr"   r   r   r   Ú_leavegroupL   s    
ÿýzMulticastMixin._leavegroupz	str | intc                 C  sb   | j tjkrdnd}| j}| j}| j |||¡}ddlm} | j tjkrTt	 
||¡S t | j |¡S )Né   é   r   )Ú	byteorder)r   r   r   r#   r)   Ú
getsockoptÚsysr2   ÚAF_INET6r   Ú
from_bytesÚ	inet_ntop)r   ÚblenZipprotoZmultiifÚir2   r   r   r   ÚgetOutgoingInterfaceT   s    z#MulticastMixin.getOutgoingInterfacezDeferred[int]c                   s    ddœ‡ ‡fdd„}t  |ƒ ¡S )zC
        @see: L{IMulticastTransport.setOutgoingInterface}
        r   r   c                  “  sf   ˆj tjkr8tˆ tƒstdƒ‚ˆ tˆjˆ ƒI d H ¡} ntˆ t	ƒsJtdƒ‚ˆ } ˆj 
ˆjˆj| ¡ dS )Nz*IPv4 interfaces are specified as addressesz)IPv6 interfaces are specified as integersé   )r   r   r   Ú
isinstancer
   ÚAssertionErrorr   r   r   r   Ú
setsockoptr#   r)   )r9   ©r   r   r   r   Úasynchronouslyd   s"     ÿþ ÿþz;MulticastMixin.setOutgoingInterface.<locals>.asynchronously)r   ÚfromCoroutine)r   r   r@   r   r?   r   ÚsetOutgoingInterface_   s    z#MulticastMixin.setOutgoingInterfaceÚboolc                 C  s   t | j | j| j¡ƒS r   )rC   r   r3   r#   r&   r"   r   r   r   ÚgetLoopbackModeu   s    zMulticastMixin.getLoopbackModeÚNone)Úmoder   c                 C  s(   | j }| j}| j ||tt|ƒƒ¡ d S r   )r#   r&   r   r>   r   rC   )r   rF   ÚaÚbr   r   r   ÚsetLoopbackModex   s    zMulticastMixin.setLoopbackModec                 C  s   | j  t jt j¡S r   )r   r3   r    ÚIP_MULTICAST_TTLr"   r   r   r   ÚgetTTL~   s    zMulticastMixin.getTTL)Úttlr   c                 C  s$   t  d|¡}| j tjtj|¡ d S )NÚB)ÚstructÚpackr   r>   r    rJ   )r   rL   Zbttlr   r   r   ÚsetTTL�   s    zMulticastMixin.setTTLzDeferred[None])r   Ú	interfaceÚjoinr   c                   sL   |r
ˆj nˆj‰ˆs(ˆjtjkr$dnd‰ddœ‡ ‡‡‡fdd„}t |ƒ ¡S )Nz0.0.0.0z::rE   r   c               
   “  sŽ   t ˆjˆ ƒI d H } t ˆjˆƒI d H }ˆ | ¡}ˆ |¡}zˆj ˆjˆ|| ¡ W n6 tk
rˆ } ztˆ ˆf|jžŽ |‚W 5 d }~X Y nX d S r   )	r   r   r   r   r>   r#   r   r   Úargs)ZresaddrZresifZpackaddrZpackifÚe©r   ÚcmdrQ   r   r   r   ÚimplŠ   s    

z'MulticastMixin._joinleave.<locals>.impl)r,   r/   r   r   r   r   rA   )r   r   rQ   rR   rW   r   rU   r   Ú
_joinleave…   s
    zMulticastMixin._joinleaveÚ )r   rQ   r   c                 C  s   |   ||d¡S )z8
        @see: L{IMulticastTransport.joinGroup}
        T©rX   ©r   r   rQ   r   r   r   Ú	joinGroup—   s    zMulticastMixin.joinGroupc                 C  s   |   ||d¡S )z9
        @see: L{IMulticastTransport.leaveGroup}
        FrZ   r[   r   r   r   Ú
leaveGroup�   s    zMulticastMixin.leaveGroupN)rY   )rY   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úpropertyr#   r&   r)   r,   r/   r:   rB   rD   rI   rK   rP   rX   r\   r]   r   r   r   r   r      s0   
r   )Ú
__future__r   r   rN   Ú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   