调整属性状态判断位置,以支持将后面的属性设置为前面属性的依赖项

This commit is contained in:
gb 2023-06-21 15:33:39 +08:00
parent 8a9b5343ad
commit c84ff12641
2 changed files with 47 additions and 22 deletions

View File

@ -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<CURVAL>& 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)

View File

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