diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index 5d52887..cb67816 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -2930,7 +2930,11 @@ int hg_scanner::set_setting(const char* name, void* data, int len) // setting_jsn_.at(real_n).at("title").get_to(name); if (type == "string") { - setting_jsn_.at(real_n).at("cur") = (char*)data; + int id = lang_get_string_id((char*)data, false); + if (id == -1) + setting_jsn_.at(real_n).at("cur") = (char*)data; + else + setting_jsn_.at(real_n).at("cur") = id; type = (char*)data; } else if (type == "int") @@ -3046,6 +3050,49 @@ bool hg_scanner::is_online(void) { return online_; } +void hg_scanner::on_language_changed(void) +{ + // change the 'size' member of string settings ... + for (size_t i = 1; i < jsn_children_.size(); ++i) + { + std::string v(jsn_children_[i]); + + if (!setting_jsn_.contains(v.c_str())) + continue; + + std::string val(""); + + setting_jsn_.at(v.c_str()).at("type").get_to(val); + if (val != "string") + continue; + + if (setting_jsn_.at(v.c_str()).contains("range")) + { + int old = 0, now = 0; + setting_jsn_.at(v.c_str()).at("size").get_to(old); + for (int i = 0; i < setting_jsn_.at(v.c_str()).at("range").size(); ++i) + { + int id = -1; + + if (setting_jsn_.at(v.c_str()).at("range").at(i).is_number()) + { + setting_jsn_.at(v.c_str()).at("range").at(i).get_to(id); + val = hg_log::lang_load(id); + } + else + setting_jsn_.at(v.c_str()).at("range").at(i).get_to(val); + if (now < val.length()) + now = val.length(); + } + now += 8; + if (now > old) + { + setting_jsn_.at(v.c_str()).at("size") = now; + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Change size of '%s' from %d to %d\n", v.c_str(), old, now); + } + } + } +} int hg_scanner::start(void) { user_cancel_ = false; diff --git a/hgdriver/hgdev/hg_scanner.h b/hgdriver/hgdev/hg_scanner.h index cd685c9..3394db5 100644 --- a/hgdriver/hgdev/hg_scanner.h +++ b/hgdriver/hgdev/hg_scanner.h @@ -426,6 +426,8 @@ public: std::string name(void); int status(void); bool is_online(void); + void on_language_changed(void); + public: virtual int start(void); virtual int get_image_info(SANE_Parameters* ii); diff --git a/hgdriver/hgdev/scanner_manager.cpp b/hgdriver/hgdev/scanner_manager.cpp index 79eaaaf..0bdbee9 100644 --- a/hgdriver/hgdev/scanner_manager.cpp +++ b/hgdriver/hgdev/scanner_manager.cpp @@ -778,3 +778,13 @@ scanner_err hg_scanner_mgr::hg_scanner_control(scanner_handle h, unsigned long c else return (scanner_err)SCAN_PTR(h)->device_io_control(code, data, len); } + +void hg_scanner_mgr::on_language_changed(void) +{ + std::lock_guard lock(mutex_dev_); + for (auto& v: online_devices_) + { + if (v.scanner) + v.scanner->on_language_changed(); + } +} \ No newline at end of file diff --git a/hgdriver/hgdev/scanner_manager.h b/hgdriver/hgdev/scanner_manager.h index b7fd52f..389013f 100644 --- a/hgdriver/hgdev/scanner_manager.h +++ b/hgdriver/hgdev/scanner_manager.h @@ -127,5 +127,7 @@ public: scanner_err hg_scanner_get_status(scanner_handle h, int setstutas); scanner_err hg_scanner_reset(scanner_handle h); scanner_err hg_scanner_control(scanner_handle h, unsigned long code, void* data, unsigned* len); + + void on_language_changed(void); }; diff --git a/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp b/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp index 6665d4a..3a72594 100644 --- a/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp +++ b/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp @@ -69,6 +69,12 @@ namespace err_map } extern "C" { + static void language_changed(int cp, void* param) + { + reload_setting_string_from_pak(cp, nullptr); + hg_scanner_mgr::instance()->on_language_changed(); + } + scanner_err hg_scanner_initialize(sane_callback callback, void* reserve) { std::string name(""), @@ -98,7 +104,7 @@ extern "C" VLOG_MINI_1(LOG_LEVEL_FATAL, "No language package found(%d)!\n", -1); return SCANNER_ERR_LANG_PAK_LOST; } - register_language_changed_notify(reload_setting_string_from_pak, true); + register_language_changed_notify(language_changed, true); hg_scanner_mgr::set_version(VERSION_MAJOR, VERSION_MINOR, VERSION_YEAR, GET_BUILD_VER); hg_scanner_mgr::set_exe_name(pe.c_str(), name.c_str()); @@ -108,7 +114,7 @@ extern "C" } void hg_scanner_uninitialize(void) { - register_language_changed_notify(reload_setting_string_from_pak, false); + register_language_changed_notify(language_changed, false); hg_scanner_mgr::clear(); hg_log::unint(); } diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index 623c544..32bbe62 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -381,6 +381,8 @@ hg_sane_middleware::~hg_sane_middleware() void hg_sane_middleware::language_changed(int cp, void* param) { + for (auto& v : hg_sane_middleware::instance()->openning_) + hg_sane_middleware::free_device_inst(v, false); } const SANE_Device** hg_sane_middleware::to_sane_device(ScannerInfo* hgscanner, int count) @@ -1016,7 +1018,7 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st if (depend) { std::vector::iterator it = find_openning_device_in_que(h); - if (it != openning_.end() && parse_depends(depend, so, (*it)->masters)) + if (it != openning_.end() && parse_depends(h, depend, so, (*it)->masters)) { so.enable_now = (ret->cap & SANE_CAP_INACTIVE) != SANE_CAP_INACTIVE; so.name = name; @@ -1049,14 +1051,22 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st return ret; } -void hg_sane_middleware::free_device_inst(LPDEVINST dev) +void hg_sane_middleware::free_device_inst(LPDEVINST dev, bool del) { if (dev->std_opt) delete dev->std_opt; for (auto& v : dev->opts) local_utility::free_memory(v.desc); - delete dev; + if(del) + delete dev; + else + { + dev->opts.clear(); + dev->cur_vals.clear(); + dev->slaves.clear(); + dev->masters.clear(); + } } scanner_handle hg_sane_middleware::find_openning_device(SANE_Handle h, bool rmv, LPDEVINST* dev) { @@ -1233,7 +1243,7 @@ bool hg_sane_middleware::get_current_value(scanner_handle handle, const void* op std::vector::iterator it = find_openning_device_in_que(handle); refresh_current_value(*it, name.c_str(), jsn); - jsn->get_value("title", val); + val = hg_sane_middleware::get_string_in_json(jsn, "title"); if (setv == &hg_sane_middleware::set_value_to_new) value = *(void**)value; @@ -1253,8 +1263,7 @@ void* hg_sane_middleware::get_default_value(scanner_handle handle, const void* o if (jsn->attach_text(&val[0]) && jsn->get_value("type", val)) { - std::string title(""); - jsn->get_value("title", title); + std::string title(hg_sane_middleware::get_string_in_json(jsn, "title")); if (val == "bool") { bool v = false; @@ -1896,7 +1905,7 @@ bool hg_sane_middleware::parse_master_option(const char* depend_str, MASTEROP& m return ret; } -bool hg_sane_middleware::parse_depends(json* jsn, SLAVEOP& so, std::vector& master) +bool hg_sane_middleware::parse_depends(scanner_handle h, json* jsn, SLAVEOP& so, std::vector& master) { std::string val(""), mn(""); bool ret = jsn->first_child(val); @@ -1913,6 +1922,10 @@ bool hg_sane_middleware::parse_depends(json* jsn, SLAVEOP& so, std::vectortype == SANE_TYPE_STRING) + mo.limit_l = from_default_language(mo.limit_l.c_str(), nullptr); so.master.push_back(mo); if (std::find(master.begin(), master.end(), mo.name) == master.end()) { diff --git a/hgsane/sane_hg_mdw.h b/hgsane/sane_hg_mdw.h index 140489f..078fa73 100644 --- a/hgsane/sane_hg_mdw.h +++ b/hgsane/sane_hg_mdw.h @@ -171,7 +171,7 @@ class hg_sane_middleware bool parse_master_option(const char* depend_str, MASTEROP& mo); - bool parse_depends(json* jsn, SLAVEOP& so, std::vector& master); + bool parse_depends(scanner_handle h, json* jsn, SLAVEOP& so, std::vector& master); bool is_associatived(const SLAVEOP& slave, const char* master_name); bool set_stored_option_enabled(scanner_handle h, const void* option, bool enable, int* size = NULL); @@ -185,7 +185,7 @@ class hg_sane_middleware std::vector::iterator find_openning_device_in_que(const char* name); /// 关联项处理结束 - static void free_device_inst(LPDEVINST dev); + static void free_device_inst(LPDEVINST dev, bool del = true); scanner_handle find_openning_device(SANE_Handle h, bool rmv = false, LPDEVINST* dev = NULL); protected: