a
    kÄ#dl  ã                   @   s²   d Z ddlmZ ddlmZ ddlmZ ddlm  mZ ddl	m
Z
 ddl	mZmZmZmZmZmZmZmZ dd	„ ZG d
d„ deƒZedƒZedƒZG dd„ deeef ƒZdS )z
Direct Access dictionary.
é    )Úabsolute_import)Úprint_function)ÚScapy_ExceptionN)Ú	plain_str)ÚAnyÚDictÚGenericÚIteratorÚListÚTypeVarÚUnionÚcastc                 C   s.   t | ƒ} | r$t| d ƒdv r$d|  } |  d¡S )zM
    Modifies a string to make sure it can be used as an attribute name.
    r   Ú
0123456789Zn_A   ________________________________________________0123456789_______ABCDEFGHIJKLMNOPQRSTUVWXYZ______abcdefghijklmnopqrstuvwxyz_____________________________________________________________________________________________________________________________________)r   ÚstrÚ	translate)Úx© r   úC/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/dadict.pyÚfixname    s    ÿr   c                   @   s   e Zd ZdS )ÚDADict_ExceptionN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   1   s   r   Ú_KÚ_Vc                   @   s–   e Zd ZdZd#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„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZdd„ Zd d!„ Zd"S )$ÚDADicta_  
    Direct Access Dictionary

    This acts like a dict, but it provides a direct attribute access
    to its keys through its values. This is used to store protocols,
    manuf...

    For instance, scapy fields will use a DADict as an enum::

        ETHER_TYPES[2048] -> IPv4

    Whereas humans can access::

        ETHER_TYPES.IPv4 -> 2048
    c                 K   s   || _ i | _|  |¡ d S ©N)Ú_nameÚdÚupdate)Úselfr   Zkargsr   r   r   Ú__init__I   s    zDADict.__init__c                 C   s   t |ttfƒrt|ƒS dS )zH
        Return value that is used as key for the direct access
        Úunknown)Ú
isinstancer   Úbytesr   )r    Úvr   r   r   ÚidentO   s    zDADict.identc                 O   s*   t  t|i |¤Ž¡D ]\}}|| |< qd S r   )ÚsixÚ	iteritemsÚdict)r    ÚargsÚkwargsÚkr%   r   r   r   r   X   s    zDADict.updatec                 c   s2   t  | j¡D ] }t|tƒr&|d dkr|V  qd S )Nr   Ú_)r'   Úiterkeysr   r#   r   )r    r   r   r   r   r.   ]   s    zDADict.iterkeysc                 C   s   t |  ¡ ƒS r   )Úlistr.   ©r    r   r   r   Úkeysc   s    zDADict.keysc                 C   s   |   ¡ S r   )r.   r0   r   r   r   Ú__iter__g   s    zDADict.__iter__c                 C   s   t  | j¡S r   )r'   Ú
itervaluesr   r0   r   r   r   r3   k   s    zDADict.itervaluesc                 C   s   t |  ¡ ƒS r   )r/   r3   r0   r   r   r   Úvalueso   s    zDADict.valuesc                 C   s&   |   ¡ D ]}td|| | f ƒ qd S )Nz	%10s = %r)r.   Úprint)r    r,   r   r   r   Ú_shows   s    zDADict._showc                 C   s   d| j t| ƒf S )Nz<%s - %s elements>)r   Úlenr0   r   r   r   Ú__repr__x   s    zDADict.__repr__c                 C   s
   | j | S r   ©r   )r    Úattrr   r   r   Ú__getitem__|   s    zDADict.__getitem__c                 C   s   || j |< d S r   r9   )r    r:   Úvalr   r   r   Ú__setitem__€   s    zDADict.__setitem__c                 C   s
   t | jƒS r   )r7   r   r0   r   r   r   Ú__len__„   s    zDADict.__len__c                 C   s   t | ƒdkS )Né   )r7   r0   r   r   r   Ú__nonzero__ˆ   s    zDADict.__nonzero__c                 C   s`   zt  | |¡W S  tyV   t | j¡D ](\}}|  |¡|kr(tt|ƒ   Y S q(Y n0 t‚d S r   )	ÚobjectÚ__getattribute__ÚAttributeErrorr'   r(   r   r&   r   r   )r    r:   r,   r%   r   r   r   Ú__getattr__Ž   s    zDADict.__getattr__c                    s   ‡ fdd„ˆ   ¡ D ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r   )r&   )Ú.0r   r0   r   r   Ú
<listcomp>š   ó    z"DADict.__dir__.<locals>.<listcomp>)r3   r0   r   r0   r   Ú__dir__˜   s    zDADict.__dir__N)r   )r   r   r   Ú__doc__r!   r&   r   r.   r1   r2   r3   r4   r6   r8   r;   r=   r>   r@   Ú__bool__rD   rH   r   r   r   r   r   9   s$   
	
r   )rI   Ú
__future__r   r   Zscapy.errorr   Zscapy.libs.sixZlibsr'   Zscapy.compatr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   s   (