From 57104089e2cd48a343910cea7d9345679282299d Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Mon, 19 Jun 2023 09:44:43 +0800 Subject: [PATCH] =?UTF-8?q?fix=20bug-467:=20=E9=85=8D=E7=BD=AE=E9=A1=B9?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E7=8A=B6=E6=80=81=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9=E7=88=B6=E9=A1=B9=E7=A6=81=E7=94=A8=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgsane/sane_hg_mdw.cpp | 20 ++++++++++++++++---- hgsane/sane_hg_mdw.h | 6 +++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index f84a9c0..5e0bf4a 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -1231,7 +1231,7 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st // master = ""; // m->get_value_as_string("cur", master, integer); // local_utility::trans_language_if_was_word_id(val); - so.enable_now = so.is_enable(so.master, (*it)->cur_vals); + so.enable_now = so.is_enable(h, so.master, (*it)->cur_vals); if (!so.enable_now) ret->cap |= SANE_CAP_INACTIVE; //} @@ -2107,7 +2107,7 @@ bool hg_sane_middleware::compare_val_not_between(const char* cur_val, const char return !hg_sane_middleware::compare_val_between(cur_val, limit_l, limit_r); } -bool hg_sane_middleware::is_enable_and(const std::vector& master, std::vector& curvals) +bool hg_sane_middleware::is_enable_and(scanner_handle hdev, const std::vector& master, std::vector& curvals) { // NOTE: logical operator '&&' should get all master's value to check, here we only consider ONE master !!!! bool enabled = true; @@ -2121,11 +2121,17 @@ bool hg_sane_middleware::is_enable_and(const std::vector& master, std: continue; } enabled &= master[i].compare_val(it->val.c_str(), master[i].limit_l.c_str(), master[i].limit_r.c_str()); + if (enabled) // whether parent is enabled + { + const SANE_Option_Descriptor* desc = hg_sane_middleware::instance()->find_stored_descriptor(hdev, master[i].name.c_str()); + if (desc && (desc->cap & SANE_CAP_INACTIVE)) + enabled = false; + } } return enabled; } -bool hg_sane_middleware::is_enable_or(const std::vector& master, std::vector& curvals) +bool hg_sane_middleware::is_enable_or(scanner_handle hdev, const std::vector& master, std::vector& curvals) { bool enabled = false; @@ -2139,6 +2145,12 @@ bool hg_sane_middleware::is_enable_or(const std::vector& master, std:: } enabled |= master[i].compare_val(it->val.c_str(), master[i].limit_l.c_str(), master[i].limit_r.c_str()); + if (enabled) // whether parent is enabled + { + const SANE_Option_Descriptor* desc = hg_sane_middleware::instance()->find_stored_descriptor(hdev, master[i].name.c_str()); + if (desc && (desc->cap & SANE_CAP_INACTIVE)) + enabled = false; + } } return enabled; @@ -2334,7 +2346,7 @@ int hg_sane_middleware::something_after_do(LPDEVINST dev, const char* master_nam bool enable = changed_options[i].enable; int bytes = 0; // if (enable) - enable = dev->slaves[slave].is_enable(dev->slaves[slave].master, dev->cur_vals); + enable = dev->slaves[slave].is_enable(dev->dev, dev->slaves[slave].master, dev->cur_vals); if (enable == dev->slaves[slave].enable_now) continue; diff --git a/hgsane/sane_hg_mdw.h b/hgsane/sane_hg_mdw.h index d5f6635..a95304a 100644 --- a/hgsane/sane_hg_mdw.h +++ b/hgsane/sane_hg_mdw.h @@ -59,7 +59,7 @@ typedef struct _slave_option std::string name; bool enable_now; std::vector master; - bool (*is_enable)(const std::vector& master + bool (*is_enable)(scanner_handle hdev, const std::vector& master , std::vector& curvals/*参数全部字符串化*/); // logic 'and', 'or' opertions }SLAVEOP; typedef struct _opt_status @@ -168,8 +168,8 @@ class hg_sane_middleware static bool compare_val_between(const char* cur_val, const char* limit_l, const char* limit_r); static bool compare_val_not_between(const char* cur_val, const char* limit_l, const char* limit_r); - static bool is_enable_and(const std::vector& master, std::vector& curvals); - static bool is_enable_or(const std::vector& master, std::vector& curvals); + static bool is_enable_and(scanner_handle hdev, const std::vector& master, std::vector& curvals); + static bool is_enable_or(scanner_handle hdev, const std::vector& master, std::vector& curvals); //std::vector slave_options_; //std::vector master_options_;