
    VhW                        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Z G d	 d
      Zy)    )annotationsN)Any)isIPAddressisIPv6Address)Deferredsucceed)MulticastJoinError)IReactorCorec                f    t        |      st        |      rt        |      S | j                  |      S N)r   r   r   resolve)reactoraddrs     K/home/dcms/DCMS/lib/python3.12/site-packages/twisted/internet/_multicast.py_maybeResolver      s*    Tk$/t}??4      c                      e Zd ZU dZded<   ded<   ded<   ddZedd	       Zedd
       Zedd       Z	edd       Z
edd       ZddZddZddZddZddZddZddZd d!dZd d!dZy)"MulticastMixinz,
    Implement multicast functionality.
    zsocket.AddressFamilyaddressFamilyr   r   zsocket.socketsocketc                    	 t        j                  | j                  |      S # t        $ r9 t	        dt        j
                  | j                        j                   d|      w xY 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   s     r   	_addrpackzMulticastMixin._addrpack    sg    
	##D$6$6== 	$.v/C/CDDVDV/W/\/\.]]_`d_gh 	s
   " AA$c                |    | j                   t        j                  k(  rt        j                  S t        j                  S r   )r   r   AF_INET
IPPROTO_IPIPPROTO_IPV6r   s    r   _ipprotozMulticastMixin._ipproto,   s6     !!V^^3 	
 $$	
r   c                |    | j                   t        j                  k(  rt        j                  S t        j                  S r   )r   r   r   IP_MULTICAST_LOOPIPV6_MULTICAST_LOOPr"   s    r   
_multiloopzMulticastMixin._multiloop4   s6     !!V^^3 $$	
 ++	
r   c                |    | j                   t        j                  k(  rt        j                  S t        j                  S r   )r   r   r   IP_MULTICAST_IFIPV6_MULTICAST_IFr"   s    r   _multiifzMulticastMixin._multiif<   s6     !!V^^3 ""	
 ))	
r   c                |    | j                   t        j                  k(  rt        j                  S t        j                  S r   )r   r   r   IP_ADD_MEMBERSHIPIPV6_JOIN_GROUPr"   s    r   
_joingroupzMulticastMixin._joingroupD   s6     !!V^^3 $$	
 ''	
r   c                |    | j                   t        j                  k(  rt        j                  S t        j                  S r   )r   r   r   IP_DROP_MEMBERSHIPIPV6_LEAVE_GROUPr"   s    r   _leavegroupzMulticastMixin._leavegroupL   s6     !!V^^3 %%	
 ((	
r   c                `   | j                   t        j                  k(  rdnd}| j                  }| j                  }| j                  j                  |||      }ddlm} | j                   t        j                  k(  rt        j                  ||      S t        j                  | j                   |      S )N      r   )	byteorder)r   r   r   r#   r+   
getsockoptsysr7   AF_INET6int
from_bytes	inet_ntop)r   blenipprotomultiifir7   s         r   getOutgoingInterfacez#MulticastMixin.getOutgoingInterfaceT   s    ((FNN:s----KK""7GT:!0>>!Y// 2 2A66r   c                H     d fd}t        j                   |             S )zC
        @see: L{IMulticastTransport.setOutgoingInterface}
        c                 j  K   j                   t        j                  k(  rEt        t              sJ d       j                  t        j                         d {         } nt        t              sJ d       } j                  j                  j                  j                  |        y7 Tw)Nz*IPv4 interfaces are specified as addressesz)IPv6 interfaces are specified as integers   )r   r   r   
isinstancestrr   r   r   r;   
setsockoptr#   r+   )rA   r   r   s    r   asynchronouslyz;MulticastMixin.setOutgoingInterface.<locals>.asynchronouslyd   s     !!V^^3!# @?@  NNt||T)J#JK!# ?>?  KK""4==$--C $Ks   AB3B1AB3returnr;   )r   fromCoroutine)r   r   rI   s   `` r   setOutgoingInterfacez#MulticastMixin.setOutgoingInterface_   s    
	 %%n&677r   c                t    t        | j                  j                  | j                  | j                              S r   )boolr   r8   r#   r'   r"   s    r   getLoopbackModezMulticastMixin.getLoopbackModeu   s&    DKK**4==$//JKKr   c           	         | j                   }| j                  }| j                  j                  ||t	        t        |                   y r   )r#   r'   r   rH   r;   rO   )r   modeabs       r   setLoopbackModezMulticastMixin.setLoopbackModex   s2    MMOOq!Sd_5r   c                r    | j                   j                  t         j                  t         j                        S r   )r   r8   r    IP_MULTICAST_TTLr"   s    r   getTTLzMulticastMixin.getTTL~   s%    {{%%f&7&79P9PQQr   c                    t        j                  d|      }| j                  j                  t        j                  t        j
                  |       y )NB)structpackr   rH   r    rW   )r   ttlbttls      r   setTTLzMulticastMixin.setTTL   s4    {{3$v00&2I2I4Pr   c                     |r j                   n j                  s! j                  t        j                  k(  rdndd fd}t        j                   |             S )Nz0.0.0.0z::c                 z  K   t        j                         d {   } t        j                         d {   }j                  |       }j                  |      }	 j                  j	                  j
                  ||z          y 7 p7 T# t        $ r}t        g|j                   |d }~ww xY wwr   )	r   r   r   r   rH   r#   r   r	   args)	resaddrresifpackaddrpackifer   cmd	interfacer   s	        r   implz'MulticastMixin._joinleave.<locals>.impl   s     )$,,==G'i@@E~~g.H^^E*FJ&&t}}c8f;LM >@  J(yB166BIJsC   B;BB;B&B;#*B B;B;	B8B33B88B;)rK   None)r/   r3   r   r   r   r   rL   )r   r   ri   joinrj   rh   s   ```  @r   
_joinleavezMulticastMixin._joinleave   sR    !%doo4+;+;%)%7%76>>%I	tI		J 		J %%df--r   c                (    | j                  ||d      S )z8
        @see: L{IMulticastTransport.joinGroup}
        Trm   r   r   ri   s      r   	joinGroupzMulticastMixin.joinGroup   s     tY55r   c                (    | j                  ||d      S )z9
        @see: L{IMulticastTransport.leaveGroup}
        Fro   rp   s      r   
leaveGroupzMulticastMixin.leaveGroup   s     tY66r   N)r   rG   rK   bytesrJ   )rK   	str | int)r   ru   rK   zDeferred[int])rK   rO   )rR   r;   rK   rk   )r]   r;   rK   rk   )r   rG   ri   rG   rl   rO   rK   Deferred[None]) )r   rG   ri   rG   rK   rv   )__name__
__module____qualname____doc____annotations__r   propertyr#   r'   r+   r/   r3   rB   rM   rP   rU   rX   r_   rm   rq   rs    r   r   r   r      s     ('L
 
 
 
 
 
 
 
 
 
 
	78,L6RQ.$67r   r   )r   r
   r   rG   rK   zDeferred[str])
__future__r   r   r[   typingr   twisted.internet.abstractr   r   twisted.internet.deferr   r   twisted.internet.errorr	   twisted.internet.interfacesr
   r   r   r~   r   r   <module>r      s0   
 #    @ 4 5 4!J7 J7r   