添加事件回调接口,以适应无UI扫描,且在无UI扫描结束时通知改为XferReady(好分数产品)
This commit is contained in:
parent
4da3fca44b
commit
84e0b6996d
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
||||
{
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue