From c84ff1264119609b8ef1e3e54b653f5cda6c57e8 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Wed, 21 Jun 2023 15:33:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B1=9E=E6=80=A7=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=88=A4=E6=96=AD=E4=BD=8D=E7=BD=AE=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B0=86=E5=90=8E=E9=9D=A2=E7=9A=84=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=89=8D=E9=9D=A2=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=9A=84=E4=BE=9D=E8=B5=96=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgsane/sane_hg_mdw.cpp | 68 ++++++++++++++++++++++++++++-------------- hgsane/sane_hg_mdw.h | 1 + 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index b357d3d..272fde2 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -954,6 +954,24 @@ void hg_sane_middleware::reload_options(scanner_handle dev) } } } + + // do depend logic opertion ... + for (auto& d : v->slaves) + { + SANE_Option_Descriptor* desc = get_option_descriptor(hg_sane_middleware::scanner_handle_to_sane(v->dev), &d.name[0]); + set_status_by_depends(v->dev, d, v->cur_vals, desc); + } + } +} +void hg_sane_middleware::set_status_by_depends(scanner_handle hdev, SLAVEOP& so, std::vector& vals, SANE_Option_Descriptor* desc) +{ + if (so.master.size()) + { + so.enable_now = so.is_enable(hdev, so.master, vals); + if (so.enable_now) + desc->cap &= ~SANE_CAP_INACTIVE; + else + desc->cap |= SANE_CAP_INACTIVE; } } SANE_Status hg_sane_middleware::open(SANE_String_Const devicename, SANE_Handle* handle, const char* name, const char* pwd, const char* method, char* rsc) @@ -1184,28 +1202,28 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st so.enable_now = (ret->cap & SANE_CAP_INACTIVE) != SANE_CAP_INACTIVE; so.name = name; - // initializing status ... - if (so.master.size()) - { - //std::string master(get_option_json(h, (void *)so.master[0].name.c_str())); - //json* m = new json(); - //if (m->attach_text(&master[0])) - //{ - // bool integer = false, str = false; - - // master = ""; - // m->get_value("type", master); - // integer = master == "int"; - // str = master == "string"; - // master = ""; - // m->get_value_as_string("cur", master, integer); - // local_utility::trans_language_if_was_word_id(val); - so.enable_now = so.is_enable(h, so.master, (*it)->cur_vals); - if (!so.enable_now) - ret->cap |= SANE_CAP_INACTIVE; - //} - //delete m; - } + // initializing status ... move to set_status_by_depends (2023-06-21) + //if (so.master.size()) + //{ + // //std::string master(get_option_json(h, (void *)so.master[0].name.c_str())); + // //json* m = new json(); + // //if (m->attach_text(&master[0])) + // //{ + // // bool integer = false, str = false; + // + // // master = ""; + // // m->get_value("type", master); + // // integer = master == "int"; + // // str = master == "string"; + // // master = ""; + // // m->get_value_as_string("cur", master, integer); + // // local_utility::trans_language_if_was_word_id(val); + // so.enable_now = so.is_enable(h, so.master, (*it)->cur_vals); + // if (!so.enable_now) + // ret->cap |= SANE_CAP_INACTIVE; + // //} + // //delete m; + //} (*it)->slaves.push_back(so); } delete depend; @@ -1619,6 +1637,12 @@ SANE_Status hg_sane_middleware::open_device(SANE_String_Const devicename, SANE_H ret = open(devicename, handle, auth.name, auth.pwd, auth.method, rsc); } + if (ret == SANE_STATUS_GOOD) + { + // for depend item maybe later, we move the depend-logic-operation out of 'from_json'. to ensure the status, we get all options actively and do depend-logic operation after all options got - 2023-06-21 + reload_options(hg_sane_middleware::sane_handle_to_scanner(*handle)); + } + return ret; } SANE_Status hg_sane_middleware::close_device(SANE_Handle h) diff --git a/hgsane/sane_hg_mdw.h b/hgsane/sane_hg_mdw.h index afc60ac..b790da2 100644 --- a/hgsane/sane_hg_mdw.h +++ b/hgsane/sane_hg_mdw.h @@ -142,6 +142,7 @@ class hg_sane_middleware static void set_value_to_new(void* val, size_t bytes, void* param); void reload_options(scanner_handle dev = nullptr); + void set_status_by_depends(scanner_handle hdev, SLAVEOP& so, std::vector& vals, SANE_Option_Descriptor* desc); SANE_Status open(SANE_String_Const devicename, SANE_Handle* handle, const char* name, const char* pwd, const char* method, char* rsc); SANE_Option_Descriptor* from_json(scanner_handle h, const std::string& name, json* jsn); std::string get_option_json(scanner_handle handle, void* opt, std::string* key = nullptr, SANE_Int* id = nullptr);