This commit is contained in:
modehua 2023-01-29 15:25:28 +08:00
commit bffdcc4728
7 changed files with 92 additions and 12 deletions

View File

@ -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")
{
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;

View File

@ -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);

View File

@ -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<std::mutex> lock(mutex_dev_);
for (auto& v: online_devices_)
{
if (v.scanner)
v.scanner->on_language_changed();
}
}

View File

@ -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);
};

View File

@ -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();
}

View File

@ -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<LPDEVINST>::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);
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<LPDEVINST>::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<std::string>& master)
bool hg_sane_middleware::parse_depends(scanner_handle h, json* jsn, SLAVEOP& so, std::vector<std::string>& 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::vector<std::
mo.name = mn;
else
mn = mo.name;
SANE_Option_Descriptor* m = find_stored_descriptor(h, mo.name.c_str());
if (m && m->type == 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())
{

View File

@ -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<std::string>& master);
bool parse_depends(scanner_handle h, json* jsn, SLAVEOP& so, std::vector<std::string>& 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<LPDEVINST>::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: