
    *f'1                        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 d dl	m
Z
 d dlmZmZ  ej                  e      Z e       Z e       ZdZg ZdZdZdZ G d d	e      Z G d
 de      Zd Zd Z G d de      Zy)    N)Lock)xauth)get_helptextplatform_is_osxi  
   皙?c                       e Zd Zy)XStartTimeoutErrorN__name__
__module____qualname__     ]/var/www/html/flask-app/venv/lib/python3.12/site-packages/pyvirtualdisplay/abstractdisplay.pyr
   r
           r   r
   c                       e Zd Zy)XStartErrorNr   r   r   r   r   r   $   r   r   r   c                  ~   d} 	 t        j                  |       }d}t        j                  ||      }|D cg c]"  }t         j                  j                  | |      $ }}|D cg c]$  }t         j                  j                  |      s#|& }}|S # t        $ r t        j	                  d       g cY S w xY wc c}w c c}w )Nz/tmpzmissing /tmpz.X*-lock)
oslistdirFileNotFoundErrorlogwarningfnmatchfilterpathjoinisfile)tmpdirlspatternnameschildps         r   _lock_filesr&   (   s    FZZ GNN2w'E38	9%"'',,vu
%	9B	9	-277>>!,!	-B	-I  N#	
 
:	-s"   B 'B5"$B:B: B21B2c                      t        t        d t                           } t        |       rt	        t
        t	        |       dz         }|S t
        }|S )Nc                 `    t        | j                  d      d   j                  d      d         S )NX   -r   )intsplit)xs    r   <lambda>z%_search_for_display.<locals>.<lambda>8   s'    CQ 5 5c :1 => r      )listmapr&   lenmax_MIN_DISPLAY_NR)r!   displays     r   _search_for_displayr7   6   sD    	c>N	OB
2wos2w{3 N "Nr   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zy)AbstractDisplayz8
    Common parent for X servers (Xvfb,Xephyr,Xvnc)
    c                    || _         || _        || _        d | _        d | _        d | _        d | _        d | _        d| _        || _	        d| _
        d | _        d| _        t        |      }d|v | _        | j                  st        j!                  d       t"        j$                  j'                  d      }|r0t        j!                  d|       t)        t+        |            | _        nt-               rd| _        | j/                  |       |r(t1        j2                         st1        j4                         || _        d | _        d | _        y )NFr   z
-displayfdz-displayfd flag is missing.PYVIRTUALDISPLAY_DISPLAYFDzPYVIRTUALDISPLAY_DISPLAYFD=%s)_extra_args_retries_programstdoutstderrold_display_var_subprocr6   _is_started_manage_global_env_reset_global_env	_pipe_wfd_retries_currentr   _has_displayfdr   debugr   environgetboolr,   r   _check_flagsr   is_installedNotFoundError
_use_xauth
_old_xauth_xauth_filename)selfprogram	use_xauthretries
extra_argsmanage_global_envhelptextr;   s           r   __init__zAbstractDisplay.__init__F   s   %# "3!& !(*h6""II34%'ZZ^^4P%Q"%II57QR"&s+E'F"GD  &+#(#U//1%%''##r   c                      y Nr   )rS   rY   s     r   rM   zAbstractDisplay._check_flagsl   s    r   c                     t               r\   )NotImplementedErrorrS   s    r   _cmdzAbstractDisplay._cmdo   s    !##r   c                 &   |r| j                   n| j                  }|(t        j                  d       	 t        j
                  d= yt        j                  d|       |t        j
                  d<   y# t        $ r t        j                  d       Y yw xY w)z
        on:
         * True -> set $DISPLAY to virtual screen
         * False -> set $DISPLAY to original screen

        :param on: bool
        Nzunset $DISPLAYDISPLAYz$DISPLAY was already unset.zset $DISPLAY=%s)new_display_varrA   r   rI   r   rJ   KeyErrorr   )rS   onds      r   _redirect_displayz!AbstractDisplay._redirect_displayr   sy     %'D  D,@,@9II&';JJy) II'+$%BJJy!	  ;9:;s   A/ /BBc                 `    t         j                  j                         }| j                  |d<   |S )Nrb   )r   rJ   copyrc   )rS   envs     r   _envzAbstractDisplay._env   s&    jjoo--I
r   c                    | j                   rt        | d      d| _         | j                  r| j                          nd}	 |dz   | _        	 | j                          	 | j                  r| j                  d       d| _        y	y	# t        $ rj t        j                  d|dz          t        j                  d       |dz  }|| j                  k\  r%t        d| j                  d| j                        Y nw xY w)
z5
        start display

        :rtype: self
        zDisplay was started twice.Tr   r*   zstart failed %s皙?zNo success after z retries. Last stderr: N)rC   r   rH   _start1_has_displayfdrG   _start1r   r   timesleepr=   r@   rD   rg   rE   )rS   is     r   startzAbstractDisplay.start   s     d$@AA&&(A()A%LLN """"4(%)D" # # KK 11q59JJt$FADMM))#}}dkk;  *	 s   B A0C54C5c                 h   t         5  |rQt        j                  | j                  | j                  gt        j
                  t        j
                  d      | _        nDt        j                  | j                  t        j
                  t        j
                  d      | _        d d d        y # 1 sw Y   y xY w)NF)pass_fdsr?   r@   shell)r?   r@   rv   )_mutex_popen
subprocessPopen_commandrF   PIPErB   )rS   use_pass_fdss     r   _popenzAbstractDisplay._popen   s}     	 * 0 0MM"nn-%??%??! !+ 0 0MM%??%??	!	 	 	s   BB((B1c                 F   t        j                         \  }| _        | j                         | j                  z   | _        t        j                  d| j
                         | j                  d       t        | j                  |            | _        t        j                  |       t        j                  | j                         dt        | j                        z  | _        | j                  r| j                          t         j                   j#                  dd       | _        y )Ncommand: %sTr|   :%srb   )r   piperF   r`   r<   rz   r   rI   r}   r,   _wait_for_pipe_textr6   closerc   rP   _setup_xauthrJ   rK   rA   )rS   rfds     r   rn   z%AbstractDisplay._start1_has_displayfd   s     ggiT^		d&6&66		-/&433C89

 $s4<<'88??  "zz~~i>r   c                    t         5  t               | _        | j                  t        v r(| xj                  dz  c_        | j                  t        v r(dt	        | j                        z  | _        t        j                  | j                         d d d        | j                         | j                  z   | _	        t        j                  d| j                         | j                  d       dt	        | j                        z  | _        | j                  r| j                          t        j                   j#                  dd       | _        t'        j&                         }| j
                  }d}t'        j(                  d       	 | j+                         sn	 t-        j.                  d	g| j1                         t,        j2                  t,        j2                  d
      }|j5                         \  }}|j6                  }|dk7  rnt        j?                  d|       d}n9t'        j&                         |z
  t@        k\  rnt'        j(                  tB               | j+                         s0t        j;                  d| jD                         d}tG        || z        |sd}tI        ||jD                  fz        y # 1 sw Y   !xY w# t8        $ r3 t        j;                  d       t'        j(                  t<               d}Y w xY w)Nr*   r   r   Fr   rb   rm   Txdpyinfo)rj   r?   r@   rv   zLxdpyinfo was not found, X start can not be checked! Please install xdpyinfo!r   z)Successfully started X with display "%s".zprocess exited early. stderr:%szFailed to start process: %szGFailed to start X on display "%s" (xdpyinfo check failed, stderr:[%s]).)%_mutexr7   r6   _USED_DISPLAY_NR_LISTr,   rc   appendr`   r<   rz   r   rI   r}   rP   r   r   rJ   rK   rA   rp   rq   is_aliverx   ry   rk   r{   communicate
returncoder   r   _X_START_WAITinfo_X_START_TIMEOUT_X_START_TIME_STEPr@   r   r
   )rS   
start_timerf   okr   _	exit_codemsgs           r   ro   zAbstractDisplay._start1   sZ    	7.0DL,,"77! ,,"77#(3t||+<#<D !((6	7 		d&6&66		-/'$s4<<'88??  "zz~~i> YY[
  

4==?%++L		%??%??  ++-1$//	* A~DaHyy{Z'+;;JJ)*W X }}KK94;;G/CcDj))[C$SAx+?%?@@ Y	7 	7T % b 

=)s%   A	J,<J,A$J9 ,J699K54K5c                    d}t        j                          }	 t        j                  |gg g d      \  }}}| j                         s1t        | j                  d| j
                  d| j                        ||v r2t        j                  |d      }|dk(  r	 |S ||j                  d      z  }t        j                          |z
  dk\  r%t        d	| j                  d
| j
                        )N r   z program closed. command: z	 stderr: r*      
asciiiX  zNo reply from program z
. command:)rp   selectr   r   r>   rz   r@   r   readdecoder
   )rS   r   sr   rfd_changed_lsr   cs          r   r   z#AbstractDisplay._wait_for_pipe_text#  s    YY[
%+]]C5"b#%F"^Q==?!}}dmmT[[B  n$GGCO:  QXXg&& yy{Z'3.(   r   c                    | j                   st        d      | j                  r| j                  d       | j	                         rE	 | j
                  j                          | j
                  j                          | j                          | j                  r| j                          | S # t        $ r }t        j                  d|       Y d}~ld}~ww xY w)z4
        stop display

        :rtype: self
        z stop() is called before start().Fzexception in terminate:%sN)rC   r   rE   rg   r   rB   killOSErrorr   rI   wait_read_stdout_stderrrP   _clear_xauth)rS   oserrors     r   stopzAbstractDisplay.stop>  s     @AA!!""5)==?@""$ MM $$&??  @		5w??@s   B( (	C1CCc                     | j                   h| j                  j                         \  | _         | _        t        j                  d| j                          t        j                  d| j                         y y )Nz	stdout=%sz	stderr=%s)r?   rB   r   r@   r   rI   r_   s    r   r   z#AbstractDisplay._read_stdout_stderrV  sP    ;;)-)B)B)D&T[$+IIk4;;/IIk4;;/	 r   c                    t        j                  dd      \  }}|| _        t        j                  |       i | _        t        j                  d      | j
                  d<   t        j                  d      | j
                  d<   |xt        j                  d<   t        j                  d<   t        j                         }t        j                  d| j                  d|       y)	zU
        Set up the Xauthority file and the XAUTHORITY environment variable.
        zPyVirtualDisplay.z.Xauthority)prefixsuffixAUTHFILE
XAUTHORITYadd.N)tempfilemkstemprR   r   r   rQ   getenvrJ   r   generate_mcookiecallrc   )rS   handlefilenamecookies       r   r   zAbstractDisplay._setup_xauth]  s     $++&}
  (
&(ii
&;
#(*		,(?%<DD

:L!9'')

5$..V<r   c                     t        j                  | j                         dD ]C  }| j                  |   t         j                  |= $| j                  |   t         j                  |<   E d| _        y)zR
        Clear the Xauthority file and restore the environment variables.
        )r   r   N)r   removerR   rQ   rJ   )rS   varnames     r   r   zAbstractDisplay._clear_xautho  s`     			$&&'1 	?Gw'/JJw'&*oog&>

7#		?
 r   c                 &    | j                          | S )%used by the :keyword:`with` statement)rs   r_   s    r   	__enter__zAbstractDisplay.__enter__{  s    

r   c                 $    | j                          y)r   N)r   )rS   exc_infos     r   __exit__zAbstractDisplay.__exit__  s    		r   c                 |    | j                   sy| j                   j                         }|| j                          |d u S )NF)rB   pollr   )rS   rcs     r   r   zAbstractDisplay.is_alive  s9    }}]]!>$$&Tzr   c                 H    | j                   r| j                   j                  S y)zI
        PID (:attr:`subprocess.Popen.pid`)

        :rtype: int
        N)rB   pidr_   s    r   r   zAbstractDisplay.pid  s      ====$$$ r   N)r   r   r   __doc__rZ   rM   r`   rg   rk   rs   r}   rn   ro   r   r   r   r   r   r   r   r   propertyr   r   r   r   r9   r9   A   su    $$L$&&
*@$?,OAb600=$

( % %r   r9   )r   loggingr   r   rx   r   rp   	threadingr   pyvirtualdisplayr   pyvirtualdisplay.utilr   r   	getLoggerr   r   r   rw   r5   r   r   r   r   	Exceptionr
   r   r&   r7   objectr9   r   r   r   <module>r      s      	      " ?g! 
v    	 		) 	_%f _%r   