o
    j                     @   sn   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ G dd	 d	ejZdS )
    N)REGCMDPathCompleter)aiocmd)logger)AIOWinRegHive)REGTYPE)AFilec                   @   s   e Zd Zdd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dZdd Zdd Zdd Zdd ZdS )!WinRegReaderConsoleNc                 C   s>   t jj| dd d | _|| _d | _d | _d | _g | _g | _	d S )NF)ignore_sigint)
r   PromptToolkitCmd__init__filenamefilepath
filehandlehive"_WinRegReaderConsole__current_path'_WinRegReaderConsole__current_path_keys'_WinRegReaderConsole__current_path_vals)selfr    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiowinreg/examples/console.pyr      s   
zWinRegReaderConsole.__init__c              
      s   zI| j dur| j   |du r| jdu rtd|dur || _t| j| _t| j| _ t| j | _	d| _
d| j | _td | dI dH  W dS  tyl } zt  tdt|  d|fW  Y d}~S d}~ww )	zOpens a hive fileNzNo filepath specified! z[%s][ROOT]> zFile opened!TNzOpen failed! Reason: %sF)r   closer   	Exceptionntpathbasenamer   r   r   r   r   promptprintdo_cd	traceback	print_excstr)r   r   er   r   r   do_open   s,   

zWinRegReaderConsole.do_openc              
      s~   z| j | jI dH D ]}td| j| j|f  qW dS  ty> } zt  tdt|  d|fW  Y d}~S d}~ww )z"Lists all keys in the current pathNz[%s][ROOT\%s\%s]r   LS failed! Reason: %sF)	r   enum_keyr   r   r   r   r   r    r!   r   keyr"   r   r   r   do_ls,   s   zWinRegReaderConsole.do_lsc              
      sv   z| j | jI dH }| | j|I dH  W dS  ty: } zt  tdt|  d|fW  Y d}~S d}~ww )z$Lists all values in the current pathNr   zLSVAL failed! Reason: %sF)	r   find_keyr   _WinRegReaderConsole__lsvalr   r   r    r   r!   r&   r   r   r   do_lsval8   s   zWinRegReaderConsole.do_lsvalc              
      s"  zm| j |I d H D ]`}| }|d | }| j j||dI d H }|\}}|tjkr8td| j||| f  |tj	krTt
|D ]\}}	td| j||j||	f  qAq|}
t|tr_|
 }
td| j||j|
f  qW dS  ty } zt  tdt|  d|fW  Y d }~S d }~ww )N\r'   z[%s][ROOT\%s][%s] %sz[%s][ROOT\%s][%s][%s] %sr   zLSVAL inner failed! Reason: %sF)r   list_valuesdecode	get_valuer   REG_UNKNOWNr   r   hexREG_MULTI_SZ	enumeratename
isinstancebytesr   r   r    r!   )r   basepathr'   	valuename	valuepathres	valuetypevalueivaltr"   r   r   r   __lsvalC   s0   


zWinRegReaderConsole.__lsvalc              
      sj   z| j | jI dH }t| W dS  ty4 } zt  tdt|  d|fW  Y d}~S d}~ww )z!Reads classes in the current pathNr   zCLASS failed! Reason: %sF)r   	get_classr   r   r   r   r    r!   )r   clr"   r   r   r   do_class[   s   zWinRegReaderConsole.do_classc              
      s   z| j | jI dH }| j |I dH }t|  W dS  ty? } zt  tdt	|  d|fW  Y d}~S d}~ww )z-Reads security descriptor in the current pathNr   zSD failed! Reason: %sF)
r   r)   r   get_sdr   to_sddlr   r   r    r!   )r   r'   sdr"   r   r   r   do_sdf   s   zWinRegReaderConsole.do_sdc              
      sj  z|dkr	W dS | j dkr|dkrtd W dS || _ n3|dkr8| j ddkr-d| _ n#| j ddd	 | _ n|dd
u rI|  j d| 7  _ n|  j |7  _ g | _| j| j I dH D ]}| j| q]g | _	| j
| j I dH }| j|I dH D ]
}| j	|  q|d| j| j f | _W dS  ty } zt  tdt|  d
|fW  Y d}~S d}~ww )zChanges the current path.r   r   z..zYou are in root!r,      r   FNz[%s][ROOT\%s]> r$   )r   r   findsplit
startswithr   r   r%   appendr   r)   r.   r/   r   r   r   r   r    r!   )r   pathr'   tkeyvalnamer"   r   r   r   r   s   s>   
zWinRegReaderConsole.do_cdc           
   
      s"  zm| j | jI dH }|du rtd W dS | j j||dI dH }|du r-td W dS |\}}|tjkr>td||f  |tjkrXt|D ]\}}td|||f  qGW dS |}t	|t
rc| }td|j|f  W dS  ty }	 zt  td	t|	  d
|	fW  Y d}	~	S d}	~	ww )z!Reads a value in the current pathNzKey not found!)FNr-   zValue not found!z%s: %sz
%s[%s]: %sr   zCAT failed! Reason: %sF)r   r)   r   r   r0   r   r1   r3   r4   r6   r7   r2   r5   r   r   r    r!   )
r   r9   r'   r;   r<   r=   r>   r?   r@   r"   r   r   r   do_cat   s8   


zWinRegReaderConsole.do_catrK   c              
      s   z7| j j| j|d2 z)3 dH W }td| j|f  | j |I dH }| ||I dH \}}|dur4|q6 W dS  tyZ } zt	  tdt
|  d|fW  Y d}~S d}~ww )z5Recursively lists keys and values in the current path)depthNz[%s][ROOT\%s]r   zWALK failed! Reason: %sF)r   walkr   r   r   r)   r*   r   r   r    r!   )r   rT   keypathr'   _errr"   r   r   r   do_walk   s"   zWinRegReaderConsole.do_walkc                 C      | j d u rg S t| jS N)r   listr   r   r   r   r   get_current_keys      

z$WinRegReaderConsole.get_current_keysc                 C   rZ   r[   )r   r\   r   r]   r   r   r   get_current_vals   r_   z$WinRegReaderConsole.get_current_valsc                 C      t | jdS N)get_current_dirs)r   r^   r]   r   r   r   _cd_completions      z#WinRegReaderConsole._cd_completionsc                 C   ra   rb   )r   r`   r]   r   r   r   _cat_completions   re   z$WinRegReaderConsole._cat_completionsr[   )rK   )__name__
__module____qualname__r   r#   r(   r+   r*   rD   rH   r   rS   rY   r^   r`   rd   rf   r   r   r   r   r      s    


)
r   )r   r   #aiowinreg.utils.regcmdpathcompleterr    aiowinreg.external.aiocmd.aiocmdr   	aiowinregr   aiowinreg.ahiver   aiowinreg.filestruct.vkr   aiowinreg.utils.afiler   r
   r   r   r   r   r   <module>   s   