3
NZ}                 @   s  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T d dlT d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZ d dlmZmZmZ ydd	lmZ W n ek
r   Y nX yd dlZW n ek
r   ejd
 Y nX d dlZejde d ZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2G dd de	Z3G dd de4Z5G dd  d ej6Z7ddde8d!fd"d#Z9d Z:dZ;d$Z<d%Z=d&Z>d'Z?d(Z@d)ZAd*ZBd+ZCd,ZDd-ZCd.ZEd/ZFd0ZGG d1d2 d2ejHZIdS )3    N)*)
LDIFParser)deviceutilsvcard)cups)BytesIO)to_bytes_utf8to_long
to_unicode   )
coverpagesz!dbus is required for PC send fax.ignore                     	   
                     c               @   s   e Zd Zdd Zdd ZdS )FaxLDIFParserc             C   s   t j| | || _d S )N)r   __init__db)selfinputr     r#   /usr/share/hplip/fax/fax.pyr      s    zFaxLDIFParser.__init__c       	   <   C   s  |ry|d d }W n> t k
rT   y|d d }W n t k
rN   d}Y nX Y nX y|d d }W n t k
r~   d}Y nX y|d d }W n  t k
r   |d | }Y nX y|d d }W n@ t k
r   y|d	 d }W n t k
r   d}Y nX Y nX g }y|d
 }W n t k
r*   Y nX |jtd dd |D }|rtjd||dj||f  | jj|t||||| d S )NZ	givenNamer   Z	givenname ZsnZcn ZfacsimiletelephonenumberfaxZouAllc             S   s   g | ]}|r|qS r#   r#   ).0gr#   r#   r$   
<listcomp>   s    z(FaxLDIFParser.handle.<locals>.<listcomp>z.Import: name=%s, fax=%s, group(s)=%s, notes=%s,)	KeyErrorappendr   logdebugjoinr    settitle)	r!   Zdnentry	firstnamelastnameZnicknamer'   grpsgroupsr#   r#   r$   handle   sB    
zFaxLDIFParser.handleN)__name__
__module____qualname__r   r9   r#   r#   r#   r$   r      s   r   c               @   s   e Zd Zdd Zdd Zdd ZeZdd Zd	d
 Ze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d%d& Zd'd( Zd)d* Zd+S ),FaxAddressBookc             C   s   i | _ | j  d S )N)_dataload)r!   r#   r#   r$   r      s    zFaxAddressBook.__init__c             C   s^   d| _ tjd krZtjjtjd| _ tjj| j rRt| j d}tj	|| _
|j  n| j  d S )Nz	/dev/nullz
fab.picklerb)_fabpropZuser_dirospathr1   existsopenpickler?   r>   closesave)r!   pickle_filer#   r#   r$   r?      s    

zFaxAddressBook.loadc       	      C   sP   dd |D }t |t |t |t |t |t ||d| jt |< | j  d S )Nc             S   s   g | ]}t |qS r#   )r   )r)   sr#   r#   r$   r+      s    z&FaxAddressBook.set.<locals>.<listcomp>)namer3   r5   r6   r'   notesr8   )r   r>   rI   )	r!   rL   r3   r5   r6   r'   r8   rM   r7   r#   r#   r$   r2      s    zFaxAddressBook.setc             C   s   || j t| |< | j  d S )N)r>   r   rI   )r!   rL   keyvaluer#   r#   r$   set_key_value   s    zFaxAddressBook.set_key_valuec             C   s   | j j|d S )N)r>   get)r!   rL   r#   r#   r$   rQ      s    zFaxAddressBook.getc             C   s~   y| j |  W n tk
r"   d S X y| j |  W nF tk
rx   | j | j | j |< || j | d< | j |= | j  Y nX d S )NrL   )r>   r-   copyrI   )r!   Zold_namenew_namer#   r#   r$   rename   s    zFaxAddressBook.renamec             C   sH   g }x>t | jj D ],\}}x"|d D ]}||kr&|j| q&W qW |S )Nr8   )listr>   itemsr.   )r!   Z
all_groupsevr*   r#   r#   r$   get_all_groups  s    zFaxAddressBook.get_all_groupsc             C   s   | j S )N)r>   )r!   r#   r#   r$   get_all_records  s    zFaxAddressBook.get_all_recordsc             C   s   t | jj S )N)rU   r>   keys)r!   r#   r#   r$   get_all_names  s    zFaxAddressBook.get_all_namesc             C   sN   y*t | jd}tj| j|dd |j  W n tk
rH   tjd Y nX d S )Nwbr   )ZprotocolzI/O error saving fab file.)	rF   rA   rG   dumpr>   rH   IOErrorr/   error)r!   rJ   r#   r#   r$   rI     s    zFaxAddressBook.savec             C   s   i | _ | j  d S )N)r>   rI   )r!   r#   r#   r$   clear&  s    zFaxAddressBook.clearc             C   s"   || j kr| j |= | j  dS dS )NTF)r>   rI   )r!   rL   r#   r#   r$   delete+  s
    
zFaxAddressBook.deletec             C   s(   yt j| jjS  tk
r"   dS X d S )Nr   )rC   statrA   st_mtimeOSError)r!   r#   r#   r$   last_modification_time4  s    z%FaxAddressBook.last_modification_timec             C   sr   xdt | jj D ]R\}}|d |krD||d krb|d jt| q||d kr|d jt| qW | j  d S )NrL   r8   )rU   r>   rV   r.   r   removerI   )r!   groupmembersrW   rX   r#   r#   r$   update_groups;  s    zFaxAddressBook.update_groupsc             C   sF   x8t | jj D ]&\}}||d kr|d jt| qW | j  d S )Nr8   )rU   r>   rV   rg   r   rI   )r!   rh   rW   rX   r#   r#   r$   delete_groupF  s    zFaxAddressBook.delete_groupc             C   s:   g }x0t | jj D ]\}}||d kr|j| qW |S )Nr8   )rU   r>   rV   r.   )r!   rh   ri   rW   rX   r#   r#   r$   group_membersM  s
    zFaxAddressBook.group_membersc             C   sB   | j |}g }x|D ]}||kr|j| qW | j|||  d S )N)rl   r.   rj   )r!   rh   ri   rl   new_group_membersmr#   r#   r$   add_to_groupU  s    

zFaxAddressBook.add_to_groupc             C   s>   | j |}g }x|D ]}||kr|j| qW | j|| d S )N)rl   r.   rj   )r!   rh   Zremove_membersrl   rm   rn   r#   r#   r$   remove_from_group_  s    

z FaxAddressBook.remove_from_groupc             C   s&   | j |}| j|g  | j|| d S )N)rl   rj   )r!   Z	old_groupZ	new_groupri   r#   r#   r$   rename_groupi  s    
zFaxAddressBook.rename_groupc             C   sj   y>t |dj }tj|| tt |d| }|j  | j  dS  tk
rd } z
d|jfS d }~X nX d S )NrTr%   F)Tr%   )	rF   readr/   debug_blockr   parserI   
ValueErrormessage)r!   filenamedataparserrW   r#   r#   r$   import_ldifo  s    zFaxAddressBook.import_ldifc             C   sh  t |dj }tj|| xFtjtjtj|D ]*}tj| |d r4d}xjt	ddD ]\}|dkrnd}nd| }y||  W n t
k
r   P Y q\X d|| d	 kr\|| d
 }P q\W |jdd}|r|g}n|jddjd}|sg }|jtd dd |D }|d }	|jdtd}
tjd|	|dj||
f  | j|	tdtdtd|||
 q4W dS )Nrr   rL   r%   r   i'  Zphonezphone%dr'   typeZnumberZorganisationZ
categories;r(   c             S   s   g | ]}|r|qS r#   r#   )r)   or#   r#   r$   r+     s    z/FaxAddressBook.import_vcard.<locals>.<listcomp>rM   z,Import: name=%s, fax=%s group(s)=%s notes=%sr,   T)Tr%   )rF   rs   r/   rt   r   ZVCardsZVFileZopentextfiler0   ranger-   rQ   splitr.   r   r1   r2   )r!   rx   ry   Zcardr'   xrK   Zorgr8   rL   rM   r#   r#   r$   import_vcard{  s<     
&zFaxAddressBook.import_vcardN)r:   r;   r<   r   r?   r2   insertrP   rQ   ZselectrT   rY   rZ   r\   rI   ra   rb   rf   rj   rk   rl   ro   rp   rq   r{   r   r#   r#   r#   r$   r=      s.   			

r=   c               @   s   e Zd ZdddedfddZdd Zdd ZeeeZd	d
 Z	dd Z
ee
e	Zdd Zdd Zdd Zdd ZdddZdd Zdd ZdS )	FaxDeviceNFc             C   sN   t jj| ||d || d | _d | _|| _|sDtj }|jdd| _	nd | _	d S )Nzcom.hplip.StatusServicez/com/hplip/StatusService)
r   Devicer   send_fax_threadZupload_log_threadfax_typedbusZ
SessionBusZ
get_objectservice)r!   
device_uriprinter_namecallbackr   disable_dbusZsession_busr#   r#   r$   r     s    
zFaxDevice.__init__c             C   s   t d S )N)AttributeError)r!   Znumr#   r#   r$   setPhoneNum  s    zFaxDevice.setPhoneNumc             C   s   t d S )N)r   )r!   r#   r#   r$   getPhoneNum  s    zFaxDevice.getPhoneNumc             C   s   t d S )N)r   )r!   rL   r#   r#   r$   setStationName  s    zFaxDevice.setStationNamec             C   s   t d S )N)r   )r!   r#   r#   r$   getStationName  s    zFaxDevice.getStationNamec             C   s   t d S )N)r   )r!   r#   r#   r$   setDateAndTime  s    zFaxDevice.setDateAndTimec             C   s   t d S )N)r   )r!   r#   r#   r$   	uploadLog  s    zFaxDevice.uploadLogc             C   s   t d S )N)r   )r!   r#   r#   r$   isUploadLogActive  s    zFaxDevice.isUploadLogActivec             C   s   t d S )N)r   )r!   r#   r#   r$   waitForUploadLogThread  s    z FaxDevice.waitForUploadLogThreadr%   c
       
      C   s   t d S )N)r   )
r!   phone_num_listfax_file_listcover_messagecover_re
cover_funcpreserve_formattingr   update_queueevent_queuer#   r#   r$   	sendFaxes  s    zFaxDevice.sendFaxesc             C   s   | j d k	r| j j S dS d S )NF)r   isAlive)r!   r#   r#   r$   isSendFaxActive  s    

zFaxDevice.isSendFaxActivec             C   s<   | j d k	r8| j j r8y| j j  W n tk
r6   Y nX d S )N)r   r   r1   KeyboardInterrupt)r!   r#   r#   r$   waitForSendFaxThread  s    

zFaxDevice.waitForSendFaxThread)r%   r%   NFr%   NN)r:   r;   r<   FAX_TYPE_NONEr   r   r   propertyZ	phone_numr   r   Zstation_namer   r   r   r   r   r   r   r#   r#   r#   r$   r     s&   

  
r   Fc             C   s@  |t krj| d krP|d k	rPtj }x.|D ]}|jj |j kr&|j} P q&W tt| d k	rjtj	| }|d }t
jd|  |ttfkrddlm} || ||||S |tkrddlm}	 |	| ||||S |tkrddlm}
 |
| ||||S |tkrddlm} || ||||S |tkr4ddlm} || ||||S ttd S )	Nzfax-typezfax-type=%dr   )PMLFaxDevice)SOAPFaxDevice)LEDMSOAPFaxDevice)MarvellFaxDevice)LEDMFaxDevice)r   r   ZgetPrintersrL   lowerr   ErrorZERROR_DEVICE_NOT_FOUNDr   ZqueryModelByURIr/   r0   ZFAX_TYPE_BLACK_SEND_EARLY_OPENZFAX_TYPE_BLACK_SEND_LATE_OPENZpmlfaxr   ZFAX_TYPE_SOAPZsoapfaxr   ZFAX_TYPE_LEDMSOAPZledmsoapfaxr   ZFAX_TYPE_MARVELLZ
marvellfaxr   ZFAX_TYPE_LEDMZledmfaxr   Z'ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION)r   r   r   r   r   ZprinterspZmqr   r   r   r   r   r#   r#   r$   getFaxDevice  s8    



r            (   2   <   F   P   Z   d   n   x      c               @   s   e Zd Zd"ddZdd Zdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd Zd#ddZdd Zdd Zdd Zd d! ZdS )$FaxSendThreadr%   NFc             C   s   t jj|  || _|| _|| _|| _|
| _|| _|| _	|| _
|| _|	| _t | _d| _d| _|| _i | _d| _g | _d | _d| _d| _d| _d| _d| _d| _d S )Nr%   Fr   )	threadingThreadr   devr   r   r   r   r   r   r   r   current_printerr   streamprev_updateremove_temp_filer   resultscover_page_presentrecipient_file_listfjob_hort_dpijob_vert_dpijob_page_sizejob_resolutionjob_encoding)r!   r   r   r   r   r   r   r   r   r   r   r   r#   r#   r$   r   6  s2    zFaxSendThread.__init__c             C   s   d| _ tj| j xh| jD ]^}|\}}}}}|dkrFd| _ tjd n&| jj|dd|f tjd||f  | j rt}qW tj| j | j rt}|S )NFzapplication/hplip-fax-coverpageTzSkipping coverpagezapplication/hplip-faxzHP Faxz+Processing pre-rendered file: %s (%d pages))r   r/   r0   r   rendered_file_listr.   check_for_cancelSTATE_ABORTED)r!   statefax_filefax_file_nameZfax_file_typeZfax_file_descZfax_file_titleZfax_file_pagesr#   r#   r$   
pre_renderV  s"    

zFaxSendThread.pre_renderc             C   s  | j d d  | _tjd d| _tj| j d}x|| jD ]p}|d }tjd|  tjj|rt| j	|< t
|d}|jt}| j|\
}}}	}
}}}}}}|dkrtjd t| j	|< t}q:|s|
||||f\| _| _| _| _| _|d7 }nX| j|
ks.| j|ks.| j|ks.| j|ks.| j|krJtjd|  t| j	|< t}tjd	|||	|
||||f  |  j|	7  _|j  ntjd
|  t| j	|< t}P | j r:t}P q:W | jr|  jd7  _tjd| j  |S )NzCounting total pages...r   z'Processing file (counting pages): %s...r@   s   hplip_g3zInvalid file header. Bad magic.r   z!Incompatible options for file: %sz>Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%dzUnable to find HP Fax file: %szTotal fax pages=%d)r   r   r/   r0   job_total_pagesrC   rD   rE   ERROR_SUCCESSr   rF   rs   FILE_HEADER_SIZEdecode_fax_headerr`   ERROR_FAX_INVALID_FAX_FILESTATE_ERRORr   r   r   r   r   ZERROR_FAX_INCOMPATIBLE_OPTIONSrH   ZERROR_FAX_FILE_NOT_FOUNDr   r   r   )r!   r   ir   r   fax_file_fdheadermagicversiontotal_pageshort_dpivert_dpi	page_size
resolutionencoding	reserved1	reserved2r#   r#   r$   count_pagesw  sZ    





"



zFaxSendThread.count_pagesc             C   s(   yt jd|S  t jk
r"   dS X d S )Nz>8sBIHHBBBIIr   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )structunpackr`   )r!   r   r#   r#   r$   r     s    zFaxSendThread.decode_fax_headerc             C   s(   yt jd|S  t jk
r"   d	S X d S )
Nz>IIIIIIr   r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r`   )r!   r   r#   r#   r$   decode_page_header  s    z FaxSendThread.decode_page_headerc             C   s   | j dkrt}nt}| jr|tjd|d   | j|\}}|rDt}n8|sNt}n.| j	j
d|dddf tjd|  t| j|< |S )	Nr   z%Creating cover page for recipient: %srL   r   zapplication/hplip-faxzHP Faxz
Cover PagezCover page G3 file: %s)r   STATE_MERGE_FILESSTATE_SINGLE_FILEr   r/   r0   render_cover_pager   r   r   r   r   r   )r!   Z	recipientr   r   canceledr#   r#   r$   
cover_page  s    


zFaxSendThread.cover_pagec             C   s   t }tjd | jd d | _yt| jd}W n( tk
rV   tjd| j  t}Y n~X |j	t
}| j|\
}}}}}}	}
}}}t| j| j< |dkrtjd t| j| j< t}tjd||||||	|
|f  |j  |S )NzProcessing single file...r   r@   zUnable to open fax file: %ss   hplip_g3zInvalid file header. Bad magic.z>Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d)STATE_SEND_FAXr/   r0   r   r   rF   r_   r`   r   rs   r   r   r   r   r   rH   )r!   r   f_fdr   r   r   r   r   r   r   r   r   r   r   r#   r#   r$   single_file  s(    




zFaxSendThread.single_filec             C   s<  t jdd  t j| j t jd d| _| jr8tj \}| _t jd| j  tj	ddt
d	| j| j| j| j| j| jt
d
t
d
}tj|| d	}x| jD ]x}|d
 }t jd|  | j| tkr
t|d}|jt}| j|\
}	}
}}}}}}}}|	dkrt jd t}P t jd|	|
||||||f  xt|D ]}|jt}| j|\}}}}}}|dkrt jd |t  P tj	d|||||t
d
}tj|| | jt|df t jd|||||f  tj||j| |d	7 }q@W |j  | j  rt!}P qt jd|  qqW tj| t jd| j  |S )Nz%s State: Merge multiple filesr   r   zMerging g3 files...TzTemp file=%sz>8sBIHHBBBIIs   hplip_g3r   r   zProcessing file: %s...r@   zInvalid file header. Bad magic.z>Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%dzPage header errorz>IIIIIIr%   z%Page=%d PPR=%d RPP=%d BPP=%d Thumb=%szSkipping file: %szTotal pages=%dz********************r   )"r/   r0   r   r   r   r   Zmake_temp_filer   r   Zpackr
   r   r   r   r   r   rC   writer   r   rF   rs   r   r   r`   r   r   PAGE_HEADER_SIZEr   write_queueSTATUS_PROCESSING_FILESrH   r   r   )r!   r   r   ry   Zjob_page_numr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zpage_numZpprZrppZbytes_to_readZthumbnail_bytesr#   r#   r$   merge_files  sb    









zFaxSendThread.merge_filesc             c   s   x| j D ]
}|V  qW d S )N)r   )r!   ar#   r#   r$   next_recipient_genP  s    z FaxSendThread.next_recipient_genc             c   s   x| j D ]
}|V  qW d S )N)r   )r!   r   r#   r#   r$   next_file_genT  s    zFaxSendThread.next_file_genc             C   sP  d}d}d}d}t j  |dkr*t jd |dkr@t jd|  |rNt jd t j| j||}	t j  tjd|	  d}
tjd d}d}tj d }xtj |k r*tjdt	| j
j  t| jj| j
jtj|	}t|d }tjd|  | rP | j rtjd|	  t j|	 dS tjd qW tjd|	  t j|	 dS |dfS )NTr%   r   r   application/x-cshellapplication/x-perlapplication/x-pythonapplication/x-shellapplication/x-sh
text/plainZprettyprintznumber-up=%dzpage-ranges=1z	Job ID=%dFg     r@zWaiting for fax... type =%sr   zFax file=%sz%Render canceled. Canceling job #%d...z3Timeout waiting for rendering. Canceling job #%d...)r   r   r   r   r   r  )r%   T)r%   F)r   ZresetOptionsZ	addOptionZ	printFiler   r/   r0   timesleepr|   r   r   rU   r   ZCheckForWaitingFaxrB   Zusernamestrr   r`   Z	cancelJob)r!   rD   r3   Z	mime_typeforce_single_pageZ	all_pagesZ
page_rangeZpage_setZnupZsent_job_idZjob_idr   ZcompleteZend_timeresultr#   r#   r$   render_fileY  sP        





zFaxSendThread.render_filec             C   s\   d}xR| j j rVy*| j jd}|d tkr8d}tjd W q tjk
rR   P Y qX qW |S )NFr   TzCancel pressed!)r   ZqsizerQ   EVENT_FAX_SEND_CANCELEDr/   r0   ZQueueZEmpty)r!   r   Zeventr#   r#   r$   r     s    zFaxSendThread.check_for_cancelc             C   s   t jd tj  | jtj| j|d d|d | jtj	dd| j
tj	dd| j| j| jd}t jd|  | j|d	d
dd\}}ytj| W n tk
r   Y nX ||fS )NzCreating cover page...rL   r%   r'   Zvoice_phoneZemail_address)r   r   Zrecipient_nameZrecipient_phoneZrecipient_faxsender_nameZsender_phone
sender_faxZsender_emailZ	regardingrw   r   zPDF File=%sz
Cover Pagezapplication/pdfT)r  )r/   r0   Z	user_confrs   r   r   ZPAGE_SIZE_LETTERr   r	  rQ   r
  r   r   r   r  rC   rg   r_   )r!   r   Zpdfr   r   r#   r#   r$   r     s,    




zFaxSendThread.render_cover_pagec             C   s4   | j d k	r0|| jkr0| j j| tjd || _d S )Nr   )r   r   Zputr  r  )r!   rw   r#   r#   r$   r     s    
zFaxSendThread.write_queuec             C   s   d S )Nr#   )r!   r#   r#   r$   run  s    zFaxSendThread.run)r%   r%   NFr%   NN)F)r:   r;   r<   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r#   r#   r#   r$   r   5  s     
!H!L
=#r   )JsysrC   r   rG   r  r   Zbase.gZ
base.codesZ	base.ldifr   baser   r   r   Zprntr   Zbase.sixextr   r	   r
   r   r%   r   ImportErrorr   r/   r`   warningssimplefilterDeprecationWarningZSTATUS_IDLEr   ZSTATUS_SENDING_TO_RECIPIENTZSTATUS_DIALINGZSTATUS_CONNECTINGZSTATUS_SENDINGZSTATUS_COMPLETEDZSTATUS_CREATING_COVER_PAGEZSTATUS_ERRORZSTATUS_BUSYZSTATUS_CLEANUPZSTATUS_ERROR_IN_CONNECTINGZSTATUS_ERROR_IN_TRANSMITTINGZSTATUS_ERROR_PROBLEM_IN_FAXLINEZSTATUS_JOB_CANCELr  ZRESOLUTION_STDZRESOLUTION_FINEZRESOLUTION_300DPIr   r   r   objectr=   r   r   r   r   Z
STATE_DONEr   ZSTATE_SUCCESSZ
STATE_BUSYZSTATE_READ_SENDER_INFOZSTATE_PRERENDERZSTATE_COUNT_PAGESZSTATE_NEXT_RECIPIENTZSTATE_COVER_PAGEr   r   r   ZSTATE_CLEANUPr   r   r   r#   r#   r#   r$   <module>   s   ;1 gK0