From 351b7328520c16730ceb46e5acae16038c42185e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Tue, 16 Feb 2021 18:24:19 +0100 Subject: New upstream version 1.0.32 --- backend/escl/escl_capabilities.c | 111 ++++++++++++++++++++++++++++++++------- 1 file changed, 92 insertions(+), 19 deletions(-) (limited to 'backend/escl/escl_capabilities.c') diff --git a/backend/escl/escl_capabilities.c b/backend/escl/escl_capabilities.c index fdd5cfe..db194f9 100644 --- a/backend/escl/escl_capabilities.c +++ b/backend/escl/escl_capabilities.c @@ -16,8 +16,8 @@ for more details. You should have received a copy of the GNU General Public License - along with sane; see the file COPYING. If not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with sane; see the file COPYING. + If not, see . This file implements a SANE backend for eSCL scanners. */ @@ -30,7 +30,6 @@ #include #include -#include #include #include "../include/sane/saneopts.h" @@ -90,9 +89,9 @@ char_to_array(SANE_String_Const *tab, int *tabsize, SANE_String_Const mode, int } (*tabsize)++; if (*tabsize == 1) - board = (SANE_String_Const *)malloc(sizeof(SANE_String_Const) * (*tabsize) + 1); + board = (SANE_String_Const *)malloc(sizeof(SANE_String_Const) * ((*tabsize) + 1)); else - board = (SANE_String_Const *)realloc(tab, sizeof(SANE_String_Const) * (*tabsize) + 1); + board = (SANE_String_Const *)realloc(tab, sizeof(SANE_String_Const) * ((*tabsize) + 1)); board[*tabsize - 1] = (SANE_String_Const)strdup(convert); board[*tabsize] = NULL; return (board); @@ -173,7 +172,7 @@ find_nodes_c(xmlNode *node) /** * \fn static int find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner) - * \brief Function that searchs in the xml file if a scanner capabilitie stocked + * \brief Function that searches in the xml file if a scanner capabilitie stocked * in one of the created array (character/integer array) is found. * * \return 0 @@ -194,32 +193,40 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type) int i = 0; SANE_Bool have_jpeg = SANE_FALSE, have_png = SANE_FALSE, have_tiff = SANE_FALSE, have_pdf = SANE_FALSE; scanner->caps[type].DocumentFormats = char_to_array(scanner->caps[type].DocumentFormats, &scanner->caps[type].DocumentFormatsSize, (SANE_String_Const)xmlNodeGetContent(node), 0); + scanner->caps[type].have_jpeg = -1; + scanner->caps[type].have_png = -1; + scanner->caps[type].have_tiff = -1; + scanner->caps[type].have_pdf = -1; for(; i < scanner->caps[type].DocumentFormatsSize; i++) { if (!strcmp(scanner->caps[type].DocumentFormats[i], "image/jpeg")) { have_jpeg = SANE_TRUE; + scanner->caps[type].have_jpeg = i; } #if(defined HAVE_LIBPNG) else if(!strcmp(scanner->caps[type].DocumentFormats[i], "image/png")) { have_png = SANE_TRUE; + scanner->caps[type].have_png = i; } #endif #if(defined HAVE_TIFFIO_H) else if(type == PLATEN && !strcmp(scanner->caps[type].DocumentFormats[i], "image/tiff")) { have_tiff = SANE_TRUE; + scanner->caps[type].have_tiff = i; } #endif #if(defined HAVE_POPPLER_GLIB) else if(type == PLATEN && !strcmp(scanner->caps[type].DocumentFormats[i], "application/pdf")) { have_pdf = SANE_TRUE; + scanner->caps[type].have_pdf = i; } #endif } - if (have_pdf) + if (have_pdf) scanner->caps[type].default_format = strdup("application/pdf"); else if (have_tiff) scanner->caps[type].default_format = strdup("image/tiff"); @@ -239,7 +246,7 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type) /** * \fn static int find_value_of_int_variables(xmlNode *node, capabilities_t *scanner) - * \brief Function that searchs in the xml file if a integer scanner capabilitie is found. + * \brief Function that searches in the xml file if a integer scanner capabilitie is found. * The integer scanner capabilities that are interesting are : * MinWidth, MaxWidth, MaxHeight, MinHeight, MaxScanRegions, MaxOpticalXResolution, * RiskyLeftMargin, RiskyRightMargin, RiskyTopMargin, RiskyBottomMargin. @@ -283,11 +290,74 @@ find_value_of_int_variables(xmlNode *node, capabilities_t *scanner, int type) return (0); } +static support_t* +print_support(xmlNode *node) +{ + support_t *sup = (support_t*)calloc(1, sizeof(support_t)); + int cpt = 0; + int have_norm = 0; + while (node) { + if (!strcmp((const char *)node->name, "Min")){ + sup->min = atoi((const char *)xmlNodeGetContent(node)); + cpt++; + } + else if (!strcmp((const char *)node->name, "Max")) { + sup->max = atoi((const char *)xmlNodeGetContent(node)); + cpt++; + } + else if (!strcmp((const char *)node->name, "Normal")) { + sup->normal = atoi((const char *)xmlNodeGetContent(node)); + cpt++; + have_norm = 1; + } + else if (!strcmp((const char *)node->name, "Step")) { + sup->step = atoi((const char *)xmlNodeGetContent(node)); + cpt++; + } + node = node->next; + } + if (cpt == 4) + return sup; + if (cpt == 3 && have_norm == 0) { + sup->normal = (sup->max / 2 ); + return sup; + } + free(sup); + return NULL; +} + +static int +find_struct_variables(xmlNode *node, capabilities_t *scanner) +{ + const char *name = (const char *)node->name; + if (strcmp(name, "BrightnessSupport") == 0) { + scanner->brightness = + print_support(node->children); + return 1; + } + else if (strcmp(name, "ContrastSupport") == 0) { + scanner->contrast = + print_support(node->children); + return 1; + } + else if (strcmp(name, "SharpenSupport") == 0) { + scanner->sharpen = + print_support(node->children); + return 1; + } + else if (strcmp(name, "ThresholdSupport") == 0) { + scanner->threshold = + print_support(node->children); + return 1; + } + return (0); +} + /** * \fn static int find_true_variables(xmlNode *node, capabilities_t *scanner) - * \brief Function that searchs in the xml file if we find a scanner capabilitie stocked + * \brief Function that searches in the xml file if we find a scanner capability stored * in one of the created array (character/integer array), - * or, if we find a integer scanner capabilitie. + * or, if we find a integer scanner capability. * * \return 0 */ @@ -322,36 +392,39 @@ find_true_variables(xmlNode *node, capabilities_t *scanner, int type) * \return 0 */ static int -print_xml_c(xmlNode *node, capabilities_t *scanner, int type) +print_xml_c(xmlNode *node, ESCL_Device *device, capabilities_t *scanner, int type) { while (node) { if (node->type == XML_ELEMENT_NODE) { if (find_nodes_c(node) && type != -1) find_true_variables(node, scanner, type); } - if (!strcmp((const char *)node->name, "PlatenInputCaps")) { + if (!strcmp((const char *)node->name, "MakeAndModel")){ + device->model_name = strdup((const char *)xmlNodeGetContent(node)); + } + else if (!strcmp((const char *)node->name, "PlatenInputCaps")) { scanner->Sources[PLATEN] = (SANE_String_Const)strdup(SANE_I18N ("Flatbed")); scanner->SourcesSize++; scanner->source = PLATEN; - print_xml_c(node->children, scanner, PLATEN); + print_xml_c(node->children, device, scanner, PLATEN); scanner->caps[PLATEN].duplex = 0; } else if (!strcmp((const char *)node->name, "AdfSimplexInputCaps")) { scanner->Sources[ADFSIMPLEX] = (SANE_String_Const)strdup(SANE_I18N("ADF")); scanner->SourcesSize++; if (scanner->source == -1) scanner->source = ADFSIMPLEX; - print_xml_c(node->children, scanner, ADFSIMPLEX); + print_xml_c(node->children, device, scanner, ADFSIMPLEX); scanner->caps[ADFSIMPLEX].duplex = 0; } else if (!strcmp((const char *)node->name, "AdfDuplexInputCaps")) { scanner->Sources[ADFDUPLEX] = (SANE_String_Const)strdup(SANE_I18N ("ADF Duplex")); scanner->SourcesSize++; if (scanner->source == -1) scanner->source = ADFDUPLEX; - print_xml_c(node->children, scanner, ADFDUPLEX); + print_xml_c(node->children, device, scanner, ADFDUPLEX); scanner->caps[ADFDUPLEX].duplex = 1; } - else - print_xml_c(node->children, scanner, type); + else if (find_struct_variables(node, scanner) == 0) + print_xml_c(node->children, device, scanner, type); node = node->next; } return (0); @@ -390,7 +463,7 @@ _reduce_color_modes(capabilities_t *scanner) * \return scanner (the structure that stocks all the capabilities elements) */ capabilities_t * -escl_capabilities(const ESCL_Device *device, SANE_Status *status) +escl_capabilities(ESCL_Device *device, SANE_Status *status) { capabilities_t *scanner = (capabilities_t*)calloc(1, sizeof(capabilities_t)); CURL *curl_handle = NULL; @@ -434,7 +507,7 @@ escl_capabilities(const ESCL_Device *device, SANE_Status *status) scanner->Sources = (SANE_String_Const *)malloc(sizeof(SANE_String_Const) * 4); for (i = 0; i < 4; i++) scanner->Sources[i] = NULL; - print_xml_c(node, scanner, -1); + print_xml_c(node, device, scanner, -1); _reduce_color_modes(scanner); clean: xmlFreeDoc(data); -- cgit v1.2.3