3
Z                @   sX  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ejdd 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 d d
lmZ d dlZd dlZd dl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mZ d dlT d dl Z d dl!Z!d dl"Z"d dl#m$Z$ ej%d y ejdd d dl	m&Z& dZ'W n e(k
rp   dZ'Y nX d dl)Z)e)j*e j+e j,d d dl!m-Z- e j.Z/dZ0dZ1dZ2e
j3d e&j4j5de&j6j7e&j8j9e&j8j9e&j8j9e&j8j9e&j8j:e&j8j9e&j8j9e&j8j9dZ;G dd dZ<G dd  d Z=G d!d" d"Z>G d#d$ d$Z?G d%d& d&ejZ@G d'd( d(eZAdS ))    NNotifyz0.7)r   )GLib)GObject)Gdk)	GdkPixbuf)Gtk)GtkGUI)Pango)saxutils)*)reducez1.9.47Secret1)r   TF)domain	localedir)StateReasonprinter   zdocument-print-previewz"System Config Printer Notificationzorg.system.config.printer.store)userr   objectprotocolportserverZauthtypeuric               @   s,   e Zd Zej Zdd Zdd Zdd ZdS )
ServiceGetc             C   s   t jj|}d S )N)r   ServiceZ
get_finish)selfsourceresultunusedservice r!   -/usr/share/system-config-printer/jobviewer.pyon_get_service]   s    zServiceGet.on_get_servicec             C   s   t jjdd | jd  d S )Nr   )r   r   getr#   )r   r!   r!   r"   __init__`   s    zServiceGet.__init__c             C   s   t jS )N)r   r    )r   r!   r!   r"   get_servicef   s    zServiceGet.get_serviceN)	__name__
__module____qualname__r   r   r    r#   r%   r&   r!   r!   r!   r"   r   Z   s   r   c               @   s*   e Zd Ze Zdd Zdd Zdd ZdS )
ItemSearchc             C   s   t jjd |}d S )N)r   r   Zsearch_finish)r   r   r   r   itemsr!   r!   r"   on_search_itemm   s    zItemSearch.on_search_itemc             C   s"   t jj|t|t jjd | jd  d S )N)r   r   searchNETWORK_PASSWORDZSearchFlagsZLOAD_SECRETSr,   )r   r    attrsr!   r!   r"   r%   p   s    zItemSearch.__init__c             C   s   t jS )N)r*   r+   )r   r!   r!   r"   	get_itemsy   s    zItemSearch.get_itemsN)r'   r(   r)   listr+   r,   r%   r0   r!   r!   r!   r"   r*   j   s   	r*   c               @   s   e Zd Zdd Zdd ZdS )PasswordStorec             C   s   t jt|t j||d | j d S )N)r   Zpassword_storer.   ZCOLLECTION_DEFAULTon_password_stored)r   r/   namesecretr!   r!   r"   r%   ~   s    zPasswordStore.__init__c             C   s   t j| d S )N)r   Zpassword_store_finish)r   r   r   r   r!   r!   r"   r3      s    z PasswordStore.on_password_storedN)r'   r(   r)   r%   r3   r!   r!   r!   r"   r2   }   s   	r2   c               @   s^   e Zd ZdddZdddZdddZdd	 Zd
d ZdddZdd Z	dd Z
dddZdS )PrinterURIIndexNc             C   s$   i | _ |d krg }|| _| j  d S )N)r   names_collect_names)r   r7   r!   r!   r"   r%      s
    zPrinterURIIndex.__init__c             C   sX   | j s
d S |s0ytj }W n tk
r.   d S X x| j D ]}| j||d q8W g | _ d S )N)
connection)r7   cups
ConnectionRuntimeErroradd_printer)r   r9   cr4   r!   r!   r"   r8      s    zPrinterURIIndex._collect_namesc             C   s,   y| j ||d W n tk
r&   d S X d S )N)r4   r9   )_map_printerKeyError)r   r   r9   r!   r!   r"   r=      s    zPrinterURIIndex.add_printerc             C   sx   g }d|kr0|d }t |tkr&|g}|j| d|krF|j|d  d|kr\|j|d  x|D ]}|| j|< qbW d S )Nzprinter-uri-supportedznotify-printer-urizprinter-more-info)typer1   extendappendr   )r   r   r/   urisZuri_supportedr   r!   r!   r"   update_from_attrs   s    

z!PrinterURIIndex.update_from_attrsc             C   s>   | j   t| jj }x"|D ]}| j| |kr| j|= qW d S )N)r8   r1   r   keys)r   r   rD   r   r!   r!   r"   remove_printer   s
    
zPrinterURIIndex.remove_printerc             C   s6   | j   y
| j| S  tk
r0   | j||dS X d S )N)r   r9   )r8   r   r@   r?   )r   r   r9   r!   r!   r"   lookup   s
    
zPrinterURIIndex.lookupc             C   s   | j   t| jj S )N)r8   setr   values)r   r!   r!   r"   all_printer_names   s    z!PrinterURIIndex.all_printer_namesc             C   s4   | j   x"| jj D ]\}}||kr|S qW td S )N)r8   r   r+   r@   )r   r4   r   r   r!   r!   r"   lookup_cached_by_name   s
    z%PrinterURIIndex.lookup_cached_by_namec             C   s   yD|d krt j }dddg}|d k	r4|j||d}n|j||d}W n0 tk
r\   tY n t jk
rt   tY nX |d }| j|| |d k	r|| j|< |S )Nzprinter-namezprinter-uri-supportedzprinter-more-info)r   requested_attributes)rM   )r:   r;   getPrinterAttributesr<   r@   IPPErrorrE   r   )r   r   r4   r9   rr/   r!   r!   r"   r?      s$    



zPrinterURIIndex._map_printer)N)N)N)N)NNN)r'   r(   r)   r%   r8   r=   rE   rG   rH   rK   rL   r?   r!   r!   r!   r"   r6      s   



r6   c               @   s   e Zd Zejjdf fejjdeffejjdeejffejjdf f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 ZdS )CancelJobsOperationN)destroyzjob-deletedz	ipp-errorfinishedc             C   s  t j j|  t|| _|| _|| _|| _|| _|rdt| jdkrRt	d}t	d}qt	d}t	d}n0t| jdkrt	d}t	d}nt	d}t	d	}t
j||d
d
d}	|	jt	dt
jj|t
jj |	jt
jj |	jd |	jd t
jjdd}
t
j }|jt
jt
jj |jdd |
j|ddd t
j|d}|jd
 |jdd |
j|ddd |	jj|
ddd |	jd| j  |	jd| j! |	j"  |	| _#d | _$t%d|   d S )N   zDelete Jobsz(Do you really want to delete these jobs?z
Delete Jobz&Do you really want to delete this job?zCancel Jobsz(Do you really want to cancel these jobs?z
Cancel Jobz&Do you really want to cancel this job?T)titletransient_forZmodalZdestroy_with_parentzKeep Printing   F   g        r   )labelresponsezdelete-eventz+%s)&r   r%   r1   jobids	purge_jobhostr   
encryptionlen_r   Dialogadd_buttonsResponseTypeNOYESset_default_responseset_border_widthset_resizableHBoxnewImageset_from_stockZSTOCK_DIALOG_QUESTIONIconSizeDIALOGset_alignment
pack_startLabelset_line_wrapvboxconnecton_job_cancel_prompt_responseon_job_cancel_prompt_deleteshow_alldialogr9   
debugprint)r   parentr]   r   r^   r[   r\   Zdialog_titleZdialog_labelrx   hboximagerY   r!   r!   r"   r%      sP    







zCancelJobsOperation.__init__c             C   s   t d|   d S )Nz-%s)ry   )r   r!   r!   r"   __del__$  s    zCancelJobsOperation.__del__c             C   s<   | j r| j j  d | _ | jr,| jj  d | _td|   d S )NzDESTROY: %s)r9   rR   rx   ry   )r   r!   r!   r"   
do_destroy'  s    

zCancelJobsOperation.do_destroyc             C   s   | j d d S )NrR   )emit)r   r!   r!   r"   rR   2  s    zCancelJobsOperation.destroyc             C   s   | j |tjj d S )N)ru   r   rc   rd   )r   rx   eventr!   r!   r"   rv   5  s    z/CancelJobsOperation.on_job_cancel_prompt_deletec             C   sf   |j   d | _|tjjkr(| jd d S t| jdkrD| jd d S tj	| j
| j| j| j| jd d S )NrS   r   )r]   r   r^   reply_handlererror_handler)rR   rx   r   rc   re   r   r_   r[   	asyncconnr;   r]   r   r^   
_connected_connect_failed)r   rx   rZ   r!   r!   r"   ru   8  s    

z1CancelJobsOperation.on_job_cancel_prompt_responsec             C   s   t d|t|f  d S )Nz)CancelJobsOperation._connect_failed %s:%s)ry   repr)r   r9   excr!   r!   r"   r   J  s    z#CancelJobsOperation._connect_failedc             C   sN   || _ | jrtd}ntd}| j j| | j j| jd | j| j| jd d S )Nzdeleting jobzcanceling jobr   )r   r   )r9   r\   r`   _begin_operation	cancelJobr[   cancelJob_finishcancelJob_error)r   r9   r   Z	operationr!   r!   r"   r   M  s    
zCancelJobsOperation._connectedc             C   s   t d|t|f  t|tjkrb|j\}}|tjkrT|tjkrT| jd| j	d | | j
|d  n<| jj  | jj  d | _| jd| j	d | | jd d S d S )NzcancelJob_error %s:%sz	ipp-errorr   rS   )ry   r   rA   r:   rO   argsIPP_NOT_POSSIBLEIPP_NOT_FOUNDr   r[   r   r9   _end_operationrR   )r   r9   r   emr!   r!   r"   r   Z  s    





z#CancelJobsOperation.cancelJob_errorc             C   s~   t d|t|f  | jd| jd  | jd= | js\| jj  | jj  d | _| jd d S |j| jd | j| j	| j
d d S )NzcancelJob_finish %s:%szjob-deletedr   rS   )r   r   )ry   r   r   r[   r9   r   rR   r   r\   r   r   )r   r9   r   r!   r!   r"   r   k  s    


z$CancelJobsOperation.cancelJob_finish)r'   r(   r)   r   SignalFlagsRUN_LASTintZTYPE_PYOBJECT__gsignals__r%   r}   r~   rR   rv   ru   r   r   r   r   r!   r!   r!   r"   rQ      s   
.rQ   c            	   @   s  e Zd ZeddddddddgZd	ejjd
f fiZdddZ	dd Z
dd Zdd ZdddZdd ZdddZdd Zdd Zdd  Zd!d" Zdd#d$Zd%d& Zdd'd(Zd)d* Zdd+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zdd7d8Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3ddcddZ4dedf Z5ddgdhZ6ddidjZ7ddkdlZ8ddmdnZ9dodp Z:dqdr Z;ddsdtZ<dudv Z=ddwdxZ>dydz Z?d{d| Z@d}d~ ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQd
S )	JobViewerzjob-k-octetszjob-namezjob-originating-user-namezjob-printer-uriz	job-stateztime-at-creationzauth-info-requiredzjob-preservedrS   NFTc             C   s	  t j j|  || _|| _|| _|| _|| _tj }d|k| _	d|k| _
i | _i | _g | _i | _t | _t | _i | _d| _i | _i | _i | _d | _i | _i | _t | _g | _| jddddgdgd	tjd
 tj dd}	|	j!dtj"t#dd t#d| j$fdtj%t#dd t#d| j&fdtj't#dd t#d| j(fdtj)t#dd t#d| j*fdtj+t#dd t#d| j,fdtj-t#dd t#d| j.fdd t#d d d d fd!d t#d"d d | j/fd#d t#d$d d | j0fd%tj1d d&t#d'| j2fg
 tj3 | _4| j4j5|	dZ | j4j6d) | j4j7  | j8j9| j4j:  tj; | _<xpd[D ]h}
|
s2tj= }n>|	j>|
}|j?d* |j@ }|
dkrp|| _Atj; }|jB| |jC  | j<jD| qW xRd\D ]J}
|	j>|
}|j?|
d%k |jE|
d%k |jF }|jC  | jGjH|d] qW xd*d*t#d+| jIfd,d*t#d-| jJfd*d,t#d.| jKfd*d,t#d/| jLfd*d*t#d0| jMfgD ]x\}}}}|rP|rPq4tjN }|rz|jOd1tPjQjR |jOd2d3 tjS||}|jT||d  |jUd, | jVjW| q4W tjN }tjSt#d4|d(d5}|jUd, | jVjW| tjSt#d6}tjX }|jY|d* tjN }|jOd1tPjQjR |jOd2d3 |jY|d, |jT|| jZd  |jT|| j[d  | jVjW| tj\t]t^| __| j_j`dtjajb | jVjc| j_ | jVjdd, | jVje | _f| jfjgtjhji | jfjjd7| jk | jVjjd8| jl | jVjjd9| jm | j8jnto | j8jp  |rtqd:d; |}|r4|r*t#d<| }nt#d=}n|rDd>| }nt#d?}| j8jrt#d@|  |rr| j8js| dAdB }tjtju }||to| _v||dC| _w| jvjx | _y| jyjzd | jvj{| jydd| jyj| | jyj} dddDdDt~jjdE | jr<| j
 r<tj | _| jj| jy | jjjdF| j | jjjd9| j | jjd* |d krNtj }| j  | jd, tj | _tj | _tj | _tj|||| j| j| jdG| _| jjjdH| j | jjjdI| j | jjjdJ| j | jjjdK| j | jjjdL| j | jjjdM| j | jjjdN| j | jjjdO| j | jjjdP| j | jjjdQ| j | jjjdR| j | jj  d | _|stj|d,| j| j| jdS| _| jjjdI| j | jjjdJ| j | jj  | js| j8jC  tj | _| jjrt#dT | jjtjj | jjdUdU | jjs| j8 | jjjdV| j | jj9| j4j:  tj dWd}|j!d%tj1d d&t#d'| jfg tj3 | _| jj5|d^ | jj6dX | jj7  | jj9| jj:  tj }| jj| tj }| jj>dY}|jF }|jEd, |jH|d |jY|d*d*d tj | _|jY| jd,d,d d S )_NZactionsZpersistencer   
JobsWindowtreeview	statusbartoolbarstatusicon_popupmenu)r   r   )r   ZJobActionGroup)r4   
cancel-jobZ_CancelzCancel selected jobs
delete-jobZ_DeletezDelete selected jobshold-jobZ_HoldzHold selected jobsrelease-jobZ_ReleasezRelease selected jobsreprint-jobZRe_printzReprint selected jobsretrieve-jobZ	Re_trievezRetrieve selected jobsmove-jobz_Move Toauthenticate-jobZ_Authenticatejob-attributesz_View Attributesclosez<ctrl>wzClose this windowrT   ay  
<ui>
 <accelerator action="cancel-job"/>
 <accelerator action="delete-job"/>
 <accelerator action="hold-job"/>
 <accelerator action="release-job"/>
 <accelerator action="reprint-job"/>
 <accelerator action="retrieve-job"/>
 <accelerator action="move-job"/>
 <accelerator action="authenticate-job"/>
 <accelerator action="job-attributes"/>
 <accelerator action="close"/>
</ui>
FZJobTZUserZDocumentZPrinterZSize	ellipsizezwidth-chars   zTime submitted)textZStatusZchangedZbutton_release_eventz
popup-menuc             S   s   | d | S )Nz, r!   )xyr!   r!   r"   <lambda>8  s    z$JobViewer.__init__.<locals>.<lambda>zmy jobs on %szmy jobsz%szall jobszDocument Print Status (%s)c             S   s\   y| j |td}W nD tjk
rV   td|  tjjtjj	ddtt}|j
d Y nX |S )Nr   zNo %s icon availableT   )	load_icon	ICON_SIZEr   GErrorry   r   ZPixbufrj   Z
ColorspaceZRGBfill)themeiconpixbufr!   r!   r"   r   I  s    z%JobViewer.__init__.<locals>.load_iconzprinter-printingg      ?   activate)busmy_jobsspecific_destsr]   r   r^   refreshz	job-addedz	job-eventzjob-removedzstate-reason-addedzstate-reason-removedzstill-connectingznow-connectedzprinter-addedzprinter-eventzprinter-removed)r   r   r]   r   r^   zJob attributesiX  Zdelete_eventZAttrsActionGroupz+
<ui>
 <accelerator action="close"/>
</ui>
z/close)
r   r   r   r   r   r   r   Nr   r   )r   r   r   r   r   r   r   r   r   )r   r%   loopappletsuppress_icon_hider   r   r   Zget_server_capsnotify_has_actionsnotify_has_persistencejobsjobitersr[   
jobs_attrsrI   active_jobsstopped_job_promptsprinter_state_reasonsnum_jobs_when_hiddenZconnecting_to_devicestate_reason_notificationsauth_info_dialogsjob_creation_times_timernew_printer_notificationscompleted_job_notificationsauthenticated_jobsopsZ
getWidgetsconfigPACKAGEr   ZActionGroupZadd_actionsSTOCK_CANCELr`   on_job_cancel_activateZSTOCK_DELETEon_job_delete_activateSTOCK_MEDIA_PAUSEon_job_hold_activateZSTOCK_MEDIA_PLAYon_job_release_activateZ
STOCK_REDOon_job_reprint_activateZSTOCK_SAVE_ASon_job_retrieve_activateon_job_authenticate_activateon_job_attributes_activateZSTOCK_CLOSEon_delete_eventZ	UIManagerjob_ui_managerZinsert_action_groupZadd_ui_from_stringZensure_updater   Zadd_accel_groupZget_accel_groupMenujob_context_menuZSeparatorMenuItem
get_actionset_sensitiveZcreate_menu_itemmove_job_menuitemset_submenushowrC   Zset_is_importantZcreate_tool_itemr   insert_set_job_job_number_text_set_job_user_text_set_job_document_text_set_job_printer_text_set_job_size_textCellRendererTextset_propertyr	   ZEllipsizeModeZENDZTreeViewColumnZset_cell_data_funcrh   r   Zappend_columnZCellRendererPixbufrp   _set_job_status_icon_set_job_status_textZ	TreeStorer   strstoreset_sort_column_idSortType
DESCENDING	set_modelZset_rules_hintget_selection	selectionset_modeSelectionModeZMULTIPLErt   on_selection_changed on_treeview_button_release_eventon_treeview_popup_menuset_icon_nameICONhider   Z	set_titleZset_transient_for	IconThemeget_default	icon_jobsicon_jobs_processingcopyicon_no_jobsr   	composite	get_width
get_heightr   
InterpTypeBILINEARZ
StatusIcon
statusiconset_from_pixbuftoggle_window_displayon_icon_popupmenuset_visibledbusZ	SystemBusZconnect_signalsset_process_pendingr:   Z	getServerr]   ZgetPortr   ZgetEncryptionr^   monitorZMonitor
on_refresh	job_added	job_eventjob_removedstate_reason_addedstate_reason_removedstill_connectingnow_connectedprinter_addedprinter_eventprinter_removedr   
my_monitorZWindowJobsAttributesWindowset_positionWindowPositionZMOUSEZset_default_sizejob_attributes_on_delete_eventZattrs_ui_managerVBoxaddZToolbarZNotebooknotebook)r   r   r   r   r   r   r   rz   Znotify_capsZjob_action_groupZaction_nameitemactionZprintersskipr   r4   settercellcolumnr   r   Z	the_destsrU   r   r   Zattrs_action_grouprs   r   r!   r!   r"   r%     s   






        




     
 





















zJobViewer.__init__c             C   s   | j j  | jr| jj  | jj  xd| jj | jj gD ]L}xF|D ]>}t|dd dkrDy|j	  W n t
jk
rz   Y nX d|_qDW q:W | jd k	rt
j| j d | _x| jD ]}|j  qW | jr| j r| jjd | jd d S )NclosedTFrS   )r  cleanupr  r   r   r   rJ   r   getattrr   r   r   r)  r   source_remover   rR   r   r   r  r  r   )r   lnotificationopr!   r!   r"   r*    s*    





zJobViewer.cleanupc             C   s
   || _ d S )N)process_pending_events)r   Zwhetherr!   r!   r"   r    s    zJobViewer.set_process_pendingc             G   s>   | j s| j r0| jj  d| j_| j s:| j  n
| jj  dS )NFT)r   r   r   r   visibler*  quit)r   r   r!   r!   r"   r     s    


zJobViewer.on_delete_eventc             C   s8   x"t | jj D ]}| jjd qW i | _| jj  dS )NrT   Tr   )ranger"  Zget_n_pagesremove_pager   r  r   )r   widgetr   pager!   r!   r"   r    s
    
z(JobViewer.job_attributes_on_delete_eventc             C   s   t j||| jS )N)errordialogsshow_IPP_Errorr   )r   Z	exceptionmessager!   r!   r"   r8    s    zJobViewer.show_IPP_Errorc       
      C   s   t | jdd }|rd}| jr8|r,| jj  q| jj  n|r| jj }| jj }| jj \}}}}	|r|j	d |d k	r|j	d | jj
  q| jjd n2| jj  | jj	d | jj }|d k	r|j	d | | j_d S )Nr1  FT)r+  r   r   r   r   Z
get_windowr  r  Zget_geometryZset_skip_taskbar_hintZiconifyr  Zpresentr1  )
r   r   
force_showr1  wZawlocsZareaor!   r!   r"   r
    s.    






zJobViewer.toggle_window_displayc             C   s<   |j  rd}nd}| jj|dd | jr8| jj|dd d S )Nallznot-completedF)
which_jobsZrefresh_all)Z
get_activer  r   r  )r   Ztoggletoolbuttonr@  r!   r!   r"   on_show_completed_jobs_clicked	  s    z(JobViewer.on_show_completed_jobs_clickedc                s  t j  }d}xR jj D ]B\}}td}d|kr:|d }|| }d}|dk r^td} n|dk rt|d }td| }n|dk rt|d }	|	d
krtd}ntd|	 }n|dk  rt|d }
|
d
k rtd}ntd|
 }nN|d#k r$t|d& }|d
krtd}ntd| }nd}t jdt j|}| jkr j| } jj	|d
| qW |r j
 r fdd}tjd|}| _
|s j
rtj j
 d  _
|S )'NFUnknownztime-at-creationT   <   za minute agoz%d minutes ago   rT   zan hour agoz%d hours ago   Z	yesterdayz%d days agorW   z	last weekz%d weeks agoz%B %Yc                 s   t j   j } t j  | S )N)r   threads_enterupdate_job_creation_timesthreads_leave)Zret)r   r!   r"   update_times_with_locking;  s    zFJobViewer.update_job_creation_times.<locals>.update_times_with_lockingx   i  i  iQ i     i`'  i:	 i  iQ *   i  i@  i _7 rL  i`'  i:	 )timer   r+   r`   r   strftime	localtimer   r   	set_valuer   r   timeout_add_secondsr,  )r   nowZneed_updatejobdatatZcreatedZagoZminsZhoursZdaysZweeksiterrJ  r!   )r   r"   rH    sT    









z#JobViewer.update_job_creation_timesc             C   sP   |j   |j  | jj| |tjjkrLd| jkrLdd l}|j	| j
}|| _d S )Ntroubleshooterr   )r   rR   r   remover   rc   rd   __dict__troubleshootrunon_troubleshoot_quitrX  )r   rx   rZ   jobidr[  rX  r!   r!   r"   print_error_dialog_responseL  s    
z%JobViewer.print_error_dialog_responsec             C   s   | ` d S )N)rX  )r   rX  r!   r!   r"   r]  W  s    zJobViewer.on_troubleshoot_quitc       
         s    j |||d | jkrd S  j} jjd }|j|d| td|  | j|<  jj }|d k	r|\}} jj	 dt
jjfkr|t
jdkr jjt
j d ddd  jsȇ fdd}	tjd	|	 d S )
N)r9   r   zJob %d addedrT   Fg        c                  s   t j   j  t j  dS )NF)r   rG  rH  rI  r!   )r   r!   r"   !start_updating_job_creation_timest  s    z<JobViewer.add_job.<locals>.start_updating_job_creation_timesi  )
update_jobr   r   rC   rQ  ry   r   r   Zget_visible_rangeZget_sort_column_idr   r   r   ZTreePathZscroll_to_cellr   r   Ztimeout_add)
r   rT  rU  r9   r   rW  r3  startendr`  r!   )r   r"   add_jobZ  s&    




zJobViewer.add_jobc             C   s   | j j  | jr| jj  d S )N)r  updater  )r   r!   r!   r"   update_monitor|  s    
zJobViewer.update_monitorc          %   C   s  | j t|j  }|| jkr&| j| |rd }yD|d krNtj| j| j| j	d}t
d|  t|}|j||d}W n: tk
r   Y n( tk
r   Y n tjk
r   d S X |r|j| || j|< d}y|jdtj}t|}|tjtjgkrdddg}	dd	g}
|jd}tj| j| j| j| j	d}|j||
d
}y|d }W n& tk
rj   t
d ddg}Y nX t|ts|g}||d< |j| |j||	d}|j| |jdtj}t|}W n@ tk
r   Y n, tk
r   Y n tjk
r    Y nX y
|d= W n tk
r"   Y nX | jj  |tjkoH|jdddk}|rx| j||jd	|jd|jdg | j  d| _!| j"  d S )N)r]   r   r^   zrequesting %s)rM   Fz	job-statezjob-hold-untilzjob-printer-urizauth-info-requiredz
device-uri)r   rM   z1No auth-info-required attribute; guessing insteadusernamepassword_status_textnone)#required_job_attributesrI   rF   r   update_job_attributes_viewerr:   r;   r]   r   r^   ry   r1   getJobAttributesr<   AttributeErrorrO   re  r   r$   IPP_JOB_PROCESSINGr   IPP_JOB_HELDIPP_JOB_STOPPEDauthconnr   rN   r@   
isinstance
ValueErrorr   
queue_drawget_authenticationr   Zsubmenu_setupdate_sensitivity)r   rT  rU  r9   rP   r/   job_requires_authjstater=  jattrspattrsr   r>   auth_info_requiredr!   r!   r"   ra    s    













zJobViewer.update_jobc       !      C   s  || j krytjd W n   td d S t}t }d }|rd|krtjj|\}	}
|	dkrt	j
|d}|j \}}}}}t||d< n.tjj|
\}}
|d krd }ntjj|\}}|	d ks|d krd}n|jt|j t|	d || jk rd}d	t|i}|rd|krx||gD ]}t }x(|j D ]\}}||i}|j| q6W t }|j }t||}|j }|r"d
d |D }|jd}x6|d jD ] }|jdkr|j ||< P qW td |jd}|d j||< P q"W td |r4ytj| j| j| j | j!d}W n t"k
r2   d}Y nX |r|d k	ryF|j#t$d |j%|| |j&  | j'  td|  | jj(| d S  tj)k
r   |j&  t*  d S    |j&  t*  Y nX |r|rt+j,t-j. d } |j/ }|j| t| |d< | j0|| d S )Nz1.9.37z;Authentication required but authenticateJob() not availablerh  smb)r   r   F)r   r   r   c             S   s   g | ]}d qS ) r!   ).0r   r!   r!   r"   
<listcomp>#  s    z0JobViewer.get_authentication.<locals>.<listcomp>rg  r   r   z)Did not find username keyring attributes.z!Failed to find secret in keyring.)r]   r   r^   zauthenticating jobz"Automatically authenticated job %d)1r   r:   requirery   
USE_SECRETdicturllibparse	splittypesmburiZSMBURIZseparater   Z	splithostZ
splitnportre  lowerr   r+   r   r&   r*   r0   index
attributesr4   Z
get_stringr5   rr  r;   r   r]   r   r^   r<   r   r`   authenticateJobr   rf  r!  rO   nonfatalExceptionpwdgetpwuidosgetuidr  display_auth_info_dialog)!r   rT  
device_uriprinter_urir|  Zshow_dialogZ
try_secretZinformational_attrs	auth_infoschemerestr   groupr   Zsharer   rh  Z
serverportr   Zidentifying_attrskeyring_attrsr/   keyvalkey_val_dictZservice_objr    Z
search_objr+   indattrr>   rg  r!   r!   r"   rv    s    




zJobViewer.get_authenticationc             C   s4  | j | }|d }tj|td}||_||_|jtjj	 dd |D }t
jtj d }d|kry |jd}|||< |j| W n   t  Y nX d}	x,|D ]$}
||	 dkr|j|
 P |	d7 }	qW |jtd	|jd
td|f  || j|< |jd| j |jd| j ||_|j  |jd |j  d S )Nzauth-info-required)r|  Zallow_rememberc             S   s   g | ]}d qS )r~  r!   )r  r   r!   r!   r"   r  b  s    z6JobViewer.display_auth_info_dialog.<locals>.<listcomp>r   rg  r~  rT   z;Authentication required for printing document `%s' (job %d)zjob-namerB  rZ   zdelete-eventT)r   rr  Z
AuthDialogr  r  r|  r  r   r  ZCENTERr  r  r  r  r  Zset_auth_infor  Zfield_grab_focusZ
set_promptr`   r$   r   rt   auth_info_dialog_responseauth_info_dialog_deletejob_idrw   Zset_keep_aboveZshow_now)r   rT  r  rU  r|  rx   r  rg  r  r  Zfieldr!   r!   r"   r  X  s@    







z"JobViewer.display_auth_info_dialogc             C   s   | j |tjj d S )N)r  r   rc   CANCEL)r   rx   r   r!   r!   r"   r    s    z!JobViewer.auth_info_dialog_deletec          )   C   s  |j }| j|= |tjjkr&|j  d S |j }ytj| j	| j
| j| jd}W n tk
rh   td d S X d}|jtd y,|j|| |j }| jj| | j  W n: tjk
r } z|j\}}| j|| W Y d d }~X nX |j  |ryt|dd }	t|dd }
|	d k	r|
d k	ry|
jd}|| |	d< W n tk
rP   Y nX d	|	jd|	jd
|	jdf }|
jd}|| }t }x(|	j  D ]\}}||i}|j!| qW t"|||}tdt#|f  W n   t$  Y nX |j  d S )N)r]   r   r^   z+Error connecting to CUPS for authenticationFzauthenticating jobr  r|  rg  r   z
%s@%s (%s)r   r   rh  zkeyring: created id %d for %s)%r  r   r   rc   OKrR   Zget_auth_inforr  r;   r   r]   r   r^   r<   ry   r   r`   r  Zget_remember_passwordr   r!  rf  r:   rO   r   r8  r   r+  r  
IndexErrorr$   r  r+   re  r2   idr  )r   rx   rZ   r^  r  r>   Zrememberr   r   r  r|  r  r4   r5   r/   r  r  r  Zpassword_objr!   r!   r"   r    sn    



z#JobViewer.auth_info_dialog_responsec             C   s   | j s
d S | jrd| _d S t| jj }|t| jj 7 }x.| jj D ] \}}t|dd dkrF|d7 }qFW t| j	}t
d|  t
d|  t
d| j  | jrd S | jjd | jj|dkp|| jk x| jrtj rtj  qW d S )	NFr)  TrT   zopen notifications: %dznum_jobs: %dznum_jobs_when_hidden: %dr   )r   r   r_   r   rF   r   r   r+   r+  r   ry   r   r   r  Zset_has_tooltipr  r0  r   Zevents_pendingZmain_iteration)r   Zopen_notificationsreasonr.  num_jobsr!   r!   r"   set_statusicon_visibility  s*    
z#JobViewer.set_statusicon_visibilityc             C   s    t jt jj}| j||d d S )Nr   )r   ZEventZ	EventTypeZNOTHINGshow_treeview_popup_menu)r   r   r   r!   r!   r"   r     s    z JobViewer.on_treeview_popup_menuc             C   s   |j dkr| j|||j  d S )N   )buttonr  )r   r   r   r!   r!   r"   r     s    
z*JobViewer.on_treeview_button_release_eventc             C   sH  |d kr| j j }|j \}}| jjd}| jjd}| jjd}| jjd}| jjd}| jjd}	| jjd}
| jjd}| jjd	}t|d
krx(||||||	||
|g	D ]}|jd qW d S d}d}d}d}d}d}| jj }t	 }g | _
x |D ]}| jj|}| jj|d
}| j
j| | j| }d|kr|d }|tjkrPd}|tjkr`d}|tjkrpd}|jddsd}|jdtjtjks|jdddkrd}|jdd }|ry| jj|}W n tk
r   |}Y nX |||< qW t|j dkr:y|jt|j d
  W n tk
r8   Y nX t|d
krtj }t|}|j  xv|D ]n}y| jj|}W n tk
r   d }Y nX tj|d}|j|d k	 |j  | j || j!| |j| qfW | j"j#| d}|j| |j|  |j| |j| |j| |	j| |j| |
j| |jd d S )Nz/cancel-jobz/delete-jobz	/hold-jobz/release-jobz/reprint-jobz/retrieve-jobz/authenticate-jobz/job-attributesz	/move-jobr   FTz	job-statezjob-preservedzjob-hold-untilrj  zauth-info-requiredzjob-printer-urirT   )rY   )$r   r   Zget_selected_rowsr   r   r_   r   printer_uri_indexrK   r  r[   r   Zget_iter	get_valuerC   r   r:   IPP_JOB_CANCELEDIPP_JOB_PENDINGrp  r$   rH   r@   rF   rY  r1   r   r   sortrL   ZMenuItemr   _submenu_connect_hackon_job_move_activater   r   )r   r   modelZpathlistZcanceldeleteholdreleaseZreprintZretrieveZauthenticater  Zmover5  Zcancel_sensitiveZhold_sensitiveZrelease_sensitiveZreprint_sensitiveZauthenticate_sensitiveZmove_sensitiveZother_printersZjob_printerspathrW  r^  rT  r=  r   r   Zprinters_menumenuitemr!   r!   r"   rw    s    













zJobViewer.update_sensitivityc             C   s   | j | d S )N)rw  )r   r   r!   r!   r"   r   N  s    zJobViewer.on_selection_changedc             C   s   | j jd d d d ||j  d S )N)r   popupZget_time)r   r   r   Zevent_buttonr!   r!   r"   r  Q  s    z"JobViewer.show_treeview_popup_menuc             C   s   | j jd d d d || d S )N)r   r  )r   r   r  rN  r!   r!   r"   r  V  s    zJobViewer.on_icon_popupmenuc             C   s   t | jj | _| j  d S )N)r_   r   rF   r   r  )r   r  r!   r!   r"   on_icon_hide_activateY  s    zJobViewer.on_icon_hide_activatec             C   sT   i }x(t jj D ]\}}|dkr"q|||< qW tjdgd|d}tjd| j| d S )NZSYSTEM_CONFIG_PRINTER_UIzsystem-config-printerT)Z	close_fdsenv
   )r  environr+   
subprocessPopenr   rR  poll_subprocess)r   r  r  r4   valuepr!   r!   r"   #on_icon_configure_printers_activate]  s    
z-JobViewer.on_icon_configure_printers_activatec             C   s   |j  }|d kS )N)Zpoll)r   Zprocess
returncoder!   r!   r"   r  g  s    zJobViewer.poll_subprocessc             C   s   | j   | jr| jj  d S )N)r*  r   r2  )r   r  r!   r!   r"   on_icon_quit_activatek  s    zJobViewer.on_icon_quit_activatec             C   s   | j d d S )NF)on_job_cancel_activate2)r   r  r!   r!   r"   r   p  s    z JobViewer.on_job_cancel_activatec             C   s   | j d d S )NT)r  )r   r  r!   r!   r"   r   s  s    z JobViewer.on_job_delete_activatec             C   sN   | j rJt| j| j| j| j| j |}| jj| |jd| j	 |jd| j
 d S )NrS   z	ipp-error)r[   rQ   r   r]   r   r^   r   rC   rt   on_canceljobs_finishedon_canceljobs_error)r   r\   r/  r!   r!   r"   r  v  s    z!JobViewer.on_job_cancel_activate2c             C   s(   |j   | jj|}| j|= | j  d S )N)rR   r   r  rf  )r   canceljobsoperationir!   r!   r"   r  ~  s    z JobViewer.on_canceljobs_finishedc             C   sL   | j   t|tjkrD|j\}}|tjkr@|tjkr@| j|| d S |d S )N)rf  rA   r:   rO   r   r   r   r8  )r   r  r^  r   r   r   r!   r!   r"   r    s    


zJobViewer.on_canceljobs_errorc             C   s   yt j| j| j| j| jd}W n tk
r2   d S X x| jD ]}|jt	d y|j
|d W n\ tjk
r } z>|j\}}|tjkr|tjkr| j|| | j  |j  d S d }~X nX |j  q<W ~| j  d S )N)r]   r   r^   zholding jobZ
indefinite)rr  r;   r   r]   r   r^   r<   r[   r   r`   setJobHoldUntilr:   rO   r   r   r   r8  rf  r   )r   r  r>   r^  r   r   r!   r!   r"   r     s,    


zJobViewer.on_job_hold_activatec             C   s   yt j| j| j| j| jd}W n tk
r2   d S X x| jD ]}|jt	d y|j
|d W n\ tjk
r } z>|j\}}|tjkr|tjkr| j|| | j  |j  d S d }~X nX |j  q<W ~| j  d S )N)r]   r   r^   zreleasing jobzno-hold)rr  r;   r   r]   r   r^   r<   r[   r   r`   r  r:   rO   r   r   r   r8  rf  r   )r   r  r>   r^  r   r   r!   r!   r"   r     s,    


z!JobViewer.on_job_release_activatec             C   s   y:t j| j| j| j| jd}x| jD ]}|j| q$W ~W nR tj	k
rz } z"|j
\}}| j|| | j  d S d }~X n tk
r   d S X | j  d S )N)r]   r   r^   )rr  r;   r   r]   r   r^   r[   Z
restartJobr:   rO   r   r8  rf  r<   )r   r  r>   r^  r   r   r!   r!   r"   r     s     

z!JobViewer.on_job_reprint_activatec          $   C   st  yt j| j| j| j| jd}W n tk
r2   d S X x.| jD ]"}y|j|}|d }y|d }W n  t	k
r   |j
dd}Y nX xtd|d D ]|}|j|||}|j
d}	|j
d}
|j
d	d
}|
d kr<tdt| }
|dkr|
d }
nB|jddkr|
|jdd
 }
n |jddkr<|
|jdd }
|	d k	rtjtd| jtjjd}|jtjtjjtjtjj |j|
 |jd |j }|tjjkr|j }ytj |	| W n( t!tj"fk
r   t#d|  Y nX n|tjjkr|j$  t%j&|	 qt#d d S qW W q> t'j(k
r` } z"|j)\}}| j*|| | j+  d S d }~X q>X q>W ~| j+  d S )N)r]   r   r^   zjob-printer-uriznumber-of-documentszdocument-countr   rT   filezdocument-namezdocument-formatr~  Z	retrievedzapplication/postscriptz.pszapplication/vnd.zapplication/vndzapplication/.z	Save File)rU   rV   r$  TzUnable to save file z%Unable to retrieve file from job filer   r   ),rr  r;   r   r]   r   r^   r<   r[   rm  r@   r$   r3  ZgetDocumentr`   r   findreplacer   ZFileChooserDialogZFileChooserActionZSAVErb   r   rc   r  Z
STOCK_SAVEr  Zset_current_nameZset_do_overwrite_confirmationr\  get_filenameshutilZcopyfileIOErrorErrorry   rR   r  unlinkr:   rO   r   r8  rf  )r   r  r>   r^  r/   r  Zdocument_countZdocument_numberdocumentZtempfiler4   formatrx   rZ   Zfile_to_saver   r   r!   r!   r"   r     sp    










z"JobViewer.on_job_retrieve_activatec                s4   t jdd fdd	}|jd||jd|fS )NrT   c                s    j drtj| f   d S )NF)acquirer   Zidle_add)r#  r   )r   callback	only_oncer!   r"   handle_event   s    
z5JobViewer._submenu_connect_hack.<locals>.handle_eventzbutton-press-eventr   )N)	threadingZ	Semaphorert   )r   r#  r  r   r  r!   )r   r  r  r"   r    s    

zJobViewer._submenu_connect_hackc             C   s   y>t j| j| j| j| jd}x| jD ]}|j||d q$W ~W nR tj	k
r~ } z"|j
\}}| j|| | j  d S d }~X n tk
r   d S X | j  d S )N)r]   r   r^   )r  job_printer_uri)rr  r;   r   r]   r   r^   r[   ZmoveJobr:   rO   r   r8  rf  r<   )r   r  r  r>   r^  r   r   r!   r!   r"   r  '  s     

zJobViewer.on_job_move_activatec       
      C   s   yt j| j| j| jd}W n tk
r.   dS X dg}ddg}x~| jD ]t}|j||d}|jd}|j	||d}y|d }	W n$ t
k
r   td d	d
g}	Y nX | j||jd||	d qFW d S )N)r]   r   r^   Fzjob-printer-urizauth-info-requiredz
device-uri)rM   )r   rM   z1No auth-info-required attribute; guessing insteadrg  rh  T)r:   r;   r]   r   r^   r<   r[   rm  r$   rN   r@   ry   rv  )
r   r  r>   Z
jattrs_reqZ
pattrs_reqr^  rz  r   r{  r|  r!   r!   r"   r   :  s*    
z&JobViewer.on_job_authenticate_activatec             C   s&   | j j  | jr| jj  | j  d S )N)r  r   r  rH  )r   Z
toolbuttonr!   r!   r"   on_refresh_clickedV  s    

zJobViewer.on_refresh_clickedc       
      C   s   yt j| j| j| jd}W n tk
r.   dS X x| jD ]}|| jkr8tj	 }tj
t|d}| jj||}tj }|j| tj }|jdtd|dd tj }|jdtd|dd tjtt}	|j|	 |j jtjj |	jdtjj |	|f| j|< | j||d	 q8W | jj  d
S )z> For every selected job create notebook page with attributes. )r]   r   r^   F)rY   r   Name)r   rT   ZValue)connN)r:   r;   r]   r   r^   r<   r[   r   r   ZScrolledWindowrq   r   r"  Zappend_pageZTreeViewr!  r   Zinsert_column_with_attributesr`   Z	ListStorer   r   r   r   NONEr   r   Z	ASCENDINGrl  r  rw   )
r   r  r>   r^  ZscrolledwindowrY   Z
page_indexZattr_treeviewr'  
attr_storer!   r!   r"   r   ]  s4    




z$JobViewer.on_job_attributes_activatec       	      C   s   |dk	r|}n0yt j| j| j| jd}W n tk
r<   dS X || jkr| j| \}}y|j|}W n< tk
rx   dS  t j	k
r   | j
j| | j|= dS X |j  x0|j D ]$\}}|dkrq|j|t|g qW dS )z* Update attributes store with new values. N)r]   r   r^   Fjob-idjob-printer-up-time)r  r  )r:   r;   r]   r   r^   r<   r   rm  rn  rO   r"  r4  clearr+   rC   r   )	r   r^  r  r>   r  r6  r/   r4   r  r!   r!   r"   rl  }  s.    
z&JobViewer.update_job_attributes_viewerc             C   s    |j dtj}|tjkrdS dS )Nz	job-stateFT)r$   r:   r  )r   jobdatastater!   r!   r"   job_is_active  s    
zJobViewer.job_is_activec       
      C   s^  d }|d kr\| j d k	r\| j j }d}x(| jj|g D ]}|| j kr4| j }P q4W |d kr\d | _ |d k	rx0| jj|g D ]}|d kr|}qt||krt|}qtW |d k	rZ|j }|tjkrZtj| }|j }ynt	j
j }|j|dd}	|	j||j d |j d |	j d |	j d |j d |j d ddtjjd W n$ tjk
rX   td|  Y nX |S )NFr   r   rC  g      ?   zNo %s icon available)worst_reasonget_printerr   r$   	get_levelr   ZREPORTZ
LEVEL_ICONr  r   r   r   r   r  r  r  r   r  r  r   r   ry   )
r   r   r   r  foundr  levelr   r   emblemr!   r!   r"   add_state_reason_emblem  sH    










z!JobViewer.add_state_reason_emblemc          	   C   s   | j s
d S |d kr$t| jj dk}|rh| j}x>| jj D ](\}}|jdtj}|tj	kr:| j
}P q:W n| j}y| j|}W n   t  Y nX |S )Nr   z	job-state)r   r_   r   rF   r   r+   r$   r:   r  ro  r   r  r  r  )r   	have_jobsr   r^  r  ry  r!   r!   r"   get_icon_pixbuf  s"    
zJobViewer.get_icon_pixbufc             C   s\   | j s
d S |d krLt| j}|dkr.td}n|dkr@td}ntd| }| jj| d S )Nr   zNo documents queuedrT   z1 document queuedz%d documents queued)r   r_   r   r`   r  Zset_tooltip_markup)r   tooltipr  r!   r!   r"   set_statusicon_tooltip  s    


z JobViewer.set_statusicon_tooltipc             C   s,  t  }x,| jj D ]\}}t|dkr|j| qW td|  t  }t|rt  }x.| jD ]$}| j| d }||kr\|j| q\W td|  g }x|D ]}|j| j|  qW d | _	t|dkr|d }x|D ]}	|	|kr|	}qW || _	td|  t
j  | jjd | j	d k	r6| j	j \}
}| jjd| nd }d}d}d}xh| jD ]^}y| j| d }W n tk
r~   wNY nX |tjkr|d }n|tjkrN|d }qNW |dks|dkrtd	||f }| jjd| | jr | j r | j|d
}| jj| | j  | j|d t
j  d S )Nr   zUpset printers: %szjob-printer-namezMy upset printers: %szWorst reason: %sr~  z	job-staterT   zprocessing / pending:   %d / %d)r  )r  )rI   r   r+   r_   r!  ry   r   r   rB   r  r   rG  r   popget_descriptionpushr@   r:   ro  r  r`   r   r   r  r  r	  r  r  rI  )r   r  Zupset_printersr   reasonsZmy_upset_printersr^  Z
my_reasonsr  r  rU   r  Zstatus_messageZ
processingpendingZ	job_stater   r!   r!   r"   update_status  sf    



zJobViewer.update_statusc             C   sN   |j  }|tjk rd S ddddddddd	d
dg}|j |kr@d S | j| d S )Notherzcom.apple.print.recoverablezconnecting-to-devicezcups-remote-pendingzcups-remote-pending-heldzcups-remote-processingzcups-remote-stoppedzcups-remote-canceledzcups-remote-abortedzcups-remote-completedzcups-waiting-for-job-completed)r  r   ZWARNING
get_reasonnotify_printer_state_reason)r   r  r  Z	blacklistr!   r!   r"   (notify_printer_state_reason_if_important6  s"    
z2JobViewer.notify_printer_state_reason_if_importantc             C   s   |j  }|| jkr&tdt|  d S |j }|tjksD|j dkrNtj	j
}ntj	j}|j \}}tjj||d}d|_|j| | jr|jtj |jd| j || j|j  < | j  y|j  W n tjk
r   t  Y nX d S )Nz Already sent notification for %szconnecting-to-devicer   Tr)  )	get_tupler   ry   r   r  r   ZERRORr  r   UrgencyZNORMALLOWr  Notificationrj   user_notifiedset_urgencyr   Zset_timeoutZEXPIRES_NEVERrt   #on_state_reason_notification_closedr  r   r   r   r  )r   r  tupler  ZurgencyrU   r   r.  r!   r!   r"   r  ]  s.    



z%JobViewer.notify_printer_state_reasonc             C   s"   t dt|  d|_| j  d S )NzNotification %s closedT)ry   r   r)  r  )r   r.  r  r!   r!   r"   r  y  s    z-JobViewer.on_state_reason_notification_closedc             C   sN  | j j|i }|jdtd}|jd}|d k	r|jd}|d krdg}tj| j| j| j| jd}y|j	||d}W n t
jk
r   d S X |jd}|d k	rtjj|\}	}
|	dkrd S |jdtd}tjjtdtd||f d}|jtjj |jd| j ||_|| j|< | j  y|j  W n tjk
rH   t  Y nX d S )Nzjob-namerB  zjob-printer-uriz
device-uri)r]   r   r^   )r   rM   socketipphttpr}  zjob-printer-namezDocument printedz1Document `%s' has been sent to `%s' for printing.r   r)  )r  r  r  r}  )r   r$   r`   rr  r;   r   r]   r   r^   rN   r:   rO   r  r  r  r   r   rj   r  r  r  rt   $on_completed_job_notification_closedr^  r   r  r   r   r   r  )r   r^  rT  r  r  r  r{  r>   r/   r  r  r   r.  r!   r!   r"   notify_completed_job  sJ    




zJobViewer.notify_completed_jobc             C   s   |j }| j|= | j  d S )N)r^  r   r  )r   r.  r  r^  r!   r!   r"   r    s    z.JobViewer.on_completed_job_notification_closedc             C   s*   | j j  i | _t | _i | _t | _d S )N)r   r  r   rI   r   r   r6   r  )r   monr!   r!   r"   r    s
    
zJobViewer.on_refreshc             C   sF  |j dd}y| jj|}W n tk
r4   |}Y nX | jrJ|| jkrJd S ||d< || jkrj| j|| nL|| jkrx@|j D ]4\}}	|| j	| kr~|	| j	| |< t
d||	f  q~W || jkrd S | j|r| jj| n|| jkr| jj| | jdd | jrB| j|sd S x*| jj |g D ]}
|
js&| j|
 q&W d S )Nzjob-printer-urir~  zjob-printer-namezAdd %s=%s (my job)T)r  )r$   r  rH   r@   r   r   rd  r  r+   r   ry   r  r   r!  rY  r  r   r   r  r  )r   r
  r^  	eventnamer   r  r   r   r  r  r  r!   r!   r"   r    s8    





zJobViewer.job_addedc             C   s  |j dd}y| jj|}W n tk
r4   |}Y nX | jrJ|| jkrJd S ||d< | j|rj| jj| n|| jkr| jj| | j	|| | j
  || jkrd S | j| }| jo|dks|dko|d tjkr|d }t|tkr|g}d}	x|D ]}
|
jd	rd
}	P qW |	s| j| | jr|dksP|dkr|d tjtjgkr|| jkrd
}|d }|tjks|tjkr|d dkrd}n|d }|d }|jdd'krtd||f }nV|jdd(krtd||f }n4|jdd)ks|tjkr
d}ntd|||f }|rtd | jd d
d tjtd| jd}|jtdtj j!tj"tj j# |j$tj j# |j%d |j&d |j't( tj)j*dd}|j%d tj+ }|j,tj-tj.j/ |j0|ddd tj1j*dd}dtd d  t2j3| }y4|d! tj4kr2|d" }|d#7 }|td$| 7 }W n tk
rJ   Y nX tj5|d%}|j6d
 |j7d
 |j8dd |j0|ddd |j0|ddd |j9j0|ddd |j:d&| j;| | jj| |j<  d S )*Nzjob-printer-urir~  zjob-printer-namezjob-completedzjob-state-changedz	job-statezjob-state-reasonsFzjob-canceledTzjob-stoppedzjob-hold-untilzauth-info-requiredznotify-textzjob-namezbackend errorsrT   zBThere was a problem sending document `%s' (job %d) to the printer.zfilter errorsz6There was a problem processing document `%s' (job %d).zbeing pausedz:There was a problem printing document `%s' (job %d): `%s'.zProblem detected)r:  zPrint Error)rU   rV   Z	_DiagnoserW   rX   r   z"<span weight="bold" size="larger">z	</span>

zprinter-statezprinter-name z*The printer called `%s' has been disabled.)rY   rZ   r   r   r   )=r$   r  rH   r@   r   r  r   r!  rY  ra  r  r   r   r:   IPP_JOB_COMPLETEDrA   r1   
startswithr	  rq  r  r   ro  rp  r  r`   ry   r
  r   ra   r   rb   rc   rd   ZSTOCK_OKr  rf   rg   rh   r   r   ri   rj   rk   rl   ZSTOCK_DIALOG_ERRORrm   rn   rp   r   r
   escapeZIPP_PRINTER_STOPPEDrq   Zset_use_markuprr   ro   rs   rt   r_  rw   )r   r
  r^  r  r   r  r   r   r  canceledr  Zmay_be_problemry  Znotify_textr  r9  rx   r{   r|   rs   Zmarkupr4   rY   r!   r!   r"   r    s    




















zJobViewer.job_eventc             C   s   | j rv|dks$|dkrv|d tjkrv|d }t| t|tkrF|g}d}x|D ]}|jdrPd}P qPW |sv| j| || jkr| j	j
| j|  | j|= | j|= || jkr| jj
| || jkr| j|= | j  d S )Nzjob-completedzjob-state-changedz	job-statezjob-state-reasonsFzjob-canceledT)r   r:   r  ry   rA   r1   r  r	  r   r   rY  r   r   r   r  )r   r
  r^  r  r   r  r  r  r!   r!   r"   r  }  s.    





zJobViewer.job_removedc       	      C   s   |j  \}}|j }y| j| }W n" tk
rD   g }|| j|< Y nX d|_|j| | j  | jj  | j	srd S x:| j
j D ],\}}| j|sq~|d |kr~| j| P q~W d S )NFzjob-printer-name)r  r  r   r@   r  rC   r  r   ru  r   r   r+   r  r  )	r   r
  r  rU   r   r   r-  rT  rU  r!   r!   r"   r    s&    



zJobViewer.state_reason_addedc          !   C   s   |j  }y| j| }W n tk
r2   td d S X y|j|}W n tk
r^   td d S X ||= | j  | jj  | j	sd S |j
 }yR| j| }t|dd dkry|j  W n tjk
r   Y nX | j|= | j  W n tk
r   Y nX d S )NzPrinter not foundzReason not foundr)  T)r  r   r@   ry   r  r  r  r   ru  r   r  r   r+  r   r   r   r  )r   r
  r  r   r  r  r  r.  r!   r!   r"   r    s8    

zJobViewer.state_reason_removedc             C   s   | j s
d S | j| d S )N)r   r  )r   r
  r  r!   r!   r"   r    s    zJobViewer.still_connectingc       
      C   s8  | j s
d S y2| j| }d }x|D ]}|j dkr |}P q W W n tk
rX   td Y nX |d k	rl|j }n^td d }x<| jj D ].\}}}||kr|dkrtd |||f}P qW |d krtd d S y| j| }	W n tk
r   td d S X t|	dd dkr4y|	j	  W n t
jk
r,   Y nX d|	_d S )	Nzconnecting-to-devicez(Couldn't find state reason (no reasons)!z#Couldn't find state reason in list!zFound from notifications listzBUnexpected now_connected signal (reason not in notifications list)zUnexpected now_connected signalr)  T)r   r   r  r@   ry   r  r   rF   r+  r   r   r   r)  )
r   r
  r   r  r  rP   r  r  r  r.  r!   r!   r"   r    sF    




zJobViewer.now_connectedc             C   s   | j j| d S )N)r  r=   )r   r
  r   r!   r!   r"   r  	  s    zJobViewer.printer_addedc             C   s   | j j|| d S )N)r  rE   )r   r
  r   r  r   r!   r!   r"   r  	  s    zJobViewer.printer_eventc             C   s   | j j| d S )N)r  rG   )r   r
  r   r!   r!   r"   r  	  s    zJobViewer.printer_removedc             G   s   |j dt|j|d d S )Nr   r   )r   r   r  )r   r(  r'  r  rW  rU  r!   r!   r"   r   	  s    z"JobViewer._set_job_job_number_textc             G   sL   |j |d}y| j| }W n tk
r.   d S X |jd|jdtd d S )Nr   r   zjob-originating-user-namerB  )r  r   r@   r   r$   r`   )r   r(  r'  r  rW  rU  r^  rT  r!   r!   r"   r    	  s    zJobViewer._set_job_user_textc             G   sL   |j |d}y| j| }W n tk
r.   d S X |jd|jdtd d S )Nr   r   zjob-namerB  )r  r   r@   r   r$   r`   )r   r(  r'  r  rW  rU  r^  rT  r!   r!   r"   r   *	  s    z JobViewer._set_job_document_textc       	      G   sn   |j |d}y| j| jd}W n tk
r4   d S X |dkrLdtd }nd}|jd| j| d |  d S )	Nr   zjob-state-reasonszprinter-stoppedz - Zdisabledr~  r   zjob-printer-name)r  r   r$   r@   r`   r   )	r   r(  r'  r  rW  rU  r^  r  r  r!   r!   r"   r   3	  s    zJobViewer._set_job_printer_textc       	      G   s`   |j |d}y| j| }W n tk
r.   d S X td}d|krPt|d d }|jd| d S )Nr   rB  zjob-k-octetskr   )r  r   r@   r`   r   r   )	r   r(  r'  r  rW  rU  r^  rT  sizer!   r!   r"   r   @	  s    zJobViewer._set_job_size_textc             C   s  y| j | }W n tk
r"   d S X |jdtj}t|}|tjkoR|jdddk}d }|rhtd}nx|tjkrtd}|jd}|d k	ry^|jd}|d!krt	j
 }	t|d | }
||d d  jd}|d"kr||d 7 }t||d | }t||d d  }nt||d d  }d	}|	j}|
|	jk sp|
|	jkrx||	jk sp||	jkrx||	jk rx|d7 }|	j|	j||
||d	d	d#f	}tjjd
}dtjd
< t	j|}|d krtjd
= n
|tjd
< t	j|}tdt	jd| }W n tk
r   Y nX |dkrtd}nb|dkr0td}nN|dkrDtd}n:|dkrXtd}n&|dkrltd}n|dkrtd}n`yHtjtdtjtdtjtdtjtdtjtdtjtdi| }W n tk
r   Y nX |d krtd }|S )$Nz	job-statezjob-hold-untilrj  zauth-info-requiredzHeld for authenticationZHeld:rT   r   ZTZZUTCzHeld until %sz%Xzday-timezHeld until day-timeZeveningzHeld until eveningZnightzHeld until night-timezsecond-shiftzHeld until second shiftzthird-shiftzHeld until third shiftZweekendzHeld until weekendZPendingZ
ProcessingZStoppedZCanceledZAbortedZ	CompletedrB  r   r   r   )r   r@   r$   r:   ro  r   rp  r`   r  rN  ZgmtimeZtm_mdayZtm_hourZtm_minZtm_secZtm_yearZtm_monr  r  ZmktimerP  rO  rt  r  rq  r  ZIPP_JOB_ABORTEDr  )r   rT  rU  ry  r=  rx  r  ZuntilZcolon1rS  ZhhZcolon2ZmmZssZdayr  Zold_tzZ
simpletimeZlocalr!   r!   r"   _find_job_state_textL	  s    































zJobViewer._find_job_state_textc             G   s&  |j |d}y| j| }W n tk
r.   d S X |jdtj}t|}|tjkrX| j}	n| j}	|tj	kr ylt
jj }
|
jt
jdd}|	j }|j|dd|j |j |j d d |j d d ddtjjd |}	W n& tjk
 r   tdt
j  Y nX n|d	 }| j|	|d
}	|jd|	 d S )Nr   z	job-stater   rC  rT   g      ?r  zNo %s icon availablezjob-printer-name)r   r   g      &@)r  r   r@   r$   r:   ro  r   r   r   rp  r   r   r   r   r   r  r  r  r  r   r  r  r   r   ry   r  r   )r   r(  r'  r  rW  rU  r^  ry  r=  r   r   r  r  r   r!   r!   r"   r   	  s8    


zJobViewer._set_job_status_iconc             G   s   |j |d}y| j| }W n tk
r.   d S X y|d }W n& tk
rb   | j|}||d< Y nX |d }| jj|g }	t|	dkr|	d }
x |	dd  D ]}||
kr|}
qW |
j \}}|d| 7 }|jd| d S )Nr   ri  zjob-printer-namerT   z - r   )	r  r   r@   r  r   r$   r_   r  r   )r   r(  r'  r  rW  rU  r^  r   r   r  r  r  rU   r   r!   r!   r"   r   	  s(    
zJobViewer._set_job_status_text)NNFFTNN)N)F)N)N)N)N)N)N)N)N)N)N)N)Rr'   r(   r)   rI   rk  r   r   r   r   r%   r*  r  r   r  r8  r
  rA  rH  r_  r]  rd  rf  ra  rv  r  r  r  r  r   r   rw  r   r  r  r  r  r  r  r   r   r  r  r  r   r   r   r   r  r  r   r  r   rl  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   r  r   r   r!   r!   r!   r"   r   |  s      
  & 

 	:
"
fq
(@$
_
F
 

+


@'
2
)  &/
	S$r   )Br   rr  r:   r  Z	dbus.glibZdbus.servicer  ZgiZrequire_versionZgi.repositoryr   r   r   r   r   r   Zguir   r  r  r  r	   r  r  r  sysrN  Zurllib.parser  Zxml.saxr
   debugr   Zstatereasonr7  	functoolsr   r  r   r  rt  gettextinstallr   r   r   Z
pkgdatadirZpkgdatar   r   ZSEARCHING_ICONZinitZSchemarj   ZSchemaFlagsr  ZSchemaAttributeTypeSTRINGZINTEGERr.   r   r*   r2   r6   rQ   r   r!   r!   r!   r"   <module>   sz   


b 