添加离线属性文件;改造TWAIN,在没有扫描仪连接时也返回空对象,以使离线属性可访问

This commit is contained in:
gb 2023-09-22 16:26:22 +08:00
parent 936201824f
commit 8c118223b1
9 changed files with 1560 additions and 1326 deletions

View File

@ -2822,6 +2822,7 @@ bool hg_scanner::is_online(void)
void hg_scanner::on_language_changed(void)
{
// change the 'size' member of string settings ...
setting_jsn_->update_data(nullptr, nullptr);
}
int hg_scanner::start(void)
{

View File

@ -0,0 +1,27 @@
#pragma once
// SANE-Option
//
// created on 2022-09-22
//
#include <string>
#include "../hg_ipc.h" // for refer
class sane_opt_provider : public refer
{
public:
sane_opt_provider()
{}
protected:
virtual ~sane_opt_provider()
{}
public:
virtual std::string get_json_text(void) = 0;
virtual int get_value(const char* name, void* buf, int* len, bool curval = true) = 0;
virtual int set_value(const char* name, void* value) = 0;
virtual bool has_option(const char* name) = 0;
};

View File

@ -0,0 +1,186 @@
#include "offline_opt.h"
#include <json/gb_json.h>
#include <huagao/hgscanner_error.h>
#include <huagao/brand.h>
#include <lang/app_language.h>
#include <sane/sane_ex.h>
#include <hginclude/utils.h>
#include "../scanner_manager.h" // for version
#include "user.h"
static std::string offline_opt_json[] = {
"{\"company\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u5236\\u9020\\u5546\",\"desc\":\"\\u8bbe\\u5907\\u5236\\u9020\\u5546\",\"ver\":0,\"pos\":0,\"fix-id\":34891,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":128,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"copyright\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u7248\\u672c\\u4fe1\\u606f\",\"desc\":\"\\u7248\\u6743\\u58f0\\u660e\\u7b49\\u4fe1\\u606f\",\"ver\":0,\"pos\":0,\"fix-id\":34892,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":128,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"co-url\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u516c\\u53f8\\u7f51\\u5740\",\"desc\":\"\\u516c\\u53f8\\u5b98\\u7f51\\u6216\\u552e\\u540e\\u670d\\u52a1\\u7f51\\u7ad9\\u5730\\u5740\",\"ver\":0,\"pos\":0,\"fix-id\":34893,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":256,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"co-tel\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u516c\\u53f8\\u7535\\u8bdd\",\"desc\":\"\\u516c\\u53f8\\u8054\\u7cfb\\u7535\\u8bdd\",\"ver\":0,\"pos\":0,\"fix-id\":34894,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":129,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"co-addr\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u516c\\u53f8\\u5730\\u5740\",\"desc\":\"\\u516c\\u53f8\\u5730\\u5740\",\"ver\":0,\"pos\":0,\"fix-id\":34895,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":128,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"co-gps\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u516c\\u53f8GPS\",\"desc\":\"\\u516c\\u53f8\\u5730\\u56fe\\u5730\\u5740\",\"ver\":0,\"pos\":0,\"fix-id\":34896,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":256,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"drv-ver\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u9a71\\u52a8\\u7248\\u672c\\u53f7\",\"desc\":\"PC\\u7aef\\u9a71\\u52a8\\u7a0b\\u5e8f\\u7248\\u672c\",\"ver\":0,\"pos\":0,\"fix-id\":34890,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":48,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"login\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u767b\\u5f55\",\"desc\":\"\\u7528\\u6237\\u767b\\u5f55\\u64cd\\u4f5c\",\"ver\":0,\"pos\":0,\"fix-id\":39168,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":64,\"auto\":false,\"cur\":\"false\",\"default\":\"false\"},\"logout\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u767b\\u51fa\",\"desc\":\"\\u7528\\u6237\\u767b\\u51fa\\u64cd\\u4f5c\",\"ver\":0,\"pos\":0,\"fix-id\":39169,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"size\":64,\"auto\":false,\"cur\":\"false\",\"default\":\"false\"},\"drv-log\":{\"cat\":\"base\",\"group\":\"\\u9ad8\\u7ea7\\u8bbe\\u7f6e\",\"title\":\"\\u9a71\\u52a8\\u65e5\\u5fd7\",\"desc\":\"PC\\u7aef\\u9a71\\u52a8\\u5de5\\u4f5c\\u65e5\\u5fd7\",\"ver\":0,\"pos\":0,\"fix-id\":39171,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"size\":256,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"}}"
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// offline_opts ...
offline_opts::offline_opts(hguser* user) : user_(user)
{
int hh = 0, hl = 0, lh = 0, ll = 0;
hg_scanner_mgr::get_version(&hh, &hl, &lh, &ll);
drv_ver_ = std::to_string(hh)
+ "." + std::to_string(hl)
+ "." + std::to_string(lh)
+ "." + std::to_string(ll);
init();
}
offline_opts::~offline_opts()
{
}
void offline_opts::init(void)
{
gb_json* child = nullptr, * jsn_ = new gb_json();
std::string text("");
for (auto& v : offline_opt_json)
text += v;
jsn_->attach_text(&text[0]);
#define INIT_SIMPLE_VAL(n, v) \
jsn_->get_value(SANE_STD_OPT_NAME_##n, child); \
if (child) \
{ \
auto func = [this](bool read, void* buf, int* len, bool curval) -> int \
{ \
if (!read) \
return SCANNER_ERR_DEVICE_NOT_SUPPORT; \
if (!len) \
return SCANNER_ERR_INVALID_PARAMETER; \
\
std::string val(from_default_language(v)); \
if (*len < val.length()) \
{ \
*len = val.length() + 1; \
\
return SCANNER_ERR_INSUFFICIENT_MEMORY; \
} \
\
strcpy((char*)buf, val.c_str()); \
\
return SCANNER_ERR_OK; \
}; \
oper_[SANE_STD_OPT_NAME_##n] = func; \
\
child->release(); \
}
INIT_SIMPLE_VAL(MANUFACTURER, COMPANY_NAME);
INIT_SIMPLE_VAL(CO_URL, BRAND_COMPANY_URL);
INIT_SIMPLE_VAL(CO_TEL, BRAND_COMPANY_TEL);
INIT_SIMPLE_VAL(CO_ADDR, BRAND_COMPANY_ADDRESS);
INIT_SIMPLE_VAL(CO_GPS, BRAND_COMPANY_GPS);
INIT_SIMPLE_VAL(COPYRIGHT, BRAND_COPYRIGHT);
INIT_SIMPLE_VAL(DRIVER_VERSION, drv_ver_.c_str());
// driver log
jsn_->get_value(SANE_STD_OPT_NAME_DRIVER_LOG, child);
if (child)
{
auto func = [this](bool read, void* buf, int* len, bool curval) -> int
{
if (user_ && user_->has_privilege(USER_PRIVILEGE_LOCAL_MGR))
{
if (read)
{
if (!buf)
return SCANNER_ERR_INVALID_PARAMETER;
return utils::copy_log_file_to((char*)buf);
}
else
{
return utils::clear_log_file();
}
}
else
{
return SCANNER_ERR_ACCESS_DENIED;
}
};
oper_[SANE_STD_OPT_NAME_DRIVER_LOG] = func;
child->release();
}
// login && logout
jsn_->get_value(SANE_STD_OPT_NAME_LOGIN, child);
if (child)
{
if (user_)
{
auto login = [this](bool read, void* buf, int* len, bool curval) -> int
{
if (read)
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
if (!buf)
return SCANNER_ERR_INVALID_PARAMETER;
char* n = (char*)buf,
* pwd = n + 32;
return user_->login(n, pwd);
};
auto logout = [this](bool read, void* buf, int* len, bool curval) -> int
{
if (read)
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
if (!buf)
return SCANNER_ERR_INVALID_PARAMETER;
char* n = (char*)buf,
* pwd = n + 32;
return user_->logout(n, pwd);
};
oper_[SANE_STD_OPT_NAME_LOGIN] = login;
oper_[SANE_STD_OPT_NAME_LOGOUT] = logout;
}
child->release();
}
jsn_->release();
}
std::string offline_opts::get_json_text(void)
{
std::string text("");
for (auto& v : offline_opt_json)
text += v;
return std::move(text);
}
int offline_opts::get_value(const char* name, void* buf, int* len, bool curval)
{
int ret = SCANNER_ERR_NO_DATA;
if (oper_.count(name))
{
ret = oper_[name](true, buf, len, curval);
}
return ret;
}
int offline_opts::set_value(const char* name, void* value)
{
int ret = SCANNER_ERR_NO_DATA;
if (oper_.count(name))
{
ret = oper_[name](false, value, nullptr, true);
}
return ret;
}
bool offline_opts::has_option(const char* name)
{
return oper_.count(name) > 0;
}

View File

@ -0,0 +1,33 @@
#pragma once
// SANE-Options accessible offline
//
// created on 2022-09-22
//
#include "base_opt.h"
#include <functional>
#include <map>
class hguser;
class offline_opts : public sane_opt_provider
{
hguser* user_;
std::string drv_ver_;
std::map<std::string, std::function<int(bool/*read?*/, void*/*buf*/, int*/*len*/, bool/*read cur value*/)>> oper_;
void init(void);
public:
offline_opts(hguser* user);
protected:
virtual ~offline_opts();
public:
virtual std::string get_json_text(void) override;
virtual int get_value(const char* name, void* buf, int* len, bool curval = true) override;
virtual int set_value(const char* name, void* value) override;
virtual bool has_option(const char* name) override;
};

File diff suppressed because it is too large Load Diff

View File

@ -77,7 +77,7 @@ class huagao_ds : public Twpp::SourceFromThis<huagao_ds> {
void CapabilityPrintf(Twpp::Msg msg, std::string capability, std::string value = "");
Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data);
Twpp::Result showTwainUI(Twpp::UserInterface& data, bool bUiOnly = false);
void init_support_caps(void);
void init_support_caps(int err);
void init_caps_from_sane_directly(const std::vector<uint32_t>& ids);
std::string get_config_file(void);
std::string get_config_value(const char* sec, const char* key);

View File

@ -315,7 +315,7 @@ namespace sane_opts
extern "C"
{
bool is_scanner_online(const char* model);
ISaneInvoker* open_scanner(const char* model, int* err, bool last_try);
ISaneInvoker* open_scanner(const char* model, int* err);
int uninitialize_sane(void* reserve);
}

View File

@ -323,7 +323,7 @@ namespace callback
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// class scanner
scanner::scanner(const char* model) : handle_(nullptr), model_(model), ex_id_(EXTENSION_ID_BASE), prev_start_result_(SCANNER_ERR_NOT_START)
, dpi_(200), tmp_path_(""), img_ind_(0)
, dpi_(200), tmp_path_(""), img_ind_(0), err_(SCANNER_ERR_NOT_OPEN)
, scanner_name_(""), is_ui_wait_img_(false), is_scanning_(false)
, scanner_ev_handler_(nullptr), evh_param_(nullptr), app_wnd_(nullptr), user_cancel_(false)
, max_img_mem_(1 * 1024), twain_set_(false), ev_cnt_(0), is_bIndicator(false), is_show_setting_(false)
@ -360,7 +360,6 @@ scanner::scanner(const char* model) : handle_(nullptr), model_(model), ex_id_(EX
// this value is same as driver memory limit ...
max_img_mem_ = mem_limit;
}
err_ = open();
}
scanner::~scanner()
{
@ -1529,7 +1528,7 @@ extern "C"
return !que.empty();
}
ISaneInvoker* open_scanner(const char* model, int* err, bool last_try)
ISaneInvoker* open_scanner(const char* model, int* err)
{
if (!sane_helper_)
{
@ -1544,20 +1543,26 @@ extern "C"
}
scanner* s = new scanner(model);
int ret = s->last_err();
int ret = s->open(), cnt = 0;
if (ret)
while (ret)
{
s->release();
s = nullptr;
if (last_try)
{
HWND parent = callback::find_main_wnd();
std::string msg(local_trans::lang_trans_between_hz936("\xE6\x89\x93\xE5\xBC\x80\xE6\x89\xAB\xE6\x8F\x8F\xE4\xBB\xAA\xE5\xA4\xB1\xE8\xB4\xA5\xE3\x80\x82", true, nullptr)),
title(local_trans::lang_trans_between_hz936("\xE9\x94\x99\xE8\xAF\xAF", true, nullptr));
if (callback::show_messagebox_ui)
callback::show_messagebox_ui(parent, 0, &msg[0], ret);
}
if (ret == SCANNER_ERR_OPENED_BY_OTHER_PROCESS)
break;
std::this_thread::sleep_for(std::chrono::milliseconds(5));
if (cnt++ > 100)
break;
ret = s->open();
}
if (ret && ret != SCANNER_ERR_OPENED_BY_OTHER_PROCESS) // error SCANNER_ERR_OPENED_BY_OTHER_PROCESS has tipped already
{
HWND parent = callback::find_main_wnd();
std::string msg(local_trans::lang_trans_between_hz936("\xE6\x89\x93\xE5\xBC\x80\xE6\x89\xAB\xE6\x8F\x8F\xE4\xBB\xAA\xE5\xA4\xB1\xE8\xB4\xA5\xE3\x80\x82", true, nullptr)),
title(local_trans::lang_trans_between_hz936("\xE9\x94\x99\xE8\xAF\xAF", true, nullptr));
if (callback::show_messagebox_ui)
callback::show_messagebox_ui(parent, 0, &msg[0], ret);
}
if (err)

View File

@ -65,7 +65,6 @@ class scanner : public ISaneInvoker, virtual public refer
void apply_config(void);
void on_ui_event(int uev, void* sender);
std::string choose_scanner(const std::vector<std::string>& scanners);
int open(void);
int close(void);
int init_options_id(void);
char* get_opt_value(int id, int size, bool def_val/*false - current value*/); // call delete[] to free returned value
@ -174,6 +173,7 @@ public:
// methods:
public:
int open(void);
int last_err(void);
int handle_device_event(int ev_code, void* data, unsigned int* len);
};