SANE_Status soapht_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *set_result) { struct soap_session *ps = (struct soap_session *)handle; SANE_Int *int_value = value, mset_result=0; int i, stat=SANE_STATUS_INVAL; char sz[64]; switch(option) { case SOAP_OPTION_COUNT: if (action == SANE_ACTION_GET_VALUE) { *int_value = SOAP_OPTION_MAX; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_SCAN_MODE: if (action == SANE_ACTION_GET_VALUE) { for (i=0; ps->scanModeList[i]; i++) { if (ps->currentScanMode == ps->scanModeMap[i]) { strcpy(value, ps->scanModeList[i]); stat = SANE_STATUS_GOOD; break; } } } else if (action == SANE_ACTION_SET_VALUE) { for (i=0; ps->scanModeList[i]; i++) { if (strcasecmp(ps->scanModeList[i], value) == 0) { ps->currentScanMode = ps->scanModeMap[i]; set_scan_mode_side_effects(ps, ps->currentScanMode); mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; stat = SANE_STATUS_GOOD; break; } } } else { /* Set default. */ ps->currentScanMode = ps->scanModeMap[0]; set_scan_mode_side_effects(ps, ps->currentScanMode); stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_INPUT_SOURCE: if (action == SANE_ACTION_GET_VALUE) { for (i=0; ps->inputSourceList[i]; i++) { if (ps->currentInputSource == ps->inputSourceMap[i]) { strcpy(value, ps->inputSourceList[i]); stat = SANE_STATUS_GOOD; break; } } } else if (action == SANE_ACTION_SET_VALUE) { for (i=0; ps->inputSourceList[i]; i++) { if (strcasecmp(ps->inputSourceList[i], value) == 0) { ps->currentInputSource = ps->inputSourceMap[i]; set_input_source_side_effects(ps, ps->currentInputSource); if(ps->currentInputSource == IS_ADF || ps->currentInputSource == IS_ADF_DUPLEX) { i = ps->adf_resolutionList[0] + 1; while(i--) ps->resolutionList[i] = ps->adf_resolutionList[i]; } else //if(ps->currentInputSource == IS_PLATEN) { i = ps->platen_resolutionList[0] + 1; while(i--) ps->resolutionList[i] = ps->platen_resolutionList[i]; } mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; stat = SANE_STATUS_GOOD; break; } } } else { /* Set default. */ ps->currentInputSource = ps->inputSourceMap[0]; set_input_source_side_effects(ps, ps->currentInputSource); mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_SCAN_RESOLUTION: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentResolution; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { for (i=1; i <= ps->resolutionList[0]; i++) { if (ps->resolutionList[i] == *int_value) { ps->currentResolution = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } if (stat != SANE_STATUS_GOOD) { ps->currentResolution = ps->resolutionList[1]; stat = SANE_STATUS_GOOD; } } else { /* Set default. */ ps->currentResolution = 75; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_CONTRAST: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentContrast; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= SOAP_CONTRAST_MIN && *int_value <= SOAP_CONTRAST_MAX) { ps->currentContrast = *int_value; } else { ps->currentContrast = SOAP_CONTRAST_DEFAULT; } mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; } else { /* Set default. */ ps->currentContrast = SOAP_CONTRAST_DEFAULT; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_BRIGHTNESS: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentBrightness; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= SOAP_BRIGHTNESS_MIN && *int_value <= SOAP_BRIGHTNESS_MAX) { ps->currentBrightness = *int_value; } else { ps->currentBrightness = SOAP_BRIGHTNESS_DEFAULT; } stat = SANE_STATUS_GOOD; } else { /* Set default. */ ps->currentBrightness = SOAP_BRIGHTNESS_DEFAULT; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_COMPRESSION: if (action == SANE_ACTION_GET_VALUE) { for (i=0; ps->compressionList[i]; i++) { if (ps->currentCompression == ps->compressionMap[i]) { strcpy(value, ps->compressionList[i]); stat = SANE_STATUS_GOOD; break; } } } else if (action == SANE_ACTION_SET_VALUE) { for (i=0; ps->compressionList[i]; i++) { if (strcasecmp(ps->compressionList[i], value) == 0) { ps->currentCompression = ps->compressionMap[i]; stat = SANE_STATUS_GOOD; break; } } } else { /* Set default. */ ps->currentCompression = SF_JFIF; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_JPEG_QUALITY: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentJpegQuality; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= MIN_JPEG_COMPRESSION_FACTOR && *int_value <= MAX_JPEG_COMPRESSION_FACTOR) { ps->currentJpegQuality = *int_value; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentJpegQuality = SAFER_JPEG_COMPRESSION_FACTOR; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_TL_X: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentTlx; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->tlxRange.min && *int_value <= ps->tlxRange.max) { ps->currentTlx = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentTlx = ps->tlxRange.min; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_TL_Y: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentTly; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->tlyRange.min && *int_value <= ps->tlyRange.max) { ps->currentTly = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentTly = ps->tlyRange.min; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_BR_X: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentBrx; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->brxRange.min && *int_value <= ps->brxRange.max) { ps->currentBrx = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentBrx = ps->brxRange.max; stat = SANE_STATUS_GOOD; } break; case SOAP_OPTION_BR_Y: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentBry; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->bryRange.min && *int_value <= ps->bryRange.max) { ps->currentBry = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentBry = ps->bryRange.max; stat = SANE_STATUS_GOOD; } break; default: break; } if (set_result) *set_result = mset_result; if (stat != SANE_STATUS_GOOD) { BUG("control_option failed: option=%s action=%s\n", ps->option[option].name, action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto"); } DBG8("sane_hpaio_control_option (option=%s action=%s value=%s)\n", ps->option[option].name, action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto", value ? ps->option[option].type == SANE_TYPE_STRING ? (char *)value : psnprintf(sz, sizeof(sz), "%d", *(int *)value) : "na"); return stat; } /* soapht_control_option */
SANE_Status ledm_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *set_result) { struct ledm_session *ps = (struct ledm_session *)handle; SANE_Int *int_value = value, mset_result=0; int i, stat=SANE_STATUS_INVAL; switch(option) { case LEDM_OPTION_COUNT: if (action == SANE_ACTION_GET_VALUE) { *int_value = LEDM_OPTION_MAX; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_SCAN_MODE: if(action == SANE_ACTION_GET_VALUE) { for(i=0; ps->scanModeList[i]; i++) { if(ps->currentScanMode == ps->scanModeMap[i]) { strcpy(value, ps->scanModeList[i]); stat = SANE_STATUS_GOOD; break; } } } else if (action == SANE_ACTION_SET_VALUE) { for (i=0; ps->scanModeList[i]; i++) { if (strcasecmp(ps->scanModeList[i], value) == 0) { ps->currentScanMode = ps->scanModeMap[i]; set_scan_mode_side_effects(ps, ps->currentScanMode); mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; stat = SANE_STATUS_GOOD; break; } } } else { /* Set default. */ ps->currentScanMode = CE_COLOR8; set_scan_mode_side_effects(ps, ps->currentScanMode); stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_INPUT_SOURCE: if (action == SANE_ACTION_GET_VALUE) { for (i=0; ps->inputSourceList[i]; i++) { if (ps->currentInputSource == ps->inputSourceMap[i]) { strcpy(value, ps->inputSourceList[i]); stat = SANE_STATUS_GOOD; break; } } } else if (action == SANE_ACTION_SET_VALUE) { for (i=0; ps->inputSourceList[i]; i++) { if (strcasecmp(ps->inputSourceList[i], value) == 0) { ps->currentInputSource = ps->inputSourceMap[i]; set_input_source_side_effects(ps, ps->currentInputSource); if(ps->currentInputSource == IS_PLATEN) { i = session->platen_resolutionList[0] + 1; while(i--) session->resolutionList[i] = session->platen_resolutionList[i]; } else { i = session->adf_resolutionList[0] + 1; while(i--) session->resolutionList[i] = session->adf_resolutionList[i]; } ps->currentResolution = session->resolutionList[1]; break; } } /*For some devices resolution varies, when we change 'source' in Xsane. Hence need to update the resolution */ if (i>1) /*Number of sources > 1*/ { if(session->platen_resolutionList[1] != session->adf_resolutionList[1]) ps->currentResolution = session->resolutionList[1]; } mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; stat = SANE_STATUS_GOOD; break; } else { /* Set default. */ ps->currentInputSource = IS_PLATEN; set_input_source_side_effects(ps, ps->currentInputSource); mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_SCAN_RESOLUTION: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentResolution; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { for (i=1; i <= ps->resolutionList[0]; i++) { if (ps->resolutionList[i] == *int_value) { ps->currentResolution = *int_value; if(ps->currentResolution == 4800) SendScanEvent(ps->uri, EVENT_SIZE_WARNING); mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } if (stat != SANE_STATUS_GOOD) { ps->currentResolution = ps->resolutionList[1]; stat = SANE_STATUS_GOOD; } } else { /* Set default. */ ps->currentResolution = 75; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_CONTRAST: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentContrast; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= LEDM_CONTRAST_MIN && *int_value <= LEDM_CONTRAST_MAX) { ps->currentContrast = *int_value; } else { ps->currentContrast = LEDM_CONTRAST_DEFAULT; } mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; } else { /* Set default. */ ps->currentContrast = LEDM_CONTRAST_DEFAULT; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_COMPRESSION: if (action == SANE_ACTION_GET_VALUE) { for (i=0; ps->compressionList[i]; i++) { if (ps->currentCompression == ps->compressionMap[i]) { strcpy(value, ps->compressionList[i]); stat = SANE_STATUS_GOOD; break; } } } else if (action == SANE_ACTION_SET_VALUE) { for (i=0; ps->compressionList[i]; i++) { if (strcasecmp(ps->compressionList[i], value) == 0) { ps->currentCompression = ps->compressionMap[i]; stat = SANE_STATUS_GOOD; break; } } } else { /* Set default. */ ps->currentCompression = SF_JPEG; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_JPEG_QUALITY: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentJpegQuality; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= MIN_JPEG_COMPRESSION_FACTOR && *int_value <= MAX_JPEG_COMPRESSION_FACTOR) { ps->currentJpegQuality = *int_value; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentJpegQuality = SAFER_JPEG_COMPRESSION_FACTOR; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_TL_X: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentTlx; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->tlxRange.min && *int_value <= ps->tlxRange.max) { ps->currentTlx = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentTlx = ps->tlxRange.min; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_TL_Y: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentTly; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->tlyRange.min && *int_value <= ps->tlyRange.max) { ps->currentTly = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentTly = ps->tlyRange.min; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_BR_X: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentBrx; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->brxRange.min && *int_value <= ps->brxRange.max) { ps->currentBrx = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentBrx = ps->brxRange.max; stat = SANE_STATUS_GOOD; } break; case LEDM_OPTION_BR_Y: if (action == SANE_ACTION_GET_VALUE) { *int_value = ps->currentBry; stat = SANE_STATUS_GOOD; } else if (action == SANE_ACTION_SET_VALUE) { if (*int_value >= ps->bryRange.min && *int_value <= ps->bryRange.max) { ps->currentBry = *int_value; mset_result |= SANE_INFO_RELOAD_PARAMS; stat = SANE_STATUS_GOOD; break; } } else { /* Set default. */ ps->currentBry = ps->bryRange.max; stat = SANE_STATUS_GOOD; } break; default: break; } if (set_result) *set_result = mset_result; if (stat != SANE_STATUS_GOOD) { BUG("control_option failed: option=%s action=%s\n", ps->option[option].name, action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto"); } return stat; } /* ledm_control_option */