1
/***********************************************************
2
(C) Copyright 2003 A.M. Kuchling. All Rights Reserved
3
(C) Copyright 2004 A.M. Kuchling, Ralph Heinkel All Rights Reserved
5
Permission to use, copy, modify, and distribute this software and its
6
documentation for any purpose and without fee is hereby granted,
7
provided that the above copyright notice appear in all copies and that
8
both that copyright notice and this permission notice appear in
9
supporting documentation, and that the name of A.M. Kuchling and
10
Ralph Heinkel not be used in advertising or publicity pertaining to
11
distribution of the software without specific, written prior permission.
13
A.M. KUCHLING, R.H. HEINKEL DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
14
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
15
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
16
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
17
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
18
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19
PERFORMANCE OF THIS SOFTWARE.
21
******************************************************************/
27
#include <sane/sane.h>
31
static PyObject *ErrorObject;
42
/* Raise a SANE exception */
44
PySane_Error(SANE_Status st)
48
if (st==SANE_STATUS_GOOD) {Py_INCREF(Py_None); return (Py_None);}
49
string=sane_strstatus(st);
50
PyErr_SetString(ErrorObject, string);
54
staticforward PyTypeObject SaneDev_Type;
56
#define SaneDevObject_Check(v) ((v)->ob_type == &SaneDev_Type)
58
static SaneDevObject *
59
newSaneDevObject(void)
62
self = PyObject_NEW(SaneDevObject, &SaneDev_Type);
72
SaneDev_dealloc(SaneDevObject *self)
74
if (self->h) sane_close(self->h);
80
SaneDev_close(SaneDevObject *self, PyObject *args)
82
if (!PyArg_ParseTuple(args, ""))
84
if (self->h) sane_close(self->h);
91
SaneDev_get_parameters(SaneDevObject *self, PyObject *args)
95
char *format="unknown format";
97
if (!PyArg_ParseTuple(args, ""))
101
PyErr_SetString(ErrorObject, "SaneDev object is closed");
104
Py_BEGIN_ALLOW_THREADS
105
st=sane_get_parameters(self->h, &p);
108
if (st) return PySane_Error(st);
111
case(SANE_FRAME_GRAY): format="gray"; break;
112
case(SANE_FRAME_RGB): format="color"; break;
113
case(SANE_FRAME_RED): format="red"; break;
114
case(SANE_FRAME_GREEN): format="green"; break;
115
case(SANE_FRAME_BLUE): format="blue"; break;
118
return Py_BuildValue("si(ii)ii", format, p.last_frame, p.pixels_per_line,
119
p.lines, p.depth, p.bytes_per_line);
124
SaneDev_fileno(SaneDevObject *self, PyObject *args)
129
if (!PyArg_ParseTuple(args, ""))
133
PyErr_SetString(ErrorObject, "SaneDev object is closed");
136
st=sane_get_select_fd(self->h, &fd);
137
if (st) return PySane_Error(st);
138
return PyInt_FromLong(fd);
142
SaneDev_start(SaneDevObject *self, PyObject *args)
146
if (!PyArg_ParseTuple(args, ""))
150
PyErr_SetString(ErrorObject, "SaneDev object is closed");
153
/* sane_start can take several seconds, if the user initiates
154
a new scan, while the scan head of a flatbed scanner moves
155
back to the start position after finishing a previous scan.
156
Hence it is worth to allow threads here.
158
Py_BEGIN_ALLOW_THREADS
159
st=sane_start(self->h);
161
if (st) return PySane_Error(st);
167
SaneDev_cancel(SaneDevObject *self, PyObject *args)
169
if (!PyArg_ParseTuple(args, ""))
173
PyErr_SetString(ErrorObject, "SaneDev object is closed");
176
sane_cancel(self->h);
182
SaneDev_get_options(SaneDevObject *self, PyObject *args)
184
const SANE_Option_Descriptor *d;
185
PyObject *list, *value;
188
if (!PyArg_ParseTuple(args, ""))
192
PyErr_SetString(ErrorObject, "SaneDev object is closed");
195
if (!(list = PyList_New(0)))
200
d=sane_get_option_descriptor(self->h, i);
203
PyObject *constraint=NULL;
206
switch (d->constraint_type)
208
case(SANE_CONSTRAINT_NONE):
209
Py_INCREF(Py_None); constraint=Py_None; break;
210
case(SANE_CONSTRAINT_RANGE):
211
if (d->type == SANE_TYPE_INT)
212
constraint=Py_BuildValue("iii", d->constraint.range->min,
213
d->constraint.range->max,
214
d->constraint.range->quant);
216
constraint=Py_BuildValue("ddd",
217
SANE_UNFIX(d->constraint.range->min),
218
SANE_UNFIX(d->constraint.range->max),
219
SANE_UNFIX(d->constraint.range->quant));
221
case(SANE_CONSTRAINT_WORD_LIST):
222
constraint=PyList_New(d->constraint.word_list[0]);
223
if (d->type == SANE_TYPE_INT)
224
for (j=1; j<=d->constraint.word_list[0]; j++)
225
PyList_SetItem(constraint, j-1,
226
PyInt_FromLong(d->constraint.word_list[j]));
228
for (j=1; j<=d->constraint.word_list[0]; j++)
229
PyList_SetItem(constraint, j-1,
230
PyFloat_FromDouble(SANE_UNFIX(d->constraint.word_list[j])));
232
case(SANE_CONSTRAINT_STRING_LIST):
233
constraint=PyList_New(0);
234
for(j=0; d->constraint.string_list[j]!=NULL; j++)
235
PyList_Append(constraint,
236
PyString_FromString(d->constraint.string_list[j]));
239
value=Py_BuildValue("isssiiiiO", i, d->name, d->title, d->desc,
240
d->type, d->unit, d->size, d->cap, constraint);
241
PyList_Append(list, value);
249
SaneDev_get_option(SaneDevObject *self, PyObject *args)
252
const SANE_Option_Descriptor *d;
253
PyObject *value=NULL;
257
if (!PyArg_ParseTuple(args, "i", &n))
263
PyErr_SetString(ErrorObject, "SaneDev object is closed");
266
d=sane_get_option_descriptor(self->h, n);
268
st=sane_control_option(self->h, n, SANE_ACTION_GET_VALUE,
274
return PySane_Error(st);
279
case(SANE_TYPE_BOOL):
281
value=Py_BuildValue("i", *( (SANE_Int*)v) );
283
case(SANE_TYPE_FIXED):
284
value=Py_BuildValue("d", SANE_UNFIX((*((SANE_Fixed*)v))) );
286
case(SANE_TYPE_STRING):
287
value=Py_BuildValue("s", v);
289
case(SANE_TYPE_BUTTON):
290
case(SANE_TYPE_GROUP):
291
value=Py_BuildValue("O", Py_None);
300
SaneDev_set_option(SaneDevObject *self, PyObject *args)
303
const SANE_Option_Descriptor *d;
309
if (!PyArg_ParseTuple(args, "iO", &n, &value))
313
PyErr_SetString(ErrorObject, "SaneDev object is closed");
316
d=sane_get_option_descriptor(self->h, n);
321
case(SANE_TYPE_BOOL):
322
if (!PyInt_Check(value))
324
PyErr_SetString(PyExc_TypeError, "SANE_BOOL requires an integer");
330
if (!PyInt_Check(value))
332
PyErr_SetString(PyExc_TypeError, "SANE_INT requires an integer");
336
*( (SANE_Int*)v) = PyInt_AsLong(value);
338
case(SANE_TYPE_FIXED):
339
if (!PyFloat_Check(value))
341
PyErr_SetString(PyExc_TypeError, "SANE_FIXED requires a floating point number");
345
*( (SANE_Fixed*)v) = SANE_FIX(PyFloat_AsDouble(value));
347
case(SANE_TYPE_STRING):
348
if (!PyString_Check(value))
350
PyErr_SetString(PyExc_TypeError, "SANE_STRING requires a string");
354
strncpy(v, PyString_AsString(value), d->size-1);
355
((char*)v)[d->size-1] = 0;
357
case(SANE_TYPE_BUTTON):
358
case(SANE_TYPE_GROUP):
362
st=sane_control_option(self->h, n, SANE_ACTION_SET_VALUE,
364
if (st) {free(v); return PySane_Error(st);}
367
return Py_BuildValue("i", i);
371
SaneDev_set_auto_option(SaneDevObject *self, PyObject *args)
374
const SANE_Option_Descriptor *d;
378
if (!PyArg_ParseTuple(args, "i", &n))
382
PyErr_SetString(ErrorObject, "SaneDev object is closed");
385
d=sane_get_option_descriptor(self->h, n);
386
st=sane_control_option(self->h, n, SANE_ACTION_SET_AUTO,
388
if (st) {return PySane_Error(st);}
390
return Py_BuildValue("i", i);
393
#define READSIZE 32768
396
SaneDev_snap(SaneDevObject *self, PyObject *args)
399
/* The buffer should be a multiple of 3 in size, so each sane_read
400
operation will return an integral number of RGB triples. */
401
SANE_Byte buffer[READSIZE]; /* XXX how big should the buffer be? */
402
SANE_Int len, lastlen;
405
int px, py, remain, cplen, bufpos, padbytes;
413
PyObject *pyNoCancel = NULL;
418
if (!PyArg_ParseTuple(args, "l|O", &L, &pyNoCancel))
422
PyErr_SetString(ErrorObject, "SaneDev object is closed");
428
noCancel = PyObject_IsTrue(pyNoCancel);
430
st=SANE_STATUS_GOOD; px=py=0;
431
/* xxx not yet implemented
432
- handscanner support (i.e., unknown image length during start)
433
- generally: move the functionality from method snap in sane.py
434
down here -- I don't like this cross-dependency.
435
we need to call sane_get_parameters here, and we can create
436
the result Image object here.
440
sane_get_parameters(self->h, &p);
441
if (p.format == SANE_FRAME_GRAY)
446
remain = p.bytes_per_line * im->ysize;
447
padbytes = p.bytes_per_line - (im->xsize+7)/8;
450
while (st!=SANE_STATUS_EOF && py < im->ysize)
452
while (len > 0 && py < im->ysize)
455
j = buffer[bufpos++];
457
for (i = 0; i < 8 && px < im->xsize; i++)
459
im->image8[py][px++] = (k&j) ? 0 : 0xFF;
471
st=sane_read(self->h, buffer,
472
remain<READSIZE ? remain : READSIZE, &len);
473
if (st && (st!=SANE_STATUS_EOF))
475
sane_cancel(self->h);
477
return PySane_Error(st);
482
/* skip possible pad bytes at the start of the buffer */
487
remain = p.bytes_per_line * im->ysize;
488
padbytes = p.bytes_per_line - im->xsize;
491
while (st!=SANE_STATUS_EOF && py < im->ysize)
493
while (len > 0 && py < im->ysize)
496
if (px + cplen >= im->xsize)
497
cplen = im->xsize - px;
498
memcpy(&im->image8[py][px], &buffer[bufpos], cplen);
512
st=sane_read(self->h, buffer,
513
remain<READSIZE ? remain : READSIZE, &len);
514
if (st && (st!=SANE_STATUS_EOF))
516
sane_cancel(self->h);
518
return PySane_Error(st);
525
remain = p.bytes_per_line * im->ysize;
526
padbytes = p.bytes_per_line - 2 * im->xsize;
527
bufpos = endian.c[0];
529
while (st!=SANE_STATUS_EOF && py < im->ysize)
531
while (len > 0 && py < im->ysize)
533
im->image8[py][px++] = buffer[bufpos];
544
st=sane_read(self->h, buffer,
545
remain<READSIZE ? remain : READSIZE, &len);
546
if (st && (st!=SANE_STATUS_EOF))
548
sane_cancel(self->h);
550
return PySane_Error(st);
559
/* other depths are not formally "illegal" according to the
560
Sane API, but it's agreed by Sane developers that other
561
depths than 1, 8, 16 should not be used
563
sane_cancel(self->h);
565
snprintf(errmsg, 80, "unsupported pixel depth: %i", p.depth);
566
PyErr_SetString(ErrorObject, errmsg);
570
else if (p.format == SANE_FRAME_RGB)
572
int incr, color, pxs, pxmax, bit, val, mask;
576
remain = p.bytes_per_line * im->ysize;
577
padbytes = p.bytes_per_line - ((im->xsize+7)/8) * 3;
581
pxmax = 4 * im->xsize;
582
while (st!=SANE_STATUS_EOF && py < im->ysize)
585
for (color = 0; color < 3; color++)
587
while (len <= 0 && st == SANE_STATUS_GOOD)
589
st=sane_read(self->h, buffer,
590
remain<READSIZE ? remain : READSIZE, &len);
591
if (st && (st!=SANE_STATUS_EOF))
593
sane_cancel(self->h);
595
return PySane_Error(st);
600
/* skip possible pad bytes at the start of the buffer */
603
if (st == SANE_STATUS_EOF) break;
605
val = buffer[bufpos++];
608
for (bit = 0; (bit < 8) && (px < pxmax); bit++)
610
((UINT8**)(im->image32))[py][px] = (val&mask) ? 0xFF : 0;
617
if (st == SANE_STATUS_EOF)
619
for (bit = 0; bit < 8 && px < pxmax; bit++)
621
((UINT8**)(im->image32))[py][px] = 0;
638
padbytes = p.bytes_per_line - 3 * im->xsize;
644
padbytes = p.bytes_per_line - 6 * im->xsize;
645
bufpos = endian.c[0];
648
remain = p.bytes_per_line * im->ysize;
651
pxmax = 4 * im->xsize;
652
/* probably not very efficient. But we have to deal with these
654
- we may have padding bytes at the end of a scan line
655
- the number of bytes read with sane_read may be smaller
656
than the number of pad bytes
657
- the buffer may become empty after setting any of the
658
red/green/blue pixel values
661
while (st != SANE_STATUS_EOF && py < im->ysize)
663
for (color = 0; color < 3; color++)
665
while (len <= 0 && st == SANE_STATUS_GOOD)
670
sane_cancel(self->h);
672
PyErr_SetString(ErrorObject, "internal _sane error: premature end of scan");
675
st = sane_read(self->h, buffer,
676
remain<(READSIZE) ? remain : (READSIZE), &len);
677
if (st && (st!=SANE_STATUS_EOF))
679
sane_cancel(self->h);
681
return PySane_Error(st);
687
if (st == SANE_STATUS_EOF) break;
688
((UINT8**)(im->image32))[py][px++] = buffer[bufpos];
692
if (st == SANE_STATUS_EOF) break;
694
((UINT8**)(im->image32))[py][px++] = 0;
707
sane_cancel(self->h);
708
snprintf(errmsg, 80, "unsupported pixel depth: %i", p.depth);
709
PyErr_SetString(ErrorObject, errmsg);
714
else /* should be SANE_FRAME_RED, GREEN or BLUE */
716
int lastlen, pxa, pxmax, offset, incr, frame_count = 0;
717
/* at least the Sane test backend behaves a bit weird, if
718
it returns "premature EOF" for sane_read, i.e., if the
719
option "return value of sane_read" is set to SANE_STATUS_EOF.
720
In this case, the test backend does not advance to the next frame,
721
so p.last_frame will never be set...
722
So let's count the number of frames we try to acquire
724
while (!p.last_frame && frame_count < 4)
727
st = sane_get_parameters(self->h, &p);
730
sane_cancel(self->h);
732
return PySane_Error(st);
734
remain = p.bytes_per_line * im->ysize;
744
case SANE_FRAME_GREEN:
747
case SANE_FRAME_BLUE:
751
sane_cancel(self->h);
753
snprintf(errmsg, 80, "unknown/invalid frame format: %i", p.format);
754
PyErr_SetString(ErrorObject, errmsg);
759
pxmax = im->xsize * 4;
763
padbytes = p.bytes_per_line - (im->xsize+7)/8;
764
st = SANE_STATUS_GOOD;
765
while (st != SANE_STATUS_EOF && py < im->ysize)
770
val = buffer[bufpos++]; len--;
772
for (bit = 0; bit < 8 && px < pxmax; bit++)
774
((UINT8**)(im->image32))[py][px]
775
= val&mask ? 0xFF : 0;
776
((UINT8**)(im->image32))[py][pxa] = 0;
791
while (len <= 0 && st == SANE_STATUS_GOOD && remain > 0)
794
st = sane_read(self->h, buffer,
795
remain<(READSIZE) ? remain : (READSIZE), &len);
796
if (st && (st!=SANE_STATUS_EOF))
798
sane_cancel(self->h);
800
return PySane_Error(st);
812
padbytes = p.bytes_per_line - im->xsize;
817
padbytes = p.bytes_per_line - 2 * im->xsize;
819
bufpos = endian.c[0];
821
st = SANE_STATUS_GOOD;
822
while (st != SANE_STATUS_EOF && py < im->ysize)
829
sane_cancel(self->h);
831
PyErr_SetString(ErrorObject, "internal _sane error: premature end of scan");
834
st = sane_read(self->h, buffer,
835
remain<(READSIZE) ? remain : (READSIZE), &len);
836
if (st && (st!=SANE_STATUS_EOF))
838
sane_cancel(self->h);
840
return PySane_Error(st);
842
if (st == SANE_STATUS_EOF)
851
if (st == SANE_STATUS_EOF)
853
((UINT8**)(im->image32))[py][px] = buffer[bufpos];
854
((UINT8**)(im->image32))[py][pxa] = 0;
871
sane_cancel(self->h);
873
snprintf(errmsg, 80, "unsupported pixel depth: %i", p.depth);
874
PyErr_SetString(ErrorObject, errmsg);
879
/* all sane_read calls in the above loop may return
880
SANE_STATUS_GOOD, but the backend may need another sane_read
881
call which returns SANE_STATUS_EOF in order to start
885
st = sane_read(self->h, buffer, READSIZE, &len);
887
while (st == SANE_STATUS_GOOD);
888
if (st != SANE_STATUS_EOF)
891
sane_cancel(self->h);
892
return PySane_Error(st);
895
st = sane_start(self->h);
899
return PySane_Error(st);
904
/* enforce SANE_STATUS_EOF. Can be necessary for ADF scans for some backends */
906
st = sane_read(self->h, buffer, READSIZE, &len);
908
while (st == SANE_STATUS_GOOD);
909
if (st != SANE_STATUS_EOF)
911
sane_cancel(self->h);
913
return PySane_Error(st);
917
sane_cancel(self->h);
926
#include "numarray/libnumarray.h"
928
/* this global variable is set to 1 in 'init_sane()' after successfully
929
importing the numarray module. */
930
int NUMARRAY_IMPORTED = 0;
933
SaneDev_arr_snap(SaneDevObject *self, PyObject *args)
936
SANE_Byte buffer[READSIZE];
940
PyArrayObject *pyArr = NULL;
941
NumarrayType arrType;
942
int line, line_index, buffer_index, remain_bytes_line, num_pad_bytes;
943
int cp_num_bytes, total_remain, bpp, arr_bytes_per_line;
944
int pixels_per_line = -1;
947
if (!NUMARRAY_IMPORTED)
949
PyErr_SetString(ErrorObject, "numarray package not available");
953
if (!PyArg_ParseTuple(args, "|i", &pixels_per_line))
957
PyErr_SetString(ErrorObject, "SaneDev object is closed");
961
sane_get_parameters(self->h, &p);
962
if (p.format != SANE_FRAME_GRAY)
964
sane_cancel(self->h);
965
snprintf(errmsg, 80, "numarray only supports gray-scale images");
966
PyErr_SetString(ErrorObject, errmsg);
972
bpp=1; /* bytes-per-pixel */
975
else if (p.depth == 16)
977
bpp=2; /* bytes-per-pixel */
982
sane_cancel(self->h);
983
snprintf(errmsg, 80, "arrsnap: unsupported pixel depth: %i", p.depth);
984
PyErr_SetString(ErrorObject, errmsg);
988
if (pixels_per_line < 1)
989
/* The user can choose a smaller result array than the actual scan */
990
pixels_per_line = p.pixels_per_line;
992
if (pixels_per_line > p.pixels_per_line)
994
PyErr_SetString(ErrorObject,"given pixels_per_line too big");
997
/* important: NumArray have indices like (y, x) !! */
998
if (!(pyArr = NA_NewArray(NULL, arrType, 2, p.lines, pixels_per_line)))
1000
PyErr_SetString(ErrorObject, "failed to create NumArray object");
1004
arr_bytes_per_line = pixels_per_line * bpp;
1005
st=SANE_STATUS_GOOD;
1008
fp = fopen("sane_p5.pgm", "w");
1009
fprintf(fp, "P5\n%d %d\n%d\n", p.pixels_per_line,
1010
p.lines, (int) pow(2.0, (double) p.depth)-1);
1012
line_index = line = 0;
1013
remain_bytes_line = arr_bytes_per_line;
1014
total_remain = p.bytes_per_line * p.lines;
1015
num_pad_bytes = p.bytes_per_line - arr_bytes_per_line;
1017
while (st!=SANE_STATUS_EOF)
1019
Py_BEGIN_ALLOW_THREADS
1020
st = sane_read(self->h, buffer,
1021
READSIZE < total_remain ? READSIZE : total_remain, &len);
1022
Py_END_ALLOW_THREADS
1024
printf("p5_write: read %d of %d\n", len, READSIZE);
1025
fwrite(buffer, 1, len, fp);
1029
total_remain -= len;
1033
/* copy at most the number of bytes that fit into (the rest of)
1035
cp_num_bytes = (len > remain_bytes_line ? remain_bytes_line : len);
1036
remain_bytes_line -= cp_num_bytes;
1037
len -= cp_num_bytes;
1039
printf("copying %d bytes from b_idx %d to d_idx %d\n",
1040
cp_num_bytes, buffer_index,
1041
line * arr_bytes_per_line + line_index);
1042
printf("len is now %d\n", len);
1044
memcpy(pyArr->data + line * arr_bytes_per_line + line_index,
1045
buffer + buffer_index, cp_num_bytes);
1047
buffer_index += cp_num_bytes;
1048
if (remain_bytes_line ==0)
1050
/* The line has been completed, so reinitialize remain_bytes_line
1051
increase the line counter, and reset line_index */
1053
printf("line %d full, skipping %d bytes\n",line,num_pad_bytes);
1055
remain_bytes_line = arr_bytes_per_line;
1058
/* Skip the number of bytes in the input stream which
1060
len -= num_pad_bytes;
1061
buffer_index += num_pad_bytes;
1064
line_index += cp_num_bytes;
1069
printf("p5_write finished\n");
1071
sane_cancel(self->h);
1072
return (PyObject*) pyArr;
1077
#endif /* WITH_NUMARRAY */
1079
static PyMethodDef SaneDev_methods[] = {
1080
{"get_parameters", (PyCFunction)SaneDev_get_parameters, 1},
1082
{"get_options", (PyCFunction)SaneDev_get_options, 1},
1083
{"get_option", (PyCFunction)SaneDev_get_option, 1},
1084
{"set_option", (PyCFunction)SaneDev_set_option, 1},
1085
{"set_auto_option", (PyCFunction)SaneDev_set_auto_option, 1},
1087
{"start", (PyCFunction)SaneDev_start, 1},
1088
{"cancel", (PyCFunction)SaneDev_cancel, 1},
1089
{"snap", (PyCFunction)SaneDev_snap, 1},
1090
#ifdef WITH_NUMARRAY
1091
{"arr_snap", (PyCFunction)SaneDev_arr_snap, 1},
1092
#endif /* WITH_NUMARRAY */
1093
{"fileno", (PyCFunction)SaneDev_fileno, 1},
1094
{"close", (PyCFunction)SaneDev_close, 1},
1095
{NULL, NULL} /* sentinel */
1099
SaneDev_getattr(SaneDevObject *self, char *name)
1101
return Py_FindMethod(SaneDev_methods, (PyObject *)self, name);
1104
staticforward PyTypeObject SaneDev_Type = {
1105
PyObject_HEAD_INIT(&PyType_Type)
1107
"SaneDev", /*tp_name*/
1108
sizeof(SaneDevObject), /*tp_basicsize*/
1111
(destructor)SaneDev_dealloc, /*tp_dealloc*/
1113
(getattrfunc)SaneDev_getattr, /*tp_getattr*/
1118
0, /*tp_as_sequence*/
1119
0, /*tp_as_mapping*/
1123
/* --------------------------------------------------------------------- */
1126
PySane_init(PyObject *self, PyObject *args)
1131
if (!PyArg_ParseTuple(args, ""))
1134
/* XXX Authorization is not yet supported */
1135
st=sane_init(&version, NULL);
1136
if (st) return PySane_Error(st);
1137
return Py_BuildValue("iiii", version, SANE_VERSION_MAJOR(version),
1138
SANE_VERSION_MINOR(version), SANE_VERSION_BUILD(version));
1142
PySane_exit(PyObject *self, PyObject *args)
1144
if (!PyArg_ParseTuple(args, ""))
1153
PySane_get_devices(PyObject *self, PyObject *args)
1155
SANE_Device **devlist;
1161
if (!PyArg_ParseTuple(args, "|i", &local_only))
1166
st=sane_get_devices(&devlist, local_only);
1167
if (st) return PySane_Error(st);
1168
if (!(list = PyList_New(0)))
1170
for(i=0; devlist[i]!=NULL; i++)
1173
PyList_Append(list, Py_BuildValue("ssss", dev->name, dev->vendor,
1174
dev->model, dev->type));
1180
/* Function returning new SaneDev object */
1183
PySane_open(PyObject *self, PyObject *args)
1189
if (!PyArg_ParseTuple(args, "s", &name))
1191
rv = newSaneDevObject();
1194
st = sane_open(name, &(rv->h));
1198
return PySane_Error(st);
1200
return (PyObject *)rv;
1204
PySane_OPTION_IS_ACTIVE(PyObject *self, PyObject *args)
1209
if (!PyArg_ParseTuple(args, "l", &lg))
1212
return PyInt_FromLong( SANE_OPTION_IS_ACTIVE(cap));
1216
PySane_OPTION_IS_SETTABLE(PyObject *self, PyObject *args)
1221
if (!PyArg_ParseTuple(args, "l", &lg))
1224
return PyInt_FromLong( SANE_OPTION_IS_SETTABLE(cap));
1228
/* List of functions defined in the module */
1230
static PyMethodDef PySane_methods[] = {
1231
{"init", PySane_init, 1},
1232
{"exit", PySane_exit, 1},
1233
{"get_devices", PySane_get_devices, 1},
1234
{"_open", PySane_open, 1},
1235
{"OPTION_IS_ACTIVE", PySane_OPTION_IS_ACTIVE, 1},
1236
{"OPTION_IS_SETTABLE", PySane_OPTION_IS_SETTABLE, 1},
1237
{NULL, NULL} /* sentinel */
1242
insint(PyObject *d, char *name, int value)
1244
PyObject *v = PyInt_FromLong((long) value);
1245
if (!v || PyDict_SetItemString(d, name, v))
1246
Py_FatalError("can't initialize sane module");
1256
/* Create the module and add the functions */
1257
m = Py_InitModule("_sane", PySane_methods);
1259
/* Add some symbolic constants to the module */
1260
d = PyModule_GetDict(m);
1261
ErrorObject = PyString_FromString("_sane.error");
1262
PyDict_SetItemString(d, "error", ErrorObject);
1264
insint(d, "INFO_INEXACT", SANE_INFO_INEXACT);
1265
insint(d, "INFO_RELOAD_OPTIONS", SANE_INFO_RELOAD_OPTIONS);
1266
insint(d, "RELOAD_PARAMS", SANE_INFO_RELOAD_PARAMS);
1268
insint(d, "FRAME_GRAY", SANE_FRAME_GRAY);
1269
insint(d, "FRAME_RGB", SANE_FRAME_RGB);
1270
insint(d, "FRAME_RED", SANE_FRAME_RED);
1271
insint(d, "FRAME_GREEN", SANE_FRAME_GREEN);
1272
insint(d, "FRAME_BLUE", SANE_FRAME_BLUE);
1274
insint(d, "CONSTRAINT_NONE", SANE_CONSTRAINT_NONE);
1275
insint(d, "CONSTRAINT_RANGE", SANE_CONSTRAINT_RANGE);
1276
insint(d, "CONSTRAINT_WORD_LIST", SANE_CONSTRAINT_WORD_LIST);
1277
insint(d, "CONSTRAINT_STRING_LIST", SANE_CONSTRAINT_STRING_LIST);
1279
insint(d, "TYPE_BOOL", SANE_TYPE_BOOL);
1280
insint(d, "TYPE_INT", SANE_TYPE_INT);
1281
insint(d, "TYPE_FIXED", SANE_TYPE_FIXED);
1282
insint(d, "TYPE_STRING", SANE_TYPE_STRING);
1283
insint(d, "TYPE_BUTTON", SANE_TYPE_BUTTON);
1284
insint(d, "TYPE_GROUP", SANE_TYPE_GROUP);
1286
insint(d, "UNIT_NONE", SANE_UNIT_NONE);
1287
insint(d, "UNIT_PIXEL", SANE_UNIT_PIXEL);
1288
insint(d, "UNIT_BIT", SANE_UNIT_BIT);
1289
insint(d, "UNIT_MM", SANE_UNIT_MM);
1290
insint(d, "UNIT_DPI", SANE_UNIT_DPI);
1291
insint(d, "UNIT_PERCENT", SANE_UNIT_PERCENT);
1292
insint(d, "UNIT_MICROSECOND", SANE_UNIT_MICROSECOND);
1294
insint(d, "CAP_SOFT_SELECT", SANE_CAP_SOFT_SELECT);
1295
insint(d, "CAP_HARD_SELECT", SANE_CAP_HARD_SELECT);
1296
insint(d, "CAP_SOFT_DETECT", SANE_CAP_SOFT_DETECT);
1297
insint(d, "CAP_EMULATED", SANE_CAP_EMULATED);
1298
insint(d, "CAP_AUTOMATIC", SANE_CAP_AUTOMATIC);
1299
insint(d, "CAP_INACTIVE", SANE_CAP_INACTIVE);
1300
insint(d, "CAP_ADVANCED", SANE_CAP_ADVANCED);
1302
/* handy for checking array lengths: */
1303
insint(d, "SANE_WORD_SIZE", sizeof(SANE_Word));
1305
/* possible return values of set_option() */
1306
insint(d, "INFO_INEXACT", SANE_INFO_INEXACT);
1307
insint(d, "INFO_RELOAD_OPTIONS", SANE_INFO_RELOAD_OPTIONS);
1308
insint(d, "INFO_RELOAD_PARAMS", SANE_INFO_RELOAD_PARAMS);
1310
/* Check for errors */
1311
if (PyErr_Occurred())
1312
Py_FatalError("can't initialize module _sane");
1314
#ifdef WITH_NUMARRAY
1315
import_libnumarray();
1316
if (PyErr_Occurred())
1319
/* this global variable is declared just in front of the
1320
arr_snap() function and should be set to 1 after
1321
successfully importing the numarray module. */
1322
NUMARRAY_IMPORTED = 1;
1324
#endif /* WITH_NUMARRAY */