diff options
Diffstat (limited to 'backend/escl')
-rw-r--r-- | backend/escl/escl.c | 81 | ||||
-rw-r--r-- | backend/escl/escl.h | 6 | ||||
-rw-r--r-- | backend/escl/escl_capabilities.c | 14 | ||||
-rw-r--r-- | backend/escl/escl_crop.c | 8 | ||||
-rw-r--r-- | backend/escl/escl_devices.c | 8 | ||||
-rw-r--r-- | backend/escl/escl_jpeg.c | 4 | ||||
-rw-r--r-- | backend/escl/escl_mupdf.c | 18 | ||||
-rw-r--r-- | backend/escl/escl_newjob.c | 71 | ||||
-rw-r--r-- | backend/escl/escl_pdf.c | 24 | ||||
-rw-r--r-- | backend/escl/escl_png.c | 16 | ||||
-rw-r--r-- | backend/escl/escl_reset.c | 42 | ||||
-rw-r--r-- | backend/escl/escl_scan.c | 2 | ||||
-rw-r--r-- | backend/escl/escl_status.c | 137 | ||||
-rw-r--r-- | backend/escl/escl_tiff.c | 8 |
14 files changed, 275 insertions, 164 deletions
diff --git a/backend/escl/escl.c b/backend/escl/escl.c index 77b753f..6bd3429 100644 --- a/backend/escl/escl.c +++ b/backend/escl/escl.c @@ -61,25 +61,6 @@ static const SANE_Device **devlist = NULL; static ESCL_Device *list_devices_primary = NULL; static int num_devices = 0; -#ifdef CURL_SSLVERSION_MAX_DEFAULT -static int proto_tls[] = { - CURL_SSLVERSION_MAX_DEFAULT, - #ifdef CURL_SSLVERSION_MAX_TLSv1_3 - CURL_SSLVERSION_MAX_TLSv1_3, - #endif - #ifdef CURL_SSLVERSION_MAX_TLSv1_2 - CURL_SSLVERSION_MAX_TLSv1_2, - #endif - #ifdef CURL_SSLVERSION_MAX_TLSv1_1 - CURL_SSLVERSION_MAX_TLSv1_1, - #endif - #ifdef CURL_SSLVERSION_MAX_TLSv1_0 - CURL_SSLVERSION_MAX_TLSv1_0, - #endif - -1 -}; -#endif - typedef struct Handled { struct Handled *next; @@ -120,17 +101,15 @@ escl_free_device(ESCL_Device *current) } -#ifdef CURL_SSLVERSION_MAX_DEFAULT static int -escl_tls_protocol_supported(char *url, int proto) +escl_tls_protocol_supported(char *url) { CURLcode res = CURLE_UNSUPPORTED_PROTOCOL; CURL *curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, url); - /* ask libcurl to use TLS version 1.0 or later */ - curl_easy_setopt(curl, CURLOPT_SSLVERSION, proto); + curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_TRY); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); @@ -145,33 +124,17 @@ escl_tls_protocol_supported(char *url, int proto) static int escl_is_tls(char * url, char *type) { - int tls_version = 0; if(!strcmp(type, "_uscans._tcp") || !strcmp(type, "https")) { - while(proto_tls[tls_version] != -1) - { - if (escl_tls_protocol_supported(url, proto_tls[tls_version]) == CURLE_OK) + if (escl_tls_protocol_supported(url) == CURLE_OK) { - DBG(10, "curl tls compatible (%d)\n", proto_tls[tls_version]); - break; + DBG(10, "curl tls compatible\n"); + return 1; } - tls_version++; - } - if (proto_tls[tls_version] < 1) - return 0; } - return proto_tls[tls_version]; -} -#else -static int -escl_is_tls(char * url, char *type) -{ - (void)url; - (void)type; return 0; } -#endif void escl_free_handler(escl_sane_t *handler) @@ -416,7 +379,7 @@ convertFromESCLDev(ESCL_Device *cdev) unix_path, cdev->https ? "s" : "", cdev->ip_address, cdev->port_nb); sdev->name = tmp; - DBG( 1, "Escl add device : %s\n", tmp); + DBG( 10, "Escl add device : %s\n", tmp); sdev->vendor = get_vendor(cdev->model_name); if (!sdev->vendor) @@ -523,7 +486,7 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line, line = sanei_config_get_string(line + 6, &name_str); DBG (10, "New Escl_Device URL [%s].\n", (name_str ? name_str : "VIDE")); if (!name_str || !*name_str) { - DBG (1, "Escl_Device URL missing.\n"); + DBG(10, "Escl_Device URL missing.\n"); return SANE_STATUS_INVAL; } if (*line) { @@ -1163,19 +1126,19 @@ escl_parse_name(SANE_String_Const name, ESCL_Device *device) device->type = strdup("http"); host = name + 7; } else { - DBG(1, "Unknown URL scheme in %s", name); + DBG(10, "Unknown URL scheme in %s", name); return SANE_STATUS_INVAL; } port_str = strchr(host, ':'); if (port_str == NULL) { - DBG(1, "Port missing from URL: %s", name); + DBG(10, "Port missing from URL: %s", name); return SANE_STATUS_INVAL; } port_str++; device->port_nb = atoi(port_str); if (device->port_nb < 1 || device->port_nb > 65535) { - DBG(1, "Invalid port number in URL: %s", name); + DBG(10, "Invalid port number in URL: %s", name); return SANE_STATUS_INVAL; } @@ -1201,7 +1164,7 @@ _get_hack(SANE_String_Const name, ESCL_Device *device) fp = sanei_config_open (ESCL_CONFIG_FILE); if (!fp) { - DBG (2, "_get_hack: couldn't access %s\n", ESCL_CONFIG_FILE); + DBG(4, "_get_hack: couldn't access %s\n", ESCL_CONFIG_FILE); DBG (3, "_get_hack: exit\n"); } @@ -1236,7 +1199,7 @@ _get_blacklist_pdf(void) fp = sanei_config_open (ESCL_CONFIG_FILE); if (!fp) { - DBG (2, "_get_blacklit: couldn't access %s\n", ESCL_CONFIG_FILE); + DBG(4, "_get_blacklit: couldn't access %s\n", ESCL_CONFIG_FILE); DBG (3, "_get_blacklist: exit\n"); } @@ -1345,7 +1308,7 @@ sane_cancel(SANE_Handle h) } handler->scanner->work = SANE_FALSE; handler->cancel = SANE_TRUE; - escl_scanner(handler->device, handler->scanner->scanJob, handler->result); + escl_scanner(handler->device, handler->scanner->scanJob, handler->result, SANE_TRUE); free(handler->result); handler->result = NULL; free(handler->scanner->scanJob); @@ -1558,7 +1521,7 @@ sane_start(SANE_Handle h) int bps = 0; if (handler->device == NULL) { - DBG(1, "Missing handler device.\n"); + DBG(10, "Missing handler device.\n"); return (SANE_STATUS_INVAL); } handler->cancel = SANE_FALSE; @@ -1566,6 +1529,7 @@ sane_start(SANE_Handle h) handler->decompress_scan_data = SANE_FALSE; handler->end_read = SANE_FALSE; if (handler->scanner->work == SANE_FALSE) { + escl_reset_all_jobs(handler->device); SANE_Status st = escl_status(handler->device, handler->scanner->source, NULL, @@ -1887,24 +1851,23 @@ escl_curl_url(CURL *handle, const ESCL_Device *device, SANE_String_Const path) (device->https ? "https" : "http"), device->ip_address, device->port_nb, path); - DBG( 1, "escl_curl_url: URL: %s\n", url ); + DBG( 10, "escl_curl_url: URL: %s\n", url ); curl_easy_setopt(handle, CURLOPT_URL, url); free(url); - DBG( 1, "Before use hack\n"); + DBG( 10, "Before use hack\n"); if (device->hack) { - DBG( 1, "Use hack\n"); + DBG( 10, "Use hack\n"); curl_easy_setopt(handle, CURLOPT_HTTPHEADER, device->hack); } - DBG( 1, "After use hack\n"); + DBG( 10, "After use hack\n"); if (device->https) { - DBG( 1, "Ignoring safety certificates, use https\n"); + DBG( 10, "Ignoring safety certificates, use https\n"); + curl_easy_setopt(handle, CURLOPT_USE_SSL, (long)CURLUSESSL_TRY); curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L); - if (device->tls > 0) - curl_easy_setopt(handle, CURLOPT_SSLVERSION, device->tls); } if (device->unix_socket != NULL) { - DBG( 1, "Using local socket %s\n", device->unix_socket ); + DBG( 10, "Using local socket %s\n", device->unix_socket ); curl_easy_setopt(handle, CURLOPT_UNIX_SOCKET_PATH, device->unix_socket); } diff --git a/backend/escl/escl.h b/backend/escl/escl.h index b59a3ff..2dce59b 100644 --- a/backend/escl/escl.h +++ b/backend/escl/escl.h @@ -248,7 +248,11 @@ SANE_Status escl_scan(capabilities_t *scanner, void escl_scanner(const ESCL_Device *device, char *scanJob, - char *result); + char *result, + SANE_Bool status); + +SANE_Status escl_reset_all_jobs(ESCL_Device *device); + typedef void CURL; diff --git a/backend/escl/escl_capabilities.c b/backend/escl/escl_capabilities.c index 950efaa..05b3fd2 100644 --- a/backend/escl/escl_capabilities.c +++ b/backend/escl/escl_capabilities.c @@ -48,7 +48,7 @@ header_callback(void *str, size_t size, size_t nmemb, void *userp) char *content = realloc(header->memory, header->size + realsize + 1); if (content == NULL) { - DBG( 1, "Not enough memory (realloc returned NULL)\n"); + DBG( 10, "Not enough memory (realloc returned NULL)\n"); return (0); } header->memory = content; @@ -201,10 +201,8 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type) { const char *name = (const char *)node->name; if (strcmp(name, "ColorMode") == 0) { +#ifndef HAVE_POPPLER_GLIB const char *color = (SANE_String_Const)xmlNodeGetContent(node); -#if HAVE_POPPLER_GLIB - if (type == PLATEN || strcmp(color, "BlackAndWhite1")) -#else if (strcmp(color, "BlackAndWhite1")) #endif scanner->caps[type].ColorModes = char_to_array(scanner->caps[type].ColorModes, &scanner->caps[type].ColorModesSize, (SANE_String_Const)xmlNodeGetContent(node), 1); @@ -235,14 +233,14 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type) } #endif #if(defined HAVE_TIFFIO_H) - else if(type == PLATEN && !strcmp(scanner->caps[type].DocumentFormats[i], "image/tiff")) + else if(!strcmp(scanner->caps[type].DocumentFormats[i], "image/tiff")) { have_tiff = SANE_TRUE; scanner->caps[type].have_tiff = i; } #endif #if HAVE_POPPLER_GLIB - else if(type == PLATEN && !strcmp(scanner->caps[type].DocumentFormats[i], "application/pdf")) + else if(!strcmp(scanner->caps[type].DocumentFormats[i], "application/pdf")) { have_pdf = SANE_TRUE; scanner->caps[type].have_pdf = i; @@ -568,9 +566,9 @@ escl_capabilities(ESCL_Device *device, char *blacklist, SANE_Status *status) curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); CURLcode res = curl_easy_perform(curl_handle); if (res == CURLE_OK) - DBG( 1, "Create NewJob : the scanner header responded : [%s]\n", header->memory); + DBG( 10, "Create NewJob : the scanner header responded : [%s]\n", header->memory); if (res != CURLE_OK) { - DBG( 1, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); + DBG( 10, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); *status = SANE_STATUS_INVAL; goto clean_data; } diff --git a/backend/escl/escl_crop.c b/backend/escl/escl_crop.c index 59284ac..a7e0fa0 100644 --- a/backend/escl/escl_crop.c +++ b/backend/escl/escl_crop.c @@ -44,7 +44,7 @@ escl_crop_surface(capabilities_t *scanner, int real_h = 0; unsigned char *surface_crop = NULL; - DBG( 1, "Escl Image Crop\n"); + DBG( 10, "Escl Image Crop\n"); ratio = (double)w / (double)scanner->caps[scanner->source].width; scanner->caps[scanner->source].width = w; if (scanner->caps[scanner->source].pos_x < 0) @@ -62,18 +62,18 @@ escl_crop_surface(capabilities_t *scanner, y_off = (int)((double)scanner->caps[scanner->source].pos_y * ratio); real_h = scanner->caps[scanner->source].height - y_off; - DBG( 1, "Escl Image Crop [%dx%d|%dx%d]\n", scanner->caps[scanner->source].pos_x, scanner->caps[scanner->source].pos_y, + DBG( 10, "Escl Image Crop [%dx%d|%dx%d]\n", scanner->caps[scanner->source].pos_x, scanner->caps[scanner->source].pos_y, scanner->caps[scanner->source].width, scanner->caps[scanner->source].height); *width = real_w; *height = real_h; - DBG( 1, "Escl Image Crop [%dx%d]\n", *width, *height); + DBG( 10, "Escl Image Crop [%dx%d]\n", *width, *height); if (x_off > 0 || real_w < scanner->caps[scanner->source].width || y_off > 0 || real_h < scanner->caps[scanner->source].height) { surface_crop = (unsigned char *)malloc (sizeof (unsigned char) * real_w * real_h * bps); if(!surface_crop) { - DBG( 1, "Escl Crop : Surface_crop Memory allocation problem\n"); + DBG( 10, "Escl Crop : Surface_crop Memory allocation problem\n"); free(surface); surface = NULL; goto finish; diff --git a/backend/escl/escl_devices.c b/backend/escl/escl_devices.c index a2fdb80..05598ed 100644 --- a/backend/escl/escl_devices.c +++ b/backend/escl/escl_devices.c @@ -193,21 +193,21 @@ escl_devices(SANE_Status *status) *status = SANE_STATUS_GOOD; if (!(simple_poll = avahi_simple_poll_new())) { - DBG( 1, "Failed to create simple poll object.\n"); + DBG( 10, "Failed to create simple poll object.\n"); *status = SANE_STATUS_INVAL; goto fail; } client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error); if (!client) { - DBG( 1, "Failed to create client: %s\n", avahi_strerror(error)); + DBG( 10, "Failed to create client: %s\n", avahi_strerror(error)); *status = SANE_STATUS_INVAL; goto fail; } if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_uscan._tcp", NULL, 0, browse_callback, client))) { - DBG( 1, "Failed to create service browser: %s\n", + DBG( 10, "Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(client))); *status = SANE_STATUS_INVAL; goto fail; @@ -216,7 +216,7 @@ escl_devices(SANE_Status *status) AVAHI_PROTO_UNSPEC, "_uscans._tcp", NULL, 0, browse_callback, client))) { - DBG( 1, "Failed to create service browser: %s\n", + DBG( 10, "Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(client))); *status = SANE_STATUS_INVAL; goto fail; diff --git a/backend/escl/escl_jpeg.c b/backend/escl/escl_jpeg.c index 62c20c0..9008dae 100644 --- a/backend/escl/escl_jpeg.c +++ b/backend/escl/escl_jpeg.c @@ -179,7 +179,7 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps) if (surface != NULL) free(surface); fseek(scanner->tmp, start, SEEK_SET); - DBG( 1, "Escl Jpeg : Error reading jpeg\n"); + DBG( 10, "Escl Jpeg : Error reading jpeg\n"); if (scanner->tmp) { fclose(scanner->tmp); scanner->tmp = NULL; @@ -241,7 +241,7 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps) surface = malloc(cinfo.output_width * cinfo.output_height * cinfo.output_components); if (surface == NULL) { jpeg_destroy_decompress(&cinfo); - DBG( 1, "Escl Jpeg : Memory allocation problem\n"); + DBG( 10, "Escl Jpeg : Memory allocation problem\n"); if (scanner->tmp) { fclose(scanner->tmp); scanner->tmp = NULL; diff --git a/backend/escl/escl_mupdf.c b/backend/escl/escl_mupdf.c index dd23482..f5b3b7e 100644 --- a/backend/escl/escl_mupdf.c +++ b/backend/escl/escl_mupdf.c @@ -137,7 +137,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED); if (!ctx) { - DBG(1, "cannot create mupdf context\n"); + DBG(10, "cannot create mupdf context\n"); status = SANE_STATUS_INVAL; goto close_file; } @@ -147,7 +147,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) fz_register_document_handlers(ctx); fz_catch(ctx) { - DBG(1, "cannot register document handlers: %s\n", fz_caught_message(ctx)); + DBG(10, "cannot register document handlers: %s\n", fz_caught_message(ctx)); status = SANE_STATUS_INVAL; goto drop_context; } @@ -157,7 +157,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) stream = fz_open_file_ptr_escl(ctx, scanner->tmp); fz_catch(ctx) { - DBG(1, "cannot open stream: %s\n", fz_caught_message(ctx)); + DBG(10, "cannot open stream: %s\n", fz_caught_message(ctx)); status = SANE_STATUS_INVAL; goto drop_context; } @@ -167,7 +167,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) fz_seek(ctx, stream, 0, SEEK_SET); fz_catch(ctx) { - DBG(1, "cannot seek stream: %s\n", fz_caught_message(ctx)); + DBG(10, "cannot seek stream: %s\n", fz_caught_message(ctx)); status = SANE_STATUS_INVAL; goto drop_stream; } @@ -177,7 +177,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) doc = fz_open_document_with_stream(ctx, "filename.pdf", stream); fz_catch(ctx) { - DBG(1, "cannot open document: %s\n", fz_caught_message(ctx)); + DBG(10, "cannot open document: %s\n", fz_caught_message(ctx)); status = SANE_STATUS_INVAL; goto drop_stream; } @@ -187,14 +187,14 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) page_count = fz_count_pages(ctx, doc); fz_catch(ctx) { - DBG(1, "cannot count number of pages: %s\n", fz_caught_message(ctx)); + DBG(10, "cannot count number of pages: %s\n", fz_caught_message(ctx)); status = SANE_STATUS_INVAL; goto drop_document; } if (page_number < 0 || page_number >= page_count) { - DBG(1, "page number out of range: %d (page count %d)\n", page_number + 1, page_count); + DBG(10, "page number out of range: %d (page count %d)\n", page_number + 1, page_count); status = SANE_STATUS_INVAL; goto drop_document; } @@ -209,7 +209,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) pix = fz_new_pixmap_from_page_number(ctx, doc, 0, &ctm, fz_device_rgb(ctx), 0); fz_catch(ctx) { - DBG(1, "cannot render page: %s\n", fz_caught_message(ctx)); + DBG(10, "cannot render page: %s\n", fz_caught_message(ctx)); status = SANE_STATUS_INVAL; goto drop_document; } @@ -220,7 +220,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) // If necessary, trim the image. surface = escl_crop_surface(scanner, surface, pix->w, pix->h, pix->n, width, height); if (!surface) { - DBG( 1, "Escl Pdf : Surface Memory allocation problem\n"); + DBG( 10, "Escl Pdf : Surface Memory allocation problem\n"); status = SANE_STATUS_NO_MEM; goto drop_pix; } diff --git a/backend/escl/escl_newjob.c b/backend/escl/escl_newjob.c index cb48bd1..ed2f4b0 100644 --- a/backend/escl/escl_newjob.c +++ b/backend/escl/escl_newjob.c @@ -96,7 +96,7 @@ download_callback(void *str, size_t size, size_t nmemb, void *userp) char *content = realloc(download->memory, download->size + realsize + 1); if (content == NULL) { - DBG( 1, "Not enough memory (realloc returned NULL)\n"); + DBG( 10, "Not enough memory (realloc returned NULL)\n"); return (0); } download->memory = content; @@ -144,19 +144,19 @@ escl_newjob (capabilities_t *scanner, const ESCL_Device *device, SANE_Status *st *status = SANE_STATUS_GOOD; if (device == NULL || scanner == NULL) { *status = SANE_STATUS_NO_MEM; - DBG( 1, "Create NewJob : the name or the scan are invalid.\n"); + DBG( 10, "Create NewJob : the name or the scan are invalid.\n"); return (NULL); } upload = (struct downloading *)calloc(1, sizeof(struct downloading)); if (upload == NULL) { *status = SANE_STATUS_NO_MEM; - DBG( 1, "Create NewJob : memory allocation failure\n"); + DBG( 10, "Create NewJob : memory allocation failure\n"); return (NULL); } download = (struct downloading *)calloc(1, sizeof(struct downloading)); if (download == NULL) { free(upload); - DBG( 1, "Create NewJob : memory allocation failure\n"); + DBG( 10, "Create NewJob : memory allocation failure\n"); *status = SANE_STATUS_NO_MEM; return (NULL); } @@ -168,38 +168,21 @@ escl_newjob (capabilities_t *scanner, const ESCL_Device *device, SANE_Status *st int have_tiff = scanner->caps[scanner->source].have_tiff; int have_pdf = scanner->caps[scanner->source].have_pdf; - if ((scanner->source == PLATEN && have_pdf == -1) || - (scanner->source > PLATEN)) { - if (have_tiff != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_tiff]); - } - else if (have_png != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_png]); - } - else if (have_jpeg != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_jpeg]); - } + if (have_pdf != -1) { + scanner->caps[scanner->source].default_format = + strdup(scanner->caps[scanner->source].DocumentFormats[have_pdf]); } - else { - if (have_pdf != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_pdf]); - } - else if (have_tiff != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_tiff]); - } - else if (have_png != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_png]); - } - else if (have_jpeg != -1) { - scanner->caps[scanner->source].default_format = - strdup(scanner->caps[scanner->source].DocumentFormats[have_jpeg]); - } + else if (have_tiff != -1) { + scanner->caps[scanner->source].default_format = + strdup(scanner->caps[scanner->source].DocumentFormats[have_tiff]); + } + else if (have_png != -1) { + scanner->caps[scanner->source].default_format = + strdup(scanner->caps[scanner->source].DocumentFormats[have_png]); + } + else if (have_jpeg != -1) { + scanner->caps[scanner->source].default_format = + strdup(scanner->caps[scanner->source].DocumentFormats[have_jpeg]); } if (atof ((const char *)device->version) <= 2.0) { @@ -222,7 +205,7 @@ escl_newjob (capabilities_t *scanner, const ESCL_Device *device, SANE_Status *st " <scan:Duplex>%s</scan:Duplex>", scanner->source == ADFDUPLEX ? "true" : "false"); } - DBG( 1, "Create NewJob : %s\n", scanner->caps[scanner->source].default_format); + DBG( 10, "Create NewJob : %s\n", scanner->caps[scanner->source].default_format); if (scanner->caps[scanner->source].pos_x > scanner->caps[scanner->source].width) off_x = (scanner->caps[scanner->source].pos_x > scanner->caps[scanner->source].width) / 2; if (scanner->caps[scanner->source].pos_y > scanner->caps[scanner->source].height) @@ -295,7 +278,7 @@ escl_newjob (capabilities_t *scanner, const ESCL_Device *device, SANE_Status *st upload->memory = strdup(cap_data); upload->size = strlen(cap_data); wake_up_device: - DBG( 1, "Create NewJob : %s\n", cap_data); + DBG( 10, "Create NewJob : %s\n", cap_data); download->memory = malloc(1); download->size = 0; curl_handle = curl_easy_init(); @@ -310,12 +293,12 @@ wake_up_device: curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); CURLcode res = curl_easy_perform(curl_handle); if (res != CURLE_OK) { - DBG( 1, "Create NewJob : the scanner responded incorrectly: %s\n", curl_easy_strerror(res)); + DBG( 10, "Create NewJob : the scanner responded incorrectly: %s\n", curl_easy_strerror(res)); *status = SANE_STATUS_INVAL; } else { if (download->memory != NULL) { - char *tmp_location = strstr(download->memory, "Location:"); + char *tmp_location = strcasestr(download->memory, "Location:"); if (tmp_location) { temporary = strchr(tmp_location, '\r'); if (temporary == NULL) @@ -325,7 +308,7 @@ wake_up_device: location = strrchr(tmp_location,'/'); if (location) { result = strdup(location); - DBG( 1, "Create NewJob : %s\n", result); + DBG( 10, "Create NewJob : %s\n", result); *temporary = '\n'; *location = '\0'; location = strrchr(tmp_location,'/'); @@ -333,7 +316,7 @@ wake_up_device: if (location) { location++; scanner->scanJob = strdup(location); - DBG( 1, "Full location header [%s]\n", scanner->scanJob); + DBG( 10, "Full location header [%s]\n", scanner->scanJob); } else scanner->scanJob = strdup("ScanJobs"); @@ -341,14 +324,14 @@ wake_up_device: } } if (result == NULL) { - DBG( 1, "Error : Create NewJob, no location: %s\n", download->memory); + DBG( 10, "Error : Create NewJob, no location: %s\n", download->memory); *status = SANE_STATUS_INVAL; } free(download->memory); download->memory = NULL; } else { - DBG( 1, "Create NewJob : The creation of the failed job: %s\n", download->memory); + DBG( 10, "Create NewJob : The creation of the failed job: %s\n", download->memory); // If "409 Conflict" appear it means that there is no paper in feeder if (strstr(download->memory, "409 Conflict") != NULL) *status = SANE_STATUS_NO_DOCS; @@ -363,7 +346,7 @@ wake_up_device: } else { *status = SANE_STATUS_NO_MEM; - DBG( 1, "Create NewJob : The creation of the failed job\n"); + DBG( 10, "Create NewJob : The creation of the failed job\n"); return (NULL); } } diff --git a/backend/escl/escl_pdf.c b/backend/escl/escl_pdf.c index 8277e1d..0bfa3b3 100644 --- a/backend/escl/escl_pdf.c +++ b/backend/escl/escl_pdf.c @@ -121,21 +121,21 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) file = g_mapped_file_new_from_fd (fileno (scanner->tmp), 0, NULL); if (!file) { - DBG(1, "Error : g_mapped_file_new_from_fd"); + DBG(10, "Error : g_mapped_file_new_from_fd"); status = SANE_STATUS_INVAL; goto close_file; } bytes = g_mapped_file_get_bytes (file); if (!bytes) { - DBG(1, "Error : g_mapped_file_get_bytes"); + DBG(10, "Error : g_mapped_file_get_bytes"); status = SANE_STATUS_INVAL; goto free_file; } doc = poppler_document_new_from_bytes (bytes, NULL, NULL); if (!doc) { - DBG(1, "Error : poppler_document_new_from_bytes"); + DBG(10, "Error : poppler_document_new_from_bytes"); status = SANE_STATUS_INVAL; goto free_bytes; } @@ -145,14 +145,14 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) data = (char*)set_file_in_buffer(scanner->tmp, &size); if (!data) { - DBG(1, "Error : set_file_in_buffer"); + DBG(10, "Error : set_file_in_buffer"); status = SANE_STATUS_INVAL; goto close_file; } doc = poppler_document_new_from_data (data, size, NULL, NULL); if (!doc) { - DBG(1, "Error : poppler_document_new_from_data"); + DBG(10, "Error : poppler_document_new_from_data"); status = SANE_STATUS_INVAL; goto free_data; } @@ -160,7 +160,7 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) page = poppler_document_get_page (doc, 0); if (!page) { - DBG(1, "Error : poppler_document_get_page"); + DBG(10, "Error : poppler_document_get_page"); status = SANE_STATUS_INVAL; goto free_doc; } @@ -172,14 +172,14 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) h = (int)ceil(dh); cairo_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h); if (!cairo_surface) { - DBG(1, "Error : cairo_image_surface_create"); + DBG(10, "Error : cairo_image_surface_create"); status = SANE_STATUS_INVAL; goto free_page; } cr = cairo_create (cairo_surface); if (!cairo_surface) { - DBG(1, "Error : cairo_create"); + DBG(10, "Error : cairo_create"); status = SANE_STATUS_INVAL; goto free_surface; } @@ -196,26 +196,26 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) int st = cairo_status(cr); if (st) { - DBG(1, "%s", cairo_status_to_string (st)); + DBG(10, "%s", cairo_status_to_string (st)); status = SANE_STATUS_INVAL; goto destroy_cr; } *bps = 3; - DBG(1, "Escl Pdf : Image Size [%dx%d]\n", w, h); + DBG(10, "Escl Pdf : Image Size [%dx%d]\n", w, h); surface = cairo_surface_to_pixels (cairo_surface, *bps); if (!surface) { status = SANE_STATUS_NO_MEM; - DBG(1, "Escl Pdf : Surface Memory allocation problem"); + DBG(10, "Escl Pdf : Surface Memory allocation problem"); goto destroy_cr; } // If necessary, trim the image. surface = escl_crop_surface(scanner, surface, w, h, *bps, width, height); if (!surface) { - DBG(1, "Escl Pdf Crop: Surface Memory allocation problem"); + DBG(10, "Escl Pdf Crop: Surface Memory allocation problem"); status = SANE_STATUS_NO_MEM; } diff --git a/backend/escl/escl_png.c b/backend/escl/escl_png.c index 294ec00..fc8d02d 100644 --- a/backend/escl/escl_png.c +++ b/backend/escl/escl_png.c @@ -64,7 +64,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) // check for valid magic number if (!png_check_sig (magic, sizeof (magic))) { - DBG( 1, "Escl Png : PNG error is not a valid PNG image!\n"); + DBG( 10, "Escl Png : PNG error is not a valid PNG image!\n"); status = SANE_STATUS_INVAL; goto close_file; } @@ -73,7 +73,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { - DBG( 1, "Escl Png : PNG error create a png read struct\n"); + DBG( 10, "Escl Png : PNG error create a png read struct\n"); status = SANE_STATUS_INVAL; goto close_file; } @@ -81,7 +81,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) png_infop info_ptr = png_create_info_struct (png_ptr); if (!info_ptr) { - DBG( 1, "Escl Png : PNG error create a png info struct\n"); + DBG( 10, "Escl Png : PNG error create a png info struct\n"); png_destroy_read_struct (&png_ptr, NULL, NULL); status = SANE_STATUS_INVAL; goto close_file; @@ -93,7 +93,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) png_destroy_read_struct (&png_ptr, &info_ptr, NULL); if (surface) free (surface); - DBG( 1, "Escl Png : PNG read error.\n"); + DBG( 10, "Escl Png : PNG read error.\n"); status = SANE_STATUS_INVAL; goto close_file; } @@ -115,7 +115,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) png_set_palette_to_rgb (png_ptr); else if (color_type != PNG_COLOR_TYPE_RGB && color_type != PNG_COLOR_TYPE_RGB_ALPHA) { - DBG(1, "PNG format not supported.\n"); + DBG(10, "PNG format not supported.\n"); status = SANE_STATUS_NO_MEM; goto close_file; } @@ -145,7 +145,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) surface = (unsigned char *)malloc (sizeof (unsigned char) * w * h * components); if (!surface) { - DBG( 1, "Escl Png : texels Memory allocation problem\n"); + DBG( 10, "Escl Png : texels Memory allocation problem\n"); status = SANE_STATUS_NO_MEM; goto close_file; } @@ -153,7 +153,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) // setup a pointer array. Each one points at the begening of a row. row_pointers = (png_bytep *)malloc (sizeof (png_bytep) * h); if (!row_pointers) { - DBG( 1, "Escl Png : row_pointers Memory allocation problem\n"); + DBG( 10, "Escl Png : row_pointers Memory allocation problem\n"); free(surface); status = SANE_STATUS_NO_MEM; goto close_file; @@ -169,7 +169,7 @@ get_PNG_data(capabilities_t *scanner, int *width, int *height, int *bps) // If necessary, trim the image. surface = escl_crop_surface(scanner, surface, w, h, components, width, height); if (!surface) { - DBG( 1, "Escl Png : Surface Memory allocation problem\n"); + DBG( 10, "Escl Png : Surface Memory allocation problem\n"); status = SANE_STATUS_NO_MEM; goto close_file; } diff --git a/backend/escl/escl_reset.c b/backend/escl/escl_reset.c index 95e3f2d..ad3080b 100644 --- a/backend/escl/escl_reset.c +++ b/backend/escl/escl_reset.c @@ -44,7 +44,32 @@ write_callback(void __sane_unused__*str, * This function is called in the 'sane_cancel' function. */ void -escl_scanner(const ESCL_Device *device, char *scanJob, char *result) +escl_delete(const ESCL_Device *device, char *uri) +{ + CURL *curl_handle = NULL; + long answer = 0; + + if (uri == NULL) + return; + curl_handle = curl_easy_init(); + if (curl_handle != NULL) { + escl_curl_url(curl_handle, device, uri); + curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "DELETE"); + if (curl_easy_perform(curl_handle) == CURLE_OK) { + curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &answer); + return; + } + curl_easy_cleanup(curl_handle); + } +} + +/** + * \fn void escl_scanner(const ESCL_Device *device, char *result) + * \brief Function that resets the scanner after each scan, using curl. + * This function is called in the 'sane_cancel' function. + */ +void +escl_scanner(const ESCL_Device *device, char *scanJob, char *result, SANE_Bool status) { CURL *curl_handle = NULL; const char *scan_jobs = "/eSCL/"; @@ -70,10 +95,15 @@ CURL_CALL: if (i >= 15) return; } curl_easy_cleanup(curl_handle); - if (SANE_STATUS_GOOD != escl_status(device, - PLATEN, - NULL, - NULL)) - goto CURL_CALL; + char* end = strrchr(scan_cmd, '/'); + *end = 0; + escl_delete(device, scan_cmd); + if (status) { + if (SANE_STATUS_GOOD != escl_status(device, + PLATEN, + NULL, + NULL)) + goto CURL_CALL; + } } } diff --git a/backend/escl/escl_scan.c b/backend/escl/escl_scan.c index 8af6bb2..b7f344d 100644 --- a/backend/escl/escl_scan.c +++ b/backend/escl/escl_scan.c @@ -83,7 +83,7 @@ escl_scan(capabilities_t *scanner, const ESCL_Device *device, char *scanJob, cha curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, scanner); CURLcode res = curl_easy_perform(curl_handle); if (res != CURLE_OK) { - DBG( 1, "Unable to scan: %s\n", curl_easy_strerror(res)); + DBG( 10, "Unable to scan: %s\n", curl_easy_strerror(res)); scanner->real_read = 0; fclose(scanner->tmp); scanner->tmp = NULL; diff --git a/backend/escl/escl_status.c b/backend/escl/escl_status.c index 1f848a2..eec8041 100644 --- a/backend/escl/escl_status.c +++ b/backend/escl/escl_status.c @@ -29,6 +29,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <libxml/parser.h> @@ -52,7 +53,7 @@ memory_callback_s(void *contents, size_t size, size_t nmemb, void *userp) char *str = realloc(mem->memory, mem->size + realsize + 1); if (str == NULL) { - DBG(1, "not enough memory (realloc returned NULL)\n"); + DBG(10, "not enough memory (realloc returned NULL)\n"); return (0); } mem->memory = str; @@ -224,7 +225,7 @@ reload: curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); CURLcode res = curl_easy_perform(curl_handle); if (res != CURLE_OK) { - DBG( 1, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); + DBG( 10, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); status = SANE_STATUS_INVAL; goto clean_data; } @@ -270,3 +271,135 @@ clean_data: } return (status); } + +static void +print_xml_job_finish(xmlNode *node, + SANE_Status *job) +{ + while (node) { + if (node->type == XML_ELEMENT_NODE) { + if (find_nodes_s(node)) { + if (strcmp((const char *)node->name, "JobState") == 0) { + const char *state = (const char *)xmlNodeGetContent(node); + if (!strcmp(state, "Canceled")) { + *job = SANE_STATUS_GOOD; + DBG(10, "jobId Completed SANE_STATUS_GOOD\n"); + } + else if (!strcmp(state, "Aborted")) { + *job = SANE_STATUS_GOOD; + DBG(10, "jobId Completed SANE_STATUS_GOOD\n"); + } + else if (!strcmp(state, "Completed")) { + *job = SANE_STATUS_GOOD; + DBG(10, "jobId Completed SANE_STATUS_GOOD\n"); + } + } + } + } + print_xml_job_finish(node->children, job); + node = node->next; + } +} + +static void +print_xml_reset_all_jobs (xmlNode *node, + ESCL_Device *device) +{ + DBG(10, "print_xml_reset_all_jobs\n"); + SANE_Status status = SANE_STATUS_DEVICE_BUSY; + while (node) { + if (node->type == XML_ELEMENT_NODE) { + if (find_nodes_s(node)) { + if (strcmp((const char *)node->name, "JobUri") == 0) { + DBG(10, "print_xml_reset_all_jobs: %s\n", node->name); + if (device != NULL) { + print_xml_job_finish (node, &status); + if (status == SANE_STATUS_DEVICE_BUSY) { + char *jobUri = (char *)xmlNodeGetContent(node); + char *job = strrchr((const char *)jobUri, '/'); + char *scanj = NULL; + if (job != NULL) { + if (strstr(jobUri,"ScanJobs")) + scanj = strdup("ScanJobs"); + else + scanj = strdup("ScanJob"); + DBG(10, "print_xml_reset_all_jobs: %s/%s\n", scanj, job); + escl_scanner(device, scanj, job, SANE_FALSE); + free(scanj); + } + DBG(10, "print_xml_reset_all_jobs: sleep to finish the job\n"); + } + } + } + } + } + print_xml_reset_all_jobs (node->children, + device); + node = node->next; + } +} + +/** + * \fn SANE_Status escl_reset_all_jobs (ESCL_Device *device, , char *scanJob) + * \brief Function that forces the end of jobs, using curl. + * This function is called in the 'sane_start' function. + * + * \return status (if everything is OK, status = SANE_STATUS_GOOD, otherwise, SANE_STATUS_NO_MEM/SANE_STATUS_INVAL) + */ +SANE_Status +escl_reset_all_jobs(ESCL_Device *device) +{ + CURL *curl_handle = NULL; + xmlDoc *data = NULL; + xmlNode *node = NULL; + struct idle *var = NULL; + const char *scanner_status = "/eSCL/ScannerStatus"; + SANE_Status status = SANE_STATUS_DEVICE_BUSY; + + DBG(10, "escl_reset_all_jobs\n"); + if (device == NULL) + return (SANE_STATUS_NO_MEM); + DBG(10, "1 - escl_reset_all_jobs\n"); + var = (struct idle*)calloc(1, sizeof(struct idle)); + if (var == NULL) + return (SANE_STATUS_NO_MEM); + DBG(10, "2 - escl_reset_all_jobs\n"); + var->memory = malloc(1); + var->size = 0; + curl_handle = curl_easy_init(); + + escl_curl_url(curl_handle, device, scanner_status); + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, memory_callback_s); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)var); + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); + CURLcode res = curl_easy_perform(curl_handle); + if (res != CURLE_OK) { + DBG( 10, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); + status = SANE_STATUS_INVAL; + goto clean_data1; + } + DBG(10, "3 - escl_reset_all_jobs\n"); + DBG( 10, "eSCL : Status : %s.\n", var->memory); + data = xmlReadMemory(var->memory, var->size, "file.xml", NULL, 0); + if (data == NULL) { + status = SANE_STATUS_NO_MEM; + goto clean_data1; + } + node = xmlDocGetRootElement(data); + if (node == NULL) { + status = SANE_STATUS_NO_MEM; + goto clean1; + } + print_xml_reset_all_jobs (node, device); + status = SANE_STATUS_GOOD; +clean1: + xmlFreeDoc(data); +clean_data1: + xmlCleanupParser(); + xmlMemoryDump(); + curl_easy_cleanup(curl_handle); + free(var->memory); + free(var); + return status; +} diff --git a/backend/escl/escl_tiff.c b/backend/escl/escl_tiff.c index e17554e..6270ff4 100644 --- a/backend/escl/escl_tiff.c +++ b/backend/escl/escl_tiff.c @@ -65,7 +65,7 @@ get_TIFF_data(capabilities_t *scanner, int *width, int *height, int *bps) lseek(fileno(scanner->tmp), 0, SEEK_SET); tif = TIFFFdOpen(fileno(scanner->tmp), "temp", "r"); if (!tif) { - DBG( 1, "Escl Tiff : Can not open, or not a TIFF file.\n"); + DBG( 10, "Escl Tiff : Can not open, or not a TIFF file.\n"); status = SANE_STATUS_INVAL; goto close_file; } @@ -76,14 +76,14 @@ get_TIFF_data(capabilities_t *scanner, int *width, int *height, int *bps) surface = (unsigned char*) malloc(npixels * sizeof (uint32_t)); if (surface == NULL) { - DBG( 1, "Escl Tiff : raster Memory allocation problem.\n"); + DBG( 10, "Escl Tiff : raster Memory allocation problem.\n"); status = SANE_STATUS_INVAL; goto close_tiff; } if (!TIFFReadRGBAImage(tif, w, h, (uint32_t *)surface, 0)) { - DBG( 1, "Escl Tiff : Problem reading image data.\n"); + DBG( 10, "Escl Tiff : Problem reading image data.\n"); status = SANE_STATUS_INVAL; free(surface); goto close_tiff; @@ -94,7 +94,7 @@ get_TIFF_data(capabilities_t *scanner, int *width, int *height, int *bps) // If necessary, trim the image. surface = escl_crop_surface(scanner, surface, w, h, components, width, height); if (!surface) { - DBG( 1, "Escl Tiff : Surface Memory allocation problem\n"); + DBG( 10, "Escl Tiff : Surface Memory allocation problem\n"); status = SANE_STATUS_INVAL; } |