From f808870f42a95f7ebbf962d5cd121941722ed90c Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Fri, 16 Jun 2023 09:24:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E8=AF=AD=E8=A8=80=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/hgdev/hg_scanner.cpp | 190 +++++++++++++++++++++++++--------- 1 file changed, 140 insertions(+), 50 deletions(-) diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index 968e17e..67d985b 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -668,6 +668,7 @@ void hg_scanner::init_setting_func_map(void) setting_map_[SANE_STD_OPT_NAME_ROLLER_COUNT] = &hg_scanner::setting_get_roller_count; setting_map_[SANE_STD_OPT_NAME_TOTAL_COUNT] = &hg_scanner::setting_get_history_count; setting_map_[SANE_STD_OPT_NAME_GET_DEVS_L0G] = &hg_scanner::setting_get_devs_log; + setting_map_[SANE_STD_OPT_NAME_LANGUAGE] = &hg_scanner::setting_set_language; } std::string hg_scanner::setting_name_from(const char* n_or_id, int* id) { @@ -2491,6 +2492,44 @@ int hg_scanner::setting_get_devs_log(void* data, long* len) strcpy((char*)data, str.c_str()); return ret; } +int hg_scanner::setting_set_language(void* data, long* len) +{ + int err = SCANNER_ERR_OK; + LANATTR **pla = lang_get_supported_languages(); + + if (!pla) + err = SCANNER_ERR_DEVICE_NOT_SUPPORT; + else + { + std::string n(to_default_language((char*)data, nullptr)), now(""); + int id = -1, cur = lang_get_cur_code_page(); + for (int i = 0; pla[i]; ++i) + { + if (pla[i]->cp == cur) + now = pla[i]->name; + if (n == pla[i]->name) + { + id = pla[i]->cp; + break; + } + } + if (id == -1) + { + err = SCANNER_ERR_INVALID_PARAMETER; + strcpy((char*)data, now.c_str()); + } + else if(cur != id) + { + int lid = lang_get_string_id((char*)data, false); + err = SCANNER_ERR_CONFIGURATION_CHANGED; + setting_jsn_.at(SANE_STD_OPT_NAME_LANGUAGE).at("cur") = lid; + lang_set_code_page(id); + on_language_changed(); + } + } + + return err; +} int hg_scanner::on_color_mode_changed(int& color_mode) { return SCANNER_ERR_DEVICE_NOT_SUPPORT; @@ -2643,13 +2682,8 @@ SANE_Image_Statu hg_scanner::last_usb_image_statu(int err) return statu; } -void hg_scanner::init_settings(const char* json_setting_text) +void hg_scanner::change_setting_language(bool init) { - jsn_children_.clear(); - setting_jsn_ = jsonconfig::load_json_from_text(json_setting_text, &jsn_children_); - - VLOG_MINI_1(LOG_LEVEL_ALL, "Initialize %d settings ...\n", jsn_children_.size() - 1); - notify_setting_result_ = false; for (size_t i = 1; i < jsn_children_.size(); ++i) { std::string v(jsn_children_[i]); @@ -2658,29 +2692,48 @@ void hg_scanner::init_settings(const char* json_setting_text) continue; std::string val(""); - + change_string_2_lang_id(v.c_str(), "title"); change_string_2_lang_id(v.c_str(), "desc"); setting_jsn_.at(v.c_str()).at("type").get_to(val); - + if (v.compare(from_default_language(SANE_STD_OPT_NAME_TIME_TO_SLEEP)) == 0) + { + int val = 0; + get_sleep_time(val); + const char* p_time = NULL; + if (val == -1 || val > 20000) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_BXM); // changed in 'if (val == "string")' branch. + else if (val > 0 && val <= 300) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_WFZ); + else if (val > 300 && val <= 600) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_SFZ); + else if (val > 600 && val <= 1800) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_BXS); + else if (val > 1800 && val <= 3600) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_YXS); + else if (val > 3600 && val <= 7200) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_LXS); + else if (val > 7200 && val <= 14400) + p_time = /*from_default_language*/(OPTION_VALUE_XMSJ_SXS); + if (p_time) + setting_jsn_.at(from_default_language(SANE_STD_OPT_NAME_TIME_TO_SLEEP)).at("default") = p_time; + } if (v.compare(from_default_language(SANE_STD_OPT_NAME_FEED_STRENGTH)) == 0) { int val = 0; - int ret = on_get_feedmode(val); - if (ret == SCANNER_ERR_OK) - { - const char* p_feed = NULL; - if (val == 0) - p_feed = from_default_language(OPTION_VALUE_FZQD_R); - else if (val == 1) - p_feed = from_default_language(OPTION_VALUE_FZQD_YB); - else if (val == 2) - p_feed = from_default_language(OPTION_VALUE_FZQD_Q); + on_get_feedmode(val); + const char* p_feed = NULL; + if (val == 0) + p_feed = /*from_default_language*/(OPTION_VALUE_FZQD_R); + else if (val == 1) + p_feed = /*from_default_language*/(OPTION_VALUE_FZQD_YB); + else if (val == 2) + p_feed = /*from_default_language*/(OPTION_VALUE_FZQD_Q); + + if (p_feed) + setting_jsn_.at(from_default_language(SANE_STD_OPT_NAME_TIME_TO_SLEEP)).at("default") = p_feed; - if (p_feed) - setting_jsn_.at(from_default_language(SANE_STD_OPT_NAME_TIME_TO_SLEEP)).at("default") = p_feed; - } } if (val == "string") { @@ -2691,7 +2744,7 @@ void hg_scanner::init_settings(const char* json_setting_text) for (int i = 0; i < setting_jsn_.at(v.c_str()).at("range").size(); ++i) { int id = -1; - + setting_jsn_.at(v.c_str()).at("range").at(i).get_to(val); id = lang_get_string_id(val.c_str(), true); if (id == -1) @@ -2702,41 +2755,78 @@ void hg_scanner::init_settings(const char* json_setting_text) setting_jsn_.at(v.c_str()).at("range")[i] = id; } } + if (v.compare(from_default_language(SANE_STD_OPT_NAME_LANGUAGE)) == 0) + continue; - val = get_setting_item_string(v.c_str(), "default"); + if (init) + { + val = get_setting_item_string(v.c_str(), "default"); - char* buf = NULL; - long size = 0; + char* buf = NULL; + long size = 0; - setting_jsn_.at(v.c_str()).at("size").get_to(size); - buf = (char*)malloc(size + 4); - bzero(buf, size + 4); - strcpy(buf, val.c_str()); - set_setting(v.c_str(), buf, &size); - free(buf); + setting_jsn_.at(v.c_str()).at("size").get_to(size); + buf = (char*)malloc(size + 4); + bzero(buf, size + 4); + strcpy(buf, val.c_str()); + set_setting(v.c_str(), buf, &size); + free(buf); + } } - else if (val == "int") + else if (init) { - int n = 0; - long size = sizeof(n); - setting_jsn_.at(v.c_str()).at("default").get_to(n); - set_setting(v.c_str(), (char*)&n, &size); - } - else if (val == "float") - { - double d = .0f; - long size = sizeof(d); - setting_jsn_.at(v.c_str()).at("default").get_to(d); - set_setting(v.c_str(), (char*)&d, &size); - } - else if (val == "bool") - { - bool b = false; - long size = sizeof(b); - setting_jsn_.at(v.c_str()).at("default").get_to(b); - set_setting(v.c_str(), (char*)&b, &size); + if (val == "int") + { + int n = 0; + long size = sizeof(n); + setting_jsn_.at(v.c_str()).at("default").get_to(n); + set_setting(v.c_str(), (char*)&n, &size); + } + else if (val == "float") + { + double d = .0f; + long size = sizeof(d); + setting_jsn_.at(v.c_str()).at("default").get_to(d); + set_setting(v.c_str(), (char*)&d, &size); + } + else if (val == "bool") + { + bool b = false; + long size = sizeof(b); + setting_jsn_.at(v.c_str()).at("default").get_to(b); + set_setting(v.c_str(), (char*)&b, &size); + } } } +} +void hg_scanner::init_settings(const char* json_setting_text) +{ + const char* lang = language_option_descriptor(); + bool empty = true; + + if (lang && *lang) + { + std::string txt(json_setting_text); + size_t pos = txt.rfind('}'); + if (pos != std::string::npos) + { + txt[pos] = ','; + } + if (strstr(lang, "{")) + txt += strstr(lang, "{") + 1; + jsn_children_.clear(); + setting_jsn_ = jsonconfig::load_json_from_text(txt.c_str(), &jsn_children_); + empty = setting_jsn_.empty(); + } + if(empty) + { + jsn_children_.clear(); + setting_jsn_ = jsonconfig::load_json_from_text(json_setting_text, &jsn_children_); + } + + VLOG_MINI_1(LOG_LEVEL_ALL, "Initialize %d settings ...\n", jsn_children_.size() - 1); + notify_setting_result_ = false; + change_setting_language(true); VLOG_MINI_1(LOG_LEVEL_ALL, "Initialize %d settings ... OK\n", jsn_children_.size() - 1); if (lang_get_cur_code_page() != DEFAULT_CODE_PAGE) on_language_changed();