HEX
Server: Apache/2.4.65 (Unix) OpenSSL/3.5.5
System: Linux cpanel.ns-taberra.com 5.14.0-681.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Feb 11 20:19:22 UTC 2026 x86_64
User: asif201 (1002)
PHP: 8.3.0
Disabled: NONE
Upload Files
File: //usr/share/system-config-printer/__pycache__/newprinter.cpython-39.pyc
a

(V�^1��@s4ddlZddlZddlZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddl
Z
ddlZddlZddlTddlZddlmZddlmZddlZddlZddlZzddladaWndaYn0ddlZddlmZdd	lmZdd
lmZddlm Z ddl!Tddl"Z"ddl#Z$ddl%Z$ddl&m'Z'ddl(Tdd
l)m)Z)ddl*Z*ddl+Z+ddl,Z,ddl-Z-ddl.Z.ddl/Z/e/j0ej1ej2d�e3d�Z4dd�Z5dd�Z6dd�Z7dd�Z8d7dd�Z9dd�Z:dd�Z;dd�Z<d d!�Z=Gd"d#�d#e�Z>d$d%�Z?e@d&k�r0ddlAZAz$eA�BejCd'd�d(d)d*g�\ZDZEWn&eAjF�y^e?�e�Gd'�Yn0dZHd(ZIeDD](\ZJZKeJd+k�r�eKZHneJd,k�rleKZI�qld-ejLd.<ddlMZMe
�Ne
jOd(�eM�P�eQd�e�ReS�e>�ZTd/d0�ZUeT�Vd1eU�eT�Vd2eU�eT�Vd3eU�eHdu�reTjPd4eHeId5�n
eT�Pd6�e�W�dS)8�N)�OpenPrintingRequest)�*)�Gdk)�GtkTF)�GObject)�GLib)�GtkGUI)�OptionWidget)�SMBURI)�PhysicalDevice)�domain�	localedirz^The firewall may need adjusting in order to detect network printers.  Adjust the firewall now?cCs(tj�|�\}}|dus |dkr$dSdS)z*Returns True is the provided URI is valid.N�FT)�urllib�parse�	splittype)�uri�scheme�rest�r�./usr/share/system-config-printer/newprinter.py�validDeviceURILsrc	sn|��}|��\�}�fdd�|D�}|��}|D]6}|��}��|�}��|d�}|�|���|�q2dS)Ncsg|]}tj��|��qSr)rZTreeRowReference�new)�.0�row��
model_fromrr�
<listcomp>X�z$moveClassMembers.<locals>.<listcomp>r)�
get_selection�get_selected_rows�	get_model�get_path�get_iter�get�append�remove)	Z
treeview_fromZtreeview_to�	selection�rowsZmodel_tor�path�iterZrow_datarrr�moveClassMembersUs

r+cCsF|��}|��}g}|r:|�|�|d�d�|�|�}q|��|S�Nr)r!�get_iter_firstr%r$�	iter_next�sort)�treeview�modelr*�resultrrr�getCurrentClassMemberscsr3cCs<|sdS|��}|��D]}|js|j��|krdSqdS)NFT)�lower�valuesZ
discovered�name)�printersr6�printerrrr�checkNPNamemsr9cCsDz,|��}|r*|�|�t��r*t��qWnt�Yn0dS�N)Z
get_window�
set_cursorr�events_pending�main_iteration�nonfatalException)�winZcursorZgdkwinrrr�readyus
r@cCst|tj�tjj��dSr:)r@rZCursorrZ
CursorTypeZWATCH)r?rrr�busysrAcCs|��dS�NT)�hide��widget�eventrrr�on_delete_just_hide�srGcCst|t�r|dS|S)z{If we don't know whether getPPDs() or getPPDs2() was used, this
    function can unwrap an item from a list in either case.r)�
isinstance�list)�xrrr�
_singleton�s
rKc	Cs�|�d�std|�dSgd�}d}d}|D]}tj�|�r.|}qHq.|sXtd�dSztj||d�}|j�d�}Wntd	|�YdS0t	�
d
t	j�}|�|�}|r�|�
d����dd
�SdS)aGet GPG fingerprint from URL.

    Check that the URL is HTTPS with a valid and trusted server
    certificate, read it, extract the GPG fingerprint from it, and return
    it. Return None if the URL is invalid, not trusted, or the fingerprint
    can't be found.
    zhttps://z0Not a https fingerprint URL: %s, ignoring driverN)z"/etc/ssl/certs/ca-certificates.crtz/etc/ssl/certs/ca-bundle.crtz /etc/pki/tls/certs/ca-bundle.crtzhkp://keyserver.ubuntu.com:80z7No system SSL certificates available for trust checking)Zverify�utf-8zCannot retrieve %sz$ ((?:(?:[0-9A-F]{4})(?:\s+|$)){10})$�� r)�
startswith�
debugprint�osr)�exists�requestsr$�content�decode�re�compile�M�search�group�strip�replace)	�urlZssl_cert_file_pathsZgpg_key_serverZcert�fZreqrTZkeyid_re�mrrr�download_gpg_fingerprint�s0


r`c@s�eZdZejjddfejjdeffejjdeeffejjdeffejjddfd�ZdZ	dZ
dZdZdZ
d	Zd
ZdZdZd
Zdddddddddddd	d
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Z�dd$d%�Zd&d'�Zd(d)�Z d*d+�Z!d,d-�Z"d.d/�Z#d0d1�Z$d2d3�Z%d4d5�Z&d6d7�Z'd8d9�Z(d:d;�Z)d<d=�Z*d>d?�Z+d@dA�Z,dBdC�Z-dDdE�Z.dFdG�Z/dHdI�Z0�ddJdK�Z1dLdM�Z2dNdO�Z3dPdQ�Z4dRdS�Z5dTdU�Z6dVdW�Z7�ddXdY�Z8dZd[�Z9d\d]�Z:d^d_�Z;d`da�Z<dbdc�Z=ddde�Z>dfdg�Z?dhdi�Z@djdk�ZAdldm�ZBdndo�ZCdpdq�ZDdrds�ZEdtdu�ZFdvdw�ZGdxdy�ZHdzd{�ZI�dd|d}�ZJd~d�ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQ�dd�d��ZR�d	d�d��ZSd�d��ZTd�d��ZUd�d��ZV�d
d�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zkd�d��Zld�dÄZmd�dńZnd�dDŽZod�dɄZpd�d˄Zqd�d̈́Zrd�dτZsd�dфZtd�dӄZud�dՄZvd�dׄZwd�dلZxd�dۄZyd�d݄Zzd�d߄Z{d�d�Z|d�d�Z}d�d�Z~d�d�Zd�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�d��Z��d�d�Z��d�d�Z�dS(�
NewPrinterGUINr)�destroy�
printer-added�printer-modified�driver-download-checked�dialog-canceledrrM������TF)�parallel�usb�	bluetooth�hal�beh�hp�hpfax�dnssd�socket�lpd�scsi�serial�smb�networkcCsXtj�|�t�tj�|_i|_t�|_t�|_	d|_
d|_d|_d|_
d|_d|_g|_d|_d|_d|_d|_g|_d|_i|_d|_d|_d|_|jgd�ddggd�d�tjd�|jtd�d	gd
d
gddgddgd
d
gddgddgddgddgg	f|j td�d	gtd�dgtd�dgtd�dggf|j!td�d	gddgddggf|j"td�d	gtd�dgtd�dgtd�dgtd�dggffD]`\}}t#�$t%t%�}|D]}|�&|��q�|�'|�t#�(�}|�)�|�*|d�|�+|d d!��q�t#j,j-}t#j,j.}t#j,j/}td"�t#�$t%�|j0|ftd#�t#�$t%�|j1|ftd$�t#�$t%�|j2|ftd%�t#�$t%�|j3|ftd&�t#�$t%t%�|j4|ftd'�t#�$t%t%�|j5|ftd(�t#�$t%�|j6|ftd)�t#�$t%�|j7|ffD]H\}	}
}}t#�(�}t#j8|	|d!d*�}
|�'|
�|�9|
�|�:��;|��q�|j<�=d+t>�|j?�=d+t>�|_@|jA�Bd�|jC�Bd�|jD�Bd�|jE�Bd�d!|_Fd|_Gd|_H|jI}t#�(�}|�*|d�|�+|d d!�tjJ�r�|jK|jLfD]}|�M��q�tNjO�Pd,��s�tNjO�Pd-��r�d.t_Qd/|_Rn"tNjO�Pd0��r�d1t_Qd2|_Rndt_Sd3d4�}|jT|jK|jLfD]}|�=d5|��q|jU|jV|jW|jXfD]}|�=d6d7d8���q<|j2�:�}|�Y|jZd�|j2�[|j\d�|j2�=d9|j]�|j2�=d:|j^�|j_�=d;|j`�|j_�ad<�t#�btjc�|_d|je�fd�tg�s�|je�htd=��|ji�'|jd�t#�8td>��}t#�(�}|�*|d�|�j||jkd�|ji�9|�t#�8td?��}t#�(�}|�*|d�|�j||jld�|ji�9|�|ji�:�}|�Y|jmd�|j<�n|jo�|j6�pd�|j6�=d@|jq�t#�r�}|�stdA��|�tdB�|�tdC�|�tdD�|�tdE�|�tdF�|ju�v|�t#�r�}|�stdG��|�tdH�|ju�v|�dI|_wdJ|_x|�y�tzdK|�dS)LNF)M�NewPrinterWindow�ntbkNewPrinter�	btnNPBack�btnNPForward�
btnNPApply�spinner�	entNPName�entNPDescription�
entNPLocation�tvNPDevices�
ntbkNPType�lblNPDeviceDescription�expNPDeviceURIs�tvNPDeviceURIs�cmbNPTSerialBaud�cmbNPTSerialParity�cmbNPTSerialBits�cmbNPTSerialFlow�btnNPTLpdProbe�
entNPTLpdHost�entNPTLpdQueue�entNPTJetDirectHostname�entNPTJetDirectPort�	entSMBURI�btnSMBBrowse�
tblSMBAuth�rbtnSMBAuthPrompt�rbtnSMBAuthSet�entSMBUsername�entSMBPassword�btnSMBVerify�entNPTNetworkHostname�btnNetworkFind�lblNetworkFindSearching�lblNetworkFindNotFound�entNPTDevice�tvNCMembers�tvNCNotMembers�btnNCAddMember�btnNCDelMember�
ntbkPPDSource�	rbtnNPPPD�	tvNPMakes�rbtnNPFoomatic�filechooserPPD�rbtnNPDownloadableDriverSearch�entNPDownloadableDriverSearch�btnNPDownloadableDriverSearch�#btnNPDownloadableDriverSearch_label�$cmbNPDownloadableDriverFoundPrinters�
tvNPModels�tvNPDrivers�rbtnChangePPDasIs�rbtnChangePPDKeepSettings�scrNPInstallableOptions�vbNPInstallOptions�tvNPDownloadableDrivers�"ntbkNPDownloadableDriverProperties�lblNPDownloadableDriverSupplier�$cbNPDownloadableDriverSupplierVendor�lblNPDownloadableDriverLicense�$cbNPDownloadableDriverLicensePatents�!cbNPDownloadableDriverLicenseFree�"lblNPDownloadableDriverDescription�&lblNPDownloadableDriverSupportContacts�hsDownloadableDriverPerfText�hsDownloadableDriverPerfLineArt� hsDownloadableDriverPerfGraphics�hsDownloadableDriverPerfPhotoZ$lblDownloadableDriverPerfTextUnknownZ'lblDownloadableDriverPerfLineArtUnknownZ(lblDownloadableDriverPerfGraphicsUnknownZ%lblDownloadableDriverPerfPhotoUnknown�#frmNPDownloadableDriverLicenseTerms�tvNPDownloadableDriverLicense�rbtnNPDownloadLicenseYes�rbtnNPDownloadLicenseNo�
WaitWindow�lblWait)�SMBBrowseDialog�tvSMBBrowser�btnSMBBrowseOk)r{r�r�)rZDefaultrZ1200Z2400Z4800Z9600Z19200Z38400Z57600Z115200�NoneZnoneZOddZoddZEvenZeven�8�7zXON/XOFF (Software)ZsoftzRTS/CTS (Hardware)ZhardzDTR/DSR (Hardware)T�textrzMembers of this classZOthersZDevicesZConnectionsZMakesZModelsZDriverszDownloadable Drivers)r��delete-eventz/etc/apt/sources.listz/etc/apt/sources.list.dZdebZaptz
/etc/yum.confZrpmZyumcSs"t|dd�}|dur|�|�dS)N�protect_active)�getattr�
set_active)Z
toggle_widget�activerrr�protect_toggle�sz.NewPrinterGUI.__init__.<locals>.protect_toggle�clickedzchange-valuecSsdSrBr)rJ�y�zrrr�<lambda>�rz(NewPrinterGUI.__init__.<locals>.<lambda>z
row-activatedzrow-expandedznotify::expandedrMzBrowsing requires pysmbc moduleZShare�Commentz
query-tooltipzQPostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)z*.ppdz*.PPDz*.ppd.gzz*.PPD.gzz*.PPD.GZz
All files (*)r���r8z+%s){r�__init__�locale�	getlocale�LC_MESSAGES�language�options�set�changed�	conflicts�device�ppd�remotecupsqueue�exactdrivermatch�installable_options�
ppdsloader�installed_driver_files�searchedfordriverpackages�founddownloadabledrivers�founddownloadableppd�downloadable_driver_for_printer�downloadable_printers�nextnptab_rerunr7�recommended_model_selected�
_searchdialog�_installdialogZ
getWidgets�config�PACKAGEr��_r�r�r�r�	ListStore�strr%�	set_modelZCellRendererText�clear�
pack_startZ
add_attributeZ
SelectionModeZMULTIPLEZSINGLEZBROWSEr�r�r�r�r�r�r�r�ZTreeViewColumnZ
append_columnrZset_moder��connectrGr��WaitWindow_handlerr|Z
set_show_tabsr�r�r��
spinner_count�opreq�opreq_handlersr�ZDOWNLOADABLE_ONLYFREEr�r�rCrQr)rRZ
packagesystem�packageinstaller�DOWNLOADABLE_ONLYPPDr�r�r�r�r�Zset_select_function�device_select_functionZset_row_separator_func�device_row_separator_fn�device_row_activated�device_row_expandedr��on_expNPDeviceURIs_expandedZset_expanded�	TreeStore�
TYPE_PYOBJECT�	smb_storer��
set_sensitive�PYSMB_AVAILABLE�set_tooltip_textr�Zset_cell_data_func�smbbrowser_cell_share�smbbrowser_cell_comment�smb_select_function�set_transient_forr{Zset_has_tooltip�on_NPDrivers_query_tooltipZ
FileFilterZset_nameZadd_patternr�Z
add_filter�device_selected�dialog_modeZconnect_signalsrP)�selfrE�opts�storer�cellr_�s�br6r1r0Zselection_mode�column�comboboxr�Zslct�colZ
ppd_filterrrrr��spN��V�Z
��



��
��




����
���


������
�






zNewPrinterGUI.__init__cCstd|�dS)Nz-%s)rP�rrrr�__del__szNewPrinterGUI.__del__cCsRtd|�|jr"|j��d|_|jr8|j��d|_|jrN|j��d|_dS)NzDESTROY: %s)rPr�rbr{r�rrrr�
do_destroys


zNewPrinterGUI.do_destroycCs0|jdkr|j��|j��|jd7_dS)NrrM)r�r��show�startrrrr�inc_spinner_task&s


zNewPrinterGUI.inc_spinner_taskcCs0|jd8_|jdkr,|j��|j��dS�NrMr)r�r�rC�stoprrrr�dec_spinner_task-s

zNewPrinterGUI.dec_spinner_taskcCs&td|t|�|f�t|||jd�S)Nz%s: IPP error dialog (%s, %s)��parent)rP�repr�show_IPP_Errorr{)r�	exception�messagerrrr(3s�zNewPrinterGUI.show_IPP_ErrorcCsN|��r|j�|�n|j�|�|jr6|j�|�n|j�|�|��dSr:)Z
is_changedr��add�discardr��setDataButtonState)r�optionrrr�option_changed8szNewPrinterGUI.option_changedcCs|j�t|j��dSr:)r~r	�boolr�rrrrr-Fsz NewPrinterGUI.setDataButtonStatecCst|�dd�}|�dd�}|�dd�}t|j|�spd}t|j|dt|��s`|d7}|dkr4q`q4|dt|�7}|S)z-Make a suggested queue name valid and unique.rN�-�/�#rgrM�d)r\r9r7r�)rr6�suffixrrr�makeNameUniqueIszNewPrinterGUI.makeNameUniquecCs|�d�dS)Nrb)�emitrrrrrbWszNewPrinterGUI.destroyrc

Cs||_|js|j�d�||_||_||_||_||_||_||_	|sPt
��|_|s^t
��|_i|_
t�|_t�|_d|_d|_d|_d|_|��s�t�ztj|j|j|jd�|_
Wn�t
jy�}
z"|
j\}t||j�WYd}
~
dSd}
~
0t�ytd|j�YdSt�y>}
zt|
�WYd}
~
dSd}
~
00zt�|j
�|_ WnDt
j!�y�}
z(|
j\}
}t"|
||jd�WYd}
~
dSd}
~
00|j#�$�|j%�&d�|j%�'d�|j(�&d�|j)�$�|j*�+�}
|
�,�|j-}|�.t/�0t1t1��|j2�'d�|j3}|�'t4d��|j5�'d�|j6�7d�|	d	k�r\|j�r\|j�8�|j�9|j�|jd
k�rr|�:�np|jdk�r�|�;�nZ|jdk�r�|�<�nD|jd
k�r�|�=�n.|jdk�r�|�>�n|jdk�r�|�?�dS|	d	k�r|j�r|j�9|�|j�@�|�A�dS)NF)r&�host�
encryptionr�r%Tr�SearchZ9100rr8�classr��printer_with_urir��download_driver)Br&r{Zset_focus_on_mapr�_device_uri�orig_ppd�devid�_host�_encryption�_name�cupsZ	getServerZ
getEncryptionr�r�r�r��fetchDevices_conn�ppds�ppdsmatch_result�printer_finder�_validInitParameters�RuntimeError�authconn�
Connection�	HTTPError�argsZshow_HTTP_Error�	Exceptionr>�cupshelpers�getPrintersr7�IPPErrorr(r�rCr�r	�set_textr�r�r�r!r�r�r�rr�r�r�r�r�r�r�r��show_nowr�_initialisePrinterMode�_initialiseClassMode�_initialiseDeviceMode�_initialisePrinterWithURIMode�_initialisePPDMode�_initialiseDownloadDriverModer�setNPButtons)rr�
device_urir6r�r@r8r9r&Zxid�err_r1r�labelrrr�initZs�

�










zNewPrinterGUI.initcCs,|jdvr|jduS|jdkr(|jdkSdS)N)r<r�r�r=rT)rr>r@rrrrrI�s




z"NewPrinterGUI._validInitParameterscCs4|�d�|j�td��|��|j�|j�dS)Nr;z	New Class)�_initialiseWidgetsForModer{�	set_titler��fillNewClassMembersr|�set_current_page�PAGE_DESCRIBE_PRINTERrrrrrV�s
z"NewPrinterGUI._initialiseClassModecCsL|�d�|j�td��|j�|j�|��|j�	d�|�
|j�dS)Nr8�New PrinterT)r`r{rar�r|rc�PAGE_SELECT_DEVICE�
fillDeviceTabr�r��on_rbtnNPFoomatic_toggledrrrrrU�s
z$NewPrinterGUI._initialisePrinterModecCs.|j�td��|j�|j�|�|j�dS)NzChange Device URI)r{rar�r|rcrfrgr>rrrrrW�sz#NewPrinterGUI._initialiseDeviceModecCsl|�d�|��|j�td��|j�|j�|j�	d�|�
|j�|j�	d�|��|j
dd�dS)Nr8reTr��step)r`�_initialiseDeviceFromURIr{rar�r|rc�PAGE_SELECT_INSTALL_METHODr�r�rhr��_initialiseAutoVariables�	nextNPTabrrrrrX�s
z+NewPrinterGUI._initialisePrinterWithURIModecCs4|j�td��|j�|j�d|_|jdd�dS)NzDownload Printer DriverTrri)r{rar�r|rc�PAGE_DOWNLOAD_DRIVERr�rnrrrrrZ�sz+NewPrinterGUI._initialiseDownloadDriverModecCs�|��|j�td��|js�t|j�dd�d�}|g}|dvrP|�ddg�t	�
�|_|j�td��|�
�tj|j||j|jd	�|j�|j�|j�d
�|�|j�|j�d
�|��dS)Nz
Change Driver�:rMr�rurv�ipp�snmprt�fetching device list�Zinclude_schemes�
reply_handler�
error_handlerT)rkr{rar�r@r�r>�split�extend�	asyncconnrLrE�_begin_operationr!rP�
getDevices�change_ppd_got_devsr|rcrlr�r�rhr�rm)rrZschemesrrrrY�s(
�z NewPrinterGUI._initialisePPDModecCsH|j�|�|��|j��|j|j|j|j|jfD]}|�d�q4dS�Nr)	r�rSr6Z
grab_focusr�r�r�r�r�)rZ	mode_namerErrrr`
s
�z'NewPrinterGUI._initialiseWidgetsForModecCsi}tj|jfi|��|_dSr:)rP�Devicer>r�)r�device_dictrrrrksz&NewPrinterGUI._initialiseDeviceFromURIcCsd|_d|_d|_dSr~)�	auto_make�
auto_model�auto_driverrrrrrmsz&NewPrinterGUI._initialiseAutoVariablescCs�|j��|j��d|_|��t|t�r2i}n|}d}d}|jdkrP|j}n$|�|jj	�}|rt|j
}|j}||_|j�
|j�|jdd�dS)Nrrri)rE�_end_operationrbr$rHrOr@r$r�r�id�make_and_modelr|rcrlrn)r�connr2Zcurrent_devicesr@Zmmr�rrrr}s$



z!NewPrinterGUI.change_ppd_got_devscCsX|�|�|jsdS|jr d|_td�d|_|j��|jkrL|j	dd�n|�	�dS)a
        This method is called when the PPDs loader has finished
        loading PPDs in preparation for the next screen the user will
        see, having clicked 'Forward'.  We are creating a new queue,
        and dialog_mode is either "printer" or "printer_with_uri".
        NTz-Loaded PPDs this time; try nextNPTab again...rri)
�_getPPDs_replyrF�_jockey_has_answeredr�rPr�r|�get_current_pagerlrn)rr�rrr�on_ppdsloader_finished_next5s
z)NewPrinterGUI.on_ppdsloader_finished_nextc
Cs�|��}|r\|��z|�Wn>tjyZ}z$|j\}}|�||�WYd}~dSd}~00|��}|r�||_|��|_	|j
r�|��|_nd|_d|_	|��d|_
dSr:)Z	get_errorrbrDrRrNr(Zget_ppdsrFZget_ppdsmatch_resultrGr�Zget_installed_filesr�r�)rr��excr]r_rFrrrr�Ms&

zNewPrinterGUI._getPPDs_replycCs�|j��}|��|j��}|��zt�|j�|_WntjyPi|_Yn0|j�	�D]"}|j|j
tj@s\|�|f�q\dSr:)
r�r!r�r�rPrQrDr7rR�keys�typeZCUPS_PRINTER_CLASSr%)rr1r8rrrrbgs

z!NewPrinterGUI.fillNewClassMemberscCs2t|j|j�|j�tt|j���|�d�dS�NF)r+r�r�rr	r0r3�r�buttonrrr�on_btnNCAddMember_clickedus
�z'NewPrinterGUI.on_btnNCAddMember_clickedcCs2t|j|j�|j�tt|j���|�d�dSr�)r+r�r�rr	r0r3r�rrr�on_btnNCDelMember_clicked{s
�z'NewPrinterGUI.on_btnNCDelMember_clickedcCs4|��}|durdS|��\}}|j�|gk�dSr:)rr r�r	�rrEr'rr(rrr�on_tvNCMembers_cursor_changed�s
z+NewPrinterGUI.on_tvNCMembers_cursor_changedcCs4|��}|durdS|��\}}|j�|gk�dSr:)rr r�r	r�rrr� on_tvNCNotMembers_cursor_changed�s
z.NewPrinterGUI.on_tvNCNotMembers_cursor_changedcCs�|jr|j��d|_|��|jr4|j��d|_|jrR|j��d|_|��|j��|jdur�|j	D]}|j�
|�qld|_	|j��d|_d|_i|_|�
d�dS)NrfT)rErbr$r�rH�cancelr{rCr�r��
disconnectr�r7r7)rrErF�handlerrrr�on_NPCancel�s,







zNewPrinterGUI.on_NPCancelcCs|�d�dS)Nr��rn�rrErrr�on_btnNPBack_clicked�sz"NewPrinterGUI.on_btnNPBack_clickedcCs|��dSr:r�r�rrr�on_btnNPForward_clicked�sz%NewPrinterGUI.on_btnNPForward_clickedc
Cs�|�|�}|sdS|d}|d}|d}td�|}tj|jddtjjtjj|d�|_	|j	�
td��|j	��}t��}|�
|�|��||j	_|j	�d	|j�|j	��|�|||�}	|j	r�|j	��|j	��d|_	|	S)
NFr6�repo�keyidzInstalling driver %sT)r&�modal�destroy_with_parentr��buttonsr�zInstalling ...�response)�_getDriverInstallationInfor�r�
MessageDialogr{�MessageType�INFO�ButtonsType�CANCELr��format_secondary_textZget_message_areaZProgressBarr+r�
_progress_barr��_installdialog_response�show_all�do_installdriverpackagerCrb)
r�driverZinstall_infor6r�r��fmtZ
dialogarea�pbar�retrrr�installdriverpackage�s6
�




z"NewPrinterGUI.installdriverpackagec
Cs�tdt|�t|�t|�f�tj��}d|d<|rBd|||g}n
d||g}tdt|��d}�z*tj||dtjtjd�|_	|j	j
|j	j}}d}	|jj
}
|j	��du�rr|����}t|�d	k�rL|d
kr�d}	�qrnt|�d��r:zFt|dd��}|d	k�r|
�|d
�n|
�|d
�|
��WnYn0n|j�|�d��t���rbt���qL|s�t�d�q�|j	jd	k�r�|	�s�d}Wnd}Yn0|�s�g|_|S)Nz+Installing driver: %s; Repo: %s; Key ID: %s�C�LC_ALLzinstall-printerdriverzRunning command: T)�env�	close_fds�stdin�stdoutFr�done�PrMr4rLg�������?) rPr'rQ�environ�copy�
subprocess�Popen�DEVNULL�PIPE�pr��stderrr�r�Zpoll�readliner[�lenrO�floatZset_fractionZset_pulse_stepZpulser�r%rUrr<r=�time�sleep�
returncode)
rr6r�r��new_environrNr�r�r�r�r��lineZ
percentagerrrr��s`��


�


z%NewPrinterGUI.do_installdriverpackagecCs�|�di�}t|���}t|�dkr0td�dSt|�dkrPtdt|��dS||d}t|�dkrttd�dSt|���d}d}|�d�r�|�d	�d}n0|�d
�r�d�|�d�dd��}nt	d
|��d}d||v�rt
j�r@|ddv�r@td�dSn8t||d�}t
j�r@|ddv�r@|�s@td�dS||�di��|j
�}|�s�td|j
t||�di��f�dS|||d�S)N�packagesrzNo packages for driverrMzMReturned more than one matching architecture, please report this as a bug: %sz=Returned more than one package, this is currently not handledrz.debr�z.rpmr1���zUnknown package type: Zfingerprint)�allZnoarchz?Not installing driver as it does not have a GPG fingerprint URLzANot installing driver as it does not have a valid GPG fingerprintZrepositoriesz'Local package system %s not found in %s)r6r�r�)r$rIr�r�rPr'�endswithrx�join�
ValueErrorr�ZDOWNLOADABLE_PKG_ONLYSIGNEDr`r�)rr�ZpkgsZarches�pkgr6r�r�rrrr�sJ

��z(NewPrinterGUI._getDriverInstallationInfocCs|j��dSr:)r�Z	terminate�r�dialogr�rrrr�Isz%NewPrinterGUI._installdialog_responsecCs�|j��}td|�d}|jdksB|jdksB|jdksB|jdkrZ|�|�}||jkrZd}|sjtd�dS|��}||�|�|}d}z&|�|j�d	kr�||jko�|d
k}Wn$t	y�||j
ko�|d
k}Yn0td|�|�r`|��|_d|_
|jdu�rdSt|jtj��r |��n|j}d|_|��||_|j
�s`||j
k�r`||�|�d}||j
k�r�|j
�s�|d
k�r�||�|�d}td
|�|d
k�r�||jk�r�|��|d
k�r�||jk�r�d}	d}
z8|jj�r|jjdv�rd|jjd|jjdf}	Wnt�Yn0zn|	du�r�t|jtj��r�|j�d�j}tj�|�\}}
|�rx|
�rxd||
f}	n|�s�|
�r�d||
f}	Wnt�Yn0|	�r�|	}
nd}	|�|	�}	|j �!|	�|
�r�|j"�!|
�|j�#|�|�$�dS)NzNext clicked on page %dTr8r<r�r=Fz9Interrupting execution of nextNPTab(): Operations pendingr�rzWill fetch ppd? %drMzWill advance to page %d)rurvrr�http�httpsroz%s %s�MFG�MDLZ	modelNamez%s%s)%r|r�rPr�_handlePrinterInstallationMode�INSTALL_RESULT_OPS_PENDING�_getPagesOrderForDialogMode�index�
PAGE_APPLYr��PAGE_INSTALLABLE_OPTIONS�getNPPPDr�r�rHrD�PPD�fillNPInstallableOptionsro�fillDownloadableDriversrdr�r�r��id_dictr>�findAttr�valuerPrF�ppdMakeModelSplitr6r�rSr�rcr[)rrj�page_nrZ
keep_goingZinstall_result�orderZnext_page_nrZ	fetch_ppdr�r6ZdescrZmname�maker1rrrrnLs�
��



��

�
�

zNewPrinterGUI.nextNPTabcCsrg}|jdkr"|j|j|jg}�nL|jdkr8|jg}�n6|jdk�r&|jrX|j|jg}n�|jr�|j�	�s�|j
r�|j|j|j|jg}n|j|j|j|j
|j|jg}n�|j
r�|j�	�s�|j|j|jg}n^|j�	�r�|j|j|j
|j|jg}n:|j�	��r
|j|j|j|jg}n|j|j|j|j|jg}�nH|jdk�r�|j�	��rT|j|j
|j|jg}n2|j�	��rr|j|j|jg}n|j|j|j|jg}n�|jdk�r�|jg}n�|j�r�|jg}n�|j�r�|j�	��s�|j
�r�|j|j|jg}n|j|j|j
|j|jg}nv|j
�r|j�	��s|j|jg}nT|j�	��r<|j|j
|j|jg}n2|j�	��rZ|j|j|jg}n|j|j|j|jg}|S)Nr;r=r8r�r�)rrd�PAGE_CHOOSE_CLASS_MEMBERSr�ror�rfr�r��
get_activer�r�rl�PAGE_CHOOSE_DRIVER_FROM_DBr�r�)rr�rrrr��s�
�
�������
��	��������������z)NewPrinterGUI._getPagesOrderForDialogModecCs�t|j�|j��}|j��}|j}||jks8||jkr@|dks\||jksT||jkrh|dkrh|�||�}||j	kr�|j
js�z<|j�
���\}}|�|d�d}|�|�}|j�|�Wnt�Yn0t|j�|Sr,)rAr{r|r��INSTALL_RESULT_DONErfrorl�_handlePrinterInstallationStager�r�r�r�r�get_selectedr$r6r�rSr>r@)rrjr�r2r1r*r6rrrr�@s6



�����


z,NewPrinterGUI._handlePrinterInstallationModecCs|jdkr>|jj}|r>|�d�r>t|dd�d���}|��||jksR||jkr^|�	|�n||j
krz|jdkrz|��d}|j
r�|jdkr�|jdkr�|jj}|s�|j}|s�d}|jdur�|jdkr�|�||�|jSd|_||jks�||jkr�|��|�|||�S)Nr=ryrk�rFr�)rr�rrOr
Zsanitize_uri�_installSMBBackendIfNeededrfrl�_selectDeviceForInstallationror��_handleDriverInstallationr�r�r@rF�_loadPPDsForDevicer��_installHPScannerFilesIfNeeded�_installPrinterFromDeviceID)rr�rjrr@rrrr�cs0

z-NewPrinterGUI._handlePrinterInstallationStagecCsp|jdkrl|jsl|jdks(|jddkrlt�dtj�sltd�zt��}|�	ddd�Wnt
�Yn0dS)NF�	localhostrr2z/usr/lib/cups/backend/smbz$No smb backend so attempting installzsamba-client)r�r�rArQ�access�F_OKrP�installpackage�
PackageKit�InstallPackageNamer>�r�pkrrrr��s���z(NewPrinterGUI._installSMBBackendIfNeededc
Csp|��|��|j_|jr2|j��d|_|��|jrP|j��d|_|��|jj	sl|jj
dvrl|��d|_t
�d|�}|�r0|��}t|d�dkr�t|ddd��}nd}z�td�tj�|d|�}|�dd|d	�|��}|jd
k�r|d	|_|��}t���V}|�|�|��zt�|j �}	Wn"tj!t"f�yZt#d��Yn0Wd�n1�sr0YWnYn0z|tj$}
tj%|d||
d�}d
dg}|j&||d�}
|
�'d
d�}|
�'dd�}t|�dk�r�|j(�)|�t|�dk�r||j_*Wn$t"�yYnt+�Yn0n<|�,d��sH|�,d��rl|�-d�dk�rl|jj.�rl|jj.|_dS)Nrqz"ipp://(\S+?)(:\d+|)/printers/(\S+)rMriwz$Download ppd file from remote serverZGETz/printers/%s.ppdrg��zServer's ppd file is corrupted.)r8�portr9zprinter-infozprinter-location)rZrequested_attributesr�dnssd:�mdns:�/cupsr�)/rm�getDeviceURIr�rrErbr$rHr�r�r��getNetworkPrinterMakeModelr�rVrY�groupsr��intrPr�ZclientZHTTPConnection�requestZgetresponse�status�read�tempfile�NamedTemporaryFile�write�flushrDr�r6rRrJ�IOErrorZHTTP_ENCRYPT_IF_REQUESTEDrLZgetPrinterAttributesr$r�rS�locationr>rO�find�info)rr�res�resgrr�Zresp�
ppdcontent�tmpfr�r9�c�r�attrsrrrrrr��s�


�


2
����z*NewPrinterGUI._selectDeviceForInstallationcCs�|j}|����\}}d}|dur.|�|d�}|dusF|dksFd|vrJdS|�|�}|rft|j�dkrjdSd|_|jdkr�|j	j
s�|j	jr�|j	jdkr�|jr�|j|j	_dS�NrMrr�r=�Unknown�
r�rr��	get_valuer�r�r�rFrr�r�r�r�)rr0r1r*r�r2rrrr��s*

��
��z'NewPrinterGUI._handleDriverInstallationcCsdt|jd�r`|jjr`t�dtj�s`t�dtj�s`td�zt��}|�	ddd�WnYn0dS)N�hp_scannablez/etc/sane.d/dll.d/hpaioz/etc/sane.d/dll.d/hplipz+No HPLIP sane backend so attempting installrz
libsane-hpaio)
�hasattrr�rrQr��R_OKrPr�r�r�r�rrrr��s��z,NewPrinterGUI._installHPScannerFilesIfNeededcCsBtd�tj|||j|j|jd�}||_|�d|j�|��dS)NznextNPTab: need PPDs loaded)�	device_idr\r&r8r9�finished)	rPr�Z
PPDsLoaderr{rArBr�r��run)rr@rr�rrrr�	s�z NewPrinterGUI._loadPPDsForDevicecCs�d}g|_�zp|jdkr$d}d}�nV|jrb|jdur>d}||_|j}|�|�}|j�|�d}�n|jjs�|jj	r~|jj	dks�|�rp|jjr�|jj
}nT|r�t�|�}nDi}tj
�|jj	�\|d<|d<d	|d
<g|d<d|d|df}|j
�|d|d|d
|d|jj|jj	�}td
t|��|j
jt|���|j||d�}	tdt|	��|	|_|	d}||}�n
|jdk�r>|j�r>|j�d�}
|
�s�|j�d�}
|
�r"|
j�r"|
j}|�d��r�|dd�}tj
�|�}|\}
}|j
�|
|�}|��D](\}}t|�d��|k�r�|}�q"�q�|�r.d}nd}||_d}n<|jdk�rZd}||_d}n |j
�dddg|jj�\}}d}Wnt �Yn0|�r�|j�r�|jdk�r�|�!|||||�S|j"S)Nr=�downloadZgeneric�raw�exactrr�r�r�DESZCMDzMFG:%s;MDL:%s;zSuitable PPDs found: %s)r@�fitzPPDs in priority order: %srr�ZNickNameZ	ModelName� (recommended)i��ppd-make-and-model�GenericZPrinterzGeneric Printer)#�id_matched_ppdnamesrr�r�r6r�rSr�r�r�r�rP�
parseDeviceIDrFr�ZgetPPDNamesFromDeviceIDrrPr'�orderPPDNamesByPreferencerIr�r�r?r�r�r��getInfoFromModel�itemsrKr$ZgetPPDNameFromDeviceIDr>� _installPrinterOrSearchForDriverr�)rr@r�rj�ppdnamer
r6r�r)Zppdnamelist�attrr�Zmfgmdlr�r1rFr�rrrrr�s�


�
��
����
���
���z)NewPrinterGUI._installPrinterFromDeviceIDcCsR�z|dkrR|j�|�}t|d�}tj�|�\}}	||_|	|_||_|�||	�|dksb|dkr�|j	dkr�d|_
|dkr�|j}�n~d|_
|j	dk�r|jdk�r|�rt
|�dk�r|�d	�dk�s|�d
�dk�s|�d�dk�s|�d�dk�s|�d
�dk�s|�d�dk�s|�d�dk�s|�d�dk�std�td|�d|_d|_td�}
tj|jddtjjtjj|
d�|_|j�td��t�|_|j�d|j�|j��g|_ |j �!|j�d|j"��|j �!|j�d|j#��d|_$|j�%|�|j&WSWnt'�Yn0|j	dk�sD|j	dk�rL|j(�sL||j)k�rL|�*�|j+S)Nr%r+r'z	exact-cmdr�TrFzMFG:generic;zMFG:Generic;zMFG:unknownzMFG:UnknownzMDL:unknownzMDL:UnknownzMFG:;zMDL:;z7nextNPTab: No exact driver match, querying OpenPrintingznextNPTab: Searching for "%s"�	Searching�r&r�r�Zmessage_typer�r�zSearching for driversr�r#�errorr=),rF�getInfoFromPPDNamerKrPr�r�r�r��fillDriverListrr�r�r�r�rrPZ_searchdialog_canceledr�rr�r{r�r�r�r�r�r�rr�r��_searchdialog_responser�r�r%�opreq_id_search_done�opreq_id_search_error�opreq_user_search�searchPrintersr�r>r�ro�fillMakeListr�)rr@r3r
r�rj�ppddictZ
make_modelr�r1r�rrrr2ys�
��
��
�������	�
�
���
�������z.NewPrinterGUI._installPrinterOrSearchForDrivercCsP|j�d�|j�td��g|_d|_d|_d|_t	|j
�t�|j
j�dS�NTr:F)r�r	r�rSr�r�r�r�r�r@r{r�idle_addr�r�r�rrrr:�s
z$NewPrinterGUI._searchdialog_responsecCsB|jD]}|�|�qt���zd|_d|_d|_|j��|j��d|_t	|�dkr�t
|j�d|_|j
dkr�|�d�n|��n�||_||_d|_zp|j��|��|��s�t
|j�d|_|j
dkr�|�d�n|��n"|j
dk�r|jdd�n|��Wnt�|��Yn0Wt��n
t��0dS)NFrMr=Trri)r�r�r�
threads_enterr=r�r�rCrbr�r@r{r�rr�rnr��downloadable_driversrr[r�r>�
threads_leave)rr�r7�driversr�rrrr;�sF









z"NewPrinterGUI.opreq_id_search_donecCs*td|t|�f�|�|t�t��dS�Nz$OpenPrinting request failed (%d): %s)rPr'r;rI�dict�rr�r
�errrrrr<s�z#NewPrinterGUI.opreq_id_search_errorcCs�|j}|����\}}d}|dur.|�|d�}|dusF|dksFd|vrJdS|�|�rbt|j�dkrfdSd|_|jdkr�|j	j
s�|j	jr�|j	jdkr�|jr�|j|j	_dSrr)rr0r1r*r�rrr�&_installSelectedDriverFromOpenPrintings0
�
�����z4NewPrinterGUI._installSelectedDriverFromOpenPrintingc	Cs |j��}|jdkrn|j��|j��|j��z|��}t	|�}Wnt
y\d}Yn0|j�|�dS|jdk�r�||jkr�|j
s�td�|j��|j��n|j��|j��dS||jkr�|j��|j��dS|j��|j��||jk�r�|j��|j��d}|j���rP|j}|��}|�rP|���|d��rPd}|j�t|j���rx|j��ddu�p�|j���p�|��dS|j��|jdk�r�|j��|j��|j��|��}|j�|�dS||jk�r,d}z|��}t	|�}Wnt�Yn0|j�|�|j��n
|j��|j��|j��||j k�r�|j��|jd	k�sx|jd
k�r�|j��|j��|j�t!|j"|j#�$���|jdk�r�|j��|jd
k�r�|j%�s�|j&�r�|j
�s�|j��||jk�rnd}|j���r0|j}|��}|�r0|���|d��r0d}|j�t|j���pR|j���pR|��|jd
k�rn|j��||j'k�r�|j(�)��*�\}}|j�t|��||j+k�r�|j��|j��|j�tt,|j-���||jk�r�|jd
k�r�|j&�r�|j��||j.k�r|��}|j�|�dS)Nr�Fr�zNo installable optionsrMTrr=r8r<r;)/r|r�rr}rCr~rrrr�AttributeErrorr	r�r�rPr�rlr�r�r��get_active_iterr!rr0r�r��
get_cursorr��get_filename�_is_driver_license_acceptedrfr>rdr9r7r��get_textr�r�r�r�rr�r�r3r�ro)	r�nrrZvalidZdownloadable_selectedrr*Zacceptedr1rrrr[.s�
















���







�

�
���
��


��
zNewPrinterGUI.setNPButtonscCsZ|j��}||jkr|j��S|j}|����\}}|sR|��\}}|rR|�	|�}|duSr:)
r�r�rfr�r�r�rr�rNr#)rZcurrent_pager0r1r*r)rrrrrP�s



z)NewPrinterGUI._is_driver_license_acceptedcCsz|��}|}|�dd�}|�dd�}|�dd�}||krB|�|�|jdkrb|j�t|j|��n|j�t|j|��dS)Nr2rr3rNr8)	rQr\rSrrr	r9r7r~)rrEr��new_textrrr�on_entNPName_changed�s


�
�z"NewPrinterGUI.on_entNPName_changedcsptd����gd�}�j}|dkrJ��fdd�}tj�j|||d�n"��fdd�}tj�j|||d�dS)	N�fetchDevices)rtrs�
driverless�bjnproFcs��||��Sr:)�local_devices_reply�rJr���current_urirrrr��s�z,NewPrinterGUI.fetchDevices.<locals>.<lambda>)Zexclude_schemesrvrwcs��||��Sr:)�network_devices_replyrYrZrrr��s�ru)rPr!�error_getting_devicesrPr|rE)rrzr[Znetwork_schemesrwrvrrZrrU�s"��zNewPrinterGUI.fetchDevicescCs6tdt|��|��|j��|j��d|_dS)NzError fetching devices: %s)rPr'r$rEr�rb)rr�r�rrrr]�s


z#NewPrinterGUI.error_getting_devicescCs&|��|jd|d�|�||�dS)NT�rzr[)r$rU�add_devices)rr�r2r[rrrrX�sz!NewPrinterGUI.local_devices_replyc	s��j���j��d�_d}i}|��D]\}}|�d�r*|||<d}q*|��D]
}||=qR�j|�|d�t|�dkr�t�	|�}��
�|j��fdd�d������
�dS)	NTzdnssd://F��no_morercs���|�Sr:)�dnssd_resolve_reply)�devicesrZrrr�s�z5NewPrinterGUI.network_devices_reply.<locals>.<lambda>�rv)rEr�rbr1rOr�r_r��dnssdresolveZDNSSDHostNamesResolverr!�resolver$�check_firewall)	rr�r2r[raZneed_resolvingrr�ZresolverrrZrr\�s$



z#NewPrinterGUI.network_devices_replycCs$|j||dd�|��|��dS)NTr`)r_r$rg)rr[rcrrrrbsz!NewPrinterGUI.dnssd_resolve_replycCs
tj��}d|d<d|d<dddd|g}t|d	t|��z,tj||d
tjtjtjd�}|�	�\}}WnYdS0d}|�
��d
�D]Z}|�d�dkr�q�t
�d|�}	|	r�|	��}
zt|
d�}Wnd}Yn0|dkr�q�q�|dkr�dS|dk�rdSdSdS)Nr�r�rZDISPLAYzhp-infoz-xz-i�-d�: T)r�r�r�r�r�r��
zfax-typez(\d+)rrizMFG:HP;MDL:Fax 2;DES:HP Fax 2;zMFG:HP;MDL:Fax;DES:HP Fax;)rQr�r�rPr'r�r�r�r��communicaterUrxrrVrYrr)r�faxurir�rNr�r�r�Zfaxtyper�rrrrr�get_hpfax_device_ids@

�

z!NewPrinterGUI.get_hpfax_device_idc	Cs�dddd|g}t|dt|��z:tj|dtjtjtjd�}|��\}}|jdkrZWdSWnYdS0|���	�}|�
d	d
�}t|�dkr�dS|d
}|dkr�dS|S)
Nzhp-queryz-kz	scan-typerhriT�r�r�r�r�r�=rMrg�0)rPr'r�r�r�r�rkr�rUr[rxr�)	rrrNr�r�r�Z	scan_type�fieldsr�rrr�get_hplip_scan_type_for_uri>s*�

z)NewPrinterGUI.get_hplip_scan_type_for_uric	Cs�|dkrd}n|dkrd}nd}d||g}t|dt|��d}z:tj|dtjtjtjd�}|��\}}|jd	krzWdSWnYdS0|���	�}|S)
N�printz-c�faxz-fz
hp-makeuririTrnr)
rPr'r�r�r�r�rkr�rUr[)	rr8�mode�modrNrr�r�r�rrr�!get_hplip_uri_for_network_printerXs&
�

z/NewPrinterGUI.get_hplip_uri_for_network_printercCstd}|dur|j}|dur�|j�d�}|dkr�|d7}|j|d��d�}|dkrf|j|d��d�}|dkr�|j|d��d�}|dkr�t|j�}|j|||�}|�rld|g}t|d	t|��d}z:tj|d
tjtj	tj	d�}|�
�\}}	|jdk�rd}WnYn0|du�rlz|�d
��
�}
Wn&t�yV|jddd��
�}
Yn0t�|
�}t|�}|dk�r�|�gd��|dd�}d}n|dk�r�|dd�}d}|dk�r�|\}
}}}}}n0|dk�r�|\}
}}}}n|dk�r�|\}
}}}|dk�r0td�tj�|�\}}d||||f|_ntd|�||_t�|j�|_||_||_|dk�rl||_||fS)z�
        Try to determine the make and model for the currently selected
        network printer, and store this in the data structure for the
        printer.
        Returns (hostname or None, uri or None).
        N�://r�rhrpr2�?z/usr/lib/cups/backend/snmpriTrnrrLz
iso-8859-1�ignore)�encoding�errorsri)rrrrrkrjzNo Device ID from snmp backendzMFG:%s;MDL:%s;DES:%s %s;zGot Device ID: %s)r�rrr�rPr'r�r�r�r�rkr�rUr[�UnicodeDecodeError�
probe_printerZwordsepryrPrFr�r�r.r�r�rr)rr8r�rrr]rNr�r�r�r��words�n�device_classr�rr"Zdevice_location�mkZmdrrrrns��




��
��

��

z(NewPrinterGUI.getNetworkPrinterMakeModelcCs�d|_t�ttjt�}tjdidt	d�i��}t
|�}|g|_|jd|�
�|dgd�}|jdt	d�ddgd�}dt	d	�d
�}tjdi|��}|j||dt
|�dgd�}	|j||	gd�d�dt	d�d
�}
tjdi|
��}|j||
dt
|�dgd�}|j|	|gd�d�||_|	|_||_d|_|j�|�|j�d�|j��|j�d�}
|j�t��|
d�||_d|_td�|��dS)Nr�r�device-infoz	Enter URIF�rzNetwork PrinterrzzFind Network Printer)�device-classr�)rNT�Windows Printer via SAMBAryrzFetching devices)r)rz)ry) rrrr�rrr0rPrr�rrcr%�get_infoZinsert_after�devices_uri_iter�devices_find_nw_iter�devices_network_iterZdevices_network_fetchedr�r�r�rSr�rC�
get_columnr;�TreePathr[�firewallrP�start_fetching_devices)rr[r1�otherZ	physotherZuri_iter�network_iterZnetwork_dictrz�find_nw_iterZsmbdev_dictZsmbdevZ
find_smb_iterrrrrrg�s`���������
zNewPrinterGUI.fillDeviceTabc	Cs|j}d}z�|��}|��}|o"|}td}|sP|dtd�d7}|�tj�|st|dtd�d7}|�tj�|s�t	d|�t
j|jddt
j
jt
jjtd�d	�}|�|�|�td
�t
jjtd�t
jj�|�d|j�|��Wn tjtf�y
t�Yn0|�rt	d�dS)
NT�

�- z%Allow all incoming IPP Browse packetsrjzAllow all incoming mDNS trafficz,Asking for permission to adjust firewall:
%s�Adjust Firewallr6�Do It Laterr�z"Firewall all OK, no changes needed)r�Zcheck_ipp_client_allowedZcheck_mdns_allowed�TEXT_adjust_firewallr��add_service�firewallsettingsZIPP_CLIENT_SERVICEZMDNS_SERVICErPrr�r{r��QUESTIONr��NONE�format_secondary_markup�add_buttons�ResponseType�NO�YESr��adjust_firewall_responser�dbus�
DBusExceptionrOr>)r�datar^�allowedZipp_allowedZmdns_allowed�secondary_textr�rrr�on_firewall_read�sR������
�zNewPrinterGUI.on_firewall_readcCsl|��|tjjkr:|j��}|s0|j�tj�|j�	�t
d�t��|_
|j
�td��|jdd�dS)Nz7Fetching network devices after firewall dialog responsertT)rz)rbrr�r�r�Zcheck_ipp_server_allowedr�r�ZIPP_SERVER_SERVICErrPrzrLrEr{r�rU)rr�r�Zipp_server_allowedrrrr�	s


z&NewPrinterGUI.adjust_firewall_responsecCs2t��|_|j�td��|jd|jd�|`dS)NrtFr^)rzrLrEr{r�rUr[rrrrr�	s
z$NewPrinterGUI.start_fetching_devicesc	Cs|rZ||vr|�|�}nB|�dd�|vr@|�dd�}|�|�}n|rVt�|�}d|_nd}t|���}|D]}|jdkrj|j�dd�|_qjdd�}tt	||��}t
t|�d�D]�}t
|dt|��D]z}||}	||}
|	jdks�|
jdkr�q�|	j|
jkr�|	j�sd|	_q�|
j�sd|
_q�t|	j�t|
j�k�r:d|	_q�d|
_q�q�d	d
�|D�}g}|D]�}t
d|j�t|d��r�t
d
|j�t|d��r�t
d|j�t|�}t
dt|��zT|j�|�}t
d|�|j|�|�t
dt|�|t|j|�f�t
d�Wn:t�yF|j�|�|�|�t
dt|��Yn0�qZ|j��|�r�t|�}
z*|j�|
�}|j|�|�|j|}
Wn*t�y�|j�|
�|�|
�Yn0nd}
|j��}|j}|j}|D�]�}d}z|j�|�}|j|}Wn*t�y(t
dt|��Y�q�Yn0|��}|djdk}|��}||
k�r^|t d�7}||dg}|�r�|dj|djk�r�|j!|||d�}||
k�r�|�"|�}|j�#|d�n|j||d�}nZ|�"|�}|�$�}|�"|�|k�r|�%|d�}||k�r�q|�&|�}�q�|j!d||d�}||
k�r�|�"|�}|jj'|dd�|j�(d�}|j�)||d��q�d}|�r�|j*��}|�$�}d}|�r|�%|d�}||jk�r�|}�q|�&|�}|d7}�q�nD|j+�s|j�(d�}|j�)t,�-�|d�|j*�(d�}|j*�)||d�dS)Nz:9100rzCurrent devicerucSs&|jdkrd|_n|jdkr"d|_|S)Nzhp:/no_device_foundrrzhpfax:/no_device_foundrsr��r�rrr�replace_generic9	s


z2NewPrinterGUI.add_devices.<locals>.replace_genericrM�deletecSsg|]}|jdvr|�qS))	rrrsrprqryrwr�rWr�r��rrJrrrrS	rz-NewPrinterGUI.add_devices.<locals>.<listcomp>zAdding device with URI %s�addressz   Device address %s�hostnamez   Device host name %sz   Created physical device %sz)   Physical device %d is the same printerz;   New physical device %s is same as physical device %d: %sz   Joining devicesz0   Physical device %s is a completely new devicezQERROR: Cannot identify new physical device with its entry in the device list (%s)rrz�
 (Current)Fr���?)Z	row_align).�popr\rPrrrIr5r�r�map�ranger�r�rPr r�r�rr'rcr��
add_devicer�r%r/r�r!r�r��get_devicesr�r�r��
insert_beforer"�
expand_rowr-rr.�scroll_to_cellr�r;r�rrr�)rrcr[ra�currentr�r��i�jZdevice1Zdevice2Z
newdevices�physicaldeviceZcurrent_devicer1r�r�Z	newdeviceZdevsrzrrr*�network_path�physdevZdevice_select_pathrZconnection_select_path�devrrrr_$	s�


�



�

�





�

zNewPrinterGUI.add_devicesc
Cs�trdStd�zt��}|�ddd�Wn<tyf}z$td�td�|��WYd}~dSd}~00zddladaWn<ty�}z$td�td�|��WYd}~dSd}~00td	�dS)
NTz3No SMB client library present so attempting installrzpython3-smbcz.Error during installation/setup of SMB client.z{}FzSMB client setup failed.z-SMB client successfully installed and set up.)	r
rPr�r�r�r��format�pysmb�ModuleNotFoundError)rr�r]rrr�install_python3_smbc_if_needed�	s&z,NewPrinterGUI.install_python3_smbc_if_neededc
Cs^|j}|��t|j�Gdd�d�}|�}tjj|_td�|_	d|_
|�d|g�t�
�rft��qTd}t�rtd}t�|j�}tjj||jd�}d}zT|��dkr�z|�d	���}Wq�ty�}z|�|�WYd}~q�d}~00q�Wn`t�y:}z6|j\}}	|tjk�r&td
t||	f��WYd}~nd}~0t�Yn0|��|�r�|D]6}
|
jtjjtjj fv�r^|�d|
g�}|�|�}�q^t!|j"�#�d�}
|
�$�\}}}}}t%|�dk�r Gdd
�d
�}|�}tjj |_||_	d|_
|�d|g�}|�|�}|�&|�}|j'�(|d�t)|j�|�*�du�rZ|j�+�t,td�td�|j-d�dS)zInitialise the SMB tree store.c@seZdZdS)z)NewPrinterGUI.browse_smb_hosts.<locals>.XN��__name__�
__module__�__qualname__rrrr�X�	sr�zScanning...rNr�
��debugZauth_fnzsmb://�Runtime error: %sr�c@seZdZdS)z1NewPrinterGUI.browse_smb_hosts.<locals>.FakeEntryNr�rrrr�	FakeEntry
sr�zNo Print Sharesz{There were no print shares found.  Please check that the Samba service is marked as trusted in your firewall configuration.r%).rr�rAr�r��smbc�
PRINTER_SHARE�	smbc_typer�r6�commentr%rr<r=�
get_debugging�AuthContext�Context�callback�perform_authentication�opendir�getdentsrO�failedrJrN�errno�ENOENTrPr'r>�	WORKGROUP�SERVERr
r�rQ�separater�r"r�r�r@r-rC�show_info_dialogr{)rrr�Zdummyr��	smbc_auth�ctx�entriesr]r�entryr*r�Z
specified_urirZr8�share�user�passwordr�Ztoplevelr)rrr�browse_smb_hosts�	st



�&
(
�




�zNewPrinterGUI.browse_smb_hostscCs|j�|�}|j�|�S)z9Don't allow this path to be selected unless it is a leaf.)rr#�iter_has_child)rr'r1r)Z
path_selectedr�r*rrrr-
sz!NewPrinterGUI.smb_select_functioncCs.|�|d�}d}|dur|j}|�d|�dS�Nrrr�)rr6�set_property)rrrr1r*r�r�r�rrrr2
s
z#NewPrinterGUI.smbbrowser_cell_sharecCs.|�|d�}d}|dur|j}|�d|�dSr�)rr�r�)rrrr1r*r�r�r�rrrr
9
s
z%NewPrinterGUI.smbbrowser_cell_commentcCsd|j}|�|�}|�|d�}|r<|jtjjkr<|j��dS|�	|�rR|�
|�n|�|||�dS)z*Handle double-clicks in the SMB tree view.rN)rr#rr�r�r�r�r�r��row_expanded�collapse_row�on_tvSMBBrowser_row_expanded)r�viewr)rrr*r�rrr�on_tvSMBBrowser_row_activated@
s


z+NewPrinterGUI.on_tvSMBBrowser_row_activatedc
Cs�|��}|�|d�}|dur dS|jtjjk�r�z|jr>WdSWnd|_Yn0t|j�d|j	}d}t
�rvd}t�|j�}tjj||j
d�}	g}
zT|��dkr�z|	�|���}
Wq�ty�}z|�|�WYd}~q�d}~00q�Wn`t�y<}z6|j\}}|tjk�r(tdt||f��WYd}~nd}~0t�Yn0|�|��rt|�|d�}
|�|
��qN|
D]F}|jtjjtjjfv�r�|�||g�}
|jtjjk�rx|�|
�}�qx|� |d�|`t!|j��n�|jtjjk�r�z|j�r�WdSWnd|_Yn0t|j�d|j	}d}t
��r8d}t�|j�}tjj||j
d�}	g}zZ|��dk�r�z|	�|���}Wn0t�y�}z|�|�WYd}~n
d}~00�q\Wnlt�y}zB|j\}}|tj"k�r�|tj#k�r�tdt||f��WYd}~nd}~0t�Yn0|�|��rH|�|d�}
|�|
��q"|D]0}|jtjjk�rL|�||g�}
tt|���qL|� |d�|`t!|j�dS)z1Handler for expanding a row in the SMB tree view.rNrMz	smb://%s/r�r�r�)$r!rr�r�r�r�Z
expanding_rowrAr�r6r�r�r�r�r�r�r�rOr�rJrNr�r�rPr'r>r�Ziter_nth_childr&r�r�r%r�r@ZEACCES�EPERM)rr�r*r)r1r�rr�r�r�r�r]rr�r�Zsharesr�rrrr�O
s�


�&
(
�


�(
(z*NewPrinterGUI.on_tvSMBBrowser_row_expandedcCs,|j�|�tr|s(|j�td�d�dS)Nz#Verification requires the %s moduleZpysmbc)r�r	r
rr�)rZonrrr�set_btnSMBVerify_sensitivity�
s
�z*NewPrinterGUI.set_btnSMBVerify_sensitivityc	Cs�tjtjd}|�||�|��}t|d���\}}}}}|rL|j�|�|r\|j	�|�|sd|r�t|||d��
�}|�|�|j�d�n|j��dkr�|j
�d�|�t|��|��dS)Nz	_-./:%[]@r��rZr8r�Tr)�string�
ascii_letters�digits�
entry_changedrQr
r�r�rSr��get_urir�r�r�r�r0r[)	r�ent�
allowed_charsrrZr8r�r�r�rrr�on_entSMBURI_changed�
s 
z"NewPrinterGUI.on_entSMBURI_changedcCs`|j��}|durdS|��\}}d}|rH|�|d�}|rH|jtjjk}|j�	|duoX|�dS)NFr)
r�rr�rr�r�r�r�r�r	)rrEr'rr*�is_sharer�rrr�on_tvSMBBrowser_cursor_changed�
s
z,NewPrinterGUI.on_tvSMBBrowser_cursor_changedc	Cs
|��sdS|j�d�z�t��}|js0t��}|��}td}|s�t	j
|jddt	jj
t	jjtd�d�}|dtd�7}|�|�|�td	�t	jjtd�t	jj�|��}|��|t	jjkr�|�tj�|��Wntjtfy�t�Yn0|j� �|�!�dS)
�<Check whether the needed SMB client library is available andNFr�Tr�r6r�z*Allow all incoming SMB/CIFS browse packetsr�)"r�r�r	r��	FirewallD�running�SystemConfigFirewallZcheck_samba_client_allowedr�rr�r{r�r�r�r�r�r�r�r�r�r�r$rbr�ZSAMBA_CLIENT_SERVICErr�r�rOr>r�rr�)rr�r^r�r�r�r�rrr�on_btnSMBBrowse_clicked�
s@��
�
z%NewPrinterGUI.on_btnSMBBrowse_clickedcCs�|j����\}}d}|r8|�|d�}|r8|jtjjk}|r@|sN|j�	�dS|�
|�}|�
|�}|�|d�}|�|d�}	|r�|�|d�j}
nd}
t|
|	j|jd��
�}|j�d�|j�d�|j�|�|j�	�dS)NFrrr�)r�rr�rr�r�r�r�r�rCZiter_parentr6r
r�r�rSr�r�)rr�rr*r�r�Zparent_iterZdomain_iterr�r8rZrrrr�on_btnSMBBrowseOk_clickeds0


�
z'NewPrinterGUI.on_btnSMBBrowseOk_clickedcGs|j��dSr:)r�rC)rrErNrrr�on_btnSMBBrowseCancel_clickedsz+NewPrinterGUI.on_btnSMBBrowseCancel_clickedcCs|��dSr:)r�r�rrr�on_btnSMBBrowseRefresh_clicked!sz,NewPrinterGUI.on_btnSMBBrowseRefresh_clickedcCs|j�|���dSr:)r�r	r�r�rrr�on_rbtnSMBAuthSet_toggled$sz'NewPrinterGUI.on_rbtnSMBAuthSet_toggledc
s,|��sdS|j��}t|d���\�}}}}d�d�d}|j��}|r\|j���|j���d}	d}
t	|j
��zd}t�r�d}|r���fdd�}tj
j||d	�}
z
d
|
_Wnty�Yn0|
�d||ftjd�}d
}	n�tj|j
���d
�}tj
j||jd	�}
|��dk�rjz |
�d||ftjd�}d
}	Wn0t�yd}z|�|�WYd}~n
d}~00�q|	�std
}
WnXt�y�}z.|j\}}tdt||f��|}WYd}~nd}~0t�Yn0t|j
�|	�r�tt d�t d�|j
d�dS|
�s(t d�}|�r|}t!t d�||j
d�dS)r�Nr�rFrr�cs
���fSr:r)ZsvrZshrZwgZunZpw�rZ�passwdr�rr�do_authAsz6NewPrinterGUI.on_btnSMBVerify_clicked.<locals>.do_authr�Tzsmb://%s/%si�)Z	workgroupr�rzError accessing share: %szPrint Share VerifiedzThis print share is accessible.r%z#This print share is not accessible.zPrint Share Inaccessible)"r�r�rQr
r�r�r�r�r�rAr{r�r�r�r�ZoptionUseKerberosrL�openrQ�O_RDWRr�r�r�rOr�rJrNrPr'r>r@r�r��show_error_dialog)rr�rr8r��ur��reasonZauth_setZ
accessibleZcanceledr�rr�r^r�r]rr�rrr�on_btnSMBVerify_clicked's�





����$

�
�z%NewPrinterGUI.on_btnSMBVerify_clickedcCsP|��}|}|D](}||vr|�|d�}tdt|��q||krL|�|�dS)zARemove all chars from entry's text that are not in allowed_chars.rzremoved disallowed character %sN)rQr\rPr'rS)rr�r�ZorigtextrS�charrrrr�tszNewPrinterGUI.entry_changedcCs(tjtjd}|�||�|��dS)Nz_-./:%[]()@?=&�r�r�r�r�r[�rr�r�rrr�on_entNPTDevice_changedsz%NewPrinterGUI.on_entNPTDevice_changedcCs(tjtjd}|�||�|��dS)N�_-.:%[]rrrrr�"on_entNPTJetDirectHostname_changed�sz0NewPrinterGUI.on_entNPTJetDirectHostname_changedcCs|�|tj�|��dSr:)r�r�r�r[�rr�rrr�on_entNPTJetDirectPort_changed�sz,NewPrinterGUI.on_entNPTJetDirectPort_changedcCs8|��}|�|�\}}}}|��}|�|||||�dSr:)Z
get_parentZquery_child_packingZget_expandedZset_child_packing)rrE�UNUSEDr&�expand�fillZpaddingZ	pack_typerrrr�s	�
�z)NewPrinterGUI.on_expNPDeviceURIs_expandedcCs|�|d�S)Nrg)r)rr1r*r�rrrr�sz%NewPrinterGUI.device_row_separator_fncCs&|�|�r|�|�n|�|d�dSr�)r�r�r�)rr�r)rrrrr�s
z"NewPrinterGUI.device_row_activatedc	Cs
|j}|��}|sdS|�|j�}|�|�s0dS|jdur>dS|jdkrTtd�dS|jD]8}|�	�D]*}|j
dkrf|j|jkrftd�dSqfqZzP|j
dks�|j
ddkr�t��|_|jjs�t��|_td�|jj|jd�Wn tjtf�yt�Yn0dS)	Nrz3Skipping firewall adjustment: discovery in progressrzz4Skipping firewall adjustment: network printers foundr�r2zExamining firewallrd)r�r!r"r�r�r�r�rPrcr�r�rr�rAr�r�r�r�rr�r�r�rOr>)rr�r1r�r�r�rrrrg�s<





�
�

zNewPrinterGUI.check_firewallcCs4|��}|r|sdS|�|j�}||kr0|��dSr:)r!r"r�rg)rr�r*r)r1r�rrrr�sz!NewPrinterGUI.device_row_expandedcGs<|j��}|�|�}|�|d�dur(dS|�|j|d�dS)z�
        Allow this path to be selected as long as there
        is a device associated with it.  Otherwise, expand or collapse it.
        rMNTF)r�r!r#rr)rr'r1r)rr*rrrr�s

z$NewPrinterGUI.device_select_functioncCs.g|_d|_d|_d|_g|_|jd7_|��\}}|durDdS|��}|�|�}|�	|d�}|durndSd}|�
�D�]�}|jdkr�td�|_
qz|jdkr�td�|_
qz|jdkr�t|d	�r�|j���d
�dkr�td�d
td�|_
n
td�|_
qz|jdk�rtd�|_
qz|jdk�r(td�|_
qz|jdk�rLtd�d
td�|_
qz|jdk�rdtd�|_
qz|jdk�r|td�|_
qz|jdk�r�tj�|j�\}	}
tj�|
�\}}
tj�|
�\}}
|dk�r�|ddk�r�|dd�}td�||_
n
td�|_
qz|jdk�rtd�|_
qz|jd k�r�tj�|j�\}	}
tj�|
�\}}
tj�|
�\}}
|dk�r�|ddk�rt|dd�}|�d!��r�|d"d�}d#|jv�r�d$}
d|_nd}
|dk�r�d%td&�d'|
|f|_
nd%td&�|
|_
qz|jd(k�s�|jd)k�rtd*�|_
qz|jd+k�s|jd,k�rtj�|j�\}	}
tj�|
�\}}
tj�|
�\}}
|dk�rt|ddk�rt|dd�}|d-k�r�td.�|_
|jdk�r|j
d'|j7_
nhd}|�d/�dk�r�d&}n*|�d0�dk�r�d1}n|�d2�dk�r�d3}|du�rtd4�||_
n
td5�|_
qzd}|j|_
qzt�ttj�}|j� |�t!|d6d�dk�r�d}d}d}d}d}d7d8i}|j"�rx|j"}|�
�D�]}|jdk�r�d}|�#|j��r�d}�q�n�|jd9v�r�|du�r|jd:v�rtj�|j�\}	}
tj�|
�\}}
|du�rtj�$|�\}}|�r�d}|j�d;��s4|j�d<��o>|j�%d=�}|j&�rT|j&d>k�rh|�sh|j'||d?�|j|d@<|j&|dA<|j(|dB<|j)|dC<�q�|�s�|�r�|�s�|j&�r�|j&d>k�s�|j&���d��s�|j&���dD��r�t|dE��r�|j*�r�|j*}n|}|�+|dF�}|�r�t,j-|fi|��}d|_
|�.|�|�#|j��rDd}|�+|d
�}|�r�|�/|�}||dB<td�|d@<t,j-|fi|��}td�d
d|_
|�.|�|�r�d|_0d|_1t!|dGd�|_0d}|�
�D]}|�2|j
|f�|d7}�q�|j�3d�}|j�4t�5�|d�|�r |j6�7�n
|j6�8�dS)HNFrMTrmz
Parallel PortrxzSerial Portrnrrtr��Fax� - �USBroZ	Bluetoothrrz%HP Linux Imaging and Printing (HPLIP)rsrpz Hardware Abstraction Layer (HAL)ruzAppSocket/HP JetDirectrvrrr2zLPD/LPR queue '%s'z
LPD/LPR queueryr�rrz	printers/�	rVzDriverless z%s�IPPz (%s)r�r�ZHTTPrt�mdnsrD�Remote CUPS printer via DNS-SD�._ipp�	._printer�LPD�._pdl-datastream�AppSocket/JetDirect�%s network printer via DNS-SD�Network printer via DNS-SD�
checked_hplipr�rz)rurvrrrtrrqrrrr)r8r�r�zdevice-make-and-modelz	device-idzdevice-locationZhewlett�dnssd_hostnamersr)9r�r�r�r�r�rrNr!r#rr�r�r��	menuentryr rr4rrrr�	splithost�
splitqueryrOrrVrr�r�rrr�r�r�Z
_network_hostrr�	splitportr�r�rr�rr'rwrPrr�rmrr&r%r�r;r�r�r�rC)rrEr)rr1r*r�Z	show_urisr�rr�hostportZqueueZdrvlessr6�	cupsqueue�protocolZhp_drivablerZ
is_networkZ
remotecupsr8r�rZ	hpliphostZhplipurir�rlZfaxdevidZfaxdevr�rrr�on_tvNPDevices_cursor_changed�sx




�
�
�

�


��
�

�
����


������
�

�
z+NewPrinterGUI.on_tvNPDevices_cursor_changedcCs�|��\}}|durdS|��}|�|�}|�|d�}||_|j�d�|j�|j	|j
�}|j�|�t
d|j�d}|j	}	|j�dd�d}
||jk�rd|j	dkr�td�}�n�|j	dk�rt|d	�r�|j���d
�dkr�td�dtd
�|_td�}ntd�}�nL|j	dk�r td�}�n4|j	dk�r8td�}�n|j	dk�rPtd�}�n|j	dk�rftd�}n�|j	dk�s~|j	dk�rNtj�|j�\}}
tj�|
�\}}
tj�|
�\}}
|dk�r�|ddk�r�|dd�}|dk�r�td�}ndd}|�d�dk�rd}n*|�d �dk�rd!}n|�d"�dk�r,d#}|du�rDtd$�|}ntd%�}n|j}|j�|��n
|j	d&k�rtj�|j�\}}
d}d'}|d&k�r�tj�|
�\}}
tjj||d(�\}}t
d)|t|�f�|jdk�r�|j}n|}|j�|�|j�t |���nj|j	d*k�r2|j!�sn|j�d+d�}t"|�dk�r>|d}nd}|�d,�}i}|D]}|�d-�\}}|||<�qT|j#d.f|j$d/f|j%d0f|j&d1ffD]�\}}||v�r |��}|�'�}d}|�r|�|d�d}t |�t ||�k�r�q|�(|�}|d7}�q�|�r|�)|�n
|�)d�n
|�)d��q��n<|j	d2k�r�|j*�d�|j+�d�|j+�,d�|j-�.d3�t"|j�d4k�rn|jd4d�}|�d�}|dk�r�||dd�}|d|�}nd}|j*�|�|j+�|�|}|j-�.d5�n�|jd6k�r|j/�d�|j0�.d3�n\|j	d6k�rX|j1�d�|j2�d�|j/�|jd4d��|�3d5�n|j�rn|j4�|j�z`t"|�dk�r�|jj5d7k�r�|j6d8k�s�|j6ddk�r�t7�8�}|d}n|j6}|j9�|�Wnt:�Yn0|�;�dS)9NrMrz!Selected connection type. URI: %srpr�rmz)A printer connected to the parallel port.rnrrtrrrzUA fax machine or the fax function of a multi-function device connected to a USB port.z"A printer connected to a USB port.roz"A printer connected via Bluetooth.rrzUHPLIP software driving a printer, or the printer function of a multi-function device.rszUHPLIP software driving a fax machine, or the fax function of a multi-function device.rpz?Local printer detected by the Hardware Abstraction Layer (HAL).rtrrr2rDrrrr r!r"r#r$r%rui�#)�defportzsocket: host is %s, port is %srxry�+ro�baud�bits�parity�flowrvFrkTryZdirectr�)<rNr!r#rr�r�rS�new_printer_device_tabsr$r�rfr�rcrPrrxrdr�r r4rr(rrrr)r*�
splitnportr'rr�r�r�Zis_classr�r�r�r�r�r-r.r�r�r��set_completionr�r	r�r�r�r�r�r�r�rArQ�unamer�r>r[)rrEr)rr1r*r��pagerr�r]r�rrr6r-r.r8rr,�partsr�Zoption_dictr.r�rRr�r8r
rrr� on_tvNPDeviceURIs_cursor_changed�s


�






�

�



�
z.NewPrinterGUI.on_tvNPDeviceURIs_cursor_changedcCs(|��}|j�t|�dk�|��dSr,)rQr�r	r�r[)rr�r�rrr�on_entNPTLpdHost_changedX
sz&NewPrinterGUI.on_entNPTLpdHost_changedcCs|��dSr:�r[rrrr�on_entNPTLpdQueue_changed]
sz'NewPrinterGUI.on_entNPTLpdQueue_changedc	s|j��}t�|��|j�dtd�dtd��|j�|j	�|j�
�t|j��fdd�}|j�|j
�|j�d|�}���}|j�|�|j�dt�|_
|j��t�t�}|D]}|�|g�q�t��}|�|�|�d�|�d�|j�|�dS)	Nz"<span weight="bold" size="larger">r5z	</span>

zSearching for printerscs���dSrB)rbrD�Zserverrrr#k
sz5NewPrinterGUI.on_btnNPTLpdProbe_clicked.<locals>.stopr�r)r�rQr~Z	LpdServerr��
set_markupr�r�rr{rTrAr�r�r�ZproberGrCrr�r�r%ZEntryCompletionr�Zset_text_columnZset_minimum_key_lengthr�r8)	rr�r�r#�signalr7r1r8Z
completionrr@r�on_btnNPTLpdProbe_clicked`
s:

���

�




z'NewPrinterGUI.on_btnNPTLpdProbe_clickedcCs�|��}|�d�dkr||�d�td|�|j�|�|j��}|�|j�}|jj	|dd�|j�
dd�|j�d�dStj
tjd}|�||�|��}|j�t|�dk�|j��|��dS)	Nrpr�rzURI detected (%s) -> Enter URIF)r)Z
start_editingrr)rQrrSrPr�r�r!r"r�r;Z
select_regionZset_positionr�r�r�r�r�r	r�r�rCr[)rr�r�r1r)r�rrrr� on_entNPTNetworkHostname_changed�
s&

�
z.NewPrinterGUI.on_entNPTNetworkHostname_changedcsn�j��}�fdd�}�j�d��j�d�d�_�j���j��t	�
�}���|�||�|�_
dS)Ncs �jdurdSt��j|�dSr:)rHrrB�found_network_printer_callback)�
new_devicerrr�found_callback�
s
z?NewPrinterGUI.on_btnNetworkFind_clicked.<locals>.found_callbackFr)r�rQr�r	�
network_foundr�rCr�r�r~Z
PrinterFinderr!rrH)rr�r8rG�finderrrr�on_btnNetworkFind_clicked�
s


z'NewPrinterGUI.on_btnNetworkFind_clickedc	Csvt��|�r|jd7_t|�}zh|j�|�}|j|�|�|j��\}}|r�|j�	�}|�
|�}|�|d�|j|kr�|�|j�Wn|t
�yd|_|j�|�|j��|j�	�}|jd|j|��|dgd�}|jdk�r|�|�}|j�|dd�Yn0n^d|_|��|j��|j�d�|j�d�|jdk�rj|j�dtd�d�|j� �t�!�dS)	NrMTFr�rz<i>z%No printer was found at that address.z</i>)"rrCrHrrcr�r�r�rNr!r#rr/r�r&r%r/r�r�r�r"r;rHr$r�rCr�r	r�r�rAr�rrE)rrFr�r�r)rr1r*rrrrE�
sJ




�

��
z,NewPrinterGUI.found_network_printer_callbackcCs�|jdvr|jjS|jj}|j�||j�}|}||jkrD|jj}�n�|dkr�|j�	�}|j
�	�}|r�|d|7}|r�|d|7}�nj|dkr�|j�	�}|j�	�}|r�|d|7}|r�|d|7}�n*|dk�rfg}|j
df|jd	f|jd
f|jdffD]>\}}	|��}
|��}|
�|d�}|d
kr�|�|	d|�q�d�|�}|jj�d�d}|�r�|d|}n�|dk�r�|j�	�}
t|
d���\}}}}}d
}d
}|j���r�|j�	�}|j�	�}t|||||d���}
|
�r�|d|
7}n
|j�	�}|S)N)r<r�rurxrprvr2rxr2r3r4r5rMrror1ryrryr�)rZr8r�r�r�) rr�rr�r6r$rfrdr�rQr�r�r�r�r�r�r�r!rMrr%r�rxr�r
r�r�r�r�r�r�r�)rr�r:r�r8rr8r�rEr6r1r*r.rrZr�r
r�r�r�rrrr�
sh






�




�

zNewPrinterGUI.getDeviceURIc	Cs|j��}|j��}|j��}|j�|�|j�|�|r@|j}|rJ|j}|rT|j	}|j
�|�|s�|jr�|j
D]}|j�|�qpd|_
|j��d|_|j�d�|j�td��t�tt�}|j}|�|�|�d�|j|jfD]}|�|�q�|j�|�o
|jdu�|��dSrA)r�r�r�r�r�r	r�rdrfrlr�rcr�r�r�r�r�r�rSr�rr�r�r�r�r�r[)	rrEZrbtn1Zrbtn2Zrbtn3r:r�r1rrrrrhs@







��z'NewPrinterGUI.on_rbtnNPFoomatic_toggledcCs|��dSr:r>r�rrr�#on_filechooserPPD_selection_changed;sz1NewPrinterGUI.on_filechooserPPD_selection_changedcCs�d|_|jdur>|jD]}|j�|�qd|_|j��d|_|�d�|j}|�td��|j	�
�}tdt|��t
�|_g|_|j�|j�d|j��|j�|j�d|j��|j�|�|j�d�dS)NTFr5zSearching for "%s"r#r7)r�r�r�r�r�r	r�rSr�r�rQrPr'rr%r��opreq_user_search_done�opreq_user_search_errorr>r�)rrEr�r^Z
searchtermrrr�(on_btnNPDownloadableDriverSearch_clicked>s4




����z6NewPrinterGUI.on_btnNPDownloadableDriverSearch_clickedcCs�|jD]}|�|�qd|_d|_d|_d|_||_||_|j}|j}t	�
��zD|�td��|�
d�t�tt�}t|j�dkr�t|j�dkr�td�}ntd�}|�d�}	|�|	d|�|�|	dd�g}
|jD]\}}|
�||f�q�|
jt�dd	��d
�|j����}
d}|
D]L\}}|�d�}	|�|	d|�|�|	d|�|��|
k�r|�|	�d}�q|j}|�|�|�|�|�
d�|��Wnt�Yn0t	� �dS)NTr:rMz -- Select from search results --z-- No matches found --rrcSst�|d|d�S)NrM)rDZ	modelSortrYrrrr�yrz6NewPrinterGUI.opreq_user_search_done.<locals>.<lambda>)�key)!r�r�r=r�r�r�rDr�r�rrCrSr�r	rr�r�r�r%�	set_valuer/�	functools�
cmp_to_keyr�rQr4r"r�r�r�r[r>rE)rr�r7rFr�r�r^r1�firstr*Zsorted_list�
printer_idZprinter_nameZsoughtZselect_indexr�r6rrrrrLXsT







z$NewPrinterGUI.opreq_user_search_donecCs*td|t|�f�|�|t�t��dSrG)rPr'rLrIrHrIrrrrM�s�z%NewPrinterGUI.opreq_user_search_errorcCs`|��|jdur\|jD]}|j�|�qd|_|j��d|_|j�d�|j�t	d��dS)NTr:)
r[r�r�r�r�r�r	r�rSr�)rrEr�rrr�/on_cmbNPDownloadableDriverFoundPrinters_changed�s


z=NewPrinterGUI.on_cmbNPDownloadableDriverFoundPrinters_changedcCs td�d|_|jdkr�|j}|��}|��}|r�|�|d�}|�|d�}|dkr�|�d�|��}|r�|�|d�}|�|d�}q�d}d}q�d}d}n|jd\}}|dur�dd�|jD�}n|g}|r�||_t	�
ttj
�}d}d}|D]�}|j|}	|	��D]�}
d|
v�st|
d�dk�rDtj�s2|�|
��sDtd	|
d
�q�|�d�}|du�r\|}|�|d|
d
�|�|d|
�|
dr�|}q�q�|du�r�dS|j���s�|jd
k�r�|�d�}|�|dtd��|�|dd�|du�r�|}|j}|�|�|du�r|���|�|�|�dS)NZfilldownloadableDriversTrMrrcSsg|]}|d�qS)rrr�rrrr�rz9NewPrinterGUI.fillDownloadableDrivers.<locals>.<listcomp>rFzRemoved invalid driver entry %sr6�recommendedFr=zLocal Driver) rsr�r=r�r!rMrr�r�rr�r�rrrDr5r�r�rr�rPr%rPr�r�rr�r�r�rZselect_iter�)on_tvNPDownloadableDrivers_cursor_changed)rrEr1r*rTZprinter_strZprinter_idsZrecommended_iterZ
first_iterrFr�r0rrrr��s�

�

����


�




z%NewPrinterGUI.fillDownloadableDriverscCs|��dSr:r>r�rrr� on_rbtnNPDownloadLicense_toggled�sz.NewPrinterGUI.on_rbtnNPDownloadLicense_toggledcCs�d|_|j��}|j��}|��d}|jr<tj�|j�}nd}|D]�}|oZtj�|�|k}|j	r||j	j
r||r||td�}n|}|�||f�}|rD|�
|�}	|j�|	dd�|j�|	dddd�d}qD|s�|j�t��dd�|j�ddddd�d}
|j	�r`|j	j�r`|j	j}|d�r:|d	�r:|dd
|d	}
n&|d�rN|d}
n|d�r`|d}
|
dk�r�|jdu�r�|
|j7}
|jdu�r�|
d
|j7}
|
�d��s�|
�d
��r�d}
|j�|
�dS)NFr*Tr�r�rr�r�rNr(r,r)�recommended_make_selectedrFZgetMakesr�r!r�r�rP�	normalizer�r�r�r%r"r;r�rr�r�r�rOr�rS)rZmakesr1�foundZauto_make_normr�rVr�r*r)rYZ
devid_dictrrrr?�sX

�

�



�zNewPrinterGUI.fillMakeListcCsv|��\}}|durr|jdurr|��}|�|�}|�|d�d|_|jobtj�|j�tj�|j�k}||_	|�
�dSr")rNrFr!r#r$�NPMaker�rPr[rZ�
fillModelList)rr�r)rr1r*Zrecommended_makerrr�on_tvNPMakes_cursor_changed#s
��z)NewPrinterGUI.on_tvNPMakes_cursor_changedcCsd|_|j�|j�}|j��}|��d}tj�|j�tj�|j	�k}|rXtj�|j
�}|D]�}|ortj�|�|k}|jr�|jjr�|r�|t
d�}n|}|�||f�}	|r\|�|	�}
|j�|
dd�|j�|
dddd�d}q\|�s|j�t��dd�|j�ddddd�|j��dS)NFr*Tr�rrY)r�rFZ	getModelsr]r�r!r�rPr[r�r�r�r�r�r%r"r;r�rr��columns_autosize)rZmodelsr1ZselectedZis_auto_makeZauto_model_norm�pmodelrVr�r*r)rrrr^/s>
�
��

�zNewPrinterGUI.fillModelListc	Cs�||_|j��}|��|jr(|jj}nd}|jrj|jjrj|jrj|jrj|jj}|j|_	t
dt|j	��n�|j�r|d|}|j�
||�}t|���}|j}z|j�||||�|_	Wnt�||_	Yn0|j�r*|j�r*g}	|j	D](}
|
|jk�r|	�d|
�q�|	�|
�q�|	|_	nt
d�g|_	g}g}d}
|j	D�]�}|j�|�}t|d�}
|
�dd�}
zdt|d	�}|
|7}
Wnt�y�Yn0|
|v}|j�r�|jj�s|j|k�r|�|
�|�|�|
d
7}
|�|
td�f�}|�|�}|j���|�|j�|ddd
d�n�|j�r�|
dk�r�|�|
�|�|�|
d
7}
|�|
td�f�}|�|�}|j���|�|j�|ddd
d�n2|�r��q<|�|
�|�|�|
d
7}
|�|
f��q<||_	|j��dS)NzID matched PPDs: %srNrzNo PPDs available?r+r*rz [%s]zppd-natural-languagerMr�Tr�rY) �NPModelr�r!r�r�r�r�r�r-�	NPDriversrPr'rFr0rIr�r�r/r>r��insertr%r8rKr\�KeyErrorr�r"rZselect_pathr�r`)rZpmakerar1r@r�rFZppdnames�filesrFr�Z
driverlistrcr�r3r�ZlpostfixZ	duplicater*r)rrrr9Os�

���

�

�


�


zNewPrinterGUI.fillDriverListc
Cs�|r|��d}|durNdSn0|�||�\}}|�||�}	|	durFdS|	d}|j|d}
|j�|
�}t|d�}|
�d�r�|d7}|td�7}|�	|�dS)NrFr+z	foomatic:rNz"This PPD is generated by foomatic.T)
rNZ#convert_widget_to_bin_window_coordsZget_path_at_posrcrFr8rKrOr�rA)
rZtvrJr�Z
keyboard_modeZtooltipr)Zbin_xZbin_yr�Z
drivernamer@Zmarkuprrrr�s"

z(NewPrinterGUI.on_NPDrivers_query_tooltipcCsx|��\}}|durt|��}|�|�}|�|d�d}|joR|joR|j��|��k}||_|�|j	|�|�
|j�dSr")rNr!r#r$rZr�r4r�r9r]�on_tvNPDrivers_cursor_changedr�)rrEr)rr1r*raZrecommended_modelrrr�on_tvNPModels_cursor_changed�s
��z*NewPrinterGUI.on_tvNPModels_cursor_changedcCs|��dSr:r>r�rrrrg�sz+NewPrinterGUI.on_tvNPDrivers_cursor_changedcCs�|j�d�|j�d�|j�d�|j�d�|j�d�|j��|�	�}|durZdS|�
�\}}|s�|��\}}|r�|�|�}ndS|�
|d�}|dkr�|j�|j�|��dS|j�|j�|�dtd��}|j}	|d}
dd	�}||	|
�|j�|�|�d
td��}|j}
|j}||
|d�|||d
�|j�|�|�dtd��}|j�|�d|v�r|d}dD]�}|��}d}|j�d|�}|j�d|�}||v�r�|�r�z6t||�}|�dd�|�|�|��|��WnYn0|du�rx|��|���qxd}d|v�r�|dD]�}|d�r0d|d}d}|d�rd||d}|d�r�|�r�|td�}||d}|�r0|td�|}|�r�|d}||}�q0|�s�td�}|j�|�d|v�r|j��|�dtd��}|j �!��|�n
|j��|d �sL|d�sL|j"�d�|j"��|j��nJ|j�d�|j"��|j��|j��|�dtd��}|j �!��|�d!|v�r�t#|d!�dk�r�d|_$nd"|_$|��dS)#NrTrMr�supplierZOpenPrintingZmanufacturersuppliedcSs||_|�|�dSr:)r�r�)rEr�rrr�set_protect_active�szSNewPrinterGUI.on_tvNPDownloadableDrivers_cursor_changed.<locals>.set_protect_active�licenseZ
Distributable�patentsZfreesoftwareZshortdescriptionr��
functionality)ZGraphicsZLineArtZPhoto�TextzhsDownloadableDriverPerf%sz"lblDownloadableDriverPerf%sUnknownr4�supportcontactsr6rr]�levelz, z
(%s)rjzNo support contacts knownZlicensetextzNot specified.ZnonfreesoftwarerFF)%r�rSr�r�r�r�r�r�rCrr�rNr#rr�rcrdr[rfr$r�r�r�r�rAr4�__dict__rZ	set_rangerPr�rr�Z
get_bufferr�r�r�)rrEr'r1r*r)rr�riZvendorr�rjrkrl�free�descriptionrmZfieldrOr�Zhs�unknownroZsupportentryZsupportcontactZsupportcontact_extraZtermsrrrrW�s�


�





�
�
�






z7NewPrinterGUI.on_tvNPDownloadableDrivers_cursor_changedc
CsPd}�zN|j��s t|j�dkrV|jdkrV|j����\}}|�|�d}|j	|}n�|j
��rrt�|j
���}n�|j}|����\}}|�|d�}|dk�rPd|v�rPt|d�dk�rP|dd}td|d�|��}t|�dk�rPtj�|�}|��}	|��t���.}
|
�|	�|
��t�|
j�}Wd�n1�sF0YW�nLttjjf�y�}�z(tdt |��|j���r�t!d�}t!d	�}
|j����\}}|�|�d}|j	|}|�"d
��r�t!d�d}n|
||j#|j$f}n�|j
���rlt!d
�}|j
��}t!d�d}z<t%j&dd|gdt%j't%j(t%j(d�}|�)�\}}||�*�7}Wn�Yn0nt!d�}t!d�}t+|||j,�WYd}~dSd}~00tdt |��t-|t.��rL|j�/t!d��z.|dk�r�|j�0|�}t�|�}t1�2|�WnDt�yt3�td�Yn$tj4�y@t3�td�Yn0|j�5�|S)NrFrMrFzppd file to download [�]zRuntimeError: zDatabase errorz4The '%s' driver cannot be used with printer '%s %s'.Z
gutenprintzFYou will need to install the '%s' package in order to use this driver.zgutenprint-foomaticz	PPD errorz2Failed to read PPD file.  Possible reason follows:rjz/usr/bin/cupstestppdz-rvvTrnzDownloadable driverszFailed to download PPD.zppd: zfetching PPDr&z/libcups from CUPS 1.3 not available: never mindz)CUPS 1.3 server not available: never mind)6r�r�r�r�r�r�rr�r"rcr�rDr�r�rOr�rrPr[rr	Zurlopenr�closerr
rrr6rJr7rMr'r�rOr]rbr�r�r�r�rkrUr	r{rHr�r{ZgetServerPPDrQ�unlinkr>rRr�)rr�r1r*rRr0r�Zfile_to_downloadZ	ppdurlobjrrr]Z	err_titleZerr_textrJ�filenamer�r�r�r^rrrr�Ms�
��


2
�
���



zNewPrinterGUI.getNPPPDc	Cs�td�d|_i|_|j}|��D]}|�|�q"|jsftjt	d�d�}|�
|�|��td�dS|jjD�]}|j
dkr�qnd|_t��}|�d�|�d�|�
|�d	}t|j�D]�\}}|jd
kr�q�|d7}t||j|�}	|�|	jd	|dd�t��}
|	j�r\tj�ddd
d
�}|�d	d	d	d�|�
|	j�|�|d|dd�|�|
d|dd�n|�|
d|dd�|
�|	jddd	�|	|j|j<q�qn|j�s�tjt	d�d�}|�
|�|��|j��|j��dS)NzExamining installable optionsFzNo Installable Options)r^z No PPD so no installable optionsZInstallableOptionsTrkrZ
PageRegionrMr�g�?rg) rPr�r�r�Zget_childrenr&r�rZLabelr�r+rZoptionGroupsr6ZGridZset_column_spacingZset_row_spacing�	enumerate�keywordr	ZattachZconflictIconZBoxr^Z	AlignmentrZset_paddingr��selectorr�rCr�)r�	container�child�lrZZgridr(rRr.�oZhbox�arrrr��sV







z&NewPrinterGUI.fillNPInstallableOptionsc
Cs�|jr|j��d|_|��|jr4|j��d|_|jrR|j��d|_|��|jdvr||j��}|j	��}|j
��}n|j}|j}|jdk�rt
|j�}z8|D].}z|j�||�Wq�ty�Yq�Yq�0q�Wn@tj�y}z$|j\}}	|�||	�WYd}~dSd}~00�n�|jdk�s4|jdk�r�d}
|jj�rL|jj}
n|��}
|j�sj|�d�dS|j��D]}|���qtt|j�t���r�t� ��q�|j�!t"d�|�zpt#|t$��r�|jj%|||
||d�nH|du�r�|jj%||
||d�n(t&�'||j(d	�|jj%|||
||d
�Wnztj�y|}z8|j\}}	t)|j�|�||	�|j�*�WYd}~dSd}~0t)|j�|j�*�t+d�Yn0|j�*�t)|j�|jdv�r`|j�!t"d�|�z.t&�,|j|�|j�-||�|j�.||�WnJtj�yP}z.|j\}}	|�||	�|j�*�WYd}~dSd}~00|j�*��n|jd
k�r�|j�!t"d�|�z|��}
|jj%||
d�WnJtj�y�}z.|j\}}	|�||	�|j�*�WYd}~dSd}~00|j�*��n�|jdk�rb|�s*|�/�}|_|�s*|�d�dS|j�!t"d�|�d}t#|t$��r�|j0�1��r�z|jj%|dd�Wn>tj�y�}z"|j\}}	|�||	�WYd}~n
d}~00z|jj%||d�WnJtj�y}z.|j\}}	|�||	�|j�*�WYd}~dSd}~00z$|j�2|�}
t�3|
�}t4�5|
�Wnhtj�y�}zL|j\}}	|tj6k�rbd}n$|�||	�|j�*�WYd}~dSWYd}~n
d}~00n�|j0�1��s�t#|j7tj3��r�t&�8|j7|�nt&�'||j(d	�|j��D]}|���q�z|jj%||d�WnJtj�yT}z.|j\}}	|�||	�|j�*�WYd}~dSd}~00|j�*�n|jdk�rx|�d	�|j�9�|jdv�r�|�:d|�n2|jdk�r�|�:d|j;�n|�:d||j7|jk�d|_i|_<dS)N)r;r8r<r;r8r<r�zadding printer %s)r3r�rr)r�rrr)r�r�rrrMzmodifying printer %sr�r�r�Fr&)r3T)r�r=)r8r<r;rcrerd)=rErbr$r�rHr�rr�rQr�r�rCr�r3r�rDZaddPrinterToClassrJrRrNr(r�rrrnr�r5Z	writebackrAr{rr<r=r{r�rHr�Z
addPrinterrPZsetPPDPageSizer�r@r�ZfatalExceptionZactivateNewPrinterZsetPrinterLocationZsetPrinterInfor�r�r�ZgetPPDr�rQrwZ
IPP_NOT_FOUNDr?ZcopyPPDOptionsrCr7r�r7)rrEr6rrr��members�memberr]�msgrr.r&rxrrr�on_btnNPApply_clicked�s.







�





�

��













"




&�



z#NewPrinterGUI.on_btnNPApply_clicked)NNNrNNNr)N)rM)FN)NN)N)F)�r�r�r�rZSignalFlagsZRUN_LASTr�r0Z__gsignals__rdrfrlr�r�r�r�ror�r�r6r�rrr!r$r(r/r-r6rbr_rIrVrUrWrXrZrYr`rkrmr}r�r�rbr�r�r�r�r�r�r�r�r�r�r�rnr�r�r�r�r�r�r�r�r�r2r:r;r<rKr[rPrTrUr]rXr\rbrmrrrwrrgr�r�r�r_r�r�rrr
r�r�r�r�r�r�rrrrrr�rrrrrrrgrrr/r<r=r?rCrDrJrErrhrKrNrLrMrUr�rXr?r_r^r9rrhrgrWr�r�r�rrrrra�sL����%�
b	
	
(:1e#"
P
eO4

$S*&
$Hb(M+	
M&".:(4
N2 ave6racCstd�dS)Na�
This is the test/debug mode of the new-printer dialog of system-config-printer.

Options:

  --setup-printer URI
            Select the (detected) CUPS device URI on start up
            and run the new-printer wizard for it.

  --devid   Supply a device ID which should be used for the
            setup of the new printer with "--setup-printer".
            This can be any printer's ID, so that driver 
            selection can be tested for printers which are not
            physically available.
)rsrrrr�	show_help�sr��__main__rMrzsetup-printer=zdevid=z--setup-printerz--devidZuiZSYSTEM_CONFIG_PRINTER_UIcGst��dSr:)rZ	main_quit)rNrrr�	on_signal�sr�rcrdrfr<)r\r@r8)N)Xr�rKrPrr��sysrQrr��	tracebackrVZhttp.clientr�r�r�r�Ztimedopsr�Z
gi.repositoryrrrSrQrDr�r
r�rrZguirZ
optionwidgetsr	r�r~Zurllib.requestr�urllib.parseZsmburir
Zerrordialogsrr�rzr�rer��gettext�installr�r
r�r�rr+r3r9r@rArGrKr`rar�r��getoptZ
gnu_getopt�argvrrN�GetoptError�exitZ
setup_printerr@�optZoptargr�Z	ppdippstr�	setlocaler�r_Z
set_debuggingZset_debugprint_fnrPr�r�r��mainrrrr�<module>s�8
	


8}
��