3
NZQ                 @   s`  d Z dZdZd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ZddlmZmZ ddlT ddlT ddlmZmZmZmZmZmZmZ dd	lmZ dd
lmZ yddlmZmZmZ ddl Zddl!m"Z" er(y ddl#m$Z$m%Z%m&Z&m'Z'm(Z( W n(   ddl)m$Z$m%Z%m&Z&m'Z'm(Z( Y nX nddl*m$Z$m%Z%m&Z&m'Z'm(Z( dZ+W n. e,k
rx   e-j.d dZ+ej/d Y nX ddl0Z0e0j1de2 dZ3d8\a4a5da6da7d9\a8a9a:i Z;G dd de<Z=G dd dej>j?Z@dd ZAdd ZBdd ZCdd ZDd d! ZEd"d# ZFd$d% ZGd:d&d'ZHd(d) ZId;d*d+ZJd,d- ZKd<d.d/ZLd0d1 ZMd2d3 ZNd4d5 ZOd=d6d7ZPdS )>z12.0z9Services and Status System Tray dBus Child/Parent ProcessZhpssdzProvides persistent data and event services to HPLIP client applications. Required to be running for PC send fax, optional in all other cases.    N)loadsHIGHEST_PROTOCOL)*)utilsdevicestatusmodelsmoduleservicesos_utils)PY3)to_bytes_utf8)lowlevel	SystemBus
SessionBus)DBusGMainLoop)MainLooptimeout_addthreads_initio_add_watchIO_INTzAdbus failed to load (python-dbus ver. 0.80+ required). Exiting...F   ignorei   c               @   s   e Zd ZdddZdS )DeviceCache c             C   sB   t jtj| _tj|| _i | _i | _	i | _
d| _d| _d| _d S )Nr   F)r   Z
RingBufferpropZhistory_sizehistoryr   ZnormalizeModelNamemodelcachefaxesdqZbackoff_counterZbackoff_countdownZpolling)selfr    r"   /usr/share/hplip/hpssd.py__init__X   s    zDeviceCache.__init__N)r   )__name__
__module____qualname__r$   r"   r"   r"   r#   r   W   s   r   c               @   s   e Zd Zdd Zejjdddddd Zejjddd	dd
d Zejjdddddd Z	ejjdddddd Z
ejjdddddd Zejjdddddd Zejjddddd#ddZdd Zejjddddd d! Zd"S )$StatusServicec             C   s   t jjj| || d S )N)dbusserviceObjectr$   )r!   nameZobject_pathr"   r"   r#   r$   f   s    zStatusService.__init__zcom.hplip.StatusServiceszsa(ssisisd))Zin_signatureZout_signaturec             C   s~   t jd|  t  yt|  W n tk
r8   |g fS X t| jj }t jdt|  dd |D  |dd |D fS d S )NzGetHistory('%s')z%d events in history:c             S   s   g | ]}|j  qS r"   )debug).0xr"   r"   r#   
<listcomp>v   s    z,StatusService.GetHistory.<locals>.<listcomp>c             S   s   g | ]}|j  qS r"   )as_tuple)r/   r0   r"   r"   r#   r1   w   s    )logr.   send_systray_blipdevicesKeyErrorr   getlen)r!   
device_urihr"   r"   r#   
GetHistoryj   s    
zStatusService.GetHistoryzsa{ss}c                sz   t jd|  t  yt|  W n tk
r8   |i fS X i t| j  fddt j D  t j |fS d S )NzGetStatus('%s')c                s    g | ]}j |t | qS r"   )
setdefaultstr)r/   r0   )r    tr"   r#   r1      s    z+StatusService.GetStatus.<locals>.<listcomp>)r3   r.   r4   r5   r6   r    listkeys)r!   r9   r"   )r    r>   r#   	GetStatusz   s    


zStatusService.GetStatusZssiic             C   s6   t jd|||f  t|tkr2|t| j|< |S dS )Nz!SetCachedIntValue('%s', '%s', %d)r   )r3   r.   check_deviceERROR_SUCCESSr5   r   )r!   r9   keyvaluer"   r"   r#   SetCachedIntValue   s
    zStatusService.SetCachedIntValueZssc             C   sD   yt | j| }W n tk
r*   d}Y nX tjd|||f  |S )Nr   z$GetCachedIntValue('%s', '%s') --> %drC   )r5   r   r6   r3   r.   )r!   r9   rF   retr"   r"   r#   GetCachedIntValue   s    
zStatusService.GetCachedIntValueZsssc             C   s6   t jd|||f  t|tkr2|t| j|< |S dS )Nz#SetCachedStrValue('%s', '%s', '%s')r   )r3   r.   rD   rE   r5   r   )r!   r9   rF   rG   r"   r"   r#   SetCachedStrValue   s
    zStatusService.SetCachedStrValuec             C   sD   yt | j| }W n tk
r*   d}Y nX tjd|||f  |S )Nr   z$GetCachedStrValue('%s', '%s') --> %s)r5   r   r6   r3   r.   )r!   r9   rF   rI   r"   r"   r#   GetCachedStrValue   s    
zStatusService.GetCachedStrValueZssisisdsr   c             C   s   t jd|||f  t  |dd||dddf}t| t| |r~yt| j||f  W n tk
rl   |S X | j|||S n:x4t	t| jj
 D ]\}}||kr| j|||S qW |S d S )Nz"CheckForWaitingFax('%s', '%s', %d)r   r   g        )r3   r.   r4   rD   show_waiting_faxesr5   r   r6   check_for_waiting_fax_returnr?   r@   )r!   r9   usernamejob_idrujr"   r"   r#   CheckForWaitingFax   s    z StatusService.CheckForWaitingFaxc             C   sD   t jd||f  t| j||f j }t| j||f= t| |S )NzFFax (username=%s, jobid=%d) removed from faxes and returned to caller.)r3   r.   r5   r   r2   rM   )r!   drR   rS   rQ   r"   r"   r#   rN      s
    z*StatusService.check_for_waiting_fax_returnZssisisr   c             C   s    t j||||||}t| d S )N)r   Eventhandle_event)r!   r9   printer_name
event_coderO   rP   titleeventr"   r"   r#   	SendEvent   s    zStatusService.SendEventN)r   )r%   r&   r'   r$   r)   r*   methodr;   rA   rH   rJ   rK   rL   rT   rN   r\   r"   r"   r"   r#   r(   e   s   

	r(   c       
      C   s   t st| } yt|   W nr tk
r   tjd|   y tj| \	}}}}}}}}}	W n" tk
rx   tjd|   t	S X t
|t| < Y nX tS )NzNew device: %szInvalid device URI: %s)r   r=   r5   r6   r3   r.   r   ZparseDeviceURIErrorZERROR_INVALID_DEVICE_URIr   rE   )
r9   Zback_endZis_hpZbusr   serialZdev_filehostZzcZportr"   r"   r#   rD      s     rD   c             C   s^   t | j jj }|rD|d j| jkrDtjd t | j jj|  dS t | j jj|  dS d S )Nr   z*Duplicate event. Replacing previous event.TFrC   )	r5   r9   r   r7   rY   r3   r.   replaceappend)r[   r   r"   r"   r#   create_history   s    
rc   c       
      C   s~  | j tko| jtjkrptjdd\}}tj|tj}d}x.tj	|t
}|sNP tj|| |t|7 }q<W tjd||f  tj| tj| tj|| t| j j| j| jf< t| j ytjdtj W n tk
r   Y nX tjd| j d\}}|rdtj| tjd}	|	r(tjj |	d}	ntj!d	 d S tjd
|	| jf  tj"tj#|	dd| j  n
tjd n
tj$d d S )Nzhpfax-)prefixr   zSaved %d bytes to file %sr   zhp-sendfax-%sTz
hp-sendfaxz"Unable to find hp-sendfax on PATH.z#Running hp-sendfax: %s --printer=%sz--printer=%sz=hp-sendfax is running. Waiting for CheckForWaitingFax() call.zNot handled!rC   )%rY   ZEVENT_FAX_RENDER_COMPLETErO   r   tempfileZmkstemposopenO_RDONLYreadPIPE_BUFwriter8   r3   r.   closer   ZFaxEventr5   r9   r   rP   rM   waitpidWNOHANGOSErrorr   Zlock_apprX   ZunlockwhichpathjoinerrorspawnlpP_NOWAITwarn)
r[   	pipe_nameZfax_file_fdZfax_file_namepipeZ
bytes_readdataokZ	lock_filerq   r"   r"   r#   handle_fax_event  sD    


 




r{   c                sj   t |  j t s"tjd|   nDt dkr>tjd|   ntjdt | f   fdd D  d S )NzNo faxes waiting for %sr   z1 fax waiting for %s:z%d faxes waiting for %s:c                s   g | ]} | j  qS r"   )r.   )r/   r0   )fr"   r#   r1   F  s    z&show_waiting_faxes.<locals>.<listcomp>)r5   r   r8   r3   r.   )rU   r"   )r|   r#   rM   ;  s    
rM   c       	      C   s   t jd|  dtd }}x^tjtgg tgd\}}}|s>P tjtt}|sPP tdj||g}|t	|7 }||krP qW t jd|  ||krt
|}t| jtkr|j t| j _ttj| jd|jdttjdd t| t d S )Nz#Reading %d bytes from hpdio pipe...r   r   g        zRead %d byteszstatus-code)r3   r.   r   selectr3rf   ri   rj   rr   r8   r   rD   r9   rE   copyr5   r    rW   r   rV   r7   ZSTATUS_PRINTER_IDLEr   rO   send_toolbox_eventEVENT_DEVICE_UPDATE_REPLY)	r[   bytes_writtenZ
total_readry   rQ   wer0   r    r"   r"   r#   handle_hpdio_eventJ  s*       r   c              C   s   t j } | dkrxtjd}|j  t j }ddlm} |j }|j	 t
krVtjd n
tjd |j  t j|tj n
tjd d S )Nr   z/tmp/pluginInstall.tmp)pluginhandlerzhp-diagnose_pluginzNDevice Plug-in was already installed. Not Invoking Plug-in installation wizardz#Started Plug-in installation wizard)rf   forkr   Z	Sync_LockacquiregetpidZ	installerr   ZPluginHandleZ	getStatusZPLUGIN_INSTALLEDr   Zexecuter3   r.   releasekillsignalSIGKILL)Zchild_processZlockObjZ	child_pidr   Z	pluginObjr"   r"   r#   handle_plugin_installg  s    

r   c              C   sP   t jd} | rtjj| d} ntjd d S tjd|   tjtj	| dd d S )Nzhp-diagnose_queuesz*Unable to find hp-diagnose_queues on PATH.zRunning hp-diagnose_queues: %sz-s)
r   rp   rf   rq   rr   r3   rs   r.   rt   ru   )rq   r"   r"   r#   handle_printer_diagnose|  s    

r   c             C   s  yt jdt j W n tk
r&   Y nX tjd |d kr>g }| j  | jtkrZt  d S | jt	krnt
  d S | jrt| jtkrd S | jtkrtj| j| _| jtk rnt| j  kotkn  rJ| jrt| }| jtttttfkrn(| jtttttttt t!t"t#t$t%t&fkr|s$t'|  t(| t) | jtt!t$fkrt  nPt*| j  ko`t+kn  r|rtjd t,|d }t-| | n| jt.krt'|  n| jt/krt'|  n| jt0fkrt1|  n| jt2t3fkrt'|  n| jt4krt5|d }t6| | n| jt7ks,| jt8kr@t'|  t(| t) nZ| jt9krxt1|  t(|  t'|  tjd t:j;  n"| jttfkrntj<d| j  d S )Nr   zHandling event...z	Fax eventr   ZExitingzUnhandled event: %d)=rf   rm   rn   ro   r3   r.   rY   ZEVENT_AUTO_CONFIGUREr   ZEVENT_DIAGNOSE_PRINTQUEUEr   r9   rD   rE   ZEVENT_MAX_EVENTr   ZMapPJLErrorCodeZEVENT_MIN_USER_EVENTZEVENT_MAX_USER_EVENTrc   ZEVENT_DEVICE_STOP_POLLINGZEVENT_START_MAINT_JOBZEVENT_START_COPY_JOBZEVENT_START_FAX_JOBZEVENT_START_PRINT_JOBZEVENT_DEVICE_START_POLLINGZEVENT_END_MAINT_JOBZEVENT_END_COPY_JOBZEVENT_END_FAX_JOBZEVENT_END_PRINT_JOBZ!EVENT_PRINT_FAILED_MISSING_PLUGINZEVENT_SCANNER_FAILZEVENT_END_SCAN_JOBZ EVENT_SCAN_FAILED_MISSING_PLUGINZEVENT_FAX_JOB_FAILZEVENT_FAX_JOB_CANCELEDZEVENT_FAX_FAILED_MISSING_PLUGINZEVENT_COPY_JOB_FAILZEVENT_COPY_JOB_CANCELEDsend_event_to_systray_uir   ZEVENT_HISTORY_UPDATEZEVENT_FAX_MINZEVENT_FAX_MAXr=   r{   Z EVENT_USER_CONFIGURATION_CHANGEDZEVENT_SYS_CONFIGURATION_CHANGEDZEVENT_DEVICE_UPDATE_REQUESTEDsend_event_to_hpdioZEVENT_DEVICE_UPDATE_ACTIVEZEVENT_DEVICE_UPDATE_INACTIVEr   intr   ZEVENT_CUPS_QUEUES_ADDEDZEVENT_CUPS_QUEUES_REMOVEDZEVENT_SYSTEMTRAY_EXIT	main_loopquitrs   )r[   Z	more_argsZ	dup_eventrw   r   r"   r"   r#   rW     s    







$








rW   c               C   s   t tjddt d S )Nr   )r   r   rV   ZEVENT_DEVICE_UPDATE_BLIPr"   r"   r"   r#   r4     s    r4   c             C   s&   | j  }|d k	r||_|jtd d S )NZ
systemtray)r   rY   send_via_pipew1)r[   rY   r   r"   r"   r#   r     s    r   c             C   s   | j td d S )NZhpdio)r   w2)r[   r"   r"   r#   r     s    r   c             C   s&   | j  }|d k	r||_|jtd d S )Nzcom.hplip.Toolbox)r   rY   Zsend_via_dbussession_bus)r[   rY   r   r"   r"   r#   r     s    r   c             O   s@   |d dkr<|d dkr<t j|d d  }t||dd  S d S )N	interfacezcom.hplip.StatusServicememberrV      )r   rV   rW   )typargskwdsr[   r"   r"   r#   handle_signal(  s    r   c              O   s   t d| |S )Nsystem)r   )r   )r   r   r"   r"   r#   handle_system_signal0  s    r   c              O   s   t d| |S )Nsession)r   )r   )r   r   r"   r"   r#   handle_session_signal4  s    r   c          '   C   sp  t jd t jdtj   | ||  aaatdda	t
 aytt	daW n: tjjk
r } zt jd tjd W Y d d }~X nX ytj aW n\ tjjk
r } z<tj dkrt jd	 tjd nt jd
 tjd W Y d d }~X nX tjtdddddd tjtdddddd tjjdt}t|d}t jd ytj  W n  tk
rj   t jd Y nX d S )Nzhp-systray(hpssd)zPID=%dT)Zset_as_default)Zmainloopz.Unable to connect to dbus system bus. Exiting.r   r   z/Unable to connect to dbus session bus. Exiting.z8Unable to connect to dbus session bus (running as root?)Zsenderdestr   r   rq   )Zsender_keywordZdestination_keywordZinterface_keywordZmember_keywordZpath_keywordzcom.hplip.StatusServicez/com/hplip/StatusServicezEntering main dbus loop...zCtrl-C: Exiting...)r3   Z
set_moduler.   rf   r   r   r   r~   r   	dbus_loopr   r   r   
system_busr)   
exceptionsZDBusExceptionrs   sysexitr   r   getuidZadd_signal_receiverr   r   r*   ZBusNamer(   runKeyboardInterrupt)Zwrite_pipe1Zwrite_pipe2Z
read_pipe3r   Zsession_nameZstatus_servicer"   r"   r#   r   9  s>    








r   )NN)NNN)N)N)N)NNN)Q__version__Z	__title____mod____doc__r   Zstructrf   ZtimeZgetoptr}   r   re   pickler   r   Zbase.gZ
base.codesbaser   r   r   r   r	   r
   r   Zbase.sixextr   r   r)   r   r   r   Zdbus.serviceZdbus.mainloop.glibr   Zgi._gobjectr   r   r   r   r   Zgi.repository.GLibZgobjectZdbus_loadedImportErrorr3   rs   r   warningssimplefilterDeprecationWarningrj   r   r   r   r   r   r   r~   r5   objectr   r*   r+   r(   rD   rc   r{   rM   r   r   r   rW   r4   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   sz   $ $

	{:
 
	
  