xref: /third_party/backends/backend/cardscan.c (revision 141cc406)
1/* sane - Scanner Access Now Easy.
2
3   This file is part of the SANE package, and implements a SANE backend
4   for various Corex Cardscan scanners.
5
6   Copyright (C) 2007-2015 m. allan noah
7
8   --------------------------------------------------------------------------
9
10   This program is free software; you can redistribute it and/or
11   modify it under the terms of the GNU General Public License as
12   published by the Free Software Foundation; either version 2 of the
13   License, or (at your option) any later version.
14
15   This program is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18   General Public License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with this program.  If not, see <https://www.gnu.org/licenses/>.
22
23   As a special exception, the authors of SANE give permission for
24   additional uses of the libraries contained in this release of SANE.
25
26   The exception is that, if you link a SANE library with other files
27   to produce an executable, this does not by itself cause the
28   resulting executable to be covered by the GNU General Public
29   License.  Your use of that executable is in no way restricted on
30   account of linking the SANE library code into it.
31
32   This exception does not, however, invalidate any other reasons why
33   the executable file might be covered by the GNU General Public
34   License.
35
36   If you submit changes to SANE to the maintainers to be included in
37   a subsequent release, you agree by submitting the changes that
38   those changes may be distributed with this exception intact.
39
40   If you write modifications of your own for SANE, it is your choice
41   whether to permit this exception to apply to your modifications.
42   If you do not wish that, delete this exception notice.
43
44   --------------------------------------------------------------------------
45
46   The source code is divided in sections which you can easily find by
47   searching for the tag "@@".
48
49   Section 1 - Init & static stuff
50   Section 2 - sane_init, _get_devices, _open & friends
51   Section 3 - sane_*_option functions
52   Section 4 - sane_start, _get_param, _read & friends
53   Section 5 - sane_close functions
54   Section 6 - misc functions
55
56   Changes:
57      v0, 2007-05-09, MAN (SANE v1.0.19)
58        - initial release
59      v1, 2008-02-14, MAN
60	- sanei_config_read has already cleaned string (#310597)
61      v2, 2010-02-10, MAN
62	- add lines_per_block config option
63	- add has_cal_buffer config option
64	- basic support for 600c
65        - clean #include lines
66      v3, 2015-11-04, MAN
67        - add USB IDs for newer model 800c
68
69##################################################
70   DATA FROM TRACE OF WINDOWS DRIVER:
71
72cmd packet format:
73cmdcode cmdlenlow cmdlenhigh cmdpayloadbytes
74
75resp packet format:
76respcode paperfound resplenlow resplenhigh respayloadbytes
77
78############ status read loop? ##################
79>> 01 01 00 00
80<< 81 00 07 00 00 09 0c 61 c2 7a 0a
81>> 34 00 00
82<< b4 00 00 00
83>> 01 01 00 00
84<< 81 00 07 00 00 09 0c 61 c2 7a 0a
85>> 34 00 00
86<< b4 00 00 00
87>> 01 01 00 00
88<< 81 00 07 00 00 09 0c 61 c2 7a 0a
89
90############# scanner settings read? (0x04b8 is scan width) #############
91>> 48 00 00
92<< c8 00 0c 00 b8 04 60 00 00 80 00 00 00 58 ca 7d
93
94############## color and gray calibration data read ############
95>> 45 00 00
96<< 0x2600 bytes, bbbBBBgggGGGrrrRRRxxxXXX
97
98############ 34/b4 and 01/81 status loop til paper inserted ##############
99
100>> 35 01 00 00
101<< b5 01 01 00 00
102
103always together? {
104>> 14 05 00 80 1b 28 00 0f
105<< 94 01 05 00 80 1b 28 00 0f
106>> 22 01 00 00
107<< a2 01 01 00 00
108}
109
110>> 1a 01 00 66
111<< 9a 01 01 00 66
112
113>> 19 03 00 51 62 49
114<< 99 01 03 00 51 62 49
115
116############# heat up lamp? #################
117===========color===================
118three times {
119>> 18 07 00 00 01 60 00 61 00 07
120<< 0x40 read and 0x03 read
121the 3 byte drops from f4 f4 f4 to 17 10 08 etc.
122}
123===========gray===================
124three times {
125>> 12 06 00 00 01 60 00 61 00
126<< 0x40 read and 0x01 read
127}
128the 1 byte drops from f4 to 02
129==================================
130
131>> 35 01 00 00
132<< b5 01 01 00 00
133
134>> 13 01 00 28
135<< 93 01 01 00 28
136
137===========color===================
138three times {
139>> 18 07 00 01 10 60 00 18 05 07
140<< 0xe2c0 read
141}
142
14314/94 and 22/a2
144
145many times {
146>> 18 07 00 01 10 60 00 18 05 07
147<< 0xe2c0 read
148}
149===========gray===================
150two times {
151>> 12 06 00 01 10 60 00 18 05
152<< 0x4bc0 read
153}
154
15514/94 and 22/a2
156
157many times {
158>> 12 06 00 01 10 60 00 18 05
159<< 0x4bc0 read
160}
161==================================
162
163>> 35 01 00 ff
164<< b5 00 01 00 ff
165
16614/94 and 22/a2
167
168########### discharge capacitor? ###########
169four times {
170>> 21 02 00 0a 00
171<< a1 00 02 00 0a 00
172}
173
174>> 01 01 00 00
175<< 81 00 07 00 00 09 0c 61 c2 7a 0a
176
177>> 35 01 00 ff
178<< b5 00 01 00 ff
179
180>> 34 00 00
181<< b4 00 00 00
182#############################################
183
184   SANE FLOW DIAGRAM
185
186   - sane_init() : initialize backend
187   . - sane_get_devices() : query list of scanner devices
188   . - sane_open() : open a particular scanner device
189   . . - sane_set_io_mode : set blocking mode
190   . . - sane_get_select_fd : get scanner fd
191   . .
192   . . - sane_get_option_descriptor() : get option information
193   . . - sane_control_option() : change option values
194   . . - sane_get_parameters() : returns estimated scan parameters
195   . . - (repeat previous 3 functions)
196   . .
197   . . - sane_start() : start image acquisition
198   . .   - sane_get_parameters() : returns actual scan parameters
199   . .   - sane_read() : read image data (from pipe)
200   . . (sane_read called multiple times; after sane_read returns EOF,
201   . . loop may continue with sane_start which may return a 2nd page
202   . . when doing duplex scans, or load the next page from the ADF)
203   . .
204   . . - sane_cancel() : cancel operation
205   . - sane_close() : close opened scanner device
206   - sane_exit() : terminate use of backend
207
208*/
209
210/*
211 * @@ Section 1 - Init
212 */
213
214#include "../include/sane/config.h"
215
216#include <string.h> /*memcpy...*/
217#include <ctype.h> /*isspace*/
218
219#include "../include/sane/sanei_backend.h"
220#include "../include/sane/sanei_usb.h"
221#include "../include/sane/saneopts.h"
222#include "../include/sane/sanei_config.h"
223
224#include "cardscan.h"
225
226#define DEBUG 1
227#define BUILD 3
228
229/* values for SANE_DEBUG_CARDSCAN env var:
230 - errors           5
231 - function trace  10
232 - function detail 15
233 - get/setopt cmds 20
234 - usb cmd trace   25
235 - usb cmd detail  30
236 - useless noise   35
237*/
238
239int global_has_cal_buffer = 1;
240int global_lines_per_block = 16;
241
242/* ------------------------------------------------------------------------- */
243#define STRING_GRAYSCALE SANE_VALUE_SCAN_MODE_GRAY
244#define STRING_COLOR SANE_VALUE_SCAN_MODE_COLOR
245
246/*
247 * used by attach* and sane_get_devices
248 * a ptr to a null term array of ptrs to SANE_Device structs
249 * a ptr to a single-linked list of scanner structs
250 */
251static const SANE_Device **sane_devArray = NULL;
252static struct scanner *scanner_devList = NULL;
253
254/*
255 * @@ Section 2 - SANE & scanner init code
256 */
257
258/*
259 * Called by SANE initially.
260 *
261 * From the SANE spec:
262 * This function must be called before any other SANE function can be
263 * called. The behavior of a SANE backend is undefined if this
264 * function is not called first. The version code of the backend is
265 * returned in the value pointed to by version_code. If that pointer
266 * is NULL, no version code is returned. Argument authorize is either
267 * a pointer to a function that is invoked when the backend requires
268 * authentication for a specific resource or NULL if the frontend does
269 * not support authentication.
270 */
271SANE_Status
272sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
273{
274    (void) authorize;           /* get rid of compiler warning */
275
276    DBG_INIT ();
277    DBG (10, "sane_init: start\n");
278
279    sanei_usb_init();
280
281    if (version_code)
282      *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD);
283
284    DBG (5, "sane_init: cardscan backend %d.%d.%d, from %s\n",
285      SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING);
286
287    DBG (10, "sane_init: finish\n");
288
289    return SANE_STATUS_GOOD;
290}
291
292/*
293 * Called by SANE to find out about supported devices.
294 *
295 * From the SANE spec:
296 * This function can be used to query the list of devices that are
297 * available. If the function executes successfully, it stores a
298 * pointer to a NULL terminated array of pointers to SANE_Device
299 * structures in *device_list. The returned list is guaranteed to
300 * remain unchanged and valid until (a) another call to this function
301 * is performed or (b) a call to sane_exit() is performed. This
302 * function can be called repeatedly to detect when new devices become
303 * available. If argument local_only is true, only local devices are
304 * returned (devices directly attached to the machine that SANE is
305 * running on). If it is false, the device list includes all remote
306 * devices that are accessible to the SANE library.
307 *
308 * SANE does not require that this function is called before a
309 * sane_open() call is performed. A device name may be specified
310 * explicitly by a user which would make it unnecessary and
311 * undesirable to call this function first.
312 *
313 * Read the config file, find scanners with help from sanei_*
314 * store in global device structs
315 */
316SANE_Status
317sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
318{
319    struct scanner *dev;
320    char line[PATH_MAX];
321    const char *lp;
322    FILE *fp;
323    int num_devices=0;
324    int i=0;
325
326    (void) local_only;          /* get rid of compiler warning */
327
328    DBG (10, "sane_get_devices: start\n");
329
330    global_has_cal_buffer = 1;
331    global_lines_per_block = 16;
332
333    fp = sanei_config_open (CONFIG_FILE);
334
335    if (fp) {
336
337        DBG (15, "sane_get_devices: reading config file %s\n", CONFIG_FILE);
338
339        while (sanei_config_read (line, PATH_MAX, fp)) {
340
341            lp = line;
342
343            /* ignore comments */
344            if (*lp == '#')
345                continue;
346
347            /* skip empty lines */
348            if (*lp == 0)
349                continue;
350
351            if ((strncmp ("usb", lp, 3) == 0) && isspace (lp[3])) {
352                DBG (15, "sane_get_devices: looking for '%s'\n", lp);
353                sanei_usb_attach_matching_devices(lp, attach_one);
354            }
355
356            else if (!strncmp(lp, "has_cal_buffer", 14) && isspace (lp[14])) {
357
358                int buf;
359                lp += 14;
360                lp = sanei_config_skip_whitespace (lp);
361                buf = atoi (lp);
362
363                if(buf){
364                  global_has_cal_buffer = 1;
365                }
366                else{
367                  global_has_cal_buffer = 0;
368                }
369
370                DBG (15, "sane_get_devices: setting \"has_cal_buffer\" to %d\n",
371                  global_has_cal_buffer);
372            }
373
374            else if (!strncmp(lp, "lines_per_block", 15) && isspace (lp[15])) {
375
376                int buf;
377                lp += 15;
378                lp = sanei_config_skip_whitespace (lp);
379                buf = atoi (lp);
380
381                if(buf < 1 || buf > 32){
382                  DBG (15,
383                    "sane_get_devices: \"lines_per_block\"=%d\n out of range",
384                    buf
385                  );
386                  continue;
387                }
388
389                DBG (15, "sane_get_devices: \"lines_per_block\" is %d\n", buf);
390                global_lines_per_block = buf;
391            }
392
393            else{
394                DBG (5, "sane_get_devices: config line \"%s\" ignored.\n", lp);
395            }
396        }
397        fclose (fp);
398    }
399
400    else {
401        DBG (5, "sane_get_devices: no config file '%s', using defaults\n",
402          CONFIG_FILE);
403
404        DBG (15, "sane_get_devices: looking for 'usb 0x08F0 0x0005'\n");
405        sanei_usb_attach_matching_devices("usb 0x08F0 0x0005", attach_one);
406    }
407
408    for (dev = scanner_devList; dev; dev=dev->next) {
409        DBG (15, "sane_get_devices: found scanner %s\n",dev->device_name);
410        num_devices++;
411    }
412
413    DBG (15, "sane_get_devices: found %d scanner(s)\n",num_devices);
414
415    sane_devArray = calloc (num_devices + 1, sizeof (SANE_Device*));
416    if (!sane_devArray)
417        return SANE_STATUS_NO_MEM;
418
419    for (dev = scanner_devList; dev; dev=dev->next) {
420        sane_devArray[i++] = (SANE_Device *)&dev->sane;
421    }
422
423    sane_devArray[i] = 0;
424
425    *device_list = sane_devArray;
426
427    DBG (10, "sane_get_devices: finish\n");
428
429    return SANE_STATUS_GOOD;
430}
431
432/* callback used by sane_get_devices
433 * build the scanner struct and link to global list
434 * unless struct is already loaded, then pretend
435 */
436static SANE_Status
437attach_one (const char *device_name)
438{
439    struct scanner *s;
440    int ret, i;
441    SANE_Word vid, pid;
442
443    DBG (10, "attach_one: start '%s'\n", device_name);
444
445    for (s = scanner_devList; s; s = s->next) {
446        if (strcmp (s->sane.name, device_name) == 0) {
447            DBG (10, "attach_one: already attached!\n");
448            return SANE_STATUS_GOOD;
449        }
450    }
451
452    /* build a scanner struct to hold it */
453    DBG (15, "attach_one: init struct\n");
454
455    if ((s = calloc (sizeof (*s), 1)) == NULL)
456        return SANE_STATUS_NO_MEM;
457
458    /* copy the device name */
459    s->device_name = strdup (device_name);
460    if (!s->device_name){
461        free (s);
462        return SANE_STATUS_NO_MEM;
463    }
464
465    /* connect the fd */
466    DBG (15, "attach_one: connect fd\n");
467
468    s->fd = -1;
469    ret = connect_fd(s);
470    if(ret != SANE_STATUS_GOOD){
471        free (s->device_name);
472        free (s);
473        return ret;
474    }
475
476    /* clean up the scanner struct based on model */
477    /* this is the only piece of model specific code */
478    sanei_usb_get_vendor_product(s->fd,&vid,&pid);
479
480    if(vid == 0x08f0){
481        s->vendor_name = "CardScan";
482        if(pid == 0x0005){
483            s->product_name = "800c";
484        }
485        else if(pid == 0x0002){
486            s->product_name = "600c";
487        }
488        else{
489            DBG (5, "Unknown product, using default settings\n");
490            s->product_name = "Unknown";
491        }
492    }
493    else if(vid == 0x0451){
494        s->vendor_name = "Sanford";
495        if(pid == 0x6250){
496            s->product_name = "800c";
497        }
498        else{
499            DBG (5, "Unknown product, using default settings\n");
500            s->product_name = "Unknown";
501        }
502    }
503    else{
504        DBG (5, "Unknown vendor/product, using default settings\n");
505        s->vendor_name = "Unknown";
506        s->product_name = "Unknown";
507    }
508
509    DBG (15, "attach_one: Found %s scanner %s at %s\n",
510      s->vendor_name, s->product_name, s->device_name);
511
512    /*copy config file settings*/
513    s->has_cal_buffer = global_has_cal_buffer;
514    s->lines_per_block = global_lines_per_block;
515    s->color_block_size = s->lines_per_block * PIXELS_PER_LINE * 3;
516    s->gray_block_size = s->lines_per_block * PIXELS_PER_LINE;
517
518    /* try to get calibration */
519    if(s->has_cal_buffer){
520      DBG (15, "attach_one: scanner calibration\n");
521
522      ret = load_calibration(s);
523      if (ret != SANE_STATUS_GOOD) {
524          DBG (5, "sane_start: ERROR: cannot calibrate, incompatible?\n");
525          free (s->device_name);
526          free (s);
527          return ret;
528      }
529    }
530    else{
531      DBG (15, "attach_one: skipping calibration\n");
532    }
533
534    /* set SANE option 'values' to good defaults */
535    DBG (15, "attach_one: init options\n");
536
537    /* go ahead and setup the first opt, because
538     * frontend may call control_option on it
539     * before calling get_option_descriptor
540     */
541    memset (s->opt, 0, sizeof (s->opt));
542    for (i = 0; i < NUM_OPTIONS; ++i) {
543        s->opt[i].name = "filler";
544        s->opt[i].size = sizeof (SANE_Word);
545        s->opt[i].cap = SANE_CAP_INACTIVE;
546    }
547
548    s->opt[OPT_NUM_OPTS].name = SANE_NAME_NUM_OPTIONS;
549    s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
550    s->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
551    s->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
552    s->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
553
554    DBG (15, "attach_one: init settings\n");
555
556    /* we close the connection, so that another backend can talk to scanner */
557    disconnect_fd(s);
558
559    /* load info into sane_device struct */
560    s->sane.name = s->device_name;
561    s->sane.vendor = s->vendor_name;
562    s->sane.model = s->product_name;
563    s->sane.type = "scanner";
564
565    s->next = scanner_devList;
566    scanner_devList = s;
567
568    DBG (10, "attach_one: finish\n");
569
570    return SANE_STATUS_GOOD;
571}
572
573/*
574 * connect the fd in the scanner struct
575 */
576static SANE_Status
577connect_fd (struct scanner *s)
578{
579    SANE_Status ret;
580
581    DBG (10, "connect_fd: start\n");
582
583    if(s->fd > -1){
584        DBG (5, "connect_fd: already open\n");
585        ret = SANE_STATUS_GOOD;
586    }
587    else {
588        DBG (15, "connect_fd: opening USB device\n");
589        ret = sanei_usb_open (s->device_name, &(s->fd));
590    }
591
592    if(ret != SANE_STATUS_GOOD){
593        DBG (5, "connect_fd: could not open device: %d\n", ret);
594    }
595
596    DBG (10, "connect_fd: finish\n");
597
598    return ret;
599}
600
601static SANE_Status
602load_calibration(struct scanner *s)
603{
604    SANE_Status ret=SANE_STATUS_GOOD;
605    unsigned char cmd[] = {0x45, 0x00, 0x00};
606    unsigned char * buf;
607    size_t bytes = HEADER_SIZE + CAL_COLOR_SIZE*2 + CAL_GRAY_SIZE*2;
608    int j;
609
610    DBG (10, "load_calibration: start\n");
611
612    buf = malloc(bytes);
613    if(!buf){
614      DBG(5, "load_calibration: not enough mem for buffer: %ld\n",(long)bytes);
615      return SANE_STATUS_NO_MEM;
616    }
617
618    ret = do_cmd(
619      s, 0,
620      cmd, sizeof(cmd),
621      NULL, 0,
622      buf, &bytes
623    );
624
625    if (ret == SANE_STATUS_GOOD) {
626        DBG(15, "load_calibration: got GOOD\n");
627
628        /*
629         * color cal data comes from scaner like:
630         * bbbbbbbBBBBBBBgggggggGGGGGGGrrrrrrrRRRRRRR
631         * where b=darkblue, B=lightblue, etc
632         * reorder the data into two buffers
633         * bbbbbbbgggggggrrrrrrr and BBBBBBBGGGGGGGRRRRRRR
634         */
635
636        /*dark/light blue*/
637        memcpy(s->cal_color_b, buf+HEADER_SIZE, PIXELS_PER_LINE);
638        memcpy(s->cal_color_w,
639          buf+HEADER_SIZE+PIXELS_PER_LINE, PIXELS_PER_LINE);
640
641        /*dark/light green*/
642        memcpy(s->cal_color_b+PIXELS_PER_LINE,
643          buf+HEADER_SIZE+(PIXELS_PER_LINE*2), PIXELS_PER_LINE);
644        memcpy(s->cal_color_w+PIXELS_PER_LINE,
645          buf+HEADER_SIZE+(PIXELS_PER_LINE*3), PIXELS_PER_LINE);
646
647        /*dark/light red*/
648        memcpy(s->cal_color_b+(PIXELS_PER_LINE*2),
649          buf+HEADER_SIZE+(PIXELS_PER_LINE*4), PIXELS_PER_LINE);
650        memcpy(s->cal_color_w+(PIXELS_PER_LINE*2),
651          buf+HEADER_SIZE+(PIXELS_PER_LINE*5), PIXELS_PER_LINE);
652
653        /* then slide the light data down using the dark offset */
654        for(j=0;j<CAL_COLOR_SIZE;j++){
655            s->cal_color_w[j] -= s->cal_color_b[j];
656        }
657
658        /*dark/light gray*/
659        memcpy(s->cal_gray_b,
660          buf+HEADER_SIZE+(CAL_COLOR_SIZE*2), PIXELS_PER_LINE);
661        memcpy(s->cal_gray_w,
662          buf+HEADER_SIZE+(CAL_COLOR_SIZE*2)+PIXELS_PER_LINE, PIXELS_PER_LINE);
663
664        /* then slide the light data down using the dark offset */
665        for(j=0;j<CAL_GRAY_SIZE;j++){
666            s->cal_gray_w[j] -= s->cal_gray_b[j];
667        }
668
669        hexdump(35, "cal_color_b:", s->cal_color_b, CAL_COLOR_SIZE);
670        hexdump(35, "cal_color_w:", s->cal_color_w, CAL_COLOR_SIZE);
671        hexdump(35, "cal_gray_b:", s->cal_gray_b, CAL_GRAY_SIZE);
672        hexdump(35, "cal_gray_w:", s->cal_gray_w, CAL_GRAY_SIZE);
673    }
674    else {
675        DBG(5, "load_calibration: error reading data block status = %d\n", ret);
676    }
677
678    DBG (10, "load_calibration: finish\n");
679
680    return ret;
681}
682
683/*
684 * From the SANE spec:
685 * This function is used to establish a connection to a particular
686 * device. The name of the device to be opened is passed in argument
687 * name. If the call completes successfully, a handle for the device
688 * is returned in *h. As a special case, specifying a zero-length
689 * string as the device requests opening the first available device
690 * (if there is such a device).
691 */
692SANE_Status
693sane_open (SANE_String_Const name, SANE_Handle * handle)
694{
695    struct scanner *dev = NULL;
696    struct scanner *s = NULL;
697    SANE_Status ret;
698
699    DBG (10, "sane_open: start\n");
700
701    if(name[0] == 0){
702        if(scanner_devList){
703            DBG (15, "sane_open: no device requested, using first\n");
704            s = scanner_devList;
705        }
706        else{
707            DBG (15, "sane_open: no device requested, none found\n");
708        }
709    }
710    else{
711        DBG (15, "sane_open: device %s requested, attaching\n", name);
712
713        ret = attach_one(name);
714        if(ret){
715            DBG (5, "sane_open: attach error %d\n",ret);
716            return ret;
717        }
718
719        for (dev = scanner_devList; dev; dev = dev->next) {
720            if (strcmp (dev->sane.name, name) == 0) {
721                s = dev;
722                break;
723            }
724        }
725    }
726
727    if (!s) {
728        DBG (5, "sane_open: no device found\n");
729        return SANE_STATUS_INVAL;
730    }
731
732    DBG (15, "sane_open: device %s found\n", s->sane.name);
733
734    *handle = s;
735
736    /* connect the fd so we can talk to scanner */
737    ret = connect_fd(s);
738    if(ret != SANE_STATUS_GOOD){
739        return ret;
740    }
741
742    DBG (10, "sane_open: finish\n");
743
744    return SANE_STATUS_GOOD;
745}
746
747/*
748 * @@ Section 3 - SANE Options functions
749 */
750
751/*
752 * Returns the options we know.
753 *
754 * From the SANE spec:
755 * This function is used to access option descriptors. The function
756 * returns the option descriptor for option number n of the device
757 * represented by handle h. Option number 0 is guaranteed to be a
758 * valid option. Its value is an integer that specifies the number of
759 * options that are available for device handle h (the count includes
760 * option 0). If n is not a valid option index, the function returns
761 * NULL. The returned option descriptor is guaranteed to remain valid
762 * (and at the returned address) until the device is closed.
763 */
764const SANE_Option_Descriptor *
765sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
766{
767  struct scanner *s = handle;
768  int i;
769  SANE_Option_Descriptor *opt = &s->opt[option];
770
771  DBG (20, "sane_get_option_descriptor: %d\n", option);
772
773  if ((unsigned) option >= NUM_OPTIONS)
774    return NULL;
775
776  /* "Mode" group -------------------------------------------------------- */
777  if(option==OPT_MODE_GROUP){
778    opt->title = "Scan Mode";
779    opt->desc = "";
780    opt->type = SANE_TYPE_GROUP;
781    opt->constraint_type = SANE_CONSTRAINT_NONE;
782  }
783
784  /* scan mode */
785  else if(option==OPT_MODE){
786    i=0;
787    s->mode_list[i++]=STRING_GRAYSCALE;
788    s->mode_list[i++]=STRING_COLOR;
789    s->mode_list[i]=NULL;
790
791    opt->name = SANE_NAME_SCAN_MODE;
792    opt->title = SANE_TITLE_SCAN_MODE;
793    opt->desc = SANE_DESC_SCAN_MODE;
794    opt->type = SANE_TYPE_STRING;
795    opt->constraint_type = SANE_CONSTRAINT_STRING_LIST;
796    opt->constraint.string_list = s->mode_list;
797    opt->size = maxStringSize (opt->constraint.string_list);
798    opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
799  }
800
801  return opt;
802}
803
804/**
805 * Gets or sets an option value.
806 *
807 * From the SANE spec:
808 * This function is used to set or inquire the current value of option
809 * number n of the device represented by handle h. The manner in which
810 * the option is controlled is specified by parameter action. The
811 * possible values of this parameter are described in more detail
812 * below.  The value of the option is passed through argument val. It
813 * is a pointer to the memory that holds the option value. The memory
814 * area pointed to by v must be big enough to hold the entire option
815 * value (determined by member size in the corresponding option
816 * descriptor).
817 *
818 * The only exception to this rule is that when setting the value of a
819 * string option, the string pointed to by argument v may be shorter
820 * since the backend will stop reading the option value upon
821 * encountering the first NUL terminator in the string. If argument i
822 * is not NULL, the value of *i will be set to provide details on how
823 * well the request has been met.
824 */
825SANE_Status
826sane_control_option (SANE_Handle handle, SANE_Int option,
827                     SANE_Action action, void *val, SANE_Int * info)
828{
829  struct scanner *s = (struct scanner *) handle;
830  SANE_Int dummy = 0;
831
832  /* Make sure that all those statements involving *info cannot break (better
833   * than having to do "if (info) ..." everywhere!)
834   */
835  if (info == 0)
836    info = &dummy;
837
838  if (option >= NUM_OPTIONS) {
839    DBG (5, "sane_control_option: %d too big\n", option);
840    return SANE_STATUS_INVAL;
841  }
842
843  if (!SANE_OPTION_IS_ACTIVE (s->opt[option].cap)) {
844    DBG (5, "sane_control_option: %d inactive\n", option);
845    return SANE_STATUS_INVAL;
846  }
847
848  /*
849   * SANE_ACTION_GET_VALUE: We have to find out the current setting and
850   * return it in a human-readable form (often, text).
851   */
852  if (action == SANE_ACTION_GET_VALUE) {
853      SANE_Word * val_p = (SANE_Word *) val;
854
855      DBG (20, "sane_control_option: get value for '%s' (%d)\n", s->opt[option].name,option);
856
857      switch (option) {
858
859        case OPT_NUM_OPTS:
860          *val_p = NUM_OPTIONS;
861          return SANE_STATUS_GOOD;
862
863        case OPT_MODE:
864          if(s->mode == MODE_GRAYSCALE){
865            strcpy (val, STRING_GRAYSCALE);
866          }
867          else if(s->mode == MODE_COLOR){
868            strcpy (val, STRING_COLOR);
869          }
870          return SANE_STATUS_GOOD;
871      }
872  }
873  else if (action == SANE_ACTION_SET_VALUE) {
874      int tmp;
875      SANE_Status status;
876
877      DBG (20, "sane_control_option: set value for '%s' (%d)\n", s->opt[option].name,option);
878
879      if ( s->started ) {
880        DBG (5, "sane_control_option: can't set, device busy\n");
881        return SANE_STATUS_DEVICE_BUSY;
882      }
883
884      if (!SANE_OPTION_IS_SETTABLE (s->opt[option].cap)) {
885        DBG (5, "sane_control_option: not settable\n");
886        return SANE_STATUS_INVAL;
887      }
888
889      status = sanei_constrain_value (s->opt + option, val, info);
890      if (status != SANE_STATUS_GOOD) {
891        DBG (5, "sane_control_option: bad value\n");
892        return status;
893      }
894
895      /*
896       * Note - for those options which can assume one of a list of
897       * valid values, we can safely assume that they will have
898       * exactly one of those values because that's what
899       * sanei_constrain_value does. Hence no "else: invalid" branches
900       * below.
901       */
902      switch (option) {
903
904        /* Mode Group */
905        case OPT_MODE:
906          if (!strcmp (val, STRING_GRAYSCALE)) {
907            tmp = MODE_GRAYSCALE;
908          }
909          else{
910            tmp = MODE_COLOR;
911          }
912
913          if (tmp == s->mode)
914              return SANE_STATUS_GOOD;
915
916          s->mode = tmp;
917          *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
918          return SANE_STATUS_GOOD;
919
920      }                       /* switch */
921  }                           /* else */
922
923  return SANE_STATUS_INVAL;
924}
925
926/*
927 * @@ Section 4 - SANE scanning functions
928 */
929/*
930 * Called by SANE to retrieve information about the type of data
931 * that the current scan will return.
932 *
933 * From the SANE spec:
934 * This function is used to obtain the current scan parameters. The
935 * returned parameters are guaranteed to be accurate between the time
936 * a scan has been started (sane_start() has been called) and the
937 * completion of that request. Outside of that window, the returned
938 * values are best-effort estimates of what the parameters will be
939 * when sane_start() gets invoked.
940 *
941 * Calling this function before a scan has actually started allows,
942 * for example, to get an estimate of how big the scanned image will
943 * be. The parameters passed to this function are the handle h of the
944 * device for which the parameters should be obtained and a pointer p
945 * to a parameter structure.
946 */
947SANE_Status
948sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
949{
950  struct scanner *s = (struct scanner *) handle;
951
952  DBG (10, "sane_get_parameters: start\n");
953
954  params->pixels_per_line = PIXELS_PER_LINE;
955  params->lines = -1;
956  params->last_frame = 1;
957
958  if (s->mode == MODE_COLOR) {
959    params->format = SANE_FRAME_RGB;
960    params->depth = 8;
961    params->bytes_per_line = params->pixels_per_line * 3;
962  }
963  else if (s->mode == MODE_GRAYSCALE) {
964    params->format = SANE_FRAME_GRAY;
965    params->depth = 8;
966    params->bytes_per_line = params->pixels_per_line;
967  }
968
969  DBG (15, "\tdepth %d\n", params->depth);
970  DBG (15, "\tlines %d\n", params->lines);
971  DBG (15, "\tpixels_per_line %d\n", params->pixels_per_line);
972  DBG (15, "\tbytes_per_line %d\n", params->bytes_per_line);
973
974  DBG (10, "sane_get_parameters: finish\n");
975
976  return SANE_STATUS_GOOD;
977}
978
979/*
980 * Called by SANE when a page acquisition operation is to be started.
981 */
982SANE_Status
983sane_start (SANE_Handle handle)
984{
985    struct scanner *s = handle;
986    SANE_Status ret;
987
988    DBG (10, "sane_start: start\n");
989
990    /* first page of batch */
991    if(s->started){
992        DBG(5,"sane_start: previous transfer not finished?");
993        sane_cancel((SANE_Handle)s);
994        return SANE_STATUS_CANCELLED;
995    }
996
997    /* set clean defaults */
998    s->started=1;
999    s->bytes_rx=0;
1000    s->bytes_tx=0;
1001    s->paperless_lines=0;
1002
1003    /* heat up the lamp */
1004    if(s->mode == MODE_COLOR){
1005        ret = heat_lamp_color(s);
1006    }
1007    else{
1008        ret = heat_lamp_gray(s);
1009    }
1010
1011    if (ret != SANE_STATUS_GOOD) {
1012        DBG (5, "sane_start: ERROR: failed to heat lamp\n");
1013        sane_cancel((SANE_Handle)s);
1014        return ret;
1015    }
1016
1017    DBG (10, "sane_start: finish\n");
1018
1019    return SANE_STATUS_GOOD;
1020}
1021
1022static SANE_Status
1023heat_lamp_gray(struct scanner *s)
1024{
1025    SANE_Status ret = SANE_STATUS_GOOD;
1026    SANE_Status ret2 = SANE_STATUS_GOOD;
1027    unsigned char cmd[] =
1028      {0x12, 0x06, 0x00, 0x00, 0x01, 0x60, 0x00, 0x61, 0x00};
1029    size_t bytes = HEADER_SIZE + 1;
1030    unsigned char * buf;
1031    int i;
1032
1033    DBG (10, "heat_lamp_gray: start\n");
1034
1035    buf = malloc(bytes);
1036    if(!buf){
1037        DBG(5, "heat_lamp_gray: not enough mem for buffer: %lu\n",
1038          (long unsigned)bytes);
1039        return SANE_STATUS_NO_MEM;
1040    }
1041
1042    for(i=0;i<10;i++){
1043
1044        ret2 = do_cmd(
1045          s, 0,
1046          cmd, sizeof(cmd),
1047          NULL, 0,
1048          buf, &bytes
1049        );
1050
1051        if (ret2 != SANE_STATUS_GOOD) {
1052            DBG(5, "heat_lamp_gray: %d error\n",i);
1053            ret = ret2;
1054            break;
1055        }
1056
1057        if(!buf[1]){
1058            DBG(5, "heat_lamp_gray: %d got no docs\n",i);
1059            ret = SANE_STATUS_NO_DOCS;
1060            break;
1061        }
1062
1063        DBG(15, "heat_lamp_gray: %d got: %d %d\n",i,
1064          buf[HEADER_SIZE],s->cal_gray_b[0]);
1065
1066        if(buf[HEADER_SIZE] < 0x20){
1067            DBG(15, "heat_lamp_gray: hot\n");
1068            ret = SANE_STATUS_GOOD;
1069            break;
1070        }
1071        else{
1072            DBG(15, "heat_lamp_gray: cold\n");
1073            ret = SANE_STATUS_DEVICE_BUSY;
1074        }
1075    }
1076
1077    free(buf);
1078
1079    DBG (10, "heat_lamp_gray: finish %d\n",ret);
1080
1081    return ret;
1082}
1083
1084static SANE_Status
1085heat_lamp_color(struct scanner *s)
1086{
1087    SANE_Status ret = SANE_STATUS_GOOD;
1088    SANE_Status ret2 = SANE_STATUS_GOOD;
1089    unsigned char cmd[] =
1090      {0x18, 0x07, 0x00, 0x00, 0x01, 0x60, 0x00, 0x61, 0x00, 0x07};
1091    size_t bytes = HEADER_SIZE + 3;
1092    unsigned char * buf;
1093    int i;
1094
1095    DBG (10, "heat_lamp_color: start\n");
1096
1097    buf = malloc(bytes);
1098    if(!buf){
1099        DBG(5, "heat_lamp_color: not enough mem for buffer: %lu\n",
1100          (long unsigned)bytes);
1101        return SANE_STATUS_NO_MEM;
1102    }
1103
1104    for(i=0;i<10;i++){
1105
1106        ret2 = do_cmd(
1107          s, 0,
1108          cmd, sizeof(cmd),
1109          NULL, 0,
1110          buf, &bytes
1111        );
1112
1113        if (ret2 != SANE_STATUS_GOOD) {
1114            DBG(5, "heat_lamp_color: %d error\n",i);
1115            ret = ret2;
1116            break;
1117        }
1118
1119        if(!buf[1]){
1120            DBG(5, "heat_lamp_color: %d got no docs\n",i);
1121            ret = SANE_STATUS_NO_DOCS;
1122            break;
1123        }
1124
1125        DBG(15, "heat_lamp_color: %d got: %d,%d,%d %d,%d,%d\n",i,
1126          buf[HEADER_SIZE],buf[HEADER_SIZE+1],buf[HEADER_SIZE+2],
1127          s->cal_color_b[0],s->cal_color_b[1],s->cal_color_b[2]);
1128
1129        if(buf[HEADER_SIZE] < 0x20
1130         && buf[HEADER_SIZE+1] < 0x20
1131         && buf[HEADER_SIZE+2] < 0x20){
1132            DBG(15, "heat_lamp_color: hot\n");
1133            ret = SANE_STATUS_GOOD;
1134            break;
1135        }
1136        else{
1137            DBG(15, "heat_lamp_color: cold\n");
1138            ret = SANE_STATUS_DEVICE_BUSY;
1139        }
1140    }
1141
1142    free(buf);
1143
1144    DBG (10, "heat_lamp_color: finish %d\n",ret);
1145
1146    return ret;
1147}
1148
1149/*
1150 * Called by SANE to read data.
1151 *
1152 * From the SANE spec:
1153 * This function is used to read image data from the device
1154 * represented by handle h.  Argument buf is a pointer to a memory
1155 * area that is at least maxlen bytes long.  The number of bytes
1156 * returned is stored in *len. A backend must set this to zero when
1157 * the call fails (i.e., when a status other than SANE_STATUS_GOOD is
1158 * returned).
1159 *
1160 * When the call succeeds, the number of bytes returned can be
1161 * anywhere in the range from 0 to maxlen bytes.
1162 */
1163SANE_Status
1164sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len)
1165{
1166    struct scanner *s = (struct scanner *) handle;
1167    SANE_Status ret=SANE_STATUS_GOOD;
1168
1169    DBG (10, "sane_read: start\n");
1170
1171    *len = 0;
1172
1173    /* cancelled? */
1174    if(!s->started){
1175        DBG (5, "sane_read: call sane_start first\n");
1176        return SANE_STATUS_CANCELLED;
1177    }
1178
1179    /* have sent all of current buffer */
1180    if(s->bytes_tx == s->bytes_rx){
1181
1182        /* at end of data, stop */
1183        if(s->paperless_lines >= MAX_PAPERLESS_LINES){
1184            DBG (15, "sane_read: returning eof\n");
1185            power_down(s);
1186            return SANE_STATUS_EOF;
1187        }
1188
1189        /* more to get, reset and go */
1190        s->bytes_tx = 0;
1191        s->bytes_rx = 0;
1192
1193        if(s->mode == MODE_COLOR){
1194            ret = read_from_scanner_color(s);
1195        }
1196        else{
1197            ret = read_from_scanner_gray(s);
1198        }
1199
1200        if(ret){
1201            DBG(5,"sane_read: returning %d\n",ret);
1202            return ret;
1203        }
1204    }
1205
1206    /* data in current buffer, send some of it */
1207    *len = s->bytes_rx - s->bytes_tx;
1208    if(*len > max_len){
1209        *len = max_len;
1210    }
1211
1212    memcpy(buf,s->buffer+s->bytes_tx,*len);
1213    s->bytes_tx += *len;
1214
1215    DBG (10, "sane_read: %d,%d,%d finish\n", *len,s->bytes_rx,s->bytes_tx);
1216
1217    return ret;
1218}
1219
1220static SANE_Status
1221read_from_scanner_gray(struct scanner *s)
1222{
1223    SANE_Status ret=SANE_STATUS_GOOD;
1224    /*cmd    len-le16    move  lines  ???   ???   ???   ???*/
1225    unsigned char cmd[] =
1226      {0x12, 0x06, 0x00, 0x01, 0x01, 0x60, 0x00, 0x18, 0x05};
1227    size_t bytes = HEADER_SIZE + s->gray_block_size;
1228    unsigned char * buf;
1229    int i,j;
1230
1231    DBG (10, "read_from_scanner_gray: start\n");
1232
1233    cmd[4] = s->lines_per_block;
1234
1235    buf = malloc(bytes);
1236    if(!buf){
1237        DBG(5, "read_from_scanner_gray: not enough mem for buffer: %lu\n",
1238          (long unsigned)bytes);
1239        return SANE_STATUS_NO_MEM;
1240    }
1241
1242    ret = do_cmd(
1243      s, 0,
1244      cmd, sizeof(cmd),
1245      NULL, 0,
1246      buf, &bytes
1247    );
1248
1249    if (ret == SANE_STATUS_GOOD) {
1250
1251        DBG(15, "read_from_scanner_gray: got GOOD\n");
1252
1253        if(!buf[1]){
1254          s->paperless_lines += s->lines_per_block;
1255        }
1256
1257        s->bytes_rx = s->gray_block_size;
1258
1259        /*memcpy(s->buffer,buf+HEADER_SIZE,s->gray_block_size);*/
1260
1261        /* reorder the gray data into the struct's buffer */
1262        for(i=0;i<s->gray_block_size;i+=PIXELS_PER_LINE){
1263            for(j=0;j<PIXELS_PER_LINE;j++){
1264
1265                unsigned char byte = buf[ HEADER_SIZE + i + j ];
1266                unsigned char bcal = s->cal_gray_b[j];
1267                unsigned char wcal = s->cal_gray_w[j];
1268
1269                byte = (byte <= bcal)?0:(byte-bcal);
1270                byte = (byte >= wcal)?255:(byte*255/wcal);
1271                s->buffer[i+j] = byte;
1272            }
1273        }
1274    }
1275    else {
1276        DBG(5, "read_from_scanner_gray: error reading status = %d\n", ret);
1277    }
1278
1279    free(buf);
1280
1281    DBG (10, "read_from_scanner_gray: finish\n");
1282
1283    return ret;
1284}
1285
1286static SANE_Status
1287read_from_scanner_color(struct scanner *s)
1288{
1289    SANE_Status ret=SANE_STATUS_GOOD;
1290    unsigned char cmd[] =
1291     {0x18, 0x07, 0x00, 0x01, 0x01, 0x60, 0x00, 0x18, 0x05, 0x07};
1292    size_t bytes = HEADER_SIZE + s->color_block_size;
1293    unsigned char * buf;
1294    int i,j,k;
1295
1296    DBG (10, "read_from_scanner_color: start\n");
1297
1298    cmd[4] = s->lines_per_block;
1299
1300    buf = malloc(bytes);
1301    if(!buf){
1302        DBG(5, "read_from_scanner_color: not enough mem for buffer: %lu\n",
1303          (long unsigned)bytes);
1304        return SANE_STATUS_NO_MEM;
1305    }
1306
1307    ret = do_cmd(
1308      s, 0,
1309      cmd, sizeof(cmd),
1310      NULL, 0,
1311      buf, &bytes
1312    );
1313
1314    if (ret == SANE_STATUS_GOOD) {
1315
1316        DBG(15, "read_from_scanner_color: got GOOD\n");
1317
1318        if(!buf[1]){
1319          s->paperless_lines += s->lines_per_block;
1320        }
1321
1322        s->bytes_rx = s->color_block_size;
1323
1324        /*memcpy(s->buffer,buf+HEADER_SIZE,s->color_block_size);*/
1325
1326        /* reorder the color data into the struct's buffer */
1327        for(i=0;i<s->color_block_size;i+=PIXELS_PER_LINE*3){
1328            for(j=0;j<PIXELS_PER_LINE;j++){
1329                for(k=0;k<3;k++){
1330
1331                    int offset = PIXELS_PER_LINE*(2-k) + j;
1332                    unsigned char byte = buf[ HEADER_SIZE + i + offset ];
1333                    unsigned char bcal = s->cal_color_b[offset];
1334                    unsigned char wcal = s->cal_color_w[offset];
1335
1336                    byte = (byte <= bcal)?0:(byte-bcal);
1337                    byte = (byte >= wcal)?255:(byte*255/wcal);
1338                    s->buffer[i+j*3+k] = byte;
1339                }
1340            }
1341        }
1342    }
1343    else {
1344        DBG(5, "read_from_scanner_color: error reading status = %d\n", ret);
1345    }
1346
1347    free(buf);
1348
1349    DBG (10, "read_from_scanner_color: finish\n");
1350
1351    return ret;
1352}
1353
1354/*
1355 * @@ Section 4 - SANE cleanup functions
1356 */
1357/*
1358 * Cancels a scan.
1359 *
1360 * From the SANE spec:
1361 * This function is used to immediately or as quickly as possible
1362 * cancel the currently pending operation of the device represented by
1363 * handle h.  This function can be called at any time (as long as
1364 * handle h is a valid handle) but usually affects long-running
1365 * operations only (such as image is acquisition). It is safe to call
1366 * this function asynchronously (e.g., from within a signal handler).
1367 * It is important to note that completion of this operation does not
1368 * imply that the currently pending operation has been cancelled. It
1369 * only guarantees that cancellation has been initiated. Cancellation
1370 * completes only when the cancelled call returns (typically with a
1371 * status value of SANE_STATUS_CANCELLED).  Since the SANE API does
1372 * not require any other operations to be re-entrant, this implies
1373 * that a frontend must not call any other operation until the
1374 * cancelled operation has returned.
1375 */
1376void
1377sane_cancel (SANE_Handle handle)
1378{
1379  struct scanner * s = (struct scanner *) handle;
1380  DBG (10, "sane_cancel: start\n");
1381  s->started = 0;
1382  DBG (10, "sane_cancel: finish\n");
1383}
1384
1385static SANE_Status
1386power_down(struct scanner *s)
1387{
1388    SANE_Status ret = SANE_STATUS_GOOD;
1389
1390    unsigned char cmd[] = {0x21, 0x02, 0x00, 0x0a, 0x00};
1391    unsigned char buf[6];
1392    size_t bytes = sizeof(buf);
1393    int i;
1394
1395    DBG (10, "power_down: start\n");
1396
1397    for(i=0;i<5;i++){
1398        ret = do_cmd(
1399          s, 0,
1400          cmd, sizeof(cmd),
1401          NULL, 0,
1402          buf, &bytes
1403        );
1404
1405        if(ret != SANE_STATUS_GOOD){
1406            break;
1407        }
1408    }
1409
1410#if 0
1411    unsigned char cmd[] = {0x35, 0x01, 0x00, 0xff};
1412    unsigned char buf[5];
1413    size_t bytes = sizeof(buf);
1414
1415    DBG (10, "power_down: start\n");
1416
1417    ret = do_cmd(
1418      s, 0,
1419      cmd, sizeof(cmd),
1420      NULL, 0,
1421      buf, &bytes
1422    );
1423#endif
1424
1425    DBG (10, "power_down: finish %d\n",ret);
1426
1427    return ret;
1428}
1429
1430/*
1431 * Ends use of the scanner.
1432 *
1433 * From the SANE spec:
1434 * This function terminates the association between the device handle
1435 * passed in argument h and the device it represents. If the device is
1436 * presently active, a call to sane_cancel() is performed first. After
1437 * this function returns, handle h must not be used anymore.
1438 */
1439void
1440sane_close (SANE_Handle handle)
1441{
1442  DBG (10, "sane_close: start\n");
1443
1444  sane_cancel(handle);
1445  disconnect_fd((struct scanner *) handle);
1446
1447  DBG (10, "sane_close: finish\n");
1448}
1449
1450static SANE_Status
1451disconnect_fd (struct scanner *s)
1452{
1453  DBG (10, "disconnect_fd: start\n");
1454
1455  if(s->fd > -1){
1456    DBG (15, "disconnecting usb device\n");
1457    sanei_usb_close (s->fd);
1458    s->fd = -1;
1459  }
1460
1461  DBG (10, "disconnect_fd: finish\n");
1462
1463  return SANE_STATUS_GOOD;
1464}
1465
1466/*
1467 * Terminates the backend.
1468 *
1469 * From the SANE spec:
1470 * This function must be called to terminate use of a backend. The
1471 * function will first close all device handles that still might be
1472 * open (it is recommended to close device handles explicitly through
1473 * a call to sane_close(), but backends are required to release all
1474 * resources upon a call to this function). After this function
1475 * returns, no function other than sane_init() may be called
1476 * (regardless of the status value returned by sane_exit(). Neglecting
1477 * to call this function may result in some resources not being
1478 * released properly.
1479 */
1480void
1481sane_exit (void)
1482{
1483  struct scanner *dev, *next;
1484
1485  DBG (10, "sane_exit: start\n");
1486
1487  for (dev = scanner_devList; dev; dev = next) {
1488      disconnect_fd(dev);
1489      next = dev->next;
1490      free (dev->device_name);
1491      free (dev);
1492  }
1493
1494  if (sane_devArray)
1495    free (sane_devArray);
1496
1497  scanner_devList = NULL;
1498  sane_devArray = NULL;
1499
1500  DBG (10, "sane_exit: finish\n");
1501}
1502
1503
1504/*
1505 * @@ Section 5 - misc helper functions
1506 */
1507/*
1508 * take a bunch of pointers, send commands to scanner
1509 */
1510static SANE_Status
1511do_cmd(struct scanner *s, int shortTime,
1512 unsigned char * cmdBuff, size_t cmdLen,
1513 unsigned char * outBuff, size_t outLen,
1514 unsigned char * inBuff, size_t * inLen
1515)
1516{
1517    /* sanei_usb overwrites the transfer size, so make some local copies */
1518    size_t loc_cmdLen = cmdLen;
1519    size_t loc_outLen = outLen;
1520    size_t loc_inLen = *inLen;
1521
1522    int cmdTime = USB_COMMAND_TIME;
1523    int outTime = USB_DATA_TIME;
1524    int inTime = USB_DATA_TIME;
1525
1526    int ret = 0;
1527
1528    DBG (10, "do_cmd: start\n");
1529
1530    if(shortTime){
1531        cmdTime /= 20;
1532        outTime /= 20;
1533        inTime /= 20;
1534    }
1535
1536    /* change timeout */
1537    sanei_usb_set_timeout(cmdTime);
1538
1539    /* write the command out */
1540    DBG(25, "cmd: writing %ld bytes, timeout %d\n", (long)cmdLen, cmdTime);
1541    hexdump(30, "cmd: >>", cmdBuff, cmdLen);
1542    ret = sanei_usb_write_bulk(s->fd, cmdBuff, &cmdLen);
1543    DBG(25, "cmd: wrote %ld bytes, retVal %d\n", (long)cmdLen, ret);
1544
1545    if(ret == SANE_STATUS_EOF){
1546        DBG(5,"cmd: got EOF, returning IO_ERROR\n");
1547        return SANE_STATUS_IO_ERROR;
1548    }
1549    if(ret != SANE_STATUS_GOOD){
1550        DBG(5,"cmd: return error '%s'\n",sane_strstatus(ret));
1551        return ret;
1552    }
1553    if(loc_cmdLen != cmdLen){
1554        DBG(5,"cmd: wrong size %ld/%ld\n", (long)loc_cmdLen, (long)cmdLen);
1555        return SANE_STATUS_IO_ERROR;
1556    }
1557
1558    /* this command has a write component, and a place to get it */
1559    if(outBuff && outLen && outTime){
1560
1561        /* change timeout */
1562        sanei_usb_set_timeout(outTime);
1563
1564        DBG(25, "out: writing %ld bytes, timeout %d\n", (long)outLen, outTime);
1565        hexdump(30, "out: >>", outBuff, outLen);
1566        ret = sanei_usb_write_bulk(s->fd, outBuff, &outLen);
1567        DBG(25, "out: wrote %ld bytes, retVal %d\n", (long)outLen, ret);
1568
1569        if(ret == SANE_STATUS_EOF){
1570            DBG(5,"out: got EOF, returning IO_ERROR\n");
1571            return SANE_STATUS_IO_ERROR;
1572        }
1573        if(ret != SANE_STATUS_GOOD){
1574            DBG(5,"out: return error '%s'\n",sane_strstatus(ret));
1575            return ret;
1576        }
1577        if(loc_outLen != outLen){
1578            DBG(5,"out: wrong size %ld/%ld\n", (long)loc_outLen, (long)outLen);
1579            return SANE_STATUS_IO_ERROR;
1580        }
1581    }
1582
1583    /* this command has a read component, and a place to put it */
1584    if(inBuff && inLen && inTime){
1585
1586        memset(inBuff,0,*inLen);
1587
1588        /* change timeout */
1589        sanei_usb_set_timeout(inTime);
1590
1591        DBG(25, "in: reading %ld bytes, timeout %d\n", (long)*inLen, inTime);
1592        ret = sanei_usb_read_bulk(s->fd, inBuff, inLen);
1593        DBG(25, "in: retVal %d\n", ret);
1594
1595        if(ret == SANE_STATUS_EOF){
1596            DBG(5,"in: got EOF, continuing\n");
1597        }
1598        else if(ret != SANE_STATUS_GOOD){
1599            DBG(5,"in: return error '%s'\n",sane_strstatus(ret));
1600            return ret;
1601        }
1602
1603        DBG(25, "in: read %ld bytes\n", (long)*inLen);
1604        if(*inLen){
1605            hexdump(30, "in: <<", inBuff, *inLen);
1606        }
1607
1608        if(loc_inLen != *inLen){
1609            ret = SANE_STATUS_EOF;
1610            DBG(5,"in: short read %ld/%ld\n", (long)loc_inLen, (long)*inLen);
1611        }
1612    }
1613
1614    DBG (10, "do_cmd: finish\n");
1615
1616    return ret;
1617}
1618
1619/**
1620 * Convenience method to determine longest string size in a list.
1621 */
1622static size_t
1623maxStringSize (const SANE_String_Const strings[])
1624{
1625  size_t size, max_size = 0;
1626  int i;
1627
1628  for (i = 0; strings[i]; ++i) {
1629    size = strlen (strings[i]) + 1;
1630    if (size > max_size)
1631      max_size = size;
1632  }
1633
1634  return max_size;
1635}
1636
1637/**
1638 * Prints a hex dump of the given buffer onto the debug output stream.
1639 */
1640static void
1641hexdump (int level, char *comment, unsigned char *p, int l)
1642{
1643  int i;
1644  char line[128];
1645  char *ptr;
1646
1647  if(DBG_LEVEL < level)
1648    return;
1649
1650  DBG (level, "%s\n", comment);
1651  ptr = line;
1652  for (i = 0; i < l; i++, p++)
1653    {
1654      if ((i % 16) == 0)
1655        {
1656          if (ptr != line)
1657            {
1658              *ptr = '\0';
1659              DBG (level, "%s\n", line);
1660              ptr = line;
1661            }
1662          sprintf (ptr, "%3.3x:", i);
1663          ptr += 4;
1664        }
1665      sprintf (ptr, " %2.2x", *p);
1666      ptr += 3;
1667    }
1668  *ptr = '\0';
1669  DBG (level, "%s\n", line);
1670}
1671
1672/**
1673 * An advanced method we don't support but have to define.
1674 */
1675SANE_Status
1676sane_set_io_mode (SANE_Handle h, SANE_Bool non_blocking)
1677{
1678  DBG (10, "sane_set_io_mode\n");
1679  DBG (15, "%d %p\n", non_blocking, h);
1680  return SANE_STATUS_UNSUPPORTED;
1681}
1682
1683/**
1684 * An advanced method we don't support but have to define.
1685 */
1686SANE_Status
1687sane_get_select_fd (SANE_Handle h, SANE_Int *fdp)
1688{
1689  DBG (10, "sane_get_select_fd\n");
1690  DBG (15, "%p %d\n", h, *fdp);
1691  return SANE_STATUS_UNSUPPORTED;
1692}
1693