sane_opt_provider接口调整,支持跨模块
This commit is contained in:
parent
363fbf5517
commit
9b8100d8df
|
@ -4277,7 +4277,7 @@ int hg_scanner::image_configuration(SCANCONF& ic)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string hg_scanner::get_value(const char* name, void* value, int* err)
|
char* hg_scanner::get_value(const char* name, void* value, size_t* size, int* err)
|
||||||
{
|
{
|
||||||
std::string val("");
|
std::string val("");
|
||||||
int result = SCANNER_ERR_OK, nv = 0;
|
int result = SCANNER_ERR_OK, nv = 0;
|
||||||
|
@ -4322,7 +4322,22 @@ std::string hg_scanner::get_value(const char* name, void* value, int* err)
|
||||||
if (err)
|
if (err)
|
||||||
*err = result;
|
*err = result;
|
||||||
|
|
||||||
return std::move(val);
|
if (size)
|
||||||
|
*size = val.length();
|
||||||
|
|
||||||
|
if (val.length())
|
||||||
|
{
|
||||||
|
char* buf = (char*)malloc(val.length() + 1);
|
||||||
|
|
||||||
|
memcpy(buf, val.c_str(), val.length());
|
||||||
|
buf[val.length()] = 0;
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int hg_scanner::set_value(const char* name, void* val)
|
int hg_scanner::set_value(const char* name, void* val)
|
||||||
{
|
{
|
||||||
|
|
|
@ -543,9 +543,9 @@ public:
|
||||||
|
|
||||||
// sane_opt_provider
|
// sane_opt_provider
|
||||||
public:
|
public:
|
||||||
virtual std::string get_value(const char* name, void* value, int* err = nullptr);
|
virtual char* get_value(const char* name, void* value, size_t* size, int* err = nullptr) override;
|
||||||
virtual int set_value(const char* name, void* val);
|
virtual int set_value(const char* name, void* val) override;
|
||||||
virtual void enable(const char* name, bool able);
|
virtual void enable(const char* name, bool able) override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ void offline_opts::init(void)
|
||||||
jsn->release();
|
jsn->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string offline_opts::get_value(const char* name, void* value, int* err)
|
char* offline_opts::get_value(const char* name, void* value, size_t* size, int* err)
|
||||||
{
|
{
|
||||||
std::string ret("");
|
std::string ret("");
|
||||||
|
|
||||||
|
@ -87,7 +87,19 @@ std::string offline_opts::get_value(const char* name, void* value, int* err)
|
||||||
else if (err)
|
else if (err)
|
||||||
*err = SCANNER_ERR_NO_DATA;
|
*err = SCANNER_ERR_NO_DATA;
|
||||||
|
|
||||||
return ret;
|
if (size)
|
||||||
|
*size = ret.length();
|
||||||
|
if (ret.length())
|
||||||
|
{
|
||||||
|
char* buf = (char*)malloc(ret.length() + 1);
|
||||||
|
|
||||||
|
memcpy(buf, ret.c_str(), ret.length());
|
||||||
|
buf[ret.length()] = 0;
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
int offline_opts::set_value(const char* name, void* value)
|
int offline_opts::set_value(const char* name, void* value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,7 +22,7 @@ protected:
|
||||||
virtual ~offline_opts();
|
virtual ~offline_opts();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual std::string get_value(const char* name, void* value, int* err = nullptr) override;
|
virtual char* get_value(const char* name, void* value, size_t* size, int* err = nullptr) override;
|
||||||
virtual int set_value(const char* name, void* value) override;
|
virtual int set_value(const char* name, void* value) override;
|
||||||
virtual void enable(const char* name, bool able) override;
|
virtual void enable(const char* name, bool able) override;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "img_processor.h"
|
#include "img_processor.h"
|
||||||
|
|
||||||
#include <json/gb_json.h>
|
#include <json/gb_json.h>
|
||||||
|
#include <huagao/hgscanner_error.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,4 +42,7 @@ bool image_processor::set_opt_json_text(char* txt)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int image_processor::process(LPPROCIIM* in, size_t cnt, bool(*result)(LPPROCIIM, void*), void* param)
|
||||||
|
{
|
||||||
|
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
|
||||||
|
}
|
||||||
|
|
|
@ -52,11 +52,23 @@ typedef struct _hg_img_info
|
||||||
uint32_t bits : 6;
|
uint32_t bits : 6;
|
||||||
uint32_t reserved : 13;
|
uint32_t reserved : 13;
|
||||||
}HGIMGINFO;
|
}HGIMGINFO;
|
||||||
|
|
||||||
typedef struct _proc_img_info_
|
typedef struct _proc_img_info_
|
||||||
{
|
{
|
||||||
HGIMGINFO info;
|
HGIMGINFO info;
|
||||||
cv::Mat img;
|
cv::Mat img;
|
||||||
}PROCIMGINFO, *LPPROCIMGINFO;
|
}PROCIMGINFO, *LPPROCIMGINFO;
|
||||||
|
|
||||||
|
typedef struct _proc_img_info_modules // 跨模块参数
|
||||||
|
{
|
||||||
|
HGIMGINFO info;
|
||||||
|
uint32_t width; // in px
|
||||||
|
uint32_t height; // in px
|
||||||
|
uint32_t channels;
|
||||||
|
uint32_t bits; // bits per channel
|
||||||
|
uint32_t bytes_per_line;
|
||||||
|
uint8_t* data; // size = bytes_per_line * height
|
||||||
|
}PROCIIM, *LPPROCIIM;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
class image_processor : public sane_opt_provider
|
class image_processor : public sane_opt_provider
|
||||||
|
@ -80,5 +92,8 @@ public:
|
||||||
int get_position(void) { return pos_; }
|
int get_position(void) { return pos_; }
|
||||||
|
|
||||||
virtual int process(std::vector<PROCIMGINFO>& in, std::vector<PROCIMGINFO>& out) = 0;
|
virtual int process(std::vector<PROCIMGINFO>& in, std::vector<PROCIMGINFO>& out) = 0;
|
||||||
|
|
||||||
|
// 跨模块图像处理接口。回调函数返回false,则停止处理;void*参数同 'param'。
|
||||||
|
virtual int process(LPPROCIIM* in, size_t cnt, bool(*result)(LPPROCIIM, void*), void* param);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -344,8 +344,13 @@ int imgproc_mgr::process(HGIMGINFO* info, uint8_t* data, size_t bytes, std::vect
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ret = v->process(*src, *dst);
|
if (v->is_in_another_module())
|
||||||
(this->*dumpf_)(*dst, v->from().c_str(), v->get_position());
|
{
|
||||||
|
// use LPPROCIIM function ...
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = v->process(*src, *dst);
|
||||||
|
(this->*dumpf_)(*dst, v->from(), v->get_position());
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
|
@ -356,17 +361,17 @@ int imgproc_mgr::process(HGIMGINFO* info, uint8_t* data, size_t bytes, std::vect
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
ret = SCANNER_ERR_THROW_EXCEPTION;
|
ret = SCANNER_ERR_THROW_EXCEPTION;
|
||||||
utils::to_log(LOG_LEVEL_DEBUG, "FATAL: image %d process '%s' throws exception: %s!\n", info->paper_ind, v->from().c_str(), e.what());
|
utils::to_log(LOG_LEVEL_DEBUG, "FATAL: image %d process '%s' throws exception: %s!\n", info->paper_ind, v->from(), e.what());
|
||||||
std::string f(dump_usb_img_real(data, bytes, info, v->from().c_str()));
|
std::string f(dump_usb_img_real(data, bytes, info, v->from()));
|
||||||
utils::to_log(LOG_LEVEL_WARNING, "FATAL: process image %d failed on '%s', source content save to file '%s'\n", info->paper_ind, v->from().c_str(), f.c_str());
|
utils::to_log(LOG_LEVEL_WARNING, "FATAL: process image %d failed on '%s', source content save to file '%s'\n", info->paper_ind, v->from(), f.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
ret = SCANNER_ERR_THROW_EXCEPTION;
|
ret = SCANNER_ERR_THROW_EXCEPTION;
|
||||||
utils::to_log(LOG_LEVEL_DEBUG, "FATAL: image process '%s' throws unknown exception!\n", v->from().c_str());
|
utils::to_log(LOG_LEVEL_DEBUG, "FATAL: image process '%s' throws unknown exception!\n", v->from());
|
||||||
std::string f(dump_usb_img_real(data, bytes, info, v->from().c_str()));
|
std::string f(dump_usb_img_real(data, bytes, info, v->from()));
|
||||||
utils::to_log(LOG_LEVEL_WARNING, "FATAL: process image %d failed on '%s', source content save to file '%s'\n", info->paper_ind, v->from().c_str(), f.c_str());
|
utils::to_log(LOG_LEVEL_WARNING, "FATAL: process image %d failed on '%s', source content save to file '%s'\n", info->paper_ind, v->from(), f.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,13 +44,13 @@ void sane_opt_provider::set_where(const char* where)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sane_opt_provider::get_opt_json(void)
|
const char* sane_opt_provider::get_opt_json(void)
|
||||||
{
|
{
|
||||||
return opt_jsn_txt_;
|
return opt_jsn_txt_.c_str();
|
||||||
}
|
}
|
||||||
std::string sane_opt_provider::from(void)
|
const char* sane_opt_provider::from(void)
|
||||||
{
|
{
|
||||||
return where_;
|
return where_.c_str();
|
||||||
}
|
}
|
||||||
void sane_opt_provider::set_following_provider(const char* name, sane_opt_provider* following)
|
void sane_opt_provider::set_following_provider(const char* name, sane_opt_provider* following)
|
||||||
{
|
{
|
||||||
|
@ -79,12 +79,15 @@ sane_opt_provider* sane_opt_provider::get_following(const char* name)
|
||||||
|
|
||||||
return prvd;
|
return prvd;
|
||||||
}
|
}
|
||||||
std::string sane_opt_provider::get_value(const char* name, void* value, int* err)
|
char* sane_opt_provider::get_value(const char* name, void* value, size_t* size, int* err)
|
||||||
{
|
{
|
||||||
if (err)
|
if (err)
|
||||||
*err = SCANNER_ERR_DEVICE_NOT_SUPPORT;
|
*err = SCANNER_ERR_DEVICE_NOT_SUPPORT;
|
||||||
|
|
||||||
return "";
|
if (size)
|
||||||
|
*size = 0;
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
int sane_opt_provider::set_value(const char* name, void* val)
|
int sane_opt_provider::set_value(const char* name, void* val)
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
class sane_opt_provider : public refer
|
class sane_opt_provider : public refer
|
||||||
{
|
{
|
||||||
|
bool is_in_another_module_;
|
||||||
|
|
||||||
std::string opt_jsn_txt_;
|
std::string opt_jsn_txt_;
|
||||||
std::string where_;
|
std::string where_;
|
||||||
|
|
||||||
|
@ -28,13 +30,15 @@ protected:
|
||||||
void set_where(const char* where);
|
void set_where(const char* where);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::string get_opt_json(void);
|
const char* get_opt_json(void); // if no content, return "" plz.
|
||||||
std::string from(void);
|
const char* from(void); // if no content, return "" plz.
|
||||||
|
bool is_in_another_module(void) { return is_in_another_module_; }
|
||||||
void set_following_provider(const char* name, sane_opt_provider* following); // when option has provided by more than one
|
void set_following_provider(const char* name, sane_opt_provider* following); // when option has provided by more than one
|
||||||
sane_opt_provider* get_following(const char* name); // caller should ->release returned value
|
sane_opt_provider* get_following(const char* name); // caller should ->release returned value
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual std::string get_value(const char* name, void* value, int* err = nullptr);
|
// return malloc(), real data size stored in parameter 'size'. invoker should free() the returned value
|
||||||
|
virtual char* get_value(const char* name, void* value, size_t* size, int* err = nullptr);
|
||||||
virtual int set_value(const char* name, void* val);
|
virtual int set_value(const char* name, void* val);
|
||||||
virtual void enable(const char* name, bool able);
|
virtual void enable(const char* name, bool able);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1001,8 +1001,8 @@ void device_option::insert_option(gb_json* opt, sane_opt_provider* from, const c
|
||||||
if (vn > vo)
|
if (vn > vo)
|
||||||
{
|
{
|
||||||
// replace and discard all following options ...
|
// replace and discard all following options ...
|
||||||
write_log("SANE-OPT: use %s::%s(ver: %d) replaced with %s::%s(ver: %d)\n", src_[existing->key()]->from().c_str(), existing->key().c_str(), vo
|
write_log("SANE-OPT: use %s::%s(ver: %d) replaced with %s::%s(ver: %d)\n", src_[existing->key()]->from(), existing->key().c_str(), vo
|
||||||
, from->from().c_str(), opt->key().c_str(), vn);
|
, from->from(), opt->key().c_str(), vn);
|
||||||
|
|
||||||
vo = origin_->index(existing);
|
vo = origin_->index(existing);
|
||||||
origin_->remove(vo);
|
origin_->remove(vo);
|
||||||
|
@ -1033,7 +1033,7 @@ void device_option::insert_option(gb_json* opt, sane_opt_provider* from, const c
|
||||||
else if (vn == vo)
|
else if (vn == vo)
|
||||||
{
|
{
|
||||||
// insert into following queue ...
|
// insert into following queue ...
|
||||||
write_log("SANE-OPT: inserting %s::%s to provider queue ...\n", from->from().c_str(), opt->key().c_str());
|
write_log("SANE-OPT: inserting %s::%s to provider queue ...\n", from->from(), opt->key().c_str());
|
||||||
opt->get_value("pos", vn);
|
opt->get_value("pos", vn);
|
||||||
existing->get_value("pos", vo);
|
existing->get_value("pos", vo);
|
||||||
if (vo < vn)
|
if (vo < vn)
|
||||||
|
@ -1128,7 +1128,7 @@ void device_option::insert_option(gb_json* opt, sane_opt_provider* from, const c
|
||||||
sane_opt_provider* next = src_[opt->key().c_str()]->get_following(opt->key().c_str());
|
sane_opt_provider* next = src_[opt->key().c_str()]->get_following(opt->key().c_str());
|
||||||
while (next)
|
while (next)
|
||||||
{
|
{
|
||||||
logi += " -> " + next->from();
|
logi += std::string(" -> ") + next->from();
|
||||||
|
|
||||||
sane_opt_provider* next1 = next;
|
sane_opt_provider* next1 = next;
|
||||||
next = next->get_following(opt->key().c_str());
|
next = next->get_following(opt->key().c_str());
|
||||||
|
@ -1140,8 +1140,8 @@ void device_option::insert_option(gb_json* opt, sane_opt_provider* from, const c
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// discard new option ...
|
// discard new option ...
|
||||||
write_log("SANE-OPT: discard %s::%s(ver: %d) for %s::%s(ver: %d) existed!\n", from->from().c_str(), opt->key().c_str(), vn
|
write_log("SANE-OPT: discard %s::%s(ver: %d) for %s::%s(ver: %d) existed!\n", from->from(), opt->key().c_str(), vn
|
||||||
, src_[existing->key()]->from().c_str(), existing->key().c_str(), vo);
|
, src_[existing->key()]->from(), existing->key().c_str(), vo);
|
||||||
|
|
||||||
// disable discarded option
|
// disable discarded option
|
||||||
from->enable(existing->key().c_str(), false);
|
from->enable(existing->key().c_str(), false);
|
||||||
|
@ -1764,11 +1764,19 @@ int device_option::update_data(const char* name, void* value, bool reorder_if_ne
|
||||||
{
|
{
|
||||||
if (src_.count(SANE_STD_OPT_NAME_PAPER_W))
|
if (src_.count(SANE_STD_OPT_NAME_PAPER_W))
|
||||||
{
|
{
|
||||||
std::string w(src_[SANE_STD_OPT_NAME_PAPER_W]->get_value(SANE_STD_OPT_NAME_PAPER_W, nullptr)),
|
size_t wl = 0, hl = 0;
|
||||||
h(src_[SANE_STD_OPT_NAME_PAPER_H]->get_value(SANE_STD_OPT_NAME_PAPER_H, nullptr)),
|
char *ws = src_[SANE_STD_OPT_NAME_PAPER_W]->get_value(SANE_STD_OPT_NAME_PAPER_W, nullptr, &wl),
|
||||||
|
*hs = src_[SANE_STD_OPT_NAME_PAPER_H]->get_value(SANE_STD_OPT_NAME_PAPER_H, nullptr, &hl);
|
||||||
|
std::string w(ws ? std::string(ws, wl) : ""),
|
||||||
|
h(hs ? std::string(hs, hl) : ""),
|
||||||
lateral(get_option_value(SANE_STD_OPT_NAME_LATERAL, SANE_ACTION_GET_VALUE));
|
lateral(get_option_value(SANE_STD_OPT_NAME_LATERAL, SANE_ACTION_GET_VALUE));
|
||||||
gb_json *jsnl = nullptr;
|
gb_json *jsnl = nullptr;
|
||||||
|
|
||||||
|
if (ws)
|
||||||
|
free(ws);
|
||||||
|
if (hs)
|
||||||
|
free(hs);
|
||||||
|
|
||||||
now_->get_value(SANE_STD_OPT_NAME_LATERAL, jsnl);
|
now_->get_value(SANE_STD_OPT_NAME_LATERAL, jsnl);
|
||||||
if (jsnl)
|
if (jsnl)
|
||||||
{
|
{
|
||||||
|
@ -1938,7 +1946,15 @@ std::string device_option::get_option_value(const char* name, int type, int* siz
|
||||||
else if (child->get_value("ownread", own_read) && own_read)
|
else if (child->get_value("ownread", own_read) && own_read)
|
||||||
{
|
{
|
||||||
if (src_.count(name))
|
if (src_.count(name))
|
||||||
value = std::move(src_[name]->get_value(name, in_data));
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
char* v = src_[name]->get_value(name, in_data, &len);
|
||||||
|
if (v)
|
||||||
|
{
|
||||||
|
value = std::string(v, len);
|
||||||
|
free(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
value = device_option::option_value(child, type == SANE_ACTION_GET_DEFAULT_VALUE);
|
value = device_option::option_value(child, type == SANE_ACTION_GET_DEFAULT_VALUE);
|
||||||
|
|
Loading…
Reference in New Issue