o
    ¹­§iS  ã                   @   sF   d dl Z d dlZd dlmZmZmZ d dlZd dlZG dd„ dƒZ	dS )é    N)ÚIteratorÚOptionalÚTuplec                   @   s  e Zd ZdZd*dedefdd„Zdefdd	„Zd
edefdd„Zd+dedefdd„Z	defdd„Z
defdd„Zdefdd„Zdefdd„Zdefdd„Zdedefdd„Zd,ded  dd fd!d"„Zd#eddfd$d%„Zejd
edefd&d'„ƒZejdefd(d)„ƒZdS )-ÚParserz)Helper class for parsing DNS wire format.r   ÚwireÚcurrentc                 C   s0   || _ d| _t| j ƒ| _|r|  |¡ || _dS )a  Initialize a Parser

        *wire*, a ``bytes`` contains the data to be parsed, and possibly other data.
        Typically it is the whole message or a slice of it.

        *current*, an `int`, the offset within *wire* where parsing should begin.
        r   N)r   r   ÚlenÚendÚseekÚfurthest)Úselfr   r   © r   ú?/home/app/Keep/.python/lib/python3.10/site-packages/dns/wire.pyÚ__init__   s   

zParser.__init__Úreturnc                 C   s   | j | j S ©N)r	   r   ©r   r   r   r   Ú	remaining   s   zParser.remainingÚsizec                 C   sX   |dksJ ‚||   ¡ krtjj‚| j| j| j| … }|  j|7  _t| j| jƒ| _|S ©Nr   )r   ÚdnsÚ	exceptionÚ	FormErrorr   r   Úmaxr   )r   r   Úoutputr   r   r   Ú	get_bytes    s   zParser.get_bytesé   Úlength_sizec                 C   s   t  |  |¡d¡}|  |¡S )NÚbig©ÚintÚ
from_bytesr   )r   r   Úlengthr   r   r   Úget_counted_bytes)   s   
zParser.get_counted_bytesc                 C   s   |   |  ¡ ¡S r   )r   r   r   r   r   r   Úget_remaining-   s   zParser.get_remainingc                 C   ó   t  d|  d¡¡d S )Nz!Br   r   ©ÚstructÚunpackr   r   r   r   r   Ú	get_uint80   ó   zParser.get_uint8c                 C   r%   )Nz!Hé   r   r&   r   r   r   r   Ú
get_uint163   r*   zParser.get_uint16c                 C   r%   )Nz!Ié   r   r&   r   r   r   r   Ú
get_uint326   r*   zParser.get_uint32c                 C   s   t  |  d¡d¡S )Né   r   r   r   r   r   r   Ú
get_uint489   s   zParser.get_uint48Úformatc                 C   s   t  ||  t  |¡¡¡S r   )r'   r(   r   Úcalcsize)r   r1   r   r   r   Ú
get_struct<   s   zParser.get_structNÚoriginzdns.name.Namec                 C   s   t j | ¡}|r| |¡}|S r   )r   ÚnameZfrom_wire_parserZ
relativize)r   r4   r5   r   r   r   Úget_name?   s   
zParser.get_nameÚwherec                 C   s$   |dk s	|| j krtjj‚|| _d S r   )r	   r   r   r   r   )r   r7   r   r   r   r
   E   s   
zParser.seekc                 c   sd    |dksJ ‚||   ¡ krtjj‚| j}z| j| | _d V  | j| jkr(tjj‚W || _d S || _w r   )r   r   r   r   r	   r   )r   r   Z	saved_endr   r   r   Úrestrict_toL   s   €ÿzParser.restrict_toc                 c   s"    z
d V  W | j | _d S | j | _w r   )r   r   r   r   r   r   Úrestore_furthest]   s   €zParser.restore_furthest)r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úbytesr    r   r   r   r#   r$   r)   r,   r.   r0   Ústrr   r3   r   r6   r
   Ú
contextlibÚcontextmanagerr   r8   r9   r   r   r   r   r      s$    	r   )
r@   r'   Útypingr   r   r   Zdns.exceptionr   Zdns.namer   r   r   r   r   Ú<module>   s   