extern int setDefaultScannerOption(SANE_Handle *devHandle, const SANE_Option_Descriptor *sod, int option ) { if ( sod->cap & SANE_CAP_AUTOMATIC ) { int paramSetRet; int status = control_option (devHandle, sod, option, SANE_ACTION_SET_AUTO, NULL, ¶mSetRet); if(status == SANE_STATUS_GOOD) { handleSaneErrors("Cannot set automatically", status, paramSetRet); //updateScanProgress(uuid, SCAN_ERRO_FROM_SCANNER, status); return 1; } } return 0; }
int setOptions( char *uuid, SANE_Handle *openDeviceHandle, int *request_resolution ) { int option = 0; SANE_Status status; SANE_Fixed v_f; SANE_Int v_i; SANE_Bool v_b; char *v_c; //const char *modes[] = { SANE_VALUE_SCAN_MODE_COLOR, SANE_VALUE_SCAN_MODE_GRAY, "Grayscale", NULL }; const char *modes_colour[] = { SANE_VALUE_SCAN_MODE_COLOR, "Color", SANE_VALUE_SCAN_MODE_GRAY, "Grayscale", NULL }; const char *modes_gray[] = { SANE_VALUE_SCAN_MODE_GRAY, "Grayscale", NULL }; const char *speeds[] = { "Auto", "Normal", "Fast", NULL }; const char *compression[] = { "None", NULL }; const char *sources[] = { "Auto", SANE_I18N ("Auto"), "Flatbed", SANE_I18N ("Flatbed"), "FlatBed", "Normal", SANE_I18N ("Normal"), NULL }; int testScanner = 0; char *devName = getScanParam(uuid, SCAN_PARAM_DEVNAME); if ( strstr(devName, "test") != 0 ) { testScanner = 1; } free(devName); for (option = 0; option < 9999; option++) { const SANE_Option_Descriptor *sod = sane_get_option_descriptor (openDeviceHandle, option); // No more options if (sod == NULL) break; // Just a placeholder if (sod->type == SANE_TYPE_GROUP || sod->name == NULL || option == 0) continue; log_option( option, sod ); // Validation if ( (sod->cap & SANE_CAP_SOFT_SELECT) && (sod->cap & SANE_CAP_HARD_SELECT) ) { o_log(DEBUGM, "The backend said that '%s' is both hardward and software settable! Err", sod->name); updateScanProgress(uuid, SCAN_ERRO_FROM_SCANNER, 0); return 0; } // we MUST set this value if ( (sod->cap & SANE_CAP_SOFT_DETECT) && ((sod->cap & SANE_CAP_INACTIVE) == 0) ) { // A hardware setting if ( sod->cap & SANE_CAP_HARD_SELECT ) { o_log(DEBUGM, "We've got no way of telling the user to set the hardward %s! Err", sod->name); } // a software setting else { int paramSetRet = 0; // Set scanning Source if ( strcmp(sod->name, SANE_NAME_SCAN_SOURCE) == 0 ) { if ( !setDefaultScannerOption(openDeviceHandle, sod, option, ¶mSetRet) ) { int i, j; int foundMatch = 0; for (i = 0; sources[i] != NULL; i++) { for (j = 0; sod->constraint.string_list[j]; j++) { if (strcmp (sources[i], sod->constraint.string_list[j]) == 0) break; } if (sod->constraint.string_list[j] != NULL) { v_c = o_strdup(sources[i]); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, (void *)v_c, ¶mSetRet); free(v_c); foundMatch = 1; break; } } if( foundMatch == 0 ) { o_log(DEBUGM, "Non of the available options are appropriate."); } } } // Set scanning mode else if ( strcmp(sod->name, SANE_NAME_SCAN_MODE ) == 0 ) { const char **modes; char *requested_mode = getScanParam(uuid, SCAN_PARAM_FORMAT ); if( 0 == strcmp( "colour", requested_mode ) ) { modes = modes_colour; } else { modes = modes_gray; } free( requested_mode ); int i, j; int foundMatch = 0; for (i = 0; modes[i] != NULL; i++) { for (j = 0; sod->constraint.string_list[j]; j++) { if (strcmp (modes[i], sod->constraint.string_list[j]) == 0) break; } if (sod->constraint.string_list[j] != NULL) { v_c = o_strdup(modes[i]); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, (void *)v_c, ¶mSetRet); free(v_c); foundMatch = 1; break; } } if( foundMatch == 0 ) { o_log(DEBUGM, "Non of the available options are appropriate."); } } else if ( strcmp(sod->name, "batch-scan" ) == 0 ) { v_b = SANE_FALSE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } else if ( strcmp(sod->name, "compression") == 0 ) { int i, j; int foundMatch = 0; for (i = 0; compression[i] != NULL; i++) { for (j = 0; sod->constraint.string_list[j]; j++) { o_log(DEBUGM, "n list: %s", sod->constraint.string_list[j]); if (strcmp (compression[i], sod->constraint.string_list[j]) == 0) break; } if (sod->constraint.string_list[j] != NULL) { o_log(DEBUGM, "Attempting to set compresstion to: %s", compression[i]); v_c = o_strdup(compression[i]); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, (void *)v_c, ¶mSetRet); free(v_c); foundMatch = 1; break; } } if( foundMatch == 0 ) { o_log(DEBUGM, "Non of the available options are appropriate."); } } // Set scanning depth else if ( strcmp(sod->name, SANE_NAME_BIT_DEPTH) == 0 ) { if ( !setDefaultScannerOption(openDeviceHandle, sod, option, ¶mSetRet) ) { if( sod->type == SANE_TYPE_STRING ) { v_c = o_strdup("8"); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, (void *)v_c, ¶mSetRet); free(v_c); } if (sod->type == SANE_TYPE_FIXED) { v_f = SANE_FIX( 8 ); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else { v_i = 8; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_i, ¶mSetRet); } } } // Set Preview mode else if ( strcmp(sod->name, SANE_NAME_PREVIEW) == 0 ) { if ( !setDefaultScannerOption(openDeviceHandle, sod, option, ¶mSetRet) ) { v_b = SANE_FALSE; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } } // Set scanning resolution else if ( strcmp(sod->name, SANE_NAME_SCAN_RESOLUTION) == 0 ) { char *request_resolution_s; request_resolution_s = getScanParam(uuid, SCAN_PARAM_REQUESTED_RESOLUTION); *request_resolution = atoi(request_resolution_s); free(request_resolution_s); if (sod->type == SANE_TYPE_FIXED) { v_f = SANE_FIX( *request_resolution ); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if (sod->type == SANE_TYPE_INT) { int sane_resolution = *request_resolution; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &sane_resolution, ¶mSetRet); } else { int sane_resolution = *request_resolution; if( sod->constraint.range->quant != 0 ) sane_resolution = sane_resolution * sod->constraint.range->quant; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &sane_resolution, ¶mSetRet); } } else if ( strcmp(sod->name, SANE_NAME_SCAN_TL_Y) == 0 ) { v_f = sod->constraint.range->min; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if ( strcmp(sod->name, SANE_NAME_SCAN_TL_X) == 0 ) { v_f = sod->constraint.range->min; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if ( strcmp(sod->name, SANE_NAME_SCAN_BR_Y) == 0 ) { int pagelength; char *length_s; v_f = sod->constraint.range->max; length_s = getScanParam(uuid, SCAN_PARAM_LENGTH); pagelength = atoi(length_s); if(pagelength && pagelength >= 20 && pagelength < 100) v_f = SANE_FIX( ( SANE_UNFIX(v_f) * (double)pagelength) / 100); free(length_s); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if ( strcmp(sod->name, SANE_NAME_SCAN_BR_X) == 0 ) { v_f = sod->constraint.range->max; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if ( strcmp(sod->name, SANE_NAME_BRIGHTNESS) == 0 ) { v_f = 0; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if ( strcmp(sod->name, SANE_NAME_CONTRAST) == 0 ) { v_f = 0; status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_f, ¶mSetRet); } else if ( strcmp(sod->name, SANE_NAME_SCAN_SPEED) == 0) { if ( !setDefaultScannerOption(openDeviceHandle, sod, option, ¶mSetRet) ) { int i, j; int foundMatch = 0; for (i = 0; speeds[i] != NULL; i++) { for (j = 0; sod->constraint.string_list[j]; j++) { if (strcmp (speeds[i], sod->constraint.string_list[j]) == 0) break; } if (sod->constraint.string_list[j] != NULL) { v_c = o_strdup(speeds[i]); status = control_option (openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, (void *)v_c, ¶mSetRet); free(v_c); foundMatch = 1; break; } } if( foundMatch == 0 ) { o_log(DEBUGM, "Non of the available options are appropriate."); } } } else if ( strcmp(sod->name, "custom-gamma") == 0 ) { v_b = SANE_FALSE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } // For the test 'virtual scanner' else if (testScanner == 1) { if ( strcmp(sod->name, "hand-scanner" ) == 0 ) { v_b = SANE_FALSE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } else if ( strcmp(sod->name, "three-pass") == 0 ){ v_b = SANE_FALSE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } else if ( strcmp(sod->name, "three-pass-order") == 0 ) { status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, "RGB", ¶mSetRet); } else if ( strcmp(sod->name, "test-raw_imageture") == 0 ) { status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, "Color pattern", ¶mSetRet); } else if ( strcmp(sod->name, "read-delay") == 0 ) { v_b = SANE_TRUE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } else if ( strcmp(sod->name, "fuzzy-parameters") == 0 ) { v_b = SANE_TRUE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } else if ( strcmp(sod->name, "read-delay-duration") == 0 ) { v_i = 1000; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_i, ¶mSetRet); } else if ( strcmp(sod->name, "read-limit") == 0 ) { v_b = SANE_TRUE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } else if ( strcmp(sod->name, "read-limit-size") == 0 ) { v_i = sod->constraint.range->max; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_i, ¶mSetRet); } else if ( strcmp(sod->name, "read-return-value") == 0 ) { status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, "Default", ¶mSetRet); } else if ( strcmp(sod->name, "ppl-loss") == 0 ) { v_i = 0; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_i, ¶mSetRet); } else if ( strcmp(sod->name, "invert-endianess") == 0 ) { v_b = SANE_FALSE; status = control_option(openDeviceHandle, sod, option, SANE_ACTION_SET_VALUE, &v_b, ¶mSetRet); } } // not a 'well known' option else { // try setting automatically if ( !setDefaultScannerOption(openDeviceHandle, sod, option, ¶mSetRet) ) o_log(DEBUGM, "Could not set authmatically", sod->name); } if( status != SANE_STATUS_GOOD ) { handleSaneErrors("Cannot set no to", sod->name, status, paramSetRet); updateScanProgress(uuid, SCAN_ERRO_FROM_SCANNER, status); return 0; } if ( paramSetRet & SANE_INFO_RELOAD_OPTIONS ) { //start from the beginning again. option = 0; } } // setable option } else { o_log(DEBUGM, "The option does not need to be set."); } } // options loop return 1; }