Add support adf.

merge-requests/213/head^2
thierry1970 2020-01-07 16:09:38 +01:00
rodzic dad063068d
commit 4f7fc379da
4 zmienionych plików z 154 dodań i 88 usunięć

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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
};

Wyświetl plik

@ -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();

Wyświetl plik

@ -59,7 +59,7 @@ static const char settings[] =
" <scan:ColorMode>%s</scan:ColorMode>" \
" <scan:XResolution>%d</scan:XResolution>" \
" <scan:YResolution>%d</scan:YResolution>" \
" <pwg:InputSource>Platen</pwg:InputSource>" \
" <pwg:InputSource>%s</pwg:InputSource>" \
"</scan:ScanSettings>";
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);