3
NZaE                 @   sD  d dl Z d dlZddlT ddlT 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 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Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6d Z7dZ8dZ9dZ:dZ;d Z<dZ=dZ>dZ?d Z@dd ZAdd ZBdd ZCd&d!d"ZDd'd$d%ZEdS )(    N   )*                @                  	   
                     J   $   3   c             C   s4   d}t j|| d d \}}}}|d@ }||||fS )Nz<IHBBr      )structunpack)bufferfmt	block_len
header_len	data_type
page_flags r#   /usr/share/hplip/base/mfpdtf.pyparseFixedHeaderp   s    r%   c       	      C   sH   |t kr<d}tj|| d d \}}}}}}||||||fS |tkrDd S )Nz<BBHHHHr   )DT_SCANNED_IMAGESr   r   DT_FAX_IMAGES)	r   r!   r   	major_ver	minor_ver	src_pagescopies_per_pagezoomjpeg_q_factorr#   r#   r$   parseImageVariantHeaderv   s     r.   c             C   s  t jd| d d }|tkrzd}t j|| d t \}}}}}}}	}
}}}}}||ksZt|||||||	|
|||||ffS |tkrd}t j|| d t \}}}||kst|||ffS |tkrd}t j|| d t \}}}}}}||kst||||||ffS t	j
d|  ttd S )Nz<Br   z<BBHHHIIIHHIIIz<BBHz<BBBBIIzError: Invalid record type: %d)r   r   RT_START_PAGESOP_RECORD_SIZEAssertionError	RT_RASTERRASTER_RECORD_SIZERT_END_PAGEEOP_RECORD_SIZElogerrorErrorZERROR_INTERNAL)r   record_typer   idencodingpage_num	black_ppr	black_bpp	black_rppblack_hort_dpiblack_vert_dpicmy_pprcmy_bppcmy_rppcmy_hort_dpicmy_vert_dpiunused	data_sizeunused1unused2unused3
black_rowscmy_rowsr#   r#   r$   parseRecord~   s$    . 
 rN   Tc       1      C   s  t td\}}}}d\}	}
}}}d}xZ|	|krtjd|	  |	|kr|rV|}	P |dkr| j|\}}t|}|d k	r| }t|\}}}}|t |t  }}tjdt|t|||||||f  |t8 }|td  }|}	tjd|||f  |t@ r|}	P |dkr|}	q*|	|kr|t	krt
||\}}}}}}tjd||||||f  |td  }|t8 }|t8 }|t8 }n |tkrtjd	 n
tjd	 tjd|||f  |dkrtjd
 |}	q*|}	|dkr*|}	q*q*|	|kr*t|\}}|tkr|\}}}} }!}"}#}$}%}&}'}(tjd||f  |td  }|t8 }|t8 }|dkrdtjd |}	q*|rp|}	q*|}	tjd|||f  q*q*|tkr|\})}*tjd|*|*f  |td  }|t8 }|t8 }tjd|||f  |dkrT|dkrTtjd t|}+tjd|+|+f  |j|d |  ||+8 }||+8 }|dkrTtjd |}	q*x||dkr|rhP tjd | j|\}}|d k	r| }t|}+tjd|+|+f  |j|d |  |
|+7 }
||+8 }qVW |dkrtjd |}	q*|}	q*q*|tkr*|\},}-}.}/}0tjd|/|0f  |td  }|t8 }|t8 }|dkrLtjd tjd|||f  |t@ st|t@ rz|}	q*|}	q*q*W tjd|
  |S )Nr   r   r   Fz**** State %d ****zbFixed header: (datalen=%d(0x%x),blocklen=%d(0x%x),headerlen=%d(0x%x),datatype=0x%x,pageflags=0x%x)z Data: data=%d,block=%d,header=%dz[Variant header: (major/minor=%d/%d,src_pages=%d,copies_per_page=%d,zoom=%d,jpeg_q_factor=%dzUnsupported data typezHeader size error.z+Start page record: (encoding=0x%x, page=%d)zBlock size error.z#Raster record: (data size=%d(0x%x))zWriting remainder of data...zData len=%d(0x%x)zData size errorz Reading more data from device...z,End page record: (black_rows=%d,cmy_rows=%d)zRead %d bytes)r   r   r   r   r   )listranger6   debugZreadChannellenr%   FIXED_HEADER_SIZEPAGE_FLAG_END_STREAMr&   r.   IMAGE_VARIANT_HEADER_SIZEr'   r7   rN   r/   r0   r2   r3   writer4   r5   PAGE_FLAG_END_DOC)1ZdeviceZ
channel_idstreamZsingle_readcallbackZ	STATE_ENDZSTATE_FIXED_HEADERZSTATE_VARIANT_HEADERZSTATE_RECORDstateZtotal_bytesZblock_remainingZheader_remainingZdata_remainingZendScanZfieldsdatar   r    r!   r"   r(   r)   r*   r+   r,   r-   r9   recordr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   Zdata_lenrI   rJ   rK   rL   rM   r#   r#   r$   readChannelToStream   s    
 























r]   Fc             C   s  t j }|jtjdd t}|rD| tkr4|t7 }n| tkrD|t	7 }|jtjd| |jtjd|  |jtjd| |rR| tkr|jtjdt
t |jtjdd |jtjdd n| tkrR|jtjdt
t |jtjdt |jtjdd |jtjdt |jtjdd |jd |jd |jd |jdd | tkr|d k	r|d }|j| |jddt|   n
| tkrd S )Nz<Ir   z<Hz<Bz<BBr   r        zdial-stringz                    z                    z                    )ioStringIOrV   r   ZpackrS   DT_DIAL_STRINGS DIAL_STRINGS_VARIANT_HEADER_SIZEr'   FAX_IMAGE_VARIANT_HEADER_SIZE	MAJOR_VER	MINOR_VERSRC_HOSTTTI_NONErR   )r!   r"   Zsend_variantr[   blockr    Zdial_stringr#   r#   r$   buildMFPDTFBlock2  sB    








rk   )TN)r   FN)Fr   ra   gZcodesZNEW_PAGEZEND_PAGEZNEW_DOCUMENTZEND_DOCUMENTZ
END_STREAMZRESERVED_20ZRESERVED_40ZRESERVED_80ZMFPDTF_RASTER_BITMAPZMFPDTF_RASTER_GRAYMAPZMFPDTF_RASTER_MHZMFPDTF_RASTER_MRZMFPDTF_RASTER_MMRZMFPDTF_RASTER_RGBZMFPDTF_RASTER_YCC411ZMFPDTF_RASTER_JPEGZMFPDTF_RASTER_PCLZMFPDTF_RASTER_NOTZ
DT_UNKNOWNr'   r&   rc   ZDT_DEMO_PAGESZDT_SPEED_DIALSZDT_FAX_LOGSZDT_CFG_PARMSZDT_LANG_STRSZDT_JUNK_FAX_CSIDSZDT_REPORT_STRSZDT_FONTSZDT_TTI_BITMAPZDT_COUNTERSZDT_DEF_PARMSZDT_SCAN_OPTIONSZDT_FW_JOB_TABLEr/   r2   r4   rS   rU   rd   re   r0   r3   r5   ZDIAL_STRING_RECORD_SIZEZPAGE_FLAG_NEW_PAGEZPAGE_FLAG_END_PAGEZPAGE_FLAG_NEW_DOCrW   rT   ZSRC_UNKNOWNrh   ZSRC_SCANNERZSRC_HOST_THEN_SCANNERZSRC_SCANNER_THEN_HOSTri   ZTTI_PREPENDED_TO_IMAGEZTTI_OVERLAYED_ON_IMAGErf   rg   r%   r.   rN   r]   rk   r#   r#   r#   r$   <module>   s   
 