
    %j8                        d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZmZmZ ddl dd	lmZ d
ZdZddZ G d de      Z G d de      Zy)z3Created on Fri May 06 2022 10:58:29 by codeskyblue
    )annotationsN)IteratorListOptionalUnion)
deprecated)adb_path)AdbConnectionErrorAdbError
AdbTimeout)*)__version__s   OKAYs   FAILc                B   t        j                          }	 |j                  d       |j                  | |f       	 |j                          y# t         j                  t         j
                  f$ r}Y d}~|j                          yd}~ww xY w# |j                          w xY w)z Returns if server is running g?TNF)socket
settimeoutconnectclosetimeouterror)hostportses       Q/var/www/oz-panel.ru/ozpay-pub/venv/lib/python3.12/site-packages/adbutils/_adb.py_check_serverr      ss    A	R			4, 	
	 NNFLL) 		 	
	s#   $A #B	/B B		B Bc                      e Zd ZddZd Zd Zedd       Zd Zd Z	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ZddZdddZd Zy) AdbConnectionc                J    || _         || _        | j                         | _        y N)_AdbConnection__host_AdbConnection__port_safe_connect_AdbConnection__conn)selfr   r   s      r   __init__zAdbConnection.__init__,   s     ((*    c                   | j                   }| j                  }t        j                         }|j                  t        j                  t        j
                  d       t        j                         }|dk(  r|j                  t        j                  t        j                  d       |j                  t        j                  t        j                  d       |j                  t        j                  t        j                  d       	 |j                  d       |j                  ||f       |j                  d        |S # t        j                  $ r}t        d      d }~wt        j                   $ r}t#        d|z        d }~ww xY w)N   Linux
      connect to adb server timeoutz connect to adb server failed: %s)r    r!   r   
setsockopt
SOL_SOCKETSO_KEEPALIVEplatformsystemIPPROTO_TCPTCP_KEEPIDLETCP_KEEPCNTTCP_KEEPINTVLr   r   r   r   r   r
   )r$   adb_hostadb_portr   sys_platformr   s         r   _create_socketzAdbConnection._create_socket1   s   ;;;;MMO	V&&(;(;Q?(7"LL++V-@-@"ELL++V-?-?CLL++V-A-A2F	MLLOIIx*+LLH~~ 	><==|| 	M$%G!%KLL	Ms$   6D: :FEF.E<<Fc                   	 | j                         S # t        $ r Y nt        $ r Y nw xY wt        j                  dk(  rt
        j                  nd}t        j                  t               dgd|       | j                         S )Nntr   zstart-serverg      4@)r   creationflags)	r9   r   r
   osname
subprocessCREATE_NO_WINDOWrunr	   )r$   flagss     r   r"   zAdbConnection._safe_connectG   sq    	&&(( 	! 		/1ww$
++A
N3TQVW""$$s    	(((c                    | j                   d u S r   )r#   r$   s    r   closedzAdbConnection.closedR   s    {{d""r&   c                    | j                   y 	 | j                   j                  t        j                         t	        j
                  d       | j                   j                          d | _         y # t        $ r Y -w xY w)Ng{Gz?)r#   shutdownr   SHUT_WRtimesleepOSErrorr   rD   s    r   r   zAdbConnection.close[   sc    ;;	KK  0JJt 	  		s   >A/ /	A;:A;c                    | S r    rD   s    r   	__enter__zAdbConnection.__enter__h   s    r&   c                $    | j                          y r   )r   )r$   exc_typeexc	tracebacks       r   __exit__zAdbConnection.__exit__k   s    

r&   c                H    | j                   t        d      | j                   S )NzConnection is closed)r#   r   rD   s    r   connzAdbConnection.connn   s"    ;;122{{r&   c                8    | j                   j                  |      S )z alias of conn.send(data) )rU   sendr$   datas     r   rW   zAdbConnection.sendt   s    yy~~d##r&   c                ~    	 | j                   j                  |      S # t        j                  $ r t	        d      w xY w)z alias of conn.recv(n) zadb recv timeout)rU   recvr   r   r   r$   ns     r   r[   zAdbConnection.recvx   s9    	199>>!$$~~ 	1/00	1s    <c                j    	 | j                  |      S # t        j                  $ r t        d      w xY w)Nadb read timeout)_read_fullyr   r   r   r\   s     r   readzAdbConnection.read   s7    	1##A&&~~ 	1/00	1s    2c                P    | j                  d      }t        j                  |d      S )N   little)ra   int
from_bytesrX   s     r   read_uint32zAdbConnection.read_uint32   s     yy|~~dH--r&   c                    |}d}|dkD  r9| j                   j                  |      }|s	 |S ||z  }|t        |      z
  }|dkD  r9|S )Nr&   r   )rU   r[   len)r$   r]   tbufferchunks        r   r`   zAdbConnection._read_fully   sZ    !eIINN1%E  eOFCKA !e r&   c                    	 | j                  |      }t	        |      |k  rt        d| dt	        |             |S # t        j                  $ r t        d      w xY w)Nr_   z	Expected z bytes, got )r`   r   r   r   ri   EOFErrorr$   r]   rY   s      r   
read_exactzAdbConnection.read_exact   sf    	1##A&D t9q=Yqcc$i[ABB	 ~~ 	1/00	1s	   = Ac                    |j                  d      }| j                  j                  dj                  t	        |            j                  d      |z          y )Nutf-8z{:04x})encoderU   rW   formatri   )r$   cmd	cmd_bytess      r   send_commandzAdbConnection.send_command   s=    JJw'			xs9~6==gFRSr&   c                J    | j                  |      j                  dd      }|S )Nrr   replaceerrorsra   decodero   s      r   read_stringzAdbConnection.read_string   s$    yy|""79"=r&   c                x    | j                  d      }|st        d      t        |d      }| j                  |      S )z.
        Raises:
            AdbError
        rc   zconnection closed   )r~   r   re   )r$   lengthsizes      r   read_string_blockzAdbConnection.read_string_block   s?    
 !!!$.//62%%r&   c                j    d}	 | j                  d      }|sn||z  }|r|j                  |d      S |S )zp
        read until connection close
        :param encoding: default utf-8, if pass None, return bytes
        r&   i   ry   rz   r|   )r$   encodingcontentrl   s       r   read_until_closezAdbConnection.read_until_close   sK    
 IIdOEuG	 
 >Fw~~hy~9R7Rr&   c                    | j                  d      }|t        k(  rt        | j                               |t        k(  ry t        d|z        )Nrc   zUnknown data: %r)ra   _FAILr   r   _OKAYrX   s     r   
check_okayzAdbConnection.check_okay   sE    yy|5=411344U])D011r&   N)r   strr   re   )returnbool)r   zsocket.socket)rY   bytesr   re   )r]   re   r   r   r   re   )ru   r   )r]   re   r   r   r   r   )rr   )r   z
str | Noner   zUnion[str, bytes])__name__
__module____qualname__r%   r9   r"   propertyrE   r   rN   rS   rU   rW   r[   ra   rg   r`   rp   rw   r~   r   r   r   rM   r&   r   r   r   +   s    +
M,	% # #  
$11.	T	&S2r&   r   c                      e Zd Z	 	 	 d	 	 	 	 	 ddZedd       Zedd       ZdddZd Zd Z	dddZ
ddd	Zd d!d
Zd"dZd#dZd$dZdd%dZd dZ eddde      d d       Z eddde      d&d       Zy)'
BaseClientNc                    |s t         j                  j                  dd      }|s)t        t         j                  j                  dd            }|| _        || _        || _        y)z
        Args:
            host (str): default value from env:ANDROID_ADB_SERVER_HOST
            port (int): default value from env:ANDROID_ADB_SERVER_PORT
        ANDROID_ADB_SERVER_HOSTz	127.0.0.1ANDROID_ADB_SERVER_PORTi  N)r=   environgetre   _BaseClient__host_BaseClient__port_BaseClient__socket_timeout)r$   r   r   socket_timeouts       r   r%   zBaseClient.__init__   sO     ::>>";[IDrzz~~&?FGD .r&   c                    | j                   S r   )r   rD   s    r   r   zBaseClient.host       {{r&   c                    | j                   S r   )r   rD   s    r   r   zBaseClient.port   r   r&   c                    |xs | j                   }	 t        | j                  | j                        }|r|j                  j                  |       |S # t        $ r t        d      w xY w)zO connect to adb server
        
        Raises:
            AdbTimeout
        r,   )r   r   r   r   rU   r   TimeoutErrorr   )r$   r   _conns      r   make_connectionzBaseClient.make_connection   sb     2T22	>!$++t{{;E

%%g.L 	><==	>s   >A A&c                    | j                         5 }|j                  d       |j                          t        |j	                         d      cddd       S # 1 sw Y   yxY w)z? 40 will match 1.0.40
        Returns:
            int
        zhost:versionr   N)r   rw   r   re   r   r$   cs     r   server_versionzBaseClient.server_version   sO    
 !!# 	2qNN>*LLNq**,b1	2 	2 	2s   ;AAc                    t        | j                  | j                        r;| j                         5 }|j	                  d       |j                          ddd       yy# 1 sw Y   yxY w)zP
        adb kill-server

        Send host:kill if adb-server is alive
        z	host:killN)r   r   r   r   rw   r   r   s     r   server_killzBaseClient.server_kill   sX     dkk2%%' 1{+  3 s   "AA&c                X   | j                  |      5 }g }|r|j                  d|g       n|j                  d       |j                  d|z   dz   |z          |j                  dj	                  |             |j                          |j                          ddd       y# 1 sw Y   yxY w)a~   Same as wait-for-TRANSPORT-STATE
        Args:
            serial (str): device serial [default None]
            transport (str): {any,usb,local} [default any]
            state (str): {device,recovery,rescue,sideload,bootloader,disconnect} [default device]
            timeout (float): max wait time [default 60]
        
        Raises:
            AdbError, AdbTimeout
        r   host-serialr   z	wait-for--:N)r   extendappendrw   joinr   )r$   serial	transportstater   r   cmdss          r   wait_forzBaseClient.wait_for  s     !!'!2 		aD]F34F#KKi/#5=>NN388D>*LLNLLN		 		 		s   BB  B)c                    | j                  |      5 }|j                  d|z          |j                          |j                         cddd       S # 1 sw Y   yxY w)a   adb connect $addr
        Args:
            addr (str): adb remote address [eg: 191.168.0.1:5555]
            timeout (float): connect timeout

        Returns:
            content adb server returns
        
        Raises:
            AdbTimeout

        Example returns:
            - "already connected to 192.168.190.101:5555"
            - "unable to connect to 192.168.190.101:5551"
            - "failed to connect to '1.2.3.4:4567': Operation timed out"
        r   zhost:connect:N)r   rw   r   r   )r$   addrr   r   s       r   r   zBaseClient.connect%  sR    " !!'!2 	)aNN?T12LLN&&(	) 	) 	)s   4AAc                    	 | j                         5 }|j                  d|z          |j                          |j                         cddd       S # 1 sw Y   yxY w# t        $ r |r Y yw xY w)a   adb disconnect $addr
        Returns:
            content adb server returns

        Raises:
            when raise_error set to True
                AdbError("error: no such device '1.2.3.4:5678')

        Example returns:
            - "disconnected 192.168.190.101:5555"
        zhost:disconnect:N)r   rw   r   r   r   )r$   r   raise_errorr   s       r   
disconnectzBaseClient.disconnect;  sl    	%%' -11D89**,- - -  	 	s.   A 4A	A AA A A+*A+c              #  
  K   g }| j                         5 }|j                  d       |j                          	 |j                         }| j	                  |      }| j                  ||      D ]  }|  |}?# 1 sw Y   yxY ww)aT  
        Report device state when changes

        Args:
            limit_status: eg, ['device', 'offline'], empty means all status

        Returns:
            Iterator[DeviceEvent], DeviceEvent.status can be one of ['device', 'offline', 'unauthorized', 'absent']

        Raises:
            AdbError when adb-server was killed
        zhost:track-devicesN)r   rw   r   r   _output2devices_diff_devices)r$   orig_devicesr   outputcurr_devicesevents         r   track_deviceszBaseClient.track_devicesP  s      !!# 	,qNN/0LLN,,.#33F;!//lK  EK + 	, 	,s   BA"A77B <Bc                    g }|j                         D ]S  }|j                         j                  dd      }t        |      dk7  r3|\  }}|j	                  t        d ||             U |S )N	r(   )maxsplit   )
splitlinesstripsplitri   r   DeviceEvent)r$   r   deviceslinefieldsr   statuss          r   r   zBaseClient._output2devicesi  sn    %%' 	>DZZ\''q'9F6{a#NFFNN;tVV<=	> r&   c              #     K   t        |      j                  |      D ]  }t        d|j                  d        t        |      j                  |      D ]%  }t        d|j                  |j                         ' y w)NFabsentT)set
differencer   r   r   )r$   origcurrds       r   r   zBaseClient._diff_devicess  sl     T%%d+ 	9AeQXXx88	9T%%d+ 	8AdAHHahh77	8s   A<A>c                   | j                         5 }d}|rdj                  |      }|j                  |       |j                          |j	                         }g }|j                         D ]C  }|j                         }t        |      dk7  r"|r	|d   |k7  r-|j                  t        |        E |cd d d        S # 1 sw Y   y xY w)Nzhost:list-forwardzhost-serial:{}:list-forwardr+   r   )
r   rt   rw   r   r   r   r   ri   r   ForwardItem)r$   r   r   list_cmdr   itemsr   partss           r   forward_listzBaseClient.forward_listy  s    !!# 	q*H8??GNN8$LLN))+GE**, 2

u:?eAh&0[%012 	 	 	s   B B;;Cc                   | j                         5 }d|dg}|r|j                  d       |j                  |dz   |z          |j                  dj                  |             |j	                          ddd       y# 1 sw Y   yxY w)z
        Args:
            serial (str): device serial
            local, remote (str): tcp:<port> or localabstract:<name>
            norebind (bool): fail if already forwarded when set to true

        Raises:
            AdbError
        r   forwardnorebind;r   N)r   r   rw   r   r   )r$   r   localremoter   r   r   s          r   r   zBaseClient.forward  st     !!# 	q!695DJ'KKf,-NN388D>*LLN	 	 	s   A A::Bz0.15.0z1.0.0zuse Device.reverse instead)deprecated_in
removed_indetailscurrent_versionc                
   | j                         5 }|j                  d|z          |j                          d|dz   |z   g}|j                  dj                  |             |j                          ddd       y# 1 sw Y   yxY w)z
        Args:
            serial (str): device serial
            remote, local (str): tcp:<port> or localabstract:<name>
            norebind (bool): fail if already reversed when set to true

        Raises:
            AdbError
        host:transport:zreverse:forwardr   r   N)r   rw   r   r   )r$   r   r   r   r   r   r   s          r   reversezBaseClient.reverse  sr     !!# 	qNN,v56LLN%v|e';<DNN388D>*LLN	 	 	s   AA99Bzuse Device.reverse_list insteadc           	        | j                         5 }|j                  d|z          |j                          |j                  d       |j                          |j                         }g }|j	                         D ];  }|j                         }t        |      dk7  r"|j                  t        |dd          = |cd d d        S # 1 sw Y   y xY w)Nr   zreverse:list-forwardr+   r(   )	r   rw   r   r   r   r   ri   r   ReverseItem)r$   r   r   r   r   r   r   s          r   reverse_listzBaseClient.reverse_list  s    
 !!# 	qNN,v56LLNNN12LLN))+GE**, 6

u:?[%)45	6
 	 	 	s   B'CC)NNN)r   Optional[str]r   zOptional[int]r   Optional[float]r   r   r   )r   r   r   r   )Nanydevice<   )r   r   r   r   r   r   r   float)r   r   r   r   r   r   )F)r   r   r   r   r   r   )r   zIterator[DeviceEvent])r   r   )r   typing.List[DeviceEvent]r   r   )r   zUnion[None, str]r   zList[ForwardItem])r   r   r   zList[ReverseItem])r   r   r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   r&   r   r   r      s     #"*.	// / (	/&    >2	>),*,28$$ h"4 +-	-" h"9 +-	-r&   r   )r   r   r   re   r   r   )__doc__
__future__r   ior=   r0   r   r?   rI   typingr   r   r   r   deprecationr   adbutils._utilsr	   adbutils.errorsr
   r   r   adbutils._protoadbutils._versionr   r   r   r   objectr   r   rM   r&   r   <module>r     sh    # 	 	      2 2 " $ D D  )
X2F X2v} }r&   