3
NZ                 @   sT  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlT d dl	T d dl
T d dlmZmZmZmZ d dlmZ ddlT d dlZy"d dlmZ d dlT d dljZW n( ek
r   ejd e jd Y nX e jd  d	kre jd d
k re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.G dd de/Z0G dd de1Z2dS )    N)BytesIO)*)deviceutilspmlcodes)cups   )cdllz;Marvell fax support requires python-ctypes module. Exiting!         	   
            i   c               @   s   e Zd ZdddedfddZd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 ZdddZdS )MarvellFaxDeviceNFc             C   sD  t j| ||||| d | _d | _ytjd}tj|d }tjj	|sVtjj
||}n|}tjj|}	tjj|	\}
}|
d }tjd|  ddlm} |j }|j |jkrtjd|  tjd d}| jj||ttjd	|d
 tjd ntj|| _W n> tk
r> } z tjd|j   tjd W Y d d }~X nX d S )Nz
hp-sendfaxz/hp-sendfaxz/fax/plugins/fax_marvell.sozLoad the library %s
r   )pluginhandlerz9Loading %s failed. Try after installing plugin libraries
zSRun "hp-plugin" to installa plugin libraries if you are not automatically prompted
ZUSERzPlugin is not installedr	   z Loading fax_marvell failed (%s)
)!	FaxDevice__init__send_fax_threadZupload_log_threadr   ZwhichosreadlinkpathisabsjoinrealpathsplitlogdebugZ	installerr   ZPluginHandleZ	getStatusZPLUGIN_INSTALLEDerrorinfoserviceZ	SendEventZEVENT_FAX_FAILED_MISSING_PLUGINgetenvsysexitr
   ZLoadLibrarylibfax_marvellErrormsg)selfZ
device_uriprinter_namecallbackZfax_typeZdisable_dbusZsendfax_pathZsendfax_a_pathZsendfax_f_pathZsendfax_abs_pathheadtailZlib_namer   Z	pluginObjZjob_ide r0   "/usr/share/hplip/fax/marvellfax.pyr   L   s8    

zMarvellFaxDevice.__init__r   c       
   	   C   s|   t d }|dddddddd}| jj|||||t|}t|}	ytj|	j d W n   tj|	d Y nX | j|	 |S )N   r       )	c_intr'   create_packetbyref
memoryviewr   log_datatobyteswriteMarvellFax)
r*   msg_typeparam1Zparam2ZstatusZdata_lenint_array_8i_bufresultbufr0   r0   r1   send_packet_for_message{   s    
z(MarvellFaxDevice.send_packet_for_messagec             C   sB   t  }x| jd|ddrqW |j }tjd|  tj|d |S )Nr3   r   )timeoutz.response_for_message (%d): response packet is
)r   readMarvellFaxgetvaluer   r    r8   )r*   r;   ret_bufr0   r0   r1   read_response_for_message   s    z*MarvellFaxDevice.read_response_for_messagec             C   s  t jd|  t }td }|dddddddd}td }| }td }| }tj }	d|	d |	d |	d |	d	 |	d
 |	d f }t jd t j| | jjt	ddddt
|}
| jj| jt||t
|}
t|}t|}xRtddD ]D}y |jt|j | jd W q   |jt||  Y qX qW xPtddD ]B}y |jt|j | jd W n   |j||  Y nX q<W |j }t jd t j|d | j| t }x| jd|ddrȐqW |j }| j  | jj|}t jd|  t jd |S )NzK************************* setPhoneNum (%s) START **************************r2   r   i4     z%4d%02d%02d%02d%02d%02dr	   r         r   zDate and Time string is ==>r3   zutf-8z9setPhoneNum: send SET_FAX_SETTINGS message and data ===> iT  r   )rB   zsetPhoneNum: response is %dzD************************* setPhoneNum END **************************)r   r    r   r4   c_chartime	localtimer'   r5   SET_FAX_SETTINGSr6   create_fax_settings_packetstation_namestrr7   rangewriter9   encoderD   r8   r:   rC   closeMarvellFaxextract_response)r*   Znumset_buf	int_arrayr>   
char_arrayc_buf
date_arraydate_buftr?   msg_buf	msg_c_bufirE   responser0   r0   r1   setPhoneNum   sN    ,

  


zMarvellFaxDevice.setPhoneNumc       
      C   s,  t d }|dddddddd}|dddddddd}tjd | jjtddddt|}t|}| j| t	 }x| j
d|ddrqrW |j }| j  | jj|}tjd|  | jj||}t	 }x>tddD ]0}	||	 ry|jt||	  W q   Y qX qW |j }tjd	|  tjd
 t|S )Nr2   r   z=******************** getPhoneNum START **********************i   r   )rB   zcreate_packet: response is %dr   zgetPhoneNum: ph_num_buf=%s z;******************** getPhoneNum END **********************)r4   r   r    r'   r5   GET_FAX_SETTINGSr6   r7   r:   r   rC   rD   rT   rU   Zextract_phone_numberrQ   rR   rP   )
r*   r=   r>   Zph_bufr?   r@   rE   r`   Z
ph_num_bufr_   r0   r0   r1   getPhoneNum   s4    



zMarvellFaxDevice.getPhoneNumc             C   s$  t jd|  td }|dddddddd}t }td }| }td }| }tj }	d|	d |	d |	d |	d	 |	d
 |	d f }t jd t j| | jjt	ddddt
|}
y| jj|| j|t
|}
W n" ttfk
r   t jd Y nX t|}t|}xPtddD ]B}y |jt|j | jd W n   |j||  Y nX qW xPtddD ]B}y |jt|j | jd W n   |j||  Y nX q^W |j }t jd t j|d | j| t }x| jd|ddrqW |j }| j  | jj|}t jd|  t jd |S )NzM************************* setStationName(%s) START **************************r2   r   i4  rG   z%4d%02d%02d%02d%02d%02dr	   r   rH   rI   r   zDate and Time string is ==>zUnicode Errorr3   zutf-8z7setStationName: SET_FAX_SETTINGS message and data ===> iT  r   )rB   zsetStationName: response is %dzG************************* setStationName END **************************)r   r    r4   r   rJ   rK   rL   r'   r5   rM   r6   rN   	phone_numUnicodeEncodeErrorUnicodeDecodeErrorr!   r7   rQ   rR   rP   r9   rS   rD   r8   r:   rC   rT   rU   )r*   namerW   r>   rV   rX   rY   rZ   r[   r\   r?   r]   r^   r_   rE   r`   r0   r0   r1   setStationName   sT    ,

  


zMarvellFaxDevice.setStationNamec          	   C   s   t d }|dddddddd}td}tjd | jjtddddt|}t|}| j	| t
 }x| jd|ddrvqdW |j }| j  | jj|}tjd|  | jj||}tjd	|j|f  tjd
 |jjdS )Nr2   r      zI************************* getStationName START **************************i   r   )rB   zgetStationName: response is %dz.getStationName: station_name=%s ; result is %dzG************************* getStationName END **************************zutf-8)r4   create_string_bufferr   r    r'   r5   rb   r6   r7   r:   r   rC   rD   rT   rU   Zextract_station_namevaluedecode)r*   rW   r>   Zst_bufr?   r@   rE   r`   r0   r0   r1   getStationName1  s$    


zMarvellFaxDevice.getStationNamec             C   sh  t d }|dddddddd}tjd td}t }t }td }| }tj }d|d |d |d |d	 |d
 |d f }tjd tj| | jj	t
ddddt|}	t|}
xLtddD ]>}y|j|
j ||d   W q   |j|
|  Y qX qW |j|j |j }| j| x| jd|ddr8q"W |j }| j  | jj|}tjd|  |S )Nr2   r   zI************************* setDateAndTime START **************************i4  rG   z%4d%02d%02d%02d%02d%02dr	   r   rH   rI   r   zDate and Time string is ==>   r3   )rB   zsetDateAndTime: response is %d)r4   r   r    rj   r   rJ   rK   rL   r'   r5   rM   r6   r7   rQ   rR   r9   rawrD   r:   rC   rT   rU   )r*   rW   r>   rY   rV   rE   rZ   r[   r\   r?   r]   r_   r`   r0   r0   r1   setDateAndTimeX  s:    
,


zMarvellFaxDevice.setDateAndTimec          	   C   s   t jd td }|dddddddd}td}| jjtddddt|}t|}| j| t	 }x| j
d|ddrvqdW |j }| j  | jj|}t jd|  |S )NzM************************* getFaxDeviceState: START **************************r2   r   r3   r   )rB   z!getFaxDeviceState: response is %d)r   r    r4   r'   r5   REQUEST_FAX_STATUSr6   r7   r:   r   rC   rD   rT   rU   )r*   rW   r>   r<   r?   r@   rE   r`   r0   r0   r1   getFaxDeviceState  s    

z"MarvellFaxDevice.getFaxDeviceState c
       
      C   s>   | j  s6t| | j|||||||||	| _| jj  dS dS d S )NTF)ZisSendFaxActiveMarvellFaxSendThreadr#   r   start)
r*   phone_num_listfax_file_listcover_messagecover_re
cover_funcpreserve_formattingr+   update_queueevent_queuer0   r0   r1   	sendFaxes  s    
zMarvellFaxDevice.sendFaxes)r   r   r   r   )rs   rs   NFrs   NN)__name__
__module____qualname__ZFAX_TYPE_NONEr   rA   rF   ra   rc   propertyrd   rh   rm   rO   rp   rr   r~   r0   r0   r0   r1   r   J   s"   ,
5#
8
0  r   c               @   s   e Zd ZdddZdd ZdS )	rt   rs   NFc             C   s$   t j| |||||||||	|
| d S )N)FaxSendThreadr   )r*   devr#   rv   rw   rx   ry   rz   r{   r+   r|   r}   r0   r0   r1   r     s    zMarvellFaxSendThread.__init__c       M      C   s^  d}d}d}d}d}d}d}d}d	}	d
}
d}d}
d}d}d}| j  }d }d }|}g | _x ||krX| j rztjd |}tjd|  ||krtjd | jtddf |}qZ||krtjd | jtddf |}qZ||krtjd | jt	ddf |}qZ||kr,tjd | jt
ddf |}qZ||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 y| jj| _| jj| _W n$ tk
r   tjd |}Y nX W d | jj  X qZ||krtjdda  | j|}qZ||kr*tjddb  | j|}qZ||krtjddc  |	}yHt|}| jtd|d f |d }|d jd }tjd!||f  W n& tk
r   |}tjd" wZY nX | jd d  | _qZ||	krtjd#dd  | j|}qZ||
krtjd$de  | j|}qZ||kr8tjd%df  tjd& |}qZ||krtjd'dg  |}| j }d}d}d(}d)}d}d}d*}d}d}d}d	} d
}!d}"d}#d}$d}%d+}&t}'|}(x|(|kr| j rtjd, |}(|&r| j })|)tkrtjd-|)  |}(|}tjd.||(|'f  |(|kr*d+}&|$}(|}q|(|krNtjd/ d+}&|$}(|}q|(|krrtjd0 d+}&|$}(|}q|(|krtjd1 d+}&|$}(|}q|(|krtjd2dh  |}(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r|tjd2di  |}(y&t|}*|*d | _"tjd3| j"  W n$ tk
rv   tjd4 |}(Y nX q|(|krtjd5dj  |}(yt| j"d6}+W n( t#k
r   tjd7 |}(wY nX y|+j$t%},W n( t#k
r   tjd7 |}(wY nX | j&|,\
}-}.}/}0}1}2}3}4}5}6|-d8krBtjd9 |}(ntjd:|-|.|/|0|1|2|3|4f  | jj }7|7dkrtjd; ntjd< |}(q|(|krdtjd=dk  |}(t'j(| j"t) }8|8t% t*|/  }9tjd>|8  tjd?|9  | jj+t,|9ddd}:|:rtjd@|:  |}(nHtjdA | jj-t,};| jj.j/|;}<|<rVtjdB|<  |}(n
tjdC q|(|krtjdDdl  | }(| jj+t0}:|:rtjdE|:  |}(n
tjdF q|(| krtjdGdm  |!}(t1dH}=t2 }>d }?| jj.j3|?||=}@|>j4|=j5 |>j6 }>| jj7|> q|(|!kr*|"}(q|(|"k
rPtjdIdn  |#}(t}'t2 }At'j(| j"t) }8|8t% t*|/  }Bxlt8|/D ]}C| j rt9}'|'t9krP y|+j$t*},W n( t#k
r   tjd7 t9}'w|Y nX | j:|,\}D}E}F}G}H}6tjdJ|D|E|F|G|Hf  |Aj4|+j$|G |+j$|H}I|Aj;d |G}Jd}Kx |Jdk
r0y|Aj$t<}LW n( t#k
	rr   tjd7 t9}'	w2Y nX |Ldk	rtjdK t9}'P | j 	rt9}'tjdL P |Kt<7 }KyL| jj+t=dddt>|L}:|:	rtjdM|:  t9}'n
tjdN | jj7|L W n& tk

r"   tjdO t9}'P Y nX |Jt< }J	q2W |Aj?d |Aj;d q|W q|(|#k
rtjdPdo  |$}(| jj+t=dd|'d}:|:
rtjdQ|:  t9}'nbtjdN | jj-t0};| jj.j/|;}<|<
rtjdR|<  t9}'n
tjdS |'rtjdT t@jAdU n|(|$krtjdVdp  |}(| jj+tBdd|'d}:|:rHtjdW|:  t9}'nHtjdX | jj-tB};| jj.j/|;}<|<rtjdY|<  t9}'n
tjdZ |'tkrtjd[ |}(y|+j  W n tCk
r   Y nX tDjEdU | jj  qW qZ||krZtjd\dq  | jFrRtjd]| j"  yt'jG| j" tjd^ W n  tHk
rP   tjd_ Y nX |}qZW d S )rNr   r            (   2   <   F   P   Z   d   n   x      z***** Job is Cancelled.z *************** STATE=(%d, 0, 0)zAborted by user.rs   zSuccess.zError, aborting.zDevice busy, aborting.z%s State: Get sender infor   zUnable to open device (%s).z*Getting station-name and phone_num failed!z!%s State: Pre-render non-G3 filesz%s State: Get total page countz%s State: Next recipientrg   faxasciizrecipient is %s num is %szLast recipient.z%s State: Render cover pagez%s State: Handle single filez%s State: Merge multiple filesz)Not merging the files for Marvell supportz%s State: Send fax      #   FzFax send aborted.zDevice is in error state=%dz&*********  FAX_SEND_STATE=(%d, %d, %d)zFax send error.zFax device busy.zFax send success.z%s State: Open devicez***** file name is : %s...zfile(s) are sent to the devicez%s State: Check idlerbzUnable to read fax file.s   hplip_g3zInvalid file header. Bad magic.zTMagic=%s Version=%d Total Pages=%d hDPI=%d vDPI=%d Size=%d Resolution=%d Encoding=%dzState: device status is zero z!State: device status is non-zero z%s State: Request startz#### file_len = %dz#### tx_data_len = %dz(Sending start fax request failed with %dz#Successfully sent start fax requestz start-fax request failed with %dzstart-fax request is successfulz%s State: Send data requestz(Sending send-data request failed with %dz"Successfully sent send-fax requestz%s State: Set paramsD   z%s State: Send pagesz%Page=%d PPR=%d RPP=%d BPP=%d Thumb=%dzNo data!zJob is cancelled. Aborting...z-Sending fax-data-block request failed with %dz(Successfully sent fax-data-block requestzChannel write error.z'%s State: Send end-of-file-data requestz,Sending fax-data-block packet failed with %dzsend-fax request failed with %dzsend-fax request is successfulz
Exiting...r	   z%s State: End the jobz)Sending end-fax-job packet failed with %dz%Successfully sent end-fax-job requestz"end-fax-job request failed with %dz!end-fax-job request is successfulz1An error occurred! setting fax_send_state to DONEz%s State: CleanupzRemoving merged file: %sZRemovedz	Not foundz********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************z********************)IZnext_recipient_genZrendered_file_listZcheck_for_cancelr   r    r!   Zwrite_queueZSTATUS_IDLEZSTATUS_COMPLETEDZSTATUS_ERRORZSTATUS_BUSYr   openr(   r)   rO   Zsender_namerd   Z
sender_faxcloseZ
pre_renderZcount_pagesnextZSTATUS_SENDING_TO_RECIPIENTrS   StopIterationZrecipient_file_listZ
cover_pageZsingle_fileZnext_file_genSUCCESSrr   Zdevice_stateZDEVICE_STATE_NOT_FOUNDfIOErrorreadZFILE_HEADER_SIZEZdecode_fax_headerr   statST_SIZEZPAGE_HEADER_SIZErA   START_FAX_JOBrF   r'   rU   SEND_FAX_JOBrj   r   Zcreate_job_settings_packetrR   ro   rD   r:   rQ   FAILUREZdecode_page_headerseekFAX_DATA_BLOCK_SIZEFAX_DATA_BLOCKlentruncater%   r&   END_FAX_JOB	NameErrorrK   ZsleepZremove_temp_fileremoveOSError)Mr*   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_recipientZrec_nameZrec_numstater/   Z	recipientZ	next_fileZFAX_SEND_STATE_DONEZFAX_SEND_STATE_SUCCESSZFAX_SEND_STATE_ABORTZFAX_SEND_STATE_ERRORZFAX_SEND_STATE_BUSYZFAX_SEND_STATE_DEVICE_OPENZFAX_SEND_STATE_NEXT_FILEZFAX_SEND_STATE_CHECK_IDLEZ FAX_SEND_STATE_START_JOB_REQUESTZFAX_SEND_STATE_SEND_JOB_REQUESTZFAX_SEND_STATE_SET_PARAMSZFAX_SEND_STATE_SEND_FAX_HEADERZFAX_SEND_STATE_SEND_FILE_DATAZFAX_SEND_STATE_END_FILE_DATAZFAX_SEND_STATE_END_JOB_REQUESTZ"FAX_SEND_STATE_GET_LOG_INFORMATIONZmonitor_stateZcurrent_stateZfax_send_stateZ	fax_stateZfax_fileZffheadermagicversionZtotal_pagesZhort_dpiZvert_dpiZ	page_sizeZ
resolutionencodingZ	reserved1Z	reserved2Z	dev_stateZfile_lenZtx_data_lenZ	ret_valuerE   Zdev_responserY   rV   Zno_dataZret_valZpageZbytes_to_readpZpage_numZpprZrppZ	b_to_readZthumbnail_bytesZ	thumbnailZbytes_to_writeZ
total_readdatar0   r0   r1   run  s   









































































zMarvellFaxSendThread.run)rs   rs   NFrs   NN)r   r   r   r   r   r0   r0   r0   r1   rt     s    
rt   )3r%   r   os.pathZstructrK   Z	threadingior   r   Zbase.gZ
base.codesbaser   r   r   r   Zprntr   r   ZhpmudextZctypesr
   Zctypes.utilutilZcuImportErrorr   r!   r&   version_infobufferr7   r   r   r   ZGET_FAX_LOG_ENTRYrb   rM   ZCLEAR_FAX_STATUSrq   r   r   r   r   ZTTI_NONEZTTI_PREPENDED_TO_IMAGEZTTI_OVERLAYED_ON_IMAGEr   r   r   rt   r0   r0   r0   r1   <module>   sR   
  o