diff options
Diffstat (limited to 'backend/escl/escl_capabilities.c')
| -rw-r--r-- | backend/escl/escl_capabilities.c | 111 | 
1 files changed, 92 insertions, 19 deletions
| 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 <https://www.gnu.org/licenses/>.     This file implements a SANE backend for eSCL scanners.  */ @@ -30,7 +30,6 @@  #include <stdlib.h>  #include <string.h> -#include <curl/curl.h>  #include <libxml/parser.h>  #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); | 
