修复xsane更改颜色模式……影响图像大小的参数时崩溃问题

This commit is contained in:
gb 2023-02-18 10:26:38 +08:00
parent a40f0015a9
commit 0d7b85cf27
3 changed files with 33 additions and 13 deletions

View File

@ -1383,7 +1383,7 @@ int hg_scanner::setting_color_mode(void* data)
if(ret == SCANNER_ERR_NOT_EXACT) if(ret == SCANNER_ERR_NOT_EXACT)
strcpy((char*)data, str.c_str()); strcpy((char*)data, str.c_str());
return ret; return SCANNER_ERR_RELOAD_OPT_PARAM; // ret;
} }
int hg_scanner::setting_multi_out(void* data) int hg_scanner::setting_multi_out(void* data)
{ {
@ -1400,7 +1400,7 @@ int hg_scanner::setting_multi_out(void* data)
//} //}
//on_color_mode_changed(val); //on_color_mode_changed(val);
return SCANNER_ERR_OK; return SCANNER_ERR_RELOAD_OPT_PARAM; // SCANNER_ERR_OK;
} }
int hg_scanner::setting_multi_out_type(void* data) int hg_scanner::setting_multi_out_type(void* data)
{ {
@ -1421,7 +1421,7 @@ int hg_scanner::setting_multi_out_type(void* data)
color = COLOR_MODE_24_BITS; color = COLOR_MODE_24_BITS;
on_color_mode_changed(color);*/ on_color_mode_changed(color);*/
return ret; return SCANNER_ERR_RELOAD_OPT_PARAM; // ret;
} }
int hg_scanner::setting_rid_color(void* data) int hg_scanner::setting_rid_color(void* data)
{ {
@ -1539,7 +1539,7 @@ int hg_scanner::setting_paper(void* data)
if(old != image_prc_param_.bits.paper) if(old != image_prc_param_.bits.paper)
reset_custom_area_range(image_prc_param_.bits.paper); reset_custom_area_range(image_prc_param_.bits.paper);
return ret; return SCANNER_ERR_RELOAD_OPT_PARAM; // ret;
} }
int hg_scanner::setting_paper_check(void* data) int hg_scanner::setting_paper_check(void* data)
{ {
@ -1629,7 +1629,7 @@ int hg_scanner::setting_resolution(void* data)
VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Change resolution from %d to %d = %s\n", old, *((int*)data), hg_scanner_err_name(ret)); VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Change resolution from %d to %d = %s\n", old, *((int*)data), hg_scanner_err_name(ret));
//*((int*)data) = resolution_; //*((int*)data) = resolution_;
return ret; return SCANNER_ERR_RELOAD_OPT_PARAM; // ret;
} }
int hg_scanner::setting_exchagnge(void* data) int hg_scanner::setting_exchagnge(void* data)
{ {
@ -2929,7 +2929,8 @@ int hg_scanner::set_setting(const char* name, void* data, int len)
ret = set_setting_value(real_n.c_str(), data, len); ret = set_setting_value(real_n.c_str(), data, len);
} }
if (ret == SCANNER_ERR_OK || ret == SCANNER_ERR_NOT_EXACT || ret == SCANNER_ERR_CONFIGURATION_CHANGED) if (ret == SCANNER_ERR_OK || ret == SCANNER_ERR_NOT_EXACT || ret == SCANNER_ERR_CONFIGURATION_CHANGED
|| ret == SCANNER_ERR_RELOAD_IMAGE_PARAM || ret == SCANNER_ERR_RELOAD_OPT_PARAM)
{ {
std::string type(""), name(get_setting_item_string(real_n.c_str(), "title")); std::string type(""), name(get_setting_item_string(real_n.c_str(), "title"));

View File

@ -211,6 +211,8 @@ extern "C"
RETURN_IF(err, SCANNER_ERR_IO_PENDING); RETURN_IF(err, SCANNER_ERR_IO_PENDING);
RETURN_IF(err, SCANNER_ERR_NOT_EXACT); RETURN_IF(err, SCANNER_ERR_NOT_EXACT);
RETURN_IF(err, SCANNER_ERR_CONFIGURATION_CHANGED); RETURN_IF(err, SCANNER_ERR_CONFIGURATION_CHANGED);
RETURN_IF(err, SCANNER_ERR_RELOAD_IMAGE_PARAM);
RETURN_IF(err, SCANNER_ERR_RELOAD_OPT_PARAM);
RETURN_IF(err, SCANNER_ERR_NOT_OPEN); RETURN_IF(err, SCANNER_ERR_NOT_OPEN);
RETURN_IF(err, SCANNER_ERR_NOT_START); RETURN_IF(err, SCANNER_ERR_NOT_START);
RETURN_IF(err, SCANNER_ERR_NOT_ANY_MORE); RETURN_IF(err, SCANNER_ERR_NOT_ANY_MORE);
@ -279,6 +281,8 @@ extern "C"
RETURN_DESC_IF(err, SCANNER_ERR_IO_PENDING); RETURN_DESC_IF(err, SCANNER_ERR_IO_PENDING);
RETURN_DESC_IF(err, SCANNER_ERR_NOT_EXACT); RETURN_DESC_IF(err, SCANNER_ERR_NOT_EXACT);
RETURN_DESC_IF(err, SCANNER_ERR_CONFIGURATION_CHANGED); RETURN_DESC_IF(err, SCANNER_ERR_CONFIGURATION_CHANGED);
RETURN_DESC_IF(err, SCANNER_ERR_RELOAD_IMAGE_PARAM);
RETURN_DESC_IF(err, SCANNER_ERR_RELOAD_OPT_PARAM);
RETURN_DESC_IF(err, SCANNER_ERR_NOT_OPEN); RETURN_DESC_IF(err, SCANNER_ERR_NOT_OPEN);
RETURN_DESC_IF(err, SCANNER_ERR_NOT_START); RETURN_DESC_IF(err, SCANNER_ERR_NOT_START);
RETURN_DESC_IF(err, SCANNER_ERR_NOT_ANY_MORE); RETURN_DESC_IF(err, SCANNER_ERR_NOT_ANY_MORE);

View File

@ -51,6 +51,8 @@ namespace local_utility
RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_IO_PENDING, SANE_STATUS_GOOD); RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_IO_PENDING, SANE_STATUS_GOOD);
RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NOT_EXACT, SANE_STATUS_GOOD); RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NOT_EXACT, SANE_STATUS_GOOD);
RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_CONFIGURATION_CHANGED, SANE_STATUS_GOOD); RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_CONFIGURATION_CHANGED, SANE_STATUS_GOOD);
RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_RELOAD_IMAGE_PARAM, SANE_STATUS_GOOD);
RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_RELOAD_OPT_PARAM, SANE_STATUS_GOOD);
//RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NOT_OPEN, SANE_STATUS_NO_DOCS); //RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NOT_OPEN, SANE_STATUS_NO_DOCS);
//RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NOT_START, SANE_STATUS_NO_DOCS); //RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NOT_START, SANE_STATUS_NO_DOCS);
RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NO_DATA, SANE_STATUS_EOF); RETURN_MATCH_ERROR(hgerr, SCANNER_ERR_NO_DATA, SANE_STATUS_EOF);
@ -77,6 +79,8 @@ namespace local_utility
RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_IO_PENDING); RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_IO_PENDING);
RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_NOT_EXACT); RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_NOT_EXACT);
RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_CONFIGURATION_CHANGED); RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_CONFIGURATION_CHANGED);
RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_RELOAD_IMAGE_PARAM);
RETURN_MATCH_ERROR(statu, SANE_STATUS_GOOD, SCANNER_ERR_RELOAD_OPT_PARAM);
//RETURN_MATCH_ERROR(statu, SANE_STATUS_NO_DOCS, SCANNER_ERR_NOT_OPEN); //RETURN_MATCH_ERROR(statu, SANE_STATUS_NO_DOCS, SCANNER_ERR_NOT_OPEN);
//RETURN_MATCH_ERROR(statu, SANE_STATUS_NO_DOCS, SCANNER_ERR_NOT_START); //RETURN_MATCH_ERROR(statu, SANE_STATUS_NO_DOCS, SCANNER_ERR_NOT_START);
RETURN_MATCH_ERROR(statu, SANE_STATUS_EOF, SCANNER_ERR_NO_DATA); RETURN_MATCH_ERROR(statu, SANE_STATUS_EOF, SCANNER_ERR_NO_DATA);
@ -171,7 +175,7 @@ namespace local_utility
return str > bgn; return str > bgn;
} }
// æšä¸<EFBFBD>支æŒ<EFBFBD>ç§å­¦è®¡æ•°æ³?1.2e+10 // 暂不支持科学计数<EFBFBD>?1.2e+10
bool get_number(const char*& str, double& val) bool get_number(const char*& str, double& val)
{ {
const char* bgn = str; const char* bgn = str;
@ -583,7 +587,7 @@ SANE_Option_Descriptor* hg_sane_middleware::string_option_to_SANE_descriptor(con
sod->unit = SANE_UNIT_NONE; sod->unit = SANE_UNIT_NONE;
sod->size = values.size(); sod->size = values.size();
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
| SANE_CAP_AUTOMATIC; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€? | SANE_CAP_AUTOMATIC; // 硬件可设置默认<EFBFBD>?
if (values.size()) if (values.size())
{ {
sod->constraint_type = SANE_CONSTRAINT_STRING_LIST; sod->constraint_type = SANE_CONSTRAINT_STRING_LIST;
@ -704,7 +708,7 @@ SANE_Option_Descriptor* hg_sane_middleware::number_option_to_SANE_descriptor(con
sod->unit = SANE_UNIT_NONE; sod->unit = SANE_UNIT_NONE;
sod->size = sizeof(SANE_Word); sod->size = sizeof(SANE_Word);
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
/*| SANE_CAP_AUTOMATIC*/; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€? /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认<EFBFBD>?
if (values.size()) if (values.size())
{ {
@ -754,7 +758,7 @@ SANE_Option_Descriptor* hg_sane_middleware::number_option_to_SANE_descriptor(con
sod->unit = SANE_UNIT_NONE; sod->unit = SANE_UNIT_NONE;
sod->size = sizeof(SANE_Word); sod->size = sizeof(SANE_Word);
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
/*| SANE_CAP_AUTOMATIC*/; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€? /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认<EFBFBD>?
if (values.size()) if (values.size())
{ {
@ -1015,7 +1019,7 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st
//if (jsn->get_value("enable", enabled) && !enabled) //if (jsn->get_value("enable", enabled) && !enabled)
// ret->cap |= SANE_CAP_INACTIVE; // ret->cap |= SANE_CAP_INACTIVE;
// å…³è<EFBFBD>”é¡? // 关联<EFBFBD>?
json* depend = NULL; json* depend = NULL;
SLAVEOP so; SLAVEOP so;
if (jsn->get_value("depend_or", depend)) if (jsn->get_value("depend_or", depend))
@ -1371,7 +1375,7 @@ SANE_Status hg_sane_middleware::get_devices(const SANE_Device*** device_list, SA
if (hgerr == SCANNER_ERR_INSUFFICIENT_MEMORY) if (hgerr == SCANNER_ERR_INSUFFICIENT_MEMORY)
{ {
count += 4; // 为两次hg_scanner_enumé—´éš™å<EFBFBD>¯èƒ½æ°å¢žçš„设备预留空é—? count += 4; // 为两次hg_scanner_enum间隙可能新增的设备预留空<EFBFBD>?
dev = (ScannerInfo*)local_utility::acquire_memory(sizeof(ScannerInfo) * count, "hg_sane_middleware::get_devices"); dev = (ScannerInfo*)local_utility::acquire_memory(sizeof(ScannerInfo) * count, "hg_sane_middleware::get_devices");
hgerr = hg_scanner_enum(dev, &count, local_only); hgerr = hg_scanner_enum(dev, &count, local_only);
if (hgerr != SCANNER_ERR_OK) if (hgerr != SCANNER_ERR_OK)
@ -1674,6 +1678,17 @@ SANE_Status hg_sane_middleware::set_option(SANE_Handle h, const void* option, SA
on_SCANNER_ERR_CONFIGURATION_CHANGED(dev); on_SCANNER_ERR_CONFIGURATION_CHANGED(dev);
err = (scanner_err)SANE_INFO_RELOAD_OPTIONS; err = (scanner_err)SANE_INFO_RELOAD_OPTIONS;
} }
else if(err == SCANNER_ERR_RELOAD_IMAGE_PARAM)
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "the setting '%s' affects image parameter, APP should re-get ...\n", desc->title);
err = (scanner_err)SANE_INFO_RELOAD_PARAMS;
}
else if(err == SCANNER_ERR_RELOAD_OPT_PARAM)
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "the setting '%s' affects image parameter and options, APP should re-get image info and reload options...\n", desc->title);
on_SCANNER_ERR_CONFIGURATION_CHANGED(dev);
err = (scanner_err)(SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS);
}
else if (err == SCANNER_ERR_ACCESS_DENIED) else if (err == SCANNER_ERR_ACCESS_DENIED)
{ {
status = SANE_STATUS_ACCESS_DENIED; status = SANE_STATUS_ACCESS_DENIED;
@ -1749,7 +1764,7 @@ bool hg_sane_middleware::is_ready(void)
} }
/// <summary> /// <summary>
/// å…³è<EFBFBD>”项处ç<EFBFBD>? /// 关联项处<EFBFBD>?
bool hg_sane_middleware::compare_val_equal(const char* cur_val, const char* limit_l, const char* limit_r) bool hg_sane_middleware::compare_val_equal(const char* cur_val, const char* limit_l, const char* limit_r)
{ {
return strcmp(cur_val, limit_l) == 0; return strcmp(cur_val, limit_l) == 0;