diff --git a/hgdriver/hgdev/CMakeLists.txt b/hgdriver/hgdev/CMakeLists.txt index 89eff29..3fda67e 100644 --- a/hgdriver/hgdev/CMakeLists.txt +++ b/hgdriver/hgdev/CMakeLists.txt @@ -50,9 +50,10 @@ target_link_libraries(${PROJECT_NAME} PRIVATE usb-1.0) target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/../3rdparty/nick ${PROJECT_SOURCE_DIR}/../ImageProcess - ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/include + ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/include ${PROJECT_SOURCE_DIR}/../3rdparty/tiff/include - ${PROJECT_SOURCE_DIR}/../../../sdk/include + ${PROJECT_SOURCE_DIR}/../../../sdk/include + ${PROJECT_SOURCE_DIR}/../wrapper ) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../build) 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/CMakeLists.txt b/hgdriver/wrapper/CMakeLists.txt index 17bb5f9..79bb56c 100644 --- a/hgdriver/wrapper/CMakeLists.txt +++ b/hgdriver/wrapper/CMakeLists.txt @@ -36,6 +36,7 @@ endif() target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/../../../build/libgdev.a ${PROJECT_SOURCE_DIR}/../../../build/libgimgproc.a + ${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/liblang.so ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgproc.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgcodecs.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_highgui.a @@ -49,6 +50,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libquirc.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libzlib.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/liblibwebp.a + ${PROJECT_SOURCE_DIR}/../../../sdk/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libusb-1.0.a #uos下放的先后顺序不对可能会导致库链接不上 udev pthread dl m) @@ -95,6 +97,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/../3rdparty/tiff/include ${PROJECT_SOURCE_DIR}/../ImageProcess ${PROJECT_SOURCE_DIR}/../hgdev + ${PROJECT_SOURCE_DIR}/../wrapper ${PROJECT_SOURCE_DIR}/../../../sdk/include ) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR}) 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/CMakeLists.txt b/hgsane/CMakeLists.txt index de2991f..ca9f5ae 100644 --- a/hgsane/CMakeLists.txt +++ b/hgsane/CMakeLists.txt @@ -18,6 +18,7 @@ link_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR} ) target_link_libraries(${PROJECT_NAME} PRIVATE hgdriver + ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/liblang.so ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libhgdriver.so ) diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index 82dc360..32bbe62 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -171,7 +171,7 @@ namespace local_utility return str > bgn; } - // 暂不支持科学计数?1.2e+10 + // 暂不支持科学计数�?1.2e+10 bool get_number(const char*& str, double& val) { const char* bgn = str; @@ -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) @@ -555,7 +557,7 @@ SANE_Option_Descriptor* hg_sane_middleware::string_option_to_SANE_descriptor(con sod->unit = SANE_UNIT_NONE; sod->size = values.size(); sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 - | SANE_CAP_AUTOMATIC; // 硬件可设置默认? + | SANE_CAP_AUTOMATIC; // 硬件可设置默认�? if (values.size()) { sod->constraint_type = SANE_CONSTRAINT_STRING_LIST; @@ -676,7 +678,7 @@ SANE_Option_Descriptor* hg_sane_middleware::number_option_to_SANE_descriptor(con sod->unit = SANE_UNIT_NONE; sod->size = sizeof(SANE_Word); sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 - /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认? + /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认�? if (values.size()) { @@ -726,7 +728,7 @@ SANE_Option_Descriptor* hg_sane_middleware::number_option_to_SANE_descriptor(con sod->unit = SANE_UNIT_NONE; sod->size = sizeof(SANE_Word); sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 - /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认? + /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认�? if (values.size()) { @@ -1002,7 +1004,7 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st //if (jsn->get_value("enable", enabled) && !enabled) // ret->cap |= SANE_CAP_INACTIVE; - // 关联? + // 关联�? json* depend = NULL; SLAVEOP so; if (jsn->get_value("depend_or", depend)) @@ -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) { @@ -1129,10 +1139,10 @@ SANE_Option_Descriptor* hg_sane_middleware::find_stored_descriptor(scanner_handl if (IS_PTR_NUMBER(option)) { if (id) - *id = (int)option; + *id = (SANE_Int)(long long)option; for (const auto& v : (*it)->opts) { - if (v.option_no == (int)option) + if (v.option_no == (SANE_Int)(long long)option) return v.desc; } } @@ -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; @@ -1349,7 +1358,7 @@ SANE_Status hg_sane_middleware::get_devices(const SANE_Device*** device_list, SA if (hgerr == SCANNER_ERR_INSUFFICIENT_MEMORY) { - count += 4; // 为两次hg_scanner_enum间隙可能新增的设备预留空? + count += 4; // 为两次hg_scanner_enum间隙可能新增的设备预留空�? dev = (ScannerInfo*)local_utility::acquire_memory(sizeof(ScannerInfo) * count, "hg_sane_middleware::get_devices"); hgerr = hg_scanner_enum(dev, &count, local_only); if (hgerr != SCANNER_ERR_OK) @@ -1727,7 +1736,7 @@ bool hg_sane_middleware::is_ready(void) } /// -/// 关联项处? +/// 关联项处�? 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; @@ -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 9d7ac2e..078fa73 100644 --- a/hgsane/sane_hg_mdw.h +++ b/hgsane/sane_hg_mdw.h @@ -89,7 +89,7 @@ typedef struct _dev_inst return dev == h; } - struct _dev_inst() + _dev_inst() { dev = nullptr; name = ""; @@ -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: