if (!h->read_info->scan_started)
return SANE_STATUS_INVAL;
+ metadata mdata;
+ if (h->current_metadata->is_last) {
+ memcpy(&mdata, h->current_metadata, sizeof(metadata));
+
+ params->format = mdata.format;
+ params->last_frame = mdata.is_last;
+ params->bytes_per_line = mdata.bytes_per_line;
+ params->pixels_per_line = mdata.pixels_per_line;
+ params->lines = mdata.lines;
+ params->depth = mdata.depth;
+ h->current_metadata->is_last = 0;
+
+ h->read_info->read_size = 0;
+ h->read_info->readed_bytes_per_line = 0;
+ h->read_info->readed_lines = 0;
+
+ return SANE_STATUS_GOOD;
+ }
+
for (int i = 0; i < 10; i++) {
sleep(1);
kds_s2000w_handler_get_parameters(h);
if (!h->current_metadata->valid)
return SANE_STATUS_UNSUPPORTED;
- metadata mdata;
memcpy(&mdata, h->current_metadata, sizeof(metadata));
params->format = mdata.format;
params->pixels_per_line = mdata.pixels_per_line;
params->lines = mdata.lines;
params->depth = mdata.depth;
+
h->read_info->read_size = 0;
h->read_info->readed_bytes_per_line = 0;
h->read_info->readed_lines = 0;
{
debug_printf(ALL, "sane_kds_s2000w_net_read");
handler* h = (handler*) handle;
+ // cancel
if (h->read_info->cancel) {
h->read_info->scan_started = 0;
*length = 0;
sleep(1);
kds_s2000w_handler_open("kds_s2000w_net", handle);
return SANE_STATUS_CANCELLED;
- }
-
- if (h->current_metadata->image != NULL) {
- int skip_header_bytes = _sane_kds_s2000w_net_find_first_data_byte(h->current_metadata->image);
- if (h->read_info->read_size <= 0)
- h->read_info->read_size += skip_header_bytes;
}
+ // last frame
if (h->read_info->readed_lines >= h->current_metadata->lines) {
*length = 0;
h->current_metadata->is_last = 1;
return SANE_STATUS_EOF;
}
+ // calc max length
int maxlen = max_length;
if (h->current_metadata->bytes_per_line - h->read_info->readed_bytes_per_line < max_length)
maxlen = h->current_metadata->bytes_per_line - h->read_info->readed_bytes_per_line;
+ // read image
+ if (h->current_metadata->image != NULL) {
+ int skip_header_bytes = _sane_kds_s2000w_net_find_first_data_byte(h->current_metadata->image);
+ if (h->read_info->read_size <= 0)
+ h->read_info->read_size += skip_header_bytes;
+ }
+
*length = maxlen;
memcpy(data, h->current_metadata->image + h->read_info->read_size, *length);
h->read_info->readed_bytes_per_line += *length;
h->read_info->read_size += *length;
+ // check is all bytes readed in one line
if (h->read_info->readed_bytes_per_line >= h->current_metadata->bytes_per_line) {
h->read_info->readed_bytes_per_line = 0;
h->read_info->readed_lines++;