添加事件回调接口,以适应无UI扫描,且在无UI扫描结束时通知改为XferReady(好分数产品)

This commit is contained in:
gb 2022-10-20 14:29:02 +08:00
parent 4da3fca44b
commit 84e0b6996d
5 changed files with 76 additions and 47 deletions

View File

@ -147,7 +147,7 @@ struct __declspec(novtable) IScanImg : public IRef
};
struct __declspec(novtable) ISaneInvoker : public IRef
{
COM_API_DECLARE(int, start(void));
COM_API_DECLARE(int, start(int(__stdcall* handle_ev)(int, void*) = NULL, void* para = NULL));
COM_API_DECLARE(int, stop(void));
COM_API_DECLARE(int, get_event(void));
COM_API_DECLARE(bool, wait_image(DWORD milliseconds = -1));

View File

@ -543,14 +543,18 @@ void scanner::on_ui_event(int uev, void* sender)
{
events_.clear();
ui_hide();
if(indicator)
events_.save(SANE_EVENT_SCAN_FINISHED);
if(indicator || !indicator_.get())
uev = SANE_EVENT_SCAN_FINISHED;
else
events_.save(SANE_EVENT_UI_CLOSE_SETTING);
uev = SANE_EVENT_UI_CLOSE_SETTING;
}
else
events_.save(uev);
}
int(__stdcall * h)(int, void*) = scanner_ev_handler_;
if (h)
h(uev, evh_param_);
}
std::string scanner::choose_scanner(const std::vector<std::string>& scanners)
{
@ -634,6 +638,7 @@ int scanner::open(void)
}
int scanner::close(void)
{
scanner_ev_handler_ = NULL;
ui_hide();
callback::unreg_callback(this);
if (handle_)
@ -2020,10 +2025,13 @@ EX_OPTION_HANDLER_IMPL(search_hole_range)
}
// ISaneInvoker
COM_API_IMPLEMENT(scanner, int, start(void))
COM_API_IMPLEMENT(scanner, int, start(int(__stdcall* handle_ev)(int, void*), void* para))
{
int ret = SANE_STATUS_GOOD;
scanner_ev_handler_ = handle_ev;
evh_param_ = para;
events_.clear();
images_.clear();
scan_msg_ = "OK";
@ -2064,6 +2072,7 @@ COM_API_IMPLEMENT(scanner, int, start(void))
}
COM_API_IMPLEMENT(scanner, int, stop(void))
{
scanner_ev_handler_ = NULL;
return hg_sane_middleware::instance()->stop(handle_);
}
COM_API_IMPLEMENT(scanner, int, get_event(void))
@ -2573,7 +2582,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len)
if (indicator_.get())
indicator_->notify_working();
else
events_.save(ev_code);
on_ui_event(ev_code, (void*)ev_code);
log_info(L"Scanning ...\r\n", 0);
}
@ -2613,7 +2622,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len)
if (indicator_.get())
indicator_->notify_scan_over((char*)data, *len != SCANNER_ERR_OK);
else
events_.save(ev_code);
on_ui_event(ev_code, (void*)ev_code);
is_scanning_ = false;
{

View File

@ -53,6 +53,9 @@ class scanner : public ISaneInvoker, virtual public refer
std::unique_ptr<dlg_setting> setting_;
gb::sane_config* cfg_;
int(__stdcall* scanner_ev_handler_)(int, void*);
void* evh_param_;
void transport_config_file(void);
void update_config(void);
void load_config(const wchar_t* file);
@ -201,7 +204,7 @@ public:
// ISaneInvoker
public:
COM_API_OVERRIDE(int, start(void));
COM_API_OVERRIDE(int, start(int(__stdcall* handle_ev)(int, void*) = NULL, void* para = NULL));
COM_API_OVERRIDE(int, stop(void));
COM_API_OVERRIDE(int, get_event(void));
COM_API_OVERRIDE(bool, wait_image(DWORD milliseconds = -1));

View File

@ -654,6 +654,10 @@ void huagao_ds::showmsg(const char* msg, int err)
{
ShellExecuteA(NULL, "open", huagao_ds::get_hidedlg_path().c_str(), msg, NULL, SW_HIDE);
}
int __stdcall huagao_ds::on_scanner_event(int ev, void* param)
{
return ((huagao_ds*)param)->handle_scanner_event(ev);
}
const Identity& huagao_ds::defaultIdentity() noexcept {
// remember, we return a reference, therefore the identity must not be placed on the stack of this method
@ -741,49 +745,16 @@ Result huagao_ds::capabilitySet(const Identity& origin, Capability& data)
}
Result huagao_ds::eventProcess(const Identity&, Event& event)
{
static int count_0 = 0;
const MSG* msg = (const MSG*)event.event();
if (scanner_.get())
{
int ev = scanner_->get_event();
if (ev == 0)
count_0++;
else
{
wchar_t msg[128] = { 0 };
if(count_0)
swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x0 +%d)\r\nds::eventProcess(0x%x)\r\n", count_0, ev);
else
swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x%x)\r\n", ev);
load_sane_util::log_info(msg, 0);
count_0 = 0;
}
switch (ev)
{
case SANE_EVENT_WORKING:
notifyXferReady();
break;
case SANE_EVENT_UI_CLOSE_CANCEL:
scanner_->stop();
// notifyEndWithoutImages();
break;
case SANE_EVENT_UI_CLOSE_NORMAL:
scanner_->ui_hide();
case SANE_EVENT_SCAN_FINISHED:
//notifyCloseOk();
//break;
case SANE_EVENT_UI_CLOSE_SETTING:
notifyCloseCancel();
break;
case SANE_EVENT_UI_SCAN_COMMAND:
scanner_->ui_show_progress(NULL);
scanner_->start();
break;
}
handle_scanner_event(ev);
}
// event.setMessage(Msg::Null);
return { ReturnCode::NotDsEvent, ConditionCode::Success };
}
Twpp::Result huagao_ds::deviceEventGet(const Twpp::Identity& origin, Twpp::DeviceEvent& data)
@ -944,8 +915,9 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui)
if (m_bIndicator && !scanner_->ui_show_progress((HWND)ui.parent().raw()))
return seqError();
int(__stdcall * evf)(int, void*) = m_bIndicator ? NULL : &huagao_ds::on_scanner_event;
scanner_->twain_set_transfer((twain_xfer)m_capXferMech);
int err = scanner_->start();
int err = scanner_->start(evf, this);
if (err == SCANNER_ERR_OK)
{
return success();
@ -2822,7 +2794,50 @@ DWORD huagao_ds::get_config_number(const wchar_t* sec, const wchar_t* key)
{
return GetPrivateProfileIntW(sec, key, 0, get_config_file().c_str());
}
int huagao_ds::handle_scanner_event(int ev)
{
static int count_0 = 0;
if (ev == 0)
count_0++;
else
{
wchar_t msg[128] = { 0 };
if (count_0)
swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x0 +%d)\r\nds::eventProcess(0x%x)\r\n", count_0, ev);
else
swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x%x)\r\n", ev);
load_sane_util::log_info(msg, 0);
count_0 = 0;
}
switch (ev)
{
case SANE_EVENT_WORKING:
notifyXferReady();
break;
case SANE_EVENT_UI_CLOSE_CANCEL:
scanner_->stop();
// notifyEndWithoutImages();
break;
case SANE_EVENT_UI_CLOSE_NORMAL:
scanner_->ui_hide();
case SANE_EVENT_SCAN_FINISHED:
//notifyCloseOk();
//break;
case SANE_EVENT_UI_CLOSE_SETTING:
if(m_bIndicator)
notifyCloseCancel();
else
notifyXferReady(); // ºÃ·ÖÊýÐèÒªÔÙ֪ͨ FAINT :( - modified on 2022-10-20
break;
case SANE_EVENT_UI_SCAN_COMMAND:
scanner_->ui_show_progress(NULL);
scanner_->start();
break;
}
return 0;
}

View File

@ -44,6 +44,7 @@ class huagao_ds : public Twpp::SourceFromThis<huagao_ds> {
static std::string get_hidedlg_path(void);
static void showmsg(const char* msg, int err);
static int __stdcall on_scanner_event(int ev, void* param);
void CapabilityPrintf(Twpp::Msg msg, std::string capability, std::string value = "");
Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data);
@ -53,6 +54,7 @@ class huagao_ds : public Twpp::SourceFromThis<huagao_ds> {
std::wstring get_config_file(void);
std::wstring get_config_value(const wchar_t* sec, const wchar_t* key);
DWORD get_config_number(const wchar_t* sec, const wchar_t* key);
int handle_scanner_event(int ev);
typedef struct _pending_xfer
{