o
    >hW                     @  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   {/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/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: )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   blenipproto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   rE   r   rD   r   setOutgoingInterface_   s   z#MulticastMixin.setOutgoingInterfaceboolc                 C  s   t | j| j| jS r   )rI   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   rC   r   rI   )r   rK   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   rC   r!   rP   )r   rR   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   rL   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   rC   r$   r   r   args)resaddrresifpackaddrpackifer   cmdrX   r   r   r   impl   s   

z'MulticastMixin._joinleave.<locals>.impl)r   rL   )r.   r1   r   r   r    r   rG   )r   r   rX   rY   rc   r   ra   r   
_joinleave   s
   zMulticastMixin._joinleave c                 C     |  ||dS )z8
        @see: L{IMulticastTransport.joinGroup}
        Trd   r   r   rX   r   r   r   	joinGroup      zMulticastMixin.joinGroupc                 C  rf   )z9
        @see: L{IMulticastTransport.leaveGroup}
        Frg   rh   r   r   r   
leaveGroup   rj   zMulticastMixin.leaveGroupN)r   r   r   r   rF   )r   r2   )r   r2   r   r@   )r   rI   )rK   r   r   rL   )rR   r   r   rL   )r   r   rX   r   rY   rI   r   rZ   )re   )r   r   rX   r   r   rZ   )__name__
__module____qualname____doc____annotations__r   propertyr$   r(   r+   r.   r1   r?   rH   rJ   rO   rQ   rW   rd   ri   rk   r   r   r   r   r      s2   
 







r   )r
   r	   r   r   r   r   )
__future__r   r   rT   typingr   twisted.internet.abstractr   r   twisted.internet.deferr   r   twisted.internet.errorr   twisted.internet.interfacesr	   r   r   r   r   r   r   <module>   s   
