3
NZzq                 @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	Z	d dl
T d dlT d dlmZmZmZmZ ddlT d dlmZ d dlmZ e	jd	e	jZdZd
ZdZd
ZdZdZd ZdZdZ dZ!G dd de"Z#G dd de$Z%dS )    N)BytesIO)urllib2_requesturllib2_parseurllib2_error)*)deviceutilscodesdime   )PY3)to_bytes_utf8zHTTP/\d.\d\s(\d+)         i  i	  c               @   sn   e Zd ZdddedfddZ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dZdS )SOAPFaxDeviceNFc             C   s>   t j| ||||| d | _d | _| jdkr4| j| _nd| _d S )NnetZ	localhost)	FaxDevice__init__send_fax_threadZupload_log_threadbushost	http_host)selfZ
device_uriprinter_namecallbackZfax_typeZdisable_dbus r   /usr/share/hplip/fax/soapfax.pyr   B   s    

zSOAPFaxDevice.__init__c       
      C   s"  g }xXt |j D ]H\}}tr<|jd|tjt|f  q|jd|tj|jdf  qW dj|}t	j
| d|| jt||f }t	j| | j|jd t }x| jd|ddrqW |j }t	j| | j  tj|jd}yt|jd}	W n ttfk
r   t}	Y nX |	tkS )	Nz%s=%szutf-8&zuPOST %s HTTP/1.1
Connection: Keep-alive
User-agent: hplip/2.0
Host: %s
Content-length: %d
Cache-control: No-cache

%si      )timeoutr   )listitemsr   appendr   Zquotestrencodejoinlogdebugr   lenlog_dataZwriteEWSr   ZreadEWSgetvalueZcloseEWShttp_result_patmatchdecodeintgroup
ValueError	TypeError
HTTP_ERRORHTTP_OK)
r   Zurlpostskvdataretr-   coder   r   r   r5   U   s,    "

	


zSOAPFaxDevice.postc             C   s   | j ddt|iS )Nz/hp/device/set_config.htmlZ	FaxNumber)r5   r$   )r   Znumr   r   r   setPhoneNum   s    zSOAPFaxDevice.setPhoneNumc             C   s,   t  }| jd| tj j|j }|d S )Nz(/hp/device/settings_fax_setup_wizard.xmlz'faxsetupwizard-faxvoicenumber-faxnumber)r   	getEWSUrlr   XMLToDictParserparseXMLr+   )r   stream	fax_setupr   r   r   getPhoneNum   s    zSOAPFaxDevice.getPhoneNumc             C   s<   y|}W n" t tfk
r*   tjd Y nX | jdd|iS )NzUnicode Errorz/hp/device/set_config.htmlZFaxCompanyName)UnicodeEncodeErrorUnicodeDecodeErrorr'   errorr5   )r   namer   r   r   setStationName   s
    zSOAPFaxDevice.setStationNamec             C   s,   t  }| jd| tj j|j }|d S )Nz(/hp/device/settings_fax_setup_wizard.xmlz-faxsetupwizard-userinformation-faxcompanyname)r   r=   r   r>   r?   r+   )r   r@   rA   r   r   r   getStationName   s    zSOAPFaxDevice.getStationNamec       	      C   sB  t  }| jd| tj j|j }|d }yt|}W n ttfk
rT   t	}Y nX t
jd|  |d }yt|}W n ttfk
r   t}Y nX t
jd|  tj }|d }t}|d dk rt}|t	kr|dkr|d8 }t|t|d t|d	 t|d
 t|t|t|d d}|t	kr6t||d< | jd|S )Nz(/hp/device/settings_fax_setup_wizard.xmlzfaxsetupwizard-time-timeformatztimeformat: %dzfaxsetupwizard-date-dateformatzdateformat: %dr      r   r   r      )Z
DateFormatZYearZMonthZDayZ
TimeFormatZHourZMinuteAMz/hp/device/set_config.html)r   r=   r   r>   r?   r+   r/   r1   r2   TIME_FORMAT_AM_PMr'   r(   DATE_FORMAT_DD_MM_YYYYtimeZ	localtimePMrK   r$   r5   )	r   r@   rA   Z
timeformatZ
dateformattZhrZam_pmr5   r   r   r   setDateAndTime   s@    





zSOAPFaxDevice.setDateAndTime c
       
      C   s>   | j  s6t| | j|||||||||	| _| jj  dS dS d S )NTF)ZisSendFaxActiveSOAPFaxSendThreadservicer   start)
r   phone_num_listfax_file_listcover_messagecover_re
cover_funcpreserve_formattingr   update_queueevent_queuer   r   r   	sendFaxes   s    
zSOAPFaxDevice.sendFaxes)rR   rR   NFrR   NN)__name__
__module____qualname__ZFAX_TYPE_NONEr   r5   r<   rB   property	phone_numrG   rH   station_namerQ   r^   r   r   r   r   r   @   s   *

.  r   c               @   s0   e Zd ZdddZdd Zdd	 ZdddZdS )rS   rR   NFc             C   s^   t j| |||||||||	|
| tj | _tjd| j  |jdkrTd| jj	 | _
nd| _
d S )Nz	JobId: %sr   z%s:8295zlocalhost:8295)FaxSendThreadr   r   Zgen_random_uuidjob_idr'   r(   r   devr   r   )r   rg   rT   rV   rW   rX   rY   rZ   r[   r   r\   r]   r   r   r   r      s    


zSOAPFaxSendThread.__init__c       A   $   C   sf  d}d}d}d}d}d}d}d}d	}	d
}
d}d}
d}d}d}| j  }|}g | _x||kr`| j rh|}tjd|  ||krtjd | jtddf |}qR||krtjd | jtddf |}qR||krtjd | jt	ddf |}qR||krtjd | jt
ddf |}qR||krtjdd]  |}zy| jj  W n8 tk
r| } ztjd|j  |}W Y d d }~X n`X y8| jj| _tjd| j  | jj| _tjd| j  W n$ tk
r   tjd |}Y nX W d | jj  X qR||krtjdd^  | j|}qR||kr6tjdd_  | j|}qR||krtjdd`  |	}y2t|}tjd|d    | jtd|d  f W n& tk
r   |}tjd! wRY nX | jd d  }qR||	krtjd"da  | j|}qR||
krtjd#db  | j|}qR||kr(tjd$dc  | j|}qR||krtjd%dd  |}d}d}d}d}d}d}d}d}d	}d
}d&}d'}|} x| |kr| j rtjd( |} |r| j }!|!tjtjfkrtjd)|!  |} |}tjd*|| f  | |kr d'}|} |}q|| |kr$tjd+ d'}|} |}q|| |krHtjd, d'}|} |}q|| |krltjd- d'}|} |}q|| |krtjd.de  |} y| jj  W n8 tk
r } ztjd|j  |} W Y d d }~X nX | jj t!kr|} q|| |krtjd/df  yt| j"d0}"W n( t#k
r6   tjd1 |} w|Y nX y|"j$t%}#W n( t#k
rn   tjd1 |} w|Y nX | j&|#\
}$}%}&}'}(})}*}+},}-|$d2krtjd3 |} ntjd4|$|%|&|'|(|)|*|+f  | j'}.d}/|d5 }0d}1|*t(krd6}2n|*t)krd7}2n|*t*kr
d8}2t+j,d9}3| j-|3j.d:}4tj/|4 tj0 rHtd;d<j1|4 | jj2  | jj3|4 t4 }5x| jj5d=|5d>d?r~qfW |5j6 }5tj0 rtd@d<j1|5 tj/|5 | jj7  | j8|5j9d:t:kr|} n|} q|| |k	rtjdAdg  t4 }6xt;|&D ]}7| j r|} | |kr$P y|"j$t<}#W n( t#k
rZ   tjd1 |} wY nX | j=|#\}8}9}:};}<}-tjdB|8|9|:|;|<f  |9t>krtjdCt>  |6j1|"j$|; |"j$|<}=|6j?d y|6j$|;}4W n& t#k
r   tjd1 |} P Y nX |4dDkrtjdE |} P |:}>| j'}.t+j,dF}3t@jA }?|?jBt@jCdGdHt@jDtE|3 |?jBt@jCdDdIt@jF|4 t4 }@|?jG|@ | j-|@j6 dJdK}4tj/|4 tj0 rtdL|7 d<j1|4 y| jj3|4 W n tk
r   |} Y nX t4 }5y x| jj5d=|5d>d?rqW W n tk
	r   |} Y nX |5j6 }5tj0 	rDtdM|7 d<j1|5 tj/|5 | jj7  | j8|5j9d:t:k	rt|} P |6jHd |6j?d qW |} q|| |k
rztjdNdh  | j'}.t+j,dO}3| j-|3j.d:}4tj/|4 tj0 	rtdPd<j1|4 | jj3|4 t4 }5x| jj5d=|5d>d?
r
qW |5j6 }5tj0 
rBtdQd<j1|5 tj/|5 | jj7  | j8|5j9d:t:k
rr|} n|} q|| |kr\tjdRdi  | j'}.t+j,dS}3| j-|3j.d:}4tj/|4 tj0 
rtdTd<j1|4 | jj3|4 t4 }5x| jj5d=|5d>d?r
qW |5j6 }5tj0 r&tdUd<j1|5 tj/|5 | jj7  | j8|5j9d:t:krV|} n|} n| |kr|tjdVdj  tjdW ytIj  W n tJk
r   Y nX y|"j  W n tJk
r   Y nX tKjLdX | jj7  | jj  |} q|W qR||krRtjdYdk  | jMrZtjdZ| j"  ytNjO| j" tjd[ W n  tPk
rX   tjd\ Y nX |}qRW d S )lNr   
            (   2   <   F   P   Z   d   n   x      zSTATE=(%d, 0, 0)zAborted by user.rR   zSuccess.zError, aborting.zDevice busy, aborting.z%s State: Get sender infor   zUnable to open device (%s).zSender name=%szSender fax=%szHTTP GET failed!z!%s State: Pre-render non-G4 filesz%s State: Get total page countz%s State: Next recipientzProcessing for recipient %srF   zLast recipient.z%s State: Render cover pagez%s State: Handle single filez%s State: Merge multiple filesz%s State: Send fax   FzFax send aborted.zD/L error state=%dzSTATE=(%d, %d, 0)zFax send error.zFax device busy.zFax send success.z%s State: Open devicez%s State: BeginJobrbzUnable to read fax file.s   hplip_g3zInvalid file header. Bad magic.z>Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%dfaxZSTANDARDZFINEZ	SUPERFINEa  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><Fax:BeginJob xmlns:Fax="urn:Fax"><ticket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Fax:Ticket"><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">$job_id</jobId><resolution xsi:type="Fax:Resolution">$res</resolution><delay xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:positiveInteger">$delay</delay><phoneNumber xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">$faxnum</phoneNumber><speedDial xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:positiveInteger">$speeddial</speedDial></ticket></Fax:BeginJob></SOAP-ENV:Body></SOAP-ENV:Envelope>zutf-8zbeginjob.logwbi    r   )r    zbeginjob_ret.logz%s State: DownloadPagesz%Page=%d PPR=%d RPP=%d BPP=%d Thumb=%dz#Pixels per line (width) must be %d!    zNo data!a"  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string" SOAP-ENV:mustUnderstand="1">$job_id</jobId></SOAP-ENV:Header><SOAP-ENV:Body><Fax:DownloadPage xmlns:Fax="urn:Fax"><height xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:positiveInteger">$height</height></Fax:DownloadPage></SOAP-ENV:Body></SOAP-ENV:Envelope>s   cid:id0s)   http://schemas.xmlsoap.org/soap/envelope/s   image/g4faxzapplication/dime)content_typezdownloadpages%d.logzdownloadpages%d_ret.logz%s State: EndJoba  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string" SOAP-ENV:mustUnderstand="1">$job_id</jobId></SOAP-ENV:Header><SOAP-ENV:Body><Fax:EndJob xmlns:Fax="urn:Fax"><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">$job_id</jobId></Fax:EndJob></SOAP-ENV:Body></SOAP-ENV:Envelope>z
endjob.logzendjob_ret.logz%s State: CancelJoba  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string" SOAP-ENV:mustUnderstand="1">$job_id</jobId></SOAP-ENV:Header><SOAP-ENV:Body><Fax:CancelJob xmlns:Fax="urn:Fax"><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">$job_id</jobId></Fax:CancelJob></SOAP-ENV:Body></SOAP-ENV:Envelope>zcanceljob.logzcanceljob_ret.logz%s State: Close sessionzClosing session...r   z%s State: CleanupzRemoving merged file: %sZRemovedz	Not foundz********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************)QZnext_recipient_genZrendered_file_listZcheck_for_cancelr'   r(   rE   Zwrite_queueZSTATUS_IDLEZSTATUS_COMPLETEDZSTATUS_ERRORZSTATUS_BUSYrg   openErrormsgrd   Zsender_namerc   Z
sender_faxcloseZ
pre_renderZcount_pagesnextZSTATUS_SENDING_TO_RECIPIENTStopIterationZ
cover_pageZsingle_fileZmerge_filesZgetFaxDownloadStateZpmlZUPDN_STATE_XFERACTIVEZUPDN_STATE_XFERDONEZdevice_stateZDEVICE_STATE_NOT_FOUNDfIOErrorreadZFILE_HEADER_SIZEZdecode_fax_headerrf   ZRESOLUTION_STDZRESOLUTION_FINEZRESOLUTION_300DPIr   catformat_httpr%   r*   Zis_debugwriteZopenSoapFaxZwriteSoapFaxr   ZreadSoapFaxr+   ZcloseSoapFaxget_error_coder.   r4   rangeZPAGE_HEADER_SIZEZdecode_page_headerPIXELS_PER_LINEseekr
   ZMessageZ
add_recordZRecordZ
TYPE_T_URIr   ZTYPE_T_MIMEZgeneratetruncateZmm	NameErrorrN   ZsleepZremove_temp_fileosremoveOSError)Ar   Z
STATE_DONEZSTATE_ABORTEDZSTATE_SUCCESSZ
STATE_BUSYZSTATE_READ_SENDER_INFOZSTATE_PRERENDERZSTATE_COUNT_PAGESZSTATE_NEXT_RECIPIENTZSTATE_COVER_PAGEZSTATE_SINGLE_FILEZSTATE_MERGE_FILESZSTATE_SEND_FAXZSTATE_CLEANUPZSTATE_ERRORZnext_recipientstateeZ	recipientZrecipient_file_listZFAX_SEND_STATE_DONEZFAX_SEND_STATE_ABORTZFAX_SEND_STATE_ERRORZFAX_SEND_STATE_BUSYZFAX_SEND_STATE_SUCCESSZFAX_SEND_STATE_DEVICE_OPENZFAX_SEND_STATE_BEGINJOBZFAX_SEND_STATE_DOWNLOADPAGESZFAX_SEND_STATE_ENDJOBZFAX_SEND_STATE_CANCELJOBZFAX_SEND_STATE_CLOSE_SESSIONZmonitor_stateZfax_send_stateZ	fax_stateZffheadermagicversionZtotal_pagesZhort_dpiZvert_dpiZ	page_sizeZ
resolutionencodingZ	reserved1Z	reserved2rf   ZdelayZfaxnumZ	speeddialressoapr9   r:   ZpagepZpage_numZpprZrppZbytes_to_readZthumbnail_bytesZ	thumbnailZheightmoutputr   r   r   run   s   
















































































zSOAPFaxSendThread.runc             C   sR   |st S tj|}|d krtS yt|jd}W n ttfk
rL   t }Y nX |S )Nr   )r3   r,   r-   r4   r/   r0   r1   r2   )r   r:   r-   r;   r   r   r   r     s     
 
z SOAPFaxSendThread.get_error_codetext/xml; charset=utf-8c             C   s"   | j }t|}tjdjd| S )NzPOST / HTTP/1.1
Host: $host
User-Agent: hplip/2.0
Content-Type: $content_type
Content-Length: $soap_len
Connection: close
SOAPAction: ""

zutf-8)r   r)   r   r   r%   )r   r   r{   r   Zsoap_lenr   r   r   r     s    zSOAPFaxSendThread.format_http)rR   rR   NFrR   NN)r   )r_   r`   ra   r   r   r   r   r   r   r   r   rS      s    
   ErS   )&sysr   rN   ior   Zbase.sixext.movesr   r   r   reZbase.gZ
base.codesbaser   r   r	   r
   rx   Zbase.sixextr   r   compileIr,   rL   ZTIME_FORMAT_24HRZDATE_FORMAT_MM_DD_YYYYrM   ZDATE_FORMAT_YYYY_MM_DDrK   rO   r4   r3   r   r   r   re   rS   r   r   r   r   <module>   s2    