
    =	fR                     (   d dl Z d dlZd dlZd dl d dlmZ d dlmZ d dlm	Z	  ej                  d      ZdZej                  dej                  d	ej                  d
ej                   dej"                  dej$                  diZej(                  dej*                  dej,                  dej.                  dej0                  dej2                  dej4                  diZdZ G d d      Z G d d      Z G d de j>                        Z d Z!d Z"d Z#d!dZ$d  Z%y)"    N)*)utilsto_bytes_utf8)queuescanext   	TYPE_BOOLTYPE_INT
TYPE_FIXEDTYPE_STRINGTYPE_BUTTON
TYPE_GROUP	UNIT_NONE
UNIT_PIXELUNIT_BITUNIT_MMUNIT_DPIUNIT_PERCENTUNIT_MICROSECONDi   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)OptionaN  Class representing a SANE option.
    Attributes:
    index -- number from 0 to n, giving the option number
    name -- a string uniquely identifying the option
    title -- single-line string containing a title for the option
    desc -- a long string describing the option; useful as a help message
    type -- type of this option.  Possible values: TYPE_BOOL,
            TYPE_INT, TYPE_STRING, and so forth.
    unit -- units of this option.  Possible values: UNIT_NONE,
            UNIT_PIXEL, etc.
    size -- size of the value in bytes
    cap -- capabilities available; CAP_EMULATED, CAP_SOFT_SELECT, etc.
    constraint -- constraint on values.  Possible values:
        None : No constraint
        (min,max,step)  Integer values, from min to max, stepping by
        list of integers or strings: only the listed values are allowed
    c           
         dd l }|| _        |\	  | _        | _        | _        | _        | _        | _        | _        | _	        | _
        t        | j                        t        d      k7  rt        | j                        | _        y y )Nr    )string
cur_deviceindexnametitledesctypeunitsizecap
constraintstr)selfargsr   r   s       /usr/share/hplip/scan/sane.py__init__zOption.__init__i   sd    $ ?C	<
DItz49diIty$(DO		?d2h&DIIDI '    c                 @    t         j                  | j                        S N)r   isOptionActiver$   r'   s    r)   isActivezOption.isActives   s    %%dhh//r+   c                 @    t         j                  | j                        S r-   )r   isOptionSettabler$   r/   s    r)   
isSettablezOption.isSettablev   s    ''11r+   c                 j   | j                         rd}nd}| j                         r(d}| j                  j                  | j                        }nd}d}d| j                  || j
                  | j                  | j                  t        | j                     t        | j                     | j                  ||f
z  S )Nyesnoz <not available, inactive option>z
Name:      %s
Cur value: %s
Index:     %d
Title:     %s
Desc:      %s
Type:      %s
Unit:      %s
Constr:    %s
isActive:    %s
isSettable:  %s
)r3   r0   r   	getOptionr   r   r   r    TYPE_STRr!   UNIT_STRr"   r%   s)r'   settableactivecurValues       r)   __repr__zOption.__repr__y   s    ??HH==?F00;HF9H	 		8jj$**diityy)8DII+>oovx99 	9r+   c           	      .   || j                   t        | j                         t        d      k(  r|| j                   d   k  r@| j                   d   }t        j                  d| j                  | j                  ||fz         nQ|| j                   d   kD  r?| j                   d   }t        j                  d| j                  | j                  ||fz         | j
                  j                  | j                  |       |S t        | j                         t        g       k(  r|| j                   vr| j                   d   }t        j                  }| j                   D ]$  }t        ||z
        |k  st        ||z
        }|}& t        j                  d| j                  | j                  |dj                  | j                         |fz         | j
                  j                  | j                  |       |S | j
                  j                  | j                        }|S )N r   z6Invalid value for %s (%s < min value of %d). Using %d.r	   z6Invalid value for %s (%s > max value of %d). Using %d.z?Invalid value for %s (%s not in constraint list: %s). Using %d.z, )r%   r!   logwarnr   r   	setOptionsysmaxsizeabsjoinr7   )r'   valuevmin_distxs        r)   limitAndSetzOption.limitAndSet   s   !<DOO$R04??1-- OOA.EHHUDIIue<= > T__Q// OOA.EHHUDIIue<= > ))$))U;& # doo&$r(2/*A"{{H!__ "uQw<(2'*57|H !A"
 HH^DIIudii6PRSTU V OO--dii;
  OO--dii8Er+   N)	__name__
__module____qualname____doc__r*   r0   r3   r>   rL   r@   r+   r)   r   r   V   s     $'02: r+   r   c                   l    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
dd
Zd Zd Zd Zd Zd Zd Zd Zy	)
ScanDevicea   Class representing a SANE device.
    Methods:
    startScan()    -- initiate a scan, using the current settings
    cancelScan()   -- cancel an in-progress scanning operation

    Also available, but rather low-level:
    getParameters() -- get the current parameter settings of the device
    getOptions()    -- return a list of tuples describing all the options.

    Attributes:
    optlist -- list of option names

    You can also access an option name to retrieve its value, and to
    set it.  For example, if one option has a .name attribute of
    imagemode, and scanner is a ScanDevice object, you can do:
         print scanner.imagemode
         scanner.imagemode = 'Full frame'
         scanner.['imagemode'] returns the corresponding Option object.
    c                 t    d | _         t        j                  |      | _        i | _        | j                          y r-   )scan_threadr   
openDevicedevoptions_ScanDevice__load_options_dict)r'   rV   s     r)   r*   zScanDevice.__init__   s/    %%c*  "r+   c                     | j                   }| j                  j                         }|D ];  }t        ||       }|j                  t
        j                  k7  s-|||j                  <   = y r-   )rW   rV   
getOptionsr   r!   r   r   r   )r'   optsopt_listtos        r)   __load_options_dictzScanDevice.__load_options_dict   sV    ||88&&( 	!Aq$Avv+++ QVV		!r+   c                    | j                   }||vr|||<   y ||   }|j                  t        j                  k(  rt        j                  d|z         t        j                  |j                        st        j                  d|z         t        j                  |j                        st        j                  d|z         t        |      t        k(  r(|j                  t        j                  k(  rt        |      }	 | j                  j                  |j                  |      | _        | j                  t        j                   z  r| j#                          y y # t        j
                  $ r t        j                  d|d|       Y y w xY w)NzGroups can't be set: %sInactive option: %sz#Option can't be set by software: %szUnable to set option z
 to value )rW   r!   r   r   rA   errorr.   r$   r2   intr   floatrV   rC   r   last_optINFO_RELOAD_OPTIONSrX   )r'   keyrH   r[   opts        r)   rC   zScanDevice.setOption   s(   ||d?DI3i88w)))II/#56%%cgg.II+c12''0II;cAB;##((g.@.@"@%LE	 HH..syy%@DM ==7666$$& 7 }} 	IIsEJK	s   :+E .FFc                    | j                   }|dk(  rt        |j                               S |dk(  r|d   |d   f|d   |d   ffS ||vrt        d|z        ||   }|j                  t
        j                  k(  rt        d|z        |j                  t
        j                  k(  rt        d	|z        t
        j                  |j                        st        d
|z        | j                  j                  |j                        S )Noptlistareaztl-xztl-yzbr-xzbr-yzNo such attribute: %szButtons don't have values: %szGroups don't have values: %s ra   )rW   listkeysAttributeErrorr!   r   r   r   r.   r$   rV   r7   r   )r'   rg   r[   rh   s       r)   r7   zScanDevice.getOption  s    ||)		$$&=L$v,/$v,V1MMMd? !83!>??3i88w*** !@3!FGG88w))) !@3!FGG%%cgg. !6!<==xx!!#)),,r+   c                 .    | j                   }||v r||   S y r-   )rW   )r'   rg   r[   s      r)   getOptionObjzScanDevice.getOptionObj5  s!    ||$;9 r+   c                 6    | j                   j                         S )a?  Return a 6-tuple holding all the current device settings:
           (format, format_name, last_frame, (pixels_per_line, lines), depth, bytes_per_line)

            - format is the SANE frame type
            - format is one of 'grey', 'color' (RGB), 'red', 'green', 'blue'.
            - last_frame [bool] indicates if this is the last frame of a multi frame image
            - (pixels_per_line, lines) specifies the size of the scanned image (x,y)
            - lines denotes the number of scanlines per frame
            - depth gives number of pixels per sample
        )rV   getParametersr/   s    r)   rr   zScanDevice.getParameters;  s     xx%%''r+   c                 6    | j                   j                         S )z<Return a list of tuples describing all the available options)rV   rZ   r/   s    r)   rZ   zScanDevice.getOptionsI      xx""$$r+   Nc                    | j                         s| j                  j                         }| j                  j                         \  | _        | _        | _        | _        | _        | _	        | _
        t        | j                  |||      | _        d| j                  _        | j                  j                          d| j                  | j                  z  |fS ddt        j                   fS )z]
            Perform a scan with the current device.
            Calls sane_start().
        TFr   )isScanActiverV   	startScanrr   formatformat_name
last_framepixels_per_linelinesdepthbytes_per_line
ScanThreadrT   scan_activestartr   SANE_STATUS_DEVICE_BUSY)r'   byte_formatupdate_queueevent_queuestatuss        r)   rw   zScanDevice.startScanN  s    
   "XX'')F:>((:P:P:R8DK)4?D<PJ
D$7)$((K{[D+/D(""$d&9&996AA !W<<<<r+   c                 6    | j                   j                         S )z)Cancel an in-progress scanning operation.)rV   
cancelScanr/   s    r)   r   zScanDevice.cancelScana  rt   r+   c           
         | j                         s|| j                  }|j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  f
S y)z6Get the output buffer and info about a completed scan.N)rv   rT   bufferrx   ry   r{   r|   r}   r~   	pad_bytes
total_readtotal_writer'   r:   s     r)   getScanzScanDevice.getScanf  sl      "  A88QXXq}}a6G6G!"2"2AKKq}}] ] #r+   c                     | j                         sG| j                  }	 |j                  j                          t	        j
                  |j                         yy# t        t        f$ r Y yw xY w)z-Cleanup the scan file after a completed scan.N)	rv   rT   r   closeosremovebuffer_pathIOErrorrn   r   s     r)   freeScanzScanDevice.freeScano  sZ      "  A 		!--( # ^, s   9A A+*A+c                     | j                   2| j                   j                         xr | j                   j                  S y)NF)rT   is_aliver   r/   s    r)   rv   zScanDevice.isScanActive{  s7    '##,,.O43C3C3O3OOr+   c                     | j                   N| j                   j                         r3| j                   j                  r	 | j                   j                          y y y y # t        $ r Y y w xY wr-   )rT   r   r   rG   KeyboardInterruptr/   s    r)   waitForScanDonezScanDevice.waitForScanDone  si    '%%'((  %%' ) ( ( % s   A 	A('A(c                     | j                   H	 | j                   j                         r| j                   j                  ry t        j                  d       Gy )N皙?)rT   r   r   timesleepr/   s    r)   waitForScanActivezScanDevice.waitForScanActive  sL    ' ##,,.$$00

3  (r+   c                 8    | j                   j                          y)z#Close the SANE device after a scan.N)rV   	closeScanr/   s    r)   r   zScanDevice.closeScan  s    r+   BGRANN)rM   rN   rO   rP   r*   rX   rC   r7   rp   rr   rZ   rw   r   r   r   rv   r   r   r   r@   r+   r)   rR   rR      sT    (#!'B-4(%
=&%
]	
 $r+   rR   c                   &    e Zd ZddZd Zd Zd Zy)r   Nc                    t         j                  j                  |        d| _        || _        || _        || _        t        j                  d      \  | _	        | _
        t        j                  | j                  d      | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        || _        d| _        y )NThpscan)prefixzw+br   r   )	threadingThreadr*   r   rV   r   r   r   make_temp_file	buffer_fdr   r   fdopenr   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   )r'   devicer   r   r   s        r)   r*   zScanThread.__init__  s    !!$'(&+0+?+?x+P((ii6!

 &r+   c                     | j                   *	 t        |      }| j                   j	                  ||f       y y # t        t        f$ r d}Y 2w xY w)Nr   )r   rc   
ValueError	TypeErrorput)r'   r   
bytes_reads      r)   updateQueuezScanThread.updateQueue  sW    (V !!6:"67 ) 	* s   8 AAc                     ddl m} | j                  j                         \  | _        | _        | _        | _        | _        | _	        | _
        t        j                  d| j                  z         t        j                  d| j
                  z         t        j                  d| j                  z         t        j                  d| j                  z         t        j                  d| j                  z         t        j                  d| j                  z         t        j                  d	| j                  z         t        j                  d
| j                  z         | j                  j                  }| j                  }| j                  t         j"                  k(  r| j                  dk(  r^| j                  d| j                  z  z
  | _        t        j                  d| j$                  z         d}| j                  dk(  rd}	 | j                  j'                  |      \  }}|t         j.                  k(  rrt1        |      } |dj3                  t5        d|| j$                  z
  d      D 	cg c]  }	||	|	dz   |   dz    c}	             | xj6                  |z  c_        | xj8                  ||| j$                  z
  dz  z   z  c_        | j-                  || j6                         t        j                  d| j6                  z         nt;        j<                  d       	 | j                  j'                  |      \  }}| j?                         rn|t         j.                  k(  r-n| j                  t         j@                  k(  r| j                  dk(  r| j                  | j                  dz   dz  z
  | _        t        j                  d| j$                  z         	 | j                  j'                  |      \  }}|t         j.                  k(  rrt1        |      } |dj3                  t5        d|| j$                  z
        D 	
cg c]7  }	dj3                  dD 
cg c]  }
|
tC        ||	|	dz          z  rdnd c}
      9 c}
}	             | xj6                  |z  c_        | xj8                  || j$                  z
  dz  z  c_        | j-                  || j6                         t        j                  d| j6                  z         nt;        j<                  d       	 | j                  j'                  |      \  }}| j?                         rn|t         j.                  k(  rRn| j                  dk(  r| j                  | j                  z
  | _        t        j                  d| j$                  z         	 | j                  j'                  |      \  }}|t         j.                  k(  r(rt1        |      } |dj3                  t5        d|| j$                  z
        D 	cg c]  }	d||	|	dz    z  dz    c}	             | xj6                  |z  c_        | xj8                  || j$                  z
  dz  z  c_        | j-                  || j6                         t        j                  d| j6                  z         nt;        j<                  d       	 | j                  j'                  |      \  }}| j?                         rn|t         j.                  k(  r(| j                  jE                  d       d| _#        t        j                  d       y # t         j(                  $ r,}|j*                  d   }| j-                  |d       Y d }~[d }~ww xY wc c}	w # t         j(                  $ r5}|j*                  d   }| j-                  || j6                         Y d }~d }~ww xY w# t         j(                  $ r,}|j*                  d   }| j-                  |d       Y d }~d }~ww xY wc c}
w c c}
}	w # t         j(                  $ r6}|j*                  d   }| j-                  || j6                         Y d }~[d }~ww xY w# t         j(                  $ r,}|j*                  d   }| j-                  |d       Y d }~d }~ww xY wc c}	w # t         j(                  $ r6}|j*                  d   }| j-                  || j6                         Y d }~d }~ww xY w)Nr   r   z	format=%dzformat_name=%szlast_frame=%dzppl=%dzlines=%dzdepth=%dzbpl=%dzbyte_format=%s      zpad_bytes=%dr   RGBAr	   r+      zColor Read %d bytesr      )   @          r         r	   s      s   r   zLineart Read %d bytesr   zGray Read %d bytesFzScan thread exiting...)$base.sixextr   rV   rr   rx   ry   rz   r{   r|   r}   r~   rA   debugr   r   writer   	FRAME_RGBr   readScanrb   r(   r   SANE_STATUS_GOODlenrG   ranger   r   r   r   checkCancel
FRAME_GRAYordseekr   )r'   r   w
readbufferdirstr]   stObjlen_tr   ks              r)   runzScanThread.run  sV   - ;?((:P:P:R	8T%t8LJ
D$7		++,		"T%5%556		/DOO34		(T1112		*tzz)*		*tzz)*		(T0001		"T%5%556KK((
;;'+++zzQ!%!4!4q4;O;O7O!O		.4>>9:##v-C, HH--j9EB
 G444 #A#((PUVWX]`d`n`nXnopPq#ruAeE!GC&7$87$B#rst50((UEDNN4JA3M-MM(((T__=		"7$//"IJ 

3 $ 1 1* =A '')) G444, [[G...zzQ!%!4!48L8Lq8PUV7V!V		.4>>9:, HH--j9EB
 G444 #A#((  ~C  DE  GL  OS  O]  O]  G]  ~^  $_  uzCHH  Bn  .o|}QQuUZ[\U\M]I^E^.Adw.w  .o  %p  $_  `  a50((ednn.D-JK(((T__=		"9DOO"KL

3 $ 1 1* =A '')' G444( q!%!4!4t7K7K!K		.4>>9:, HH--j9EB G444 #A#((eTUW\_c_m_mWmNn#oUAaeAg&6$6$@#opq50((et~~.E-JK(((T__=		"6"HI

3 $ 1 1* =A '')' G444, 	 		*+y }} ,AB$$R++, $s #== "ZZ]((T__=" }} ,AB$$R++, .o  $_ #== "ZZ]((T__= }} ,AB$$R++, $p #== "ZZ]((T__=s   ] +^^	 _ ``4	``! 0a- b/b4 ^!]<<^	_+__`'!```!a*4+a%%a*-b, !b''b,4c=+c88c=c                 T   d}| j                   j                         rq	 | j                   j                  d      }|t        k(  r1d}t        j                  d       | j                  j                          | j                   j                         rq|S # t        j                  $ r Y |S w xY w)NFr   TzCancel pressed!)
r   qsizegetEVENT_SCAN_CANCELEDrA   r   rV   	canclScanr   Empty)r'   canceledevents      r)   r   zScanThread.checkCancelD  s    $$&	((,,Q///#HII/0HH&&( $$&  ;; s   AB B'&B'r   )rM   rN   rO   r*   r   r   r   r@   r+   r)   r   r     s    *8z,|r+   r   c                  *    t         j                         S r-   )r   initr@   r+   r)   r   r   V  s    <<>r+   c                  *    t         j                         S r-   )r   deInitr@   r+   r)   r   r   Z  s    >>r+   c                     t        |       S )zOpen a device for scanning)rR   )rV   s    r)   rU   rU   ^  s    c?r+   c                 ,    t         j                  |       S r-   )r   
getDevices)
local_onlys    r)   r   r   c  s    j))r+   c                 ^    t         j                  dt        j                  |       | fz         y )NzSANE: %s (code=%d))rA   rb   r   getErrorMessage)codes    r)   reportErrorr   g  s$    II"g&=&=d&CT%JJKr+   )r   )&r   r   r   base.gbaser   r   r   base.sixext.movesr   
import_extr   r   r
   r   r   r   r   r   r8   r   r   r   r   r   r   r   r9   MAX_READSIZEr   rR   r   r   r   r   rU   r   r   r@   r+   r)   <module>r      s#  r   	   % #
%

9
% +1A1Aj,1D1Dm  -1C1ClU {|z__yz!!~%%'9< ` `zN Ndm!! mb
*Lr+   