重载属性时,保持最顶层的SANE_Option_Descriptor*指针不变;修复浮点数打印错误;修复字符串函数符号;初始化时获取设备固件版本及序列号,以供其它属性使用

This commit is contained in:
gb 2023-11-04 09:44:01 +08:00
parent 68e062cb46
commit d14e2327ad
4 changed files with 31 additions and 12 deletions

View File

@ -2202,6 +2202,7 @@ void hg_scanner::init_settings(const char* json_setting_text)
{
gb_json* child = nullptr;
// fixed values ...
jsn->get_value(SANE_STD_OPT_NAME_DEVICE_VID, child);
if (child)
{
@ -2242,6 +2243,24 @@ void hg_scanner::init_settings(const char* json_setting_text)
child->release();
}
// fixed values from device ...
jsn->get_value(SANE_STD_OPT_NAME_FIRMWARE_VERSION, child);
if(child)
{
std::string val(get_firmware_version());
child->set_value("cur", val.c_str());
child->set_value("default", val.c_str());
child->release();
}
jsn->get_value(SANE_STD_OPT_NAME_DEVICE_SERIAL_NO, child);
if(child)
{
std::string val(get_serial_num());
child->set_value("cur", val.c_str());
child->set_value("default", val.c_str());
child->release();
}
text = std::move(jsn->to_string());
}
jsn->release();

View File

@ -561,21 +561,21 @@ bool device_option::is_string_function(const char* expr, std::string& name, int&
{
name = exp.substr(0, pos++);
exp.erase(0, pos);
if (exp.find("left[") == 0)
if (exp.find("left(") == 0)
{
exp.erase(0, 5);
start = 0;
cnt = atoi(exp.c_str());
pos = 0;
}
else if (exp.find("right[") == 0)
else if (exp.find("right(") == 0)
{
exp.erase(0, 6);
start = -1 * atoi(exp.c_str());
cnt = -1;
pos = 0;
}
else if (exp.find("mid[") == 0)
else if (exp.find("mid(") == 0)
{
exp.erase(0, 4);
start = atoi(exp.c_str());
@ -589,7 +589,7 @@ bool device_option::is_string_function(const char* expr, std::string& name, int&
}
if (pos == 0)
{
pos = exp.find("]");
pos = exp.find(")");
ret = pos != std::string::npos && (cnt > 0 || cnt == -1);
}
}
@ -737,11 +737,11 @@ bool device_option::parse_simple_logic_expression(gb_json* root, const char* exp
else
{
// substr function ...
if (strstr(tag, "left[") || strstr(tag, "right[") || strstr(tag, "mid["))
if (strstr(tag, "left(") || strstr(tag, "right(") || strstr(tag, "mid("))
{
const char* end = nullptr, *start = strstr(tag, "[");
int l = string_util::find_end_of_pair(start + 1, '[', ']');
bool ret = start[++l] == ']';
const char* end = nullptr, *start = strstr(tag, "(");
int l = string_util::find_end_of_pair(start + 1, '(', ')');
bool ret = start[++l] == ')';
if (ret)
{

View File

@ -175,8 +175,8 @@ bool simple_logic::parse_internal(const char* expr, int* end, void(*leaf)(const
}
std::string sub(ptr + 1, len - 1);
if (sub.find("||") == std::string::npos ||
sub.find("&&") == std::string::npos ||
if (sub.find("||") == std::string::npos &&
sub.find("&&") == std::string::npos &&
sub.find("^") == std::string::npos)
{
// count as function ...

View File

@ -36,7 +36,7 @@ std::string sane_opt::readable_text(SANE_Value_Type type, void* value)
else if (type == SANE_TYPE_INT)
return std::to_string(*(int*)value);
else if (type == SANE_TYPE_FIXED)
return std::to_string(*(double*)value);
return std::to_string(SANE_UNFIX(*(SANE_Fixed*)value));
else if (type == SANE_TYPE_STRING)
return (char*)value;
else
@ -376,7 +376,7 @@ bool sane_options::init_from(const char* jsn_text/*all options*/, void(*err_msg)
std::string str(jsn_text);
int sn = 0;
clear();
// clear(); // keep the SANE_Option_Descriptor*
if (jsn->attach_text(&str[0]))
{
gb_json* child = jsn->first_child();