From 84e0b6996d2009c89ef861d62abbfbc145f6151c Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Thu, 20 Oct 2022 14:29:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BB=A5=E9=80=82=E5=BA=94?= =?UTF-8?q?=E6=97=A0UI=E6=89=AB=E6=8F=8F=EF=BC=8C=E4=B8=94=E5=9C=A8?= =?UTF-8?q?=E6=97=A0UI=E6=89=AB=E6=8F=8F=E7=BB=93=E6=9D=9F=E6=97=B6?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=94=B9=E4=B8=BAXferReady=EF=BC=88=E5=A5=BD?= =?UTF-8?q?=E5=88=86=E6=95=B0=E4=BA=A7=E5=93=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/s2t_api.h | 2 +- sane/scanner.cpp | 25 +++++++---- sane/scanner.h | 5 ++- twain/twain/huagaods.cpp | 89 +++++++++++++++++++++++----------------- twain/twain/huagaods.hpp | 2 + 5 files changed, 76 insertions(+), 47 deletions(-) diff --git a/sane/s2t_api.h b/sane/s2t_api.h index 3c7846d..499b850 100644 --- a/sane/s2t_api.h +++ b/sane/s2t_api.h @@ -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)); diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 3ea424c..b7fb4b1 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -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); + + 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& 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; { diff --git a/sane/scanner.h b/sane/scanner.h index a29e76b..70b7241 100644 --- a/sane/scanner.h +++ b/sane/scanner.h @@ -53,6 +53,9 @@ class scanner : public ISaneInvoker, virtual public refer std::unique_ptr 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)); diff --git a/twain/twain/huagaods.cpp b/twain/twain/huagaods.cpp index c52b789..b4caf44 100644 --- a/twain/twain/huagaods.cpp +++ b/twain/twain/huagaods.cpp @@ -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; +} diff --git a/twain/twain/huagaods.hpp b/twain/twain/huagaods.hpp index 18a5d2a..3e245de 100644 --- a/twain/twain/huagaods.hpp +++ b/twain/twain/huagaods.hpp @@ -44,6 +44,7 @@ class huagao_ds : public Twpp::SourceFromThis { 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 { 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 {