kopia lustrzana https://gitlab.com/sane-project/backends
Add support adf.
rodzic
dad063068d
commit
4f7fc379da
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Ładowanie…
Reference in New Issue