* backend/fujitsu.c, backend/fujitsu.h: renamed some variables

* backend/fujitsu.c: gray duplex scanning now works with the 4097D
	  when disconnect is enabled in the scsi-controller
	* doc/descriptions/unsupported.desc: remove fujitsu fi4120C
	* doc/descriptions/fujitsu.desc added fi4120C, ScanParter 93GX
merge-requests/1/head
Oliver Schirrmeister 2003-03-05 12:56:44 +00:00
rodzic a4b5a465fd
commit f9d7350534
5 zmienionych plików z 494 dodań i 451 usunięć

Wyświetl plik

@ -1,3 +1,10 @@
2003-03-05 Oliver Schirrmeister <oschirr@abm.de>
* backend/fujitsu.c, backend/fujitsu.h: renamed some variables
* backend/fujitsu.c: gray duplex scanning now works with the 4097D
when disconnect is enabled in the scsi-controller
* doc/descriptions/unsupported.desc: remove fujitsu fi4120C
* doc/descriptions/fujitsu.desc added fi4120C, ScanParter 93GX
2003-03-04 Henning Meier-Geinitz <henning@meier-geinitz.de>
* include/sane/sanei.h sanei/sanei_constrain_value.c: Added function
@ -158,15 +165,14 @@
HP scanners.
2003-02-20 Oliver Schirrmeister <oschirr@abm.de>
* make option RIF available for 3091 and 3092, bugfix
* set availability of options THRESHOLD und VARIANCE
* backend/fujitsu.c: make option RIF available for 3091 and 3092, bugfix
* backend/fujitsu.c: set availability of options THRESHOLD und VARIANCE
2003-02-20 Oliver Schirrmeister <oschirr@abm.de>
* patch from <ron@roncemer.com>:
* backend/fujitsu.c, backend/fujitsu.h: patch from <ron@roncemer.com>:
fi4220 support
USB support for scanners which send SCSI commands over usb
2003-02-19 Henning Meier-Geinitz <henning@meier-geinitz.de>
* doc/descriptions-external/ma1509.desc: Added description of the

Wyświetl plik

@ -71,7 +71,7 @@
V 1.3, 08-Aug-2002, OS (oschirr@abm.de)
- bugfix. Imprinter didn't print the first time after
switching on the scanner
- bugfix. readerGenericPassthrough ignored the number of bytes
- bugfix. reader_generic_passthrough ignored the number of bytes
returned by the scanner.
V 1.4, 13-Sep-2002
- 3092 support (mgoppold@tbz-pariv.de)
@ -85,6 +85,10 @@
- set availability of options THRESHOLD und VARIANCE
correctly
- option RIF is available for 3091 und 3092
V 1.6, 04-Mar-2003 (oschirr@abm.de)
- renamed some variables
- bugfix: duplex scanning now works when disconnect is enabled
in the scsi controller.
SANE FLOW DIAGRAM
@ -1949,7 +1953,7 @@ sane_start (SANE_Handle handle)
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
DBG (10, "sane_start opening SCSI device\n");
if (sanei_scsi_open (scanner->sane.name, &(scanner->sfd),
scsiSenseHandler, 0) != SANE_STATUS_GOOD) {
scsi_sense_handler, 0) != SANE_STATUS_GOOD) {
DBG (MSG_ERR,
"sane_start: open of %s failed:\n", scanner->sane.name);
return SANE_STATUS_INVAL;
@ -1959,7 +1963,7 @@ sane_start (SANE_Handle handle)
scanner->object_count = 1;
scanner->eof = SANE_FALSE;
if ((ret = grabScanner (scanner)))
if ((ret = grab_scanner (scanner)))
{
DBG (5, "sane_start: unable to reserve scanner\n");
if (scanner->connection == SANE_FUJITSU_USB) {
@ -1985,7 +1989,7 @@ sane_start (SANE_Handle handle)
if ((ret = fujitsu_send(scanner)))
{
DBG (5, "sane_start: ERROR: failed to start send command\n");
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -1999,7 +2003,7 @@ sane_start (SANE_Handle handle)
if ((ret = imprinter(scanner)))
{
DBG (5, "sane_start: ERROR: failed to start imprinter command\n");
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2015,7 +2019,7 @@ sane_start (SANE_Handle handle)
(ret = object_position (scanner, SANE_TRUE)))
{
DBG (5, "sane_start: WARNING: ADF empty\n");
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2032,7 +2036,7 @@ sane_start (SANE_Handle handle)
if ((ret = setWindowParam (scanner)))
{
DBG (5, "sane_start: ERROR: failed to set window\n");
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2052,14 +2056,19 @@ sane_start (SANE_Handle handle)
DBG (10, "\tthreshold (line art) = %d\n", scanner->threshold);
startScan (scanner);
ret = start_scan (scanner);
if (ret != SANE_STATUS_GOOD)
{
DBG (MSG_ERR, "start_scan failed");
return ret;
}
/* create a pipe, fds[0]=read-fd, fds[1]=write-fd */
if (pipe (defaultFds) < 0)
{
DBG (MSG_ERR, "ERROR: could not create pipe\n");
scanner->object_count = 0;
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2078,7 +2087,7 @@ sane_start (SANE_Handle handle)
{
DBG (MSG_ERR, "ERROR: could not create temporary file.\n");
scanner->object_count = 0;
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2094,7 +2103,7 @@ sane_start (SANE_Handle handle)
{
DBG (MSG_ERR, "ERROR: could not create duplex pipe.\n");
scanner->object_count = 0;
freeScanner (scanner);
free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2427,7 +2436,7 @@ attachScanner (const char *devicename, struct fujitsu **devp)
}
} else if (mostRecentConfigConnectionType == SANE_FUJITSU_SCSI) {
DBG (15, "attachScanner opening SCSI device\n");
if (sanei_scsi_open (devicename, &sfd, scsiSenseHandler, 0) != 0) {
if (sanei_scsi_open (devicename, &sfd, scsi_sense_handler, 0) != 0) {
DBG (5, "attach_scanner: open failed\n");
return SANE_STATUS_INVAL;
}
@ -2448,7 +2457,7 @@ attachScanner (const char *devicename, struct fujitsu **devp)
/*
* Now query the device and find out what it is, exactly.
*/
if (identifyScanner (dev) != 0)
if (identify_scanner (dev) != 0)
{
DBG (5, "attach_scanner: scanner identification failed\n");
if (dev->connection == SANE_FUJITSU_USB) {
@ -2504,7 +2513,7 @@ attachOne (const char *name)
* Responsible for producing a meaningful debug message.
*/
static SANE_Status
scsiSenseHandler (int scsi_fd, u_char * sensed_data, void *arg)
scsi_sense_handler (int scsi_fd, u_char * sensed_data, void *arg)
{
unsigned int ret = SANE_STATUS_IO_ERROR;
unsigned int sense = get_RS_sense_key (sensed_data);
@ -2728,7 +2737,7 @@ scsiSenseHandler (int scsi_fd, u_char * sensed_data, void *arg)
* struct buffer.
*/
static void
doInquiry (struct fujitsu *s)
do_inquiry (struct fujitsu *s)
{
DBG (10, "do_inquiry\n");
@ -2764,7 +2773,7 @@ get_hardware_status (struct fujitsu *s)
}
} else if (s->connection == SANE_FUJITSU_SCSI) {
DBG (10, "get_hardware_status opening SCSI device\n");
if (sanei_scsi_open (s->devicename, &sfd, scsiSenseHandler, 0)!=0) {
if (sanei_scsi_open (s->devicename, &sfd, scsi_sense_handler, 0)!=0) {
DBG (5, "get_hardware_status: open failed\n");
return SANE_STATUS_INVAL;
}
@ -3177,10 +3186,10 @@ makeTempFile ()
* GOOD
*/
static int
freeScanner (struct fujitsu *s)
free_scanner (struct fujitsu *s)
{
int ret;
DBG (10, "freeScanner\n");
DBG (10, "free_scanner\n");
#if 0
ret = object_position (s, SANE_FALSE);
@ -3196,13 +3205,13 @@ freeScanner (struct fujitsu *s)
if (ret)
return ret;
DBG (10, "freeScanner: ok\n");
DBG (10, "free_scanner: ok\n");
return ret;
}
/**
* Reserves the scanner on the SCSI bus for our exclusive access until released
* by freeScanner.
* by free_scanner.
*
* Should go through the following command sequence:
* TEST UNIT READY
@ -3215,11 +3224,11 @@ freeScanner (struct fujitsu *s)
* GOOD
*/
static int
grabScanner (struct fujitsu *s)
grab_scanner (struct fujitsu *s)
{
int ret;
DBG (10, "grabScanner\n");
DBG (10, "grab_scanner\n");
wait_scanner (s);
hexdump (MSG_IO, "reserve_unit", reserve_unitB.cmd, reserve_unitB.size);
@ -3228,7 +3237,7 @@ grabScanner (struct fujitsu *s)
if (ret)
return ret;
DBG (10, "grabScanner: ok\n");
DBG (10, "grab_scanner: ok\n");
return 0;
}
@ -3404,7 +3413,7 @@ doCancel (struct fujitsu *scanner)
if (scanner->sfd >= 0)
{
freeScanner (scanner);
free_scanner (scanner);
DBG (10, "doCancel: close filedescriptor\n");
if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd);
@ -3445,14 +3454,14 @@ maxStringSize (const SANE_String_Const strings[])
* to start scanning.)
*/
static int
startScan (struct fujitsu *s)
start_scan (struct fujitsu *s)
{
int ret;
unsigned char *command;
int cmdsize;
DBG (10, "startScan\n");
DBG (10, "start_scan\n");
command = malloc (scanB.size + 2);
memcpy (command, scanB.cmd, scanB.size);
@ -3485,8 +3494,16 @@ startScan (struct fujitsu *s)
free (command);
if (ret)
{
/* possible reasons:
* - duplex reading without object_position
* - invalid field in parameter list
*/
return ret;
DBG (10, "startScan:ok\n");
}
DBG (10, "start_scan:ok\n");
return ret;
}
@ -3618,16 +3635,16 @@ sigtermHandler (int signal)
* through (i.e. stuffs it into the pipe).
*/
static unsigned int
readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
reader_generic_passthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
{
int status;
unsigned int totalDataSize, dataLeft, dataToRead;
unsigned int total_data_size, dataLeft, data_to_read;
unsigned char *largeBuffer;
unsigned int largeBufferSize = 0;
unsigned int i_data_read;
dataLeft = scanner->bytes_per_scan_line * scanner->scan_height_pixels;
totalDataSize = dataLeft;
total_data_size = dataLeft;
largeBuffer = scanner->buffer;
largeBufferSize =
@ -3636,9 +3653,9 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
do
{
dataToRead = (dataLeft < largeBufferSize) ? dataLeft : largeBufferSize;
data_to_read = (dataLeft < largeBufferSize) ? dataLeft : largeBufferSize;
status = read_large_data_block (scanner, largeBuffer, dataToRead,
status = read_large_data_block (scanner, largeBuffer, data_to_read,
i_window_id, &i_data_read);
switch (status)
@ -3648,8 +3665,8 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
case SANE_STATUS_EOF:
DBG (10, "reader_process: EOM (no more data) length = %d\n",
i_data_read);
dataToRead -= i_data_read;
dataLeft = dataToRead;
data_to_read -= i_data_read;
dataLeft = data_to_read;
break;
default:
DBG (MSG_ERR,
@ -3661,14 +3678,14 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
fwrite (largeBuffer, 1, i_data_read, fp);
fflush (fp);
dataLeft -= dataToRead;
dataLeft -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, dataLeft);
data_to_read, dataLeft);
}
while (dataLeft);
fclose (fp);
return totalDataSize;
return total_data_size;
}
@ -3692,7 +3709,7 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
unsigned int *i_data_read)
{
unsigned int data_left = length;
unsigned int dataToRead;
unsigned int data_to_read;
int status;
unsigned char *myBuffer = buffer;
size_t data_read;
@ -3702,15 +3719,15 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
DBG (FLOW_CONTROL, "read_large_data_block requested %u bytes\n", length);
do
{
dataToRead =
data_to_read =
(data_left <= s->scsi_buf_size) ? data_left : s->scsi_buf_size;
set_R_datatype_code (readB.cmd, R_datatype_imagedata);
set_R_window_id (readB.cmd, i_window_id);
set_R_xfer_length (readB.cmd, dataToRead);
set_R_xfer_length (readB.cmd, data_to_read);
status = do_cmd (s->connection, s->sfd, readB.cmd, readB.size,
myBuffer, dataToRead, &data_read);
myBuffer, data_to_read, &data_read);
if (status == SANE_STATUS_EOF)
{
@ -3718,6 +3735,14 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
data_read = s->i_transfer_length;
data_left = 0;
}
else if (status == SANE_STATUS_DEVICE_BUSY)
{
/* temporary lack of data?
* try again.
*/
data_read = 0;
usleep(100000L);
}
else if (status != SANE_STATUS_GOOD)
{
/* denotes error */
@ -3762,7 +3787,7 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
* scanner.
*/
static int
identifyScanner (struct fujitsu *s)
identify_scanner (struct fujitsu *s)
{
char vendor[9];
char product[17];
@ -3773,7 +3798,7 @@ identifyScanner (struct fujitsu *s)
vendor[8] = product[0x10] = version[4] = 0;
doInquiry (s); /* get inquiry */
do_inquiry (s); /* get inquiry */
if (get_IN_periph_devtype (s->buffer) != IN_periph_devtype_scanner)
{
DBG (5, "The device at \"%s\" is not a scanner.\n", s->devicename);
@ -3897,7 +3922,7 @@ identifyScanner (struct fujitsu *s)
/* no info about the 3093DG, seems to have trouble when trying to
* alternate read in linear mode.
*/
s->can_read_alternate = 0;
s->can_read_alternate = SANE_FALSE;
s->ipc_present = (strchr (s->productName, 'i')) ? 1 : 0;
s->cmp_present = (strchr (s->productName, 'm')) ? 1 : 0;
@ -3922,7 +3947,7 @@ identifyScanner (struct fujitsu *s)
if (!strncmp (product, "M4097D", 6))
{
s->can_read_alternate = 1;
s->can_read_alternate = SANE_TRUE;
}
for (i = 0; i <= res_list3[0]; i++)
@ -3963,7 +3988,7 @@ identifyScanner (struct fujitsu *s)
else if (s->model == MODEL_FI)
{
s->can_read_alternate = 1;
s->can_read_alternate = SANE_TRUE;
s->ipc_present = (strchr ((s->productName)+3, 'i')) ? 1 : 0;
if (!strncmp (product, "fi-4340C", 8))
{
@ -4396,7 +4421,7 @@ imprinter(struct fujitsu *s)
} else if (s->connection == SANE_FUJITSU_SCSI) {
DBG (10, "imprinter opening SCSI device\n");
if (sanei_scsi_open
(s->devicename, &sfd, scsiSenseHandler, 0) != 0) {
(s->devicename, &sfd, scsi_sense_handler, 0) != 0) {
DBG (5, "imprinter: open failed\n");
return SANE_STATUS_INVAL;
}
@ -4818,10 +4843,10 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
FILE *fp1, *fp2;
sigset_t sigterm_set;
struct SIGACTION act;
time_t startTime, endTime;
unsigned int totalDataSize = 0;
time_t start_time, end_time;
unsigned int total_data_size = 0;
(void) time (&startTime);
(void) time (&start_time);
DBG (10, "reader_process started\n");
@ -4873,24 +4898,24 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
case MODEL_3091:
if ((scanner->color_mode == MODE_COLOR)
&& (scanner->duplex_mode == DUPLEX_BOTH))
totalDataSize = reader3091ColorDuplex (scanner, fp1, fp2);
total_data_size = reader3091ColorDuplex (scanner, fp1, fp2);
else if (scanner->color_mode == MODE_COLOR)
totalDataSize = reader3091ColorSimplex (scanner, fp1);
total_data_size = reader3091ColorSimplex (scanner, fp1);
else if (scanner->duplex_mode == DUPLEX_BOTH)
totalDataSize = reader3091GrayDuplex (scanner, fp1, fp2);
total_data_size = reader3091GrayDuplex (scanner, fp1, fp2);
else
totalDataSize = readerGenericPassthrough (scanner, fp1, 0);
total_data_size = reader_generic_passthrough (scanner, fp1, 0);
break;
case MODEL_3092:
if ((scanner->color_mode == MODE_COLOR)
&& (scanner->duplex_mode == DUPLEX_BOTH))
totalDataSize = reader3092ColorDuplex (scanner, fp1, fp2);
total_data_size = reader3092ColorDuplex (scanner, fp1, fp2);
else if (scanner->color_mode == MODE_COLOR)
totalDataSize = reader3092ColorSimplex (scanner, fp1);
total_data_size = reader3092ColorSimplex (scanner, fp1);
else if (scanner->duplex_mode == DUPLEX_BOTH)
totalDataSize = reader3092GrayDuplex (scanner, fp1, fp2);
total_data_size = reader3092GrayDuplex (scanner, fp1, fp2);
else
totalDataSize = readerGenericPassthrough (scanner, fp1, 0);
total_data_size = reader_generic_passthrough (scanner, fp1, 0);
break;
case MODEL_FORCE:
@ -4904,19 +4929,19 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
if (scanner->can_read_alternate)
{
totalDataSize =
total_data_size =
reader_gray_duplex_alternate (scanner, fp1, fp2);
}
else
{
totalDataSize =
total_data_size =
reader_gray_duplex_sequential (scanner, fp1, fp2);
}
}
else
{
totalDataSize = readerGenericPassthrough (scanner, fp1, 0);
total_data_size = reader_generic_passthrough (scanner, fp1, 0);
}
break;
@ -4924,12 +4949,12 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
DBG (5, "reader_process: no implementation for this scanner model\n");
}
(void) time (&endTime);
if (endTime == startTime)
endTime++;
(void) time (&end_time);
if (end_time == start_time)
end_time++;
DBG (10, "reader_process: finished, throughput was %lu bytes/second\n",
(u_long) totalDataSize / (endTime - startTime));
(u_long) total_data_size / (end_time - start_time));
return 0;
@ -5741,7 +5766,7 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
{
int status;
unsigned int data_left;
unsigned int totalDataSize, dataToRead, dataToProcess;
unsigned int total_data_size, data_to_read, dataToProcess;
unsigned int green_offset, blue_offset, lookAheadSize;
unsigned readOffset;
unsigned char *linebuffer = 0;
@ -5793,18 +5818,18 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
readOffset = 0;
data_left += lookAheadSize;
totalDataSize = data_left;
total_data_size = data_left;
do
{
dataToRead = (data_left < largeBufferSize - readOffset)
data_to_read = (data_left < largeBufferSize - readOffset)
? data_left : largeBufferSize - readOffset;
dataToProcess = dataToRead + readOffset - lookAheadSize;
/* if (dataToRead == data_left) dataToProcess += lookAheadSize / 2; */
dataToProcess = data_to_read + readOffset - lookAheadSize;
/* if (data_to_read == data_left) dataToProcess += lookAheadSize / 2; */
status =
read_large_data_block (scanner, largeBuffer + readOffset, dataToRead,
read_large_data_block (scanner, largeBuffer + readOffset, data_to_read,
0, &i_data_read);
switch (status)
@ -5814,8 +5839,8 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length;
data_left = dataToRead;
data_to_read -= scanner->i_transfer_length;
data_left = data_to_read;
break;
default:
DBG (MSG_ERR,
@ -5894,9 +5919,9 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
}
fflush (fp);
data_left -= dataToRead;
data_left -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, data_left);
data_to_read, data_left);
memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize);
readOffset = lookAheadSize;
}
@ -5906,7 +5931,7 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
free (largeBuffer);
fclose (fp);
return totalDataSize;
return total_data_size;
}
@ -5915,7 +5940,7 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
{
int status;
unsigned int data_left;
unsigned int totalDataSize, dataToRead, dataToProcess;
unsigned int total_data_size, data_to_read, dataToProcess;
unsigned int green_offset, blue_offset, lookAheadSize;
unsigned readOffset;
unsigned int duplexStartLine, duplexEndLine;
@ -6034,19 +6059,19 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
readOffset = 0;
data_left += lookAheadSize;
totalDataSize = data_left;
total_data_size = data_left;
do
{
dataToRead = (data_left < largeBufferSize - readOffset)
data_to_read = (data_left < largeBufferSize - readOffset)
? data_left : largeBufferSize - readOffset;
dataToProcess = dataToRead + readOffset - lookAheadSize;
if (dataToRead == data_left)
dataToProcess = data_to_read + readOffset - lookAheadSize;
if (data_to_read == data_left)
dataToProcess += lookAheadSize / 2;
status =
read_large_data_block (scanner, largeBuffer + readOffset, dataToRead,
read_large_data_block (scanner, largeBuffer + readOffset, data_to_read,
0, &i_data_read);
switch (status)
{
@ -6055,8 +6080,8 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length;
data_left = dataToRead;
data_to_read -= scanner->i_transfer_length;
data_left = data_to_read;
break;
default:
DBG (MSG_ERR,
@ -6214,9 +6239,9 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
fflush (fp_front);
data_left -= dataToRead;
data_left -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, data_left);
data_to_read, data_left);
/* FIXME: simon lai reported an overflow here! */
memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize);
readOffset = lookAheadSize;
@ -6251,7 +6276,7 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
free (duplexBuffer);
}
return totalDataSize;
return total_data_size;
}
@ -6263,13 +6288,18 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
int status;
unsigned int i_left_front, i_left_back;
unsigned int totalDataSize, dataToRead;
unsigned int total_data_size, data_to_read;
unsigned int duplexBufferSize;
unsigned char *duplexBuffer;
unsigned char *duplexPointer;
unsigned int largeBufferSize = 0;
unsigned int i_data_read;
/*
time_t start_time, end_time;
(void) time (&start_time);
*/
i_left_front = scanner->bytes_per_scan_line * scanner->scan_height_pixels;
i_left_back = i_left_front;
@ -6301,15 +6331,15 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
scanner->scsi_buf_size -
(scanner->scsi_buf_size % scanner->bytes_per_scan_line);
totalDataSize = 0;
total_data_size = 0;
do
{
dataToRead = (i_left_front < largeBufferSize)
data_to_read = (i_left_front < largeBufferSize)
? i_left_front : largeBufferSize;
DBG (5, "reader_process: read %d bytes from front side\n", dataToRead);
status = read_large_data_block (scanner, scanner->buffer, dataToRead,
DBG (5, "reader_process: read %d bytes from front side\n", data_to_read);
status = read_large_data_block (scanner, scanner->buffer, data_to_read,
0x0, &i_data_read);
switch (status)
@ -6319,12 +6349,12 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length;
i_left_front = dataToRead;
data_to_read -= scanner->i_transfer_length;
i_left_front = data_to_read;
break;
case SANE_STATUS_DEVICE_BUSY:
DBG (5, "device busy");
dataToRead = 0;
data_to_read = 0;
break;
default:
DBG (MSG_ERR,
@ -6334,22 +6364,22 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
return (0);
}
totalDataSize += dataToRead;
fwrite (scanner->buffer, 1, dataToRead, fp_front);
i_left_front -= dataToRead;
total_data_size += data_to_read;
fwrite (scanner->buffer, 1, data_to_read, fp_front);
i_left_front -= data_to_read;
DBG (5,
"reader_process_front: buffer of %d bytes read; %d bytes to go\n",
dataToRead, i_left_front);
data_to_read, i_left_front);
/*
* read back side
*/
dataToRead = (i_left_back < largeBufferSize)
data_to_read = (i_left_back < largeBufferSize)
? i_left_back : largeBufferSize;
DBG (5, "reader_process: read %d bytes from back side\n", dataToRead);
status = read_large_data_block (scanner, scanner->buffer, dataToRead,
DBG (5, "reader_process: read %d bytes from back side\n", data_to_read);
status = read_large_data_block (scanner, scanner->buffer, data_to_read,
0x80, &i_data_read);
switch (status)
@ -6359,12 +6389,12 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length;
i_left_back = dataToRead;
data_to_read -= scanner->i_transfer_length;
i_left_back = data_to_read;
break;
case SANE_STATUS_DEVICE_BUSY:
DBG (5, "device busy");
dataToRead = 0;
data_to_read = 0;
break;
default:
DBG (MSG_ERR,
@ -6374,11 +6404,11 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
return (0);
}
totalDataSize += dataToRead;
total_data_size += data_to_read;
if (scanner->use_temp_file)
{
if ((unsigned int) fwrite (scanner->buffer, 1, dataToRead, fp_back)
!= dataToRead)
if ((unsigned int) fwrite (scanner->buffer, 1, data_to_read, fp_back)
!= data_to_read)
{
fclose (fp_back);
DBG (MSG_ERR,
@ -6388,20 +6418,28 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
}
else
{
memcpy (duplexPointer, scanner->buffer, dataToRead);
duplexPointer += dataToRead;
memcpy (duplexPointer, scanner->buffer, data_to_read);
duplexPointer += data_to_read;
}
i_left_back -= dataToRead;
i_left_back -= data_to_read;
DBG (5,
"reader_process_back: buffer of %d bytes read; %d bytes to go\n",
dataToRead, i_left_back);
data_to_read, i_left_back);
}
while (i_left_front > 0 || i_left_back > 0);
fflush (fp_front);
fclose (fp_front);
/*
(void) time (&end_time);
if (end_time == start_time)
end_time++;
DBG (1, "time to read from scanner: %lu seconds\n", (end_time - start_time));
*/
if (scanner->use_temp_file)
{
fflush (fp_back);
@ -6414,7 +6452,7 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
free (duplexBuffer);
}
return totalDataSize;
return total_data_size;
}
static unsigned int
@ -6425,8 +6463,8 @@ reader_gray_duplex_sequential (struct fujitsu *scanner,
i_total_size = 0;
i_total_size += readerGenericPassthrough (scanner, fp_front, 0);
i_total_size += readerGenericPassthrough (scanner, fp_back, 0x80);
i_total_size += reader_generic_passthrough (scanner, fp_front, 0);
i_total_size += reader_generic_passthrough (scanner, fp_back, 0x80);
return i_total_size;
}
@ -6437,7 +6475,7 @@ static unsigned int
reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
{
int status;
unsigned int totalDataSize, data_left, dataToRead;
unsigned int total_data_size, data_left, data_to_read;
unsigned int duplexStartLine, duplexEndLine;
unsigned int duplexBufferSize;
unsigned char *duplexBuffer;
@ -6480,13 +6518,13 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
scanner->scan_height_pixels * 2 -
scanner->duplex_raster_offset * scanner->resolution_y / 300;
totalDataSize = data_left;
total_data_size = data_left;
do
{
dataToRead = (data_left < largeBufferSize) ? data_left : largeBufferSize;
data_to_read = (data_left < largeBufferSize) ? data_left : largeBufferSize;
status = read_large_data_block (scanner, largeBuffer, dataToRead,
status = read_large_data_block (scanner, largeBuffer, data_to_read,
0, &i_data_read);
switch (status)
@ -6496,8 +6534,8 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length;
data_left = dataToRead;
data_to_read -= scanner->i_transfer_length;
data_left = data_to_read;
break;
default:
DBG (MSG_ERR,
@ -6507,7 +6545,7 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
return (0);
}
for (source = scanner->buffer; source < scanner->buffer + dataToRead;
for (source = scanner->buffer; source < scanner->buffer + data_to_read;
source += scanner->bytes_per_scan_line)
{
if ((lineCount < duplexStartLine) ||
@ -6541,9 +6579,9 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
}
fflush (fp_front);
data_left -= dataToRead;
data_left -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, data_left);
data_to_read, data_left);
}
while (data_left);
fclose (fp_front);
@ -6560,7 +6598,7 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
free (duplexBuffer);
}
return totalDataSize;
return total_data_size;
}
/**

Wyświetl plik

@ -471,16 +471,14 @@ void sane_exit (void);
/* ------------------------------------------------------------------------- */
static void doInquiry (struct fujitsu *s);
static void do_inquiry (struct fujitsu *s);
static SANE_Status attachScanner (const char *devicename,
struct fujitsu **devp);
static SANE_Status scsiSenseHandler (int scsi_fd, u_char * result, void *arg);
static SANE_Status scsi_sense_handler (int scsi_fd, u_char * result, void *arg);
static int identifyScanner (struct fujitsu *s);
static void doInquiry (struct fujitsu *s);
static int identify_scanner (struct fujitsu *s);
static int
do_cmd (Fujitsu_Connection_Type connection, int fd, unsigned char *cmd,
@ -500,9 +498,9 @@ static void hexdump (int level, char *comment, unsigned char *p, int l);
static SANE_Status init_options (struct fujitsu *scanner);
static int grabScanner (struct fujitsu *s);
static int grab_scanner (struct fujitsu *s);
static int freeScanner (struct fujitsu *s);
static int free_scanner (struct fujitsu *s);
static int wait_scanner (struct fujitsu *s);
@ -526,7 +524,7 @@ static int setWindowParam (struct fujitsu *s);
static size_t maxStringSize (const SANE_String_Const strings[]);
static int startScan (struct fujitsu *s);
static int start_scan (struct fujitsu *s);
static int reader_process (struct fujitsu *scanner, int fd1, int fd2);
@ -547,7 +545,7 @@ static unsigned int reader_gray_duplex_sequential (struct fujitsu *scanner,
static unsigned int reader_gray_duplex_alternate (struct fujitsu *scanner,
FILE * fd, FILE * fd2);
static unsigned int readerGenericPassthrough (struct fujitsu *scanner,
static unsigned int reader_generic_passthrough (struct fujitsu *scanner,
FILE * fd, int i_window_id);
static int read_large_data_block (struct fujitsu *s,

Wyświetl plik

@ -37,8 +37,14 @@
:interface "SCSI"
:model "M4097"
:interface "SCSI"
:model "fi-4120C"
:interface "USB SCSI"
:status :untested
:comment "Probably similar to fi-4220C?"
:model "fi-4220C"
:interface "SCSI USB"
:model "fi-4340C"
:interface "SCSI USB"
:model "ScanPartner 93GX"
:interface "SCSI"

Wyświetl plik

@ -164,11 +164,6 @@
:status :unsupported
:comment "Unsupported. Vendor/product unknown. Maybe similar to fi-4220C?"
:model "fi-4120C"
:interface "USB SCSI"
:status :unsupported
:comment "Unsupported. Vendor/product: 0x04c5/0x1042. Maybe similar to fi-4220C?"
;********************************************************************************************