diff --git a/backend/escl/escl.c b/backend/escl/escl.c
index 958b9ed24..ee1754633 100644
--- a/backend/escl/escl.c
+++ b/backend/escl/escl.c
@@ -311,9 +311,14 @@ init_options(SANE_String_Const name, escl_sane_t *s)
DBG (10, "escl init_options\n");
SANE_Status status = SANE_STATUS_GOOD;
int i = 0;
-
- if (name == NULL)
- return (SANE_STATUS_INVAL);
+ if (!s->scanner) return SANE_STATUS_INVAL;
+ if (name) {
+ for (i = 0; i < s->scanner->SourcesSize; i++)
+ {
+ if (!strcmp(s->scanner->Sources[i], name))
+ s->scanner->source = i;
+ }
+ }
memset (s->opt, 0, sizeof (s->opt));
memset (s->val, 0, sizeof (s->val));
for (i = 0; i < NUM_OPTIONS; ++i) {
@@ -321,11 +326,11 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
s->x_range.min = 0;
- s->x_range.max = s->scanner->MaxWidth - s->scanner->MinWidth;
- s->x_range.quant = 1;
+ s->x_range.max = s->scanner->caps[s->scanner->source].MaxWidth;
+ s->x_range.quant = 0;
s->y_range.min = 0;
- s->y_range.max = s->scanner->MaxHeight - s->scanner->MinHeight;
- s->y_range.quant = 1;
+ s->y_range.max = s->scanner->caps[s->scanner->source].MaxHeight;
+ s->y_range.quant = 0;
s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
s->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
s->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
@@ -344,10 +349,12 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[OPT_MODE].type = SANE_TYPE_STRING;
s->opt[OPT_MODE].unit = SANE_UNIT_NONE;
s->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
- s->opt[OPT_MODE].constraint.string_list = s->scanner->ColorModes;
- s->val[OPT_MODE].s = (char *)strdup(s->scanner->ColorModes[0]);
- s->opt[OPT_MODE].size = max_string_size(s->scanner->ColorModes);
- s->scanner->default_color = (char *)strdup(s->scanner->ColorModes[0]);
+ s->opt[OPT_MODE].constraint.string_list = s->scanner->caps[s->scanner->source].ColorModes;
+ s->val[OPT_MODE].s = (char *)strdup(s->scanner->caps[s->scanner->source].ColorModes[0]);
+ s->opt[OPT_MODE].size = max_string_size(s->scanner->caps[s->scanner->source].ColorModes);
+ if (s->scanner->caps[s->scanner->source].default_color)
+ free (s->scanner->caps[s->scanner->source].default_color);
+ s->scanner->caps[s->scanner->source].default_color = (char *)strdup(s->scanner->caps[s->scanner->source].ColorModes[0]);
s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
@@ -355,9 +362,9 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[OPT_RESOLUTION].type = SANE_TYPE_INT;
s->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
- s->opt[OPT_RESOLUTION].constraint.word_list = s->scanner->SupportedResolutions;
- s->val[OPT_RESOLUTION].w = s->scanner->SupportedResolutions[1];
- s->scanner->default_resolution = s->scanner->SupportedResolutions[1];
+ s->opt[OPT_RESOLUTION].constraint.word_list = s->scanner->caps[s->scanner->source].SupportedResolutions;
+ s->val[OPT_RESOLUTION].w = s->scanner->caps[s->scanner->source].SupportedResolutions[1];
+ s->scanner->caps[s->scanner->source].default_resolution = s->scanner->caps[s->scanner->source].SupportedResolutions[1];
s->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
s->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
@@ -385,7 +392,7 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[OPT_TL_X].unit = SANE_UNIT_PIXEL;
s->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_TL_X].constraint.range = &s->x_range;
- s->val[OPT_TL_X].w = s->scanner->RiskyLeftMargin;
+ s->val[OPT_TL_X].w = s->scanner->caps[s->scanner->source].RiskyLeftMargin;
s->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
s->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
@@ -394,7 +401,7 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[OPT_TL_Y].unit = SANE_UNIT_PIXEL;
s->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_TL_Y].constraint.range = &s->y_range;
- s->val[OPT_TL_Y].w = s->scanner->RiskyTopMargin;
+ s->val[OPT_TL_Y].w = s->scanner->caps[s->scanner->source].RiskyTopMargin;
s->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
s->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
@@ -403,7 +410,7 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[OPT_BR_X].unit = SANE_UNIT_PIXEL;
s->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_BR_X].constraint.range = &s->x_range;
- s->val[OPT_BR_X].w = s->scanner->MaxWidth;
+ s->val[OPT_BR_X].w = s->scanner->caps[s->scanner->source].MaxWidth;
s->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
s->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
@@ -412,7 +419,23 @@ init_options(SANE_String_Const name, escl_sane_t *s)
s->opt[OPT_BR_Y].unit = SANE_UNIT_PIXEL;
s->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_BR_Y].constraint.range = &s->y_range;
- s->val[OPT_BR_Y].w = s->scanner->MaxHeight;
+ s->val[OPT_BR_Y].w = s->scanner->caps[s->scanner->source].MaxHeight;
+
+ /* OPT_SCAN_SOURCE */
+ s->opt[OPT_SCAN_SOURCE].name = SANE_NAME_SCAN_SOURCE;
+ s->opt[OPT_SCAN_SOURCE].title = SANE_TITLE_SCAN_SOURCE;
+ s->opt[OPT_SCAN_SOURCE].desc = SANE_DESC_SCAN_SOURCE;
+ s->opt[OPT_SCAN_SOURCE].type = SANE_TYPE_STRING;
+ s->opt[OPT_SCAN_SOURCE].size = s->scanner->SourcesSize;
+ s->opt[OPT_SCAN_SOURCE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ s->opt[OPT_SCAN_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ s->opt[OPT_SCAN_SOURCE].constraint.string_list = s->scanner->Sources;
+ if (s->val[OPT_SCAN_SOURCE].s)
+ free (s->val[OPT_SCAN_SOURCE].s);
+ if (name)
+ s->val[OPT_SCAN_SOURCE].s = strdup (name);
+ else
+ s->val[OPT_SCAN_SOURCE].s = strdup (s->scanner->Sources[0]);
return (status);
}
@@ -444,7 +467,7 @@ sane_open(SANE_String_Const name, SANE_Handle *h)
handler->scanner = escl_capabilities(name, &status);
if (status != SANE_STATUS_GOOD)
return (status);
- status = init_options(name, handler);
+ status = init_options(NULL, handler);
if (status != SANE_STATUS_GOOD)
return (status);
handler->ps.depth = 8;
@@ -549,6 +572,7 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int
case OPT_GRAY_PREVIEW:
*(SANE_Word *) v = handler->val[n].w;
break;
+ case OPT_SCAN_SOURCE:
case OPT_MODE:
strcpy (v, handler->val[n].s);
break;
@@ -576,6 +600,11 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int
if (i)
*i |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS | SANE_INFO_INEXACT;
break;
+ case OPT_SCAN_SOURCE:
+ init_options((SANE_String_Const)v, handler);
+ if (i)
+ *i |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS | SANE_INFO_INEXACT;
+ break;
case OPT_MODE:
if (handler->val[n].s)
free (handler->val[n].s);
@@ -613,34 +642,34 @@ sane_start(SANE_Handle h)
handler->write_scan_data = SANE_FALSE;
handler->decompress_scan_data = SANE_FALSE;
handler->end_read = SANE_FALSE;
- handler->scanner->height = handler->val[OPT_BR_Y].w;
- handler->scanner->width = handler->val[OPT_BR_X].w;
- handler->scanner->pos_x = handler->val[OPT_TL_X].w;
- handler->scanner->pos_y = handler->val[OPT_TL_Y].w;
- if(handler->scanner->default_color)
- free(handler->scanner->default_color);
+ handler->scanner->caps[handler->scanner->source].height = handler->val[OPT_BR_Y].w;
+ handler->scanner->caps[handler->scanner->source].width = handler->val[OPT_BR_X].w;
+ handler->scanner->caps[handler->scanner->source].pos_x = handler->val[OPT_TL_X].w;
+ handler->scanner->caps[handler->scanner->source].pos_y = handler->val[OPT_TL_Y].w;
+ if(handler->scanner->caps[handler->scanner->source].default_color)
+ free(handler->scanner->caps[handler->scanner->source].default_color);
if (handler->val[OPT_PREVIEW].w == SANE_TRUE)
{
int i = 0, val = 9999;;
if (handler->val[OPT_GRAY_PREVIEW].w == SANE_TRUE ||
!strncasecmp(handler->val[OPT_MODE].s, SANE_VALUE_SCAN_MODE_GRAY, 3))
- handler->scanner->default_color = strdup("Grayscale8");
+ handler->scanner->caps[handler->scanner->source].default_color = strdup("Grayscale8");
else
- handler->scanner->default_color = strdup("RGB24");
- for (i = 1; i < handler->scanner->SupportedResolutionsSize; i++)
+ handler->scanner->caps[handler->scanner->source].default_color = strdup("RGB24");
+ for (i = 1; i < handler->scanner->caps[handler->scanner->source].SupportedResolutionsSize; i++)
{
- if (val > handler->scanner->SupportedResolutions[i])
- val = handler->scanner->SupportedResolutions[i];
+ if (val > handler->scanner->caps[handler->scanner->source].SupportedResolutions[i])
+ val = handler->scanner->caps[handler->scanner->source].SupportedResolutions[i];
}
- handler->scanner->default_resolution = val;
+ handler->scanner->caps[handler->scanner->source].default_resolution = val;
}
else
{
- handler->scanner->default_resolution = handler->val[OPT_RESOLUTION].w;
+ handler->scanner->caps[handler->scanner->source].default_resolution = handler->val[OPT_RESOLUTION].w;
if (!strncasecmp(handler->val[OPT_MODE].s, SANE_VALUE_SCAN_MODE_GRAY, 3))
- handler->scanner->default_color = strdup("Grayscale8");
+ handler->scanner->caps[handler->scanner->source].default_color = strdup("Grayscale8");
else
- handler->scanner->default_color = strdup("RGB24");
+ handler->scanner->caps[handler->scanner->source].default_color = strdup("RGB24");
}
handler->result = escl_newjob(handler->scanner, handler->name, &status);
if (status != SANE_STATUS_GOOD)
@@ -648,15 +677,15 @@ sane_start(SANE_Handle h)
status = escl_scan(handler->scanner, handler->name, handler->result);
if (status != SANE_STATUS_GOOD)
return (status);
- if (!strcmp(handler->scanner->default_format, "image/jpeg"))
+ if (!strcmp(handler->scanner->caps[handler->scanner->source].default_format, "image/jpeg"))
{
status = get_JPEG_data(handler->scanner, &w, &he, &bps);
}
- else if (!strcmp(handler->scanner->default_format, "image/png"))
+ else if (!strcmp(handler->scanner->caps[handler->scanner->source].default_format, "image/png"))
{
status = get_PNG_data(handler->scanner, &w, &he, &bps);
}
- else if (!strcmp(handler->scanner->default_format, "image/tiff"))
+ else if (!strcmp(handler->scanner->caps[handler->scanner->source].default_format, "image/tiff"))
{
status = get_TIFF_data(handler->scanner, &w, &he, &bps);
}
diff --git a/backend/escl/escl.h b/backend/escl/escl.h
index 8f9315265..02328f3c8 100644
--- a/backend/escl/escl.h
+++ b/backend/escl/escl.h
@@ -50,6 +50,14 @@
#define ESCL_CONFIG_FILE "escl.conf"
+
+enum {
+ PLATEN,
+ ADFSIMPLEX,
+ ADFDUPLEX
+};
+
+
typedef struct {
int p1_0;
int p2_0;
@@ -71,7 +79,7 @@ typedef struct ESCL_Device {
char *type;
} ESCL_Device;
-typedef struct capabilities
+typedef struct capst
{
int height;
int width;
@@ -91,6 +99,7 @@ typedef struct capabilities
int ContentTypesSize;
SANE_String_Const *DocumentFormats;
int DocumentFormatsSize;
+ int format_ext;
SANE_Int *SupportedResolutions;
int SupportedResolutionsSize;
SANE_String_Const *SupportedIntents;
@@ -101,11 +110,18 @@ typedef struct capabilities
int RiskyRightMargin;
int RiskyTopMargin;
int RiskyBottomMargin;
+} caps_t;
+
+typedef struct capabilities
+{
+ caps_t caps[3];
+ int source;
+ SANE_String_Const *Sources;
+ int SourcesSize;
FILE *tmp;
unsigned char *img_data;
long img_size;
long img_read;
- int format_ext;
} capabilities_t;
typedef struct {
@@ -135,6 +151,9 @@ enum
OPT_TL_Y,
OPT_BR_X,
OPT_BR_Y,
+
+ OPT_SCAN_SOURCE,
+
NUM_OPTIONS
};
diff --git a/backend/escl/escl_capabilities.c b/backend/escl/escl_capabilities.c
index c6fa9d861..6f292abc1 100644
--- a/backend/escl/escl_capabilities.c
+++ b/backend/escl/escl_capabilities.c
@@ -173,48 +173,48 @@ find_nodes_c(xmlNode *node)
* \return 0
*/
static int
-find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner)
+find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type)
{
const char *name = (const char *)node->name;
if (strcmp(name, "ColorMode") == 0)
- scanner->ColorModes = char_to_array(scanner->ColorModes, &scanner->ColorModesSize, (SANE_String_Const)xmlNodeGetContent(node), 1);
+ scanner->caps[type].ColorModes = char_to_array(scanner->caps[type].ColorModes, &scanner->caps[type].ColorModesSize, (SANE_String_Const)xmlNodeGetContent(node), 1);
else if (strcmp(name, "ContentType") == 0)
- scanner->ContentTypes = char_to_array(scanner->ContentTypes, &scanner->ContentTypesSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
+ scanner->caps[type].ContentTypes = char_to_array(scanner->caps[type].ContentTypes, &scanner->caps[type].ContentTypesSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
else if (strcmp(name, "DocumentFormat") == 0)
{
int i = 0;
- scanner->DocumentFormats = char_to_array(scanner->DocumentFormats, &scanner->DocumentFormatsSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
- for(; i < scanner->DocumentFormatsSize; i++)
+ scanner->caps[type].DocumentFormats = char_to_array(scanner->caps[type].DocumentFormats, &scanner->caps[type].DocumentFormatsSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
+ for(; i < scanner->caps[type].DocumentFormatsSize; i++)
{
- if (scanner->default_format == NULL && !strcmp(scanner->DocumentFormats[i], "image/jpeg"))
+ if (scanner->caps[type].default_format == NULL && !strcmp(scanner->caps[type].DocumentFormats[i], "image/jpeg"))
{
- scanner->default_format = strdup("image/jpeg");
+ scanner->caps[type].default_format = strdup("image/jpeg");
}
#if(defined HAVE_LIBPNG)
- else if(!strcmp(scanner->DocumentFormats[i], "image/png") && (scanner->default_format == NULL || strcmp(scanner->default_format, "image/tiff")))
+ else if(!strcmp(scanner->caps[type].DocumentFormats[i], "image/png") && (scanner->caps[type].default_format == NULL || strcmp(scanner->caps[type].default_format, "image/tiff")))
{
- if (scanner->default_format)
- free(scanner->default_format);
- scanner->default_format = strdup("image/png");
+ if (scanner->caps[type].default_format)
+ free(scanner->caps[type].default_format);
+ scanner->caps[type].default_format = strdup("image/png");
}
#endif
#if(defined HAVE_TIFFIO_H)
- else if(!strcmp(scanner->DocumentFormats[i], "image/tiff"))
+ else if(!strcmp(scanner->caps[type].DocumentFormats[i], "image/tiff"))
{
- if (scanner->default_format)
- free(scanner->default_format);
- scanner->default_format = strdup("image/tiff");
+ if (scanner->caps[type].default_format)
+ free(scanner->caps[type].default_format);
+ scanner->caps[type].default_format = strdup("image/tiff");
}
#endif
}
- fprintf(stderr, "Capability : [%s]\n", scanner->default_format);
+ LOG_MSG_DEBUG ("Capability : [%s]", scanner->caps[type].default_format);
}
else if (strcmp(name, "DocumentFormatExt") == 0)
- scanner->format_ext = 1;
+ scanner->caps[type].format_ext = 1;
else if (strcmp(name, "Intent") == 0)
- scanner->SupportedIntents = char_to_array(scanner->SupportedIntents, &scanner->SupportedIntentsSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
+ scanner->caps[type].SupportedIntents = char_to_array(scanner->caps[type].SupportedIntents, &scanner->caps[type].SupportedIntentsSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
else if (strcmp(name, "XResolution") == 0)
- scanner->SupportedResolutions = int_to_array(scanner->SupportedResolutions, &scanner->SupportedResolutionsSize, atoi((const char *)xmlNodeGetContent(node)));
+ scanner->caps[type].SupportedResolutions = int_to_array(scanner->caps[type].SupportedResolutions, &scanner->caps[type].SupportedResolutionsSize, atoi((const char *)xmlNodeGetContent(node)));
return (0);
}
@@ -228,39 +228,39 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner)
* \return 0
*/
static int
-find_value_of_int_variables(xmlNode *node, capabilities_t *scanner)
+find_value_of_int_variables(xmlNode *node, capabilities_t *scanner, int type)
{
int MaxWidth = 0;
int MaxHeight = 0;
const char *name = (const char *)node->name;
if (strcmp(name, "MinWidth") == 0)
- scanner->MinWidth = atoi((const char*)xmlNodeGetContent(node));
+ scanner->caps[type].MinWidth = atoi((const char*)xmlNodeGetContent(node));
else if (strcmp(name, "MaxWidth") == 0) {
MaxWidth = atoi((const char*)xmlNodeGetContent(node));
- if (scanner->MaxWidth == 0 || MaxWidth < scanner->MaxWidth)
- scanner->MaxWidth = atoi((const char *)xmlNodeGetContent(node));
+ if (scanner->caps[type].MaxWidth == 0 || MaxWidth < scanner->caps[type].MaxWidth)
+ scanner->caps[type].MaxWidth = atoi((const char *)xmlNodeGetContent(node));
}
else if (strcmp(name, "MinHeight") == 0)
- scanner->MinHeight = atoi((const char*)xmlNodeGetContent(node));
+ scanner->caps[type].MinHeight = atoi((const char*)xmlNodeGetContent(node));
else if (strcmp(name, "MaxHeight") == 0) {
MaxHeight = atoi((const char*)xmlNodeGetContent(node));
- if (scanner->MaxHeight == 0 || MaxHeight < scanner->MaxHeight)
- scanner->MaxHeight = atoi((const char *)xmlNodeGetContent(node));
+ if (scanner->caps[type].MaxHeight == 0 || MaxHeight < scanner->caps[type].MaxHeight)
+ scanner->caps[type].MaxHeight = atoi((const char *)xmlNodeGetContent(node));
}
else if (strcmp(name, "MaxScanRegions") == 0)
- scanner->MaxScanRegions = atoi((const char *)xmlNodeGetContent(node));
+ scanner->caps[type].MaxScanRegions = atoi((const char *)xmlNodeGetContent(node));
else if (strcmp(name, "MaxOpticalXResolution") == 0)
- scanner->MaxOpticalXResolution = atoi((const char *)xmlNodeGetContent(node));
+ scanner->caps[type].MaxOpticalXResolution = atoi((const char *)xmlNodeGetContent(node));
else if (strcmp(name, "RiskyLeftMargin") == 0)
- scanner->RiskyLeftMargin = atoi((const char *)xmlNodeGetContent(node));
+ scanner->caps[type].RiskyLeftMargin = atoi((const char *)xmlNodeGetContent(node));
else if (strcmp(name, "RiskyRightMargin") == 0)
- scanner->RiskyRightMargin = atoi((const char *)xmlNodeGetContent(node));
+ scanner->caps[type].RiskyRightMargin = atoi((const char *)xmlNodeGetContent(node));
else if (strcmp(name, "RiskyTopMargin") == 0)
- scanner->RiskyTopMargin = atoi((const char *)xmlNodeGetContent(node));
+ scanner->caps[type].RiskyTopMargin = atoi((const char *)xmlNodeGetContent(node));
else if (strcmp(name, "RiskyBottomMargin") == 0)
- scanner->RiskyBottomMargin = atoi((const char *)xmlNodeGetContent(node));
- find_valor_of_array_variables(node, scanner);
+ scanner->caps[type].RiskyBottomMargin = atoi((const char *)xmlNodeGetContent(node));
+ find_valor_of_array_variables(node, scanner, type);
return (0);
}
@@ -273,7 +273,7 @@ find_value_of_int_variables(xmlNode *node, capabilities_t *scanner)
* \return 0
*/
static int
-find_true_variables(xmlNode *node, capabilities_t *scanner)
+find_true_variables(xmlNode *node, capabilities_t *scanner, int type)
{
const char *name = (const char *)node->name;
if (strcmp(name, "MinWidth") == 0 ||
@@ -292,7 +292,7 @@ find_true_variables(xmlNode *node, capabilities_t *scanner)
strcmp(name, "RiskyTopMargin") == 0 ||
strcmp(name, "RiskyBottomMargin") == 0 ||
strcmp(name, "DocumentFormatExt") == 0)
- find_value_of_int_variables(node, scanner);
+ find_value_of_int_variables(node, scanner, type);
return (0);
}
@@ -303,14 +303,25 @@ find_true_variables(xmlNode *node, capabilities_t *scanner)
* \return 0
*/
static int
-print_xml_c(xmlNode *node, capabilities_t *scanner)
+print_xml_c(xmlNode *node, capabilities_t *scanner, int type)
{
while (node) {
if (node->type == XML_ELEMENT_NODE) {
- if (find_nodes_c(node))
- find_true_variables(node, scanner);
+ if (find_nodes_c(node) && type != -1)
+ find_true_variables(node, scanner, type);
}
- print_xml_c(node->children, scanner);
+ if (!strcmp((const char *)node->name, "PlatenInputCaps")) {
+ scanner->Sources = char_to_array(scanner->Sources, &scanner->SourcesSize, (SANE_String_Const)"Platen", 0);
+ scanner->source = 0;
+ print_xml_c(node->children, scanner, PLATEN);
+ }
+ else if (!strcmp((const char *)node->name, "AdfSimplexInputCaps")) {
+ scanner->Sources = char_to_array(scanner->Sources, &scanner->SourcesSize, (SANE_String_Const)"Feeder", 0);
+ scanner->source = 0;
+ print_xml_c(node->children, scanner, ADFSIMPLEX);
+ }
+ else
+ print_xml_c(node->children, scanner, type);
node = node->next;
}
return (0);
@@ -364,7 +375,7 @@ escl_capabilities(SANE_String_Const name, SANE_Status *status)
node = xmlDocGetRootElement(data);
if (node == NULL)
*status = SANE_STATUS_NO_MEM;
- print_xml_c(node, scanner);
+ print_xml_c(node, scanner, -1);
xmlFreeDoc(data);
xmlCleanupParser();
xmlMemoryDump();
diff --git a/backend/escl/escl_newjob.c b/backend/escl/escl_newjob.c
index 8268c5fa8..4a998b5f7 100644
--- a/backend/escl/escl_newjob.c
+++ b/backend/escl/escl_newjob.c
@@ -59,7 +59,7 @@ static const char settings[] =
" %s" \
" %d" \
" %d" \
- " Platen" \
+ " %s" \
"";
static char formatExtJPEG[] =
@@ -154,13 +154,13 @@ escl_newjob (capabilities_t *scanner, SANE_String_Const name, SANE_Status *statu
}
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
- if (scanner->format_ext == 1)
+ if (scanner->caps[scanner->source].format_ext == 1)
{
- if (!strcmp(scanner->default_format, "image/jpeg"))
+ if (!strcmp(scanner->caps[scanner->source].default_format, "image/jpeg"))
format_ext = formatExtJPEG;
- else if (!strcmp(scanner->default_format, "image/png"))
+ else if (!strcmp(scanner->caps[scanner->source].default_format, "image/png"))
format_ext = formatExtPNG;
- else if (!strcmp(scanner->default_format, "image/tiff"))
+ else if (!strcmp(scanner->caps[scanner->source].default_format, "image/tiff"))
format_ext = formatExtTIFF;
else
format_ext = f_ext;
@@ -168,10 +168,17 @@ escl_newjob (capabilities_t *scanner, SANE_String_Const name, SANE_Status *statu
else
format_ext = f_ext;
if (curl_handle != NULL) {
- snprintf(cap_data, sizeof(cap_data), settings, scanner->height, scanner->width, 0, 0, scanner->default_format,
- format_ext,
- scanner->default_color, scanner->default_resolution, scanner->default_resolution);
- // fprintf(stderr, "CAP_DATA = %s\n", cap_data);
+ snprintf(cap_data, sizeof(cap_data), settings,
+ scanner->caps[scanner->source].height,
+ scanner->caps[scanner->source].width,
+ 0,
+ 0,
+ scanner->caps[scanner->source].default_format,
+ format_ext,
+ scanner->caps[scanner->source].default_color,
+ scanner->caps[scanner->source].default_resolution,
+ scanner->caps[scanner->source].default_resolution,
+ scanner->Sources[scanner->source]);
upload->read_data = strdup(cap_data);
upload->size = strlen(cap_data);
download->memory = malloc(1);