处理保持设置界面不关闭的扫描流程; 显示设置界面时EndXfer不阻塞,改在GetInfo中阻塞,以解决APP刷新最后一幅图片的问题
This commit is contained in:
parent
b522cd9836
commit
efb252ddfa
|
@ -713,18 +713,36 @@ void scanner::apply_config(void)
|
||||||
}
|
}
|
||||||
void scanner::on_ui_event(int uev, void* sender)
|
void scanner::on_ui_event(int uev, void* sender)
|
||||||
{
|
{
|
||||||
if (uev == SANE_EVENT_SCAN_FINISHED || uev == SANE_EVENT_UI_CLOSE_CANCEL || uev == SANE_EVENT_UI_CLOSE_NORMAL)
|
if (uev == SANE_EVENT_UI_CLOSE_SETTING)
|
||||||
{
|
{
|
||||||
is_scanning_ = false;
|
// setting UI closed ...
|
||||||
|
is_scanning_ = is_show_setting_ = false;
|
||||||
|
if (setting_.get())
|
||||||
|
setting_.reset();
|
||||||
}
|
}
|
||||||
int(__stdcall * h)(int, void*) = scanner_ev_handler_;
|
else if (uev == SANE_EVENT_UI_CLOSE_NORMAL)
|
||||||
if (uev == SANE_EVENT_UI_CLOSE_CANCEL) // notify when following message SANE_EVENT_SCAN_FINISHED arrived
|
|
||||||
{
|
{
|
||||||
stop();
|
// scan complete
|
||||||
if (indicator_.get())
|
if (indicator_.get())
|
||||||
indicator_.reset();
|
indicator_.reset();
|
||||||
|
|
||||||
|
is_scanning_ = is_show_setting_;
|
||||||
}
|
}
|
||||||
else if (h)
|
else if (uev == SANE_EVENT_UI_CLOSE_CANCEL)
|
||||||
|
{
|
||||||
|
// scan cancelled
|
||||||
|
if (indicator_.get())
|
||||||
|
indicator_.reset();
|
||||||
|
|
||||||
|
stop(); // nothing to do, the finishing work do in SANE_EVENT_SCAN_FINISHED
|
||||||
|
}
|
||||||
|
else if (uev == SANE_EVENT_SCAN_FINISHED)
|
||||||
|
{
|
||||||
|
is_scanning_ = is_show_setting_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int(__stdcall * h)(int, void*) = scanner_ev_handler_;
|
||||||
|
if (h)
|
||||||
{
|
{
|
||||||
h(uev, evh_param_);
|
h(uev, evh_param_);
|
||||||
}
|
}
|
||||||
|
@ -732,50 +750,6 @@ void scanner::on_ui_event(int uev, void* sender)
|
||||||
|
|
||||||
events_.save(uev, sizeof(uev));
|
events_.save(uev, sizeof(uev));
|
||||||
|
|
||||||
//if (uev == SANE_EVENT_UI_SCAN_COMMAND) //UI主动通知
|
|
||||||
//{
|
|
||||||
// int(__stdcall * h)(int, void*) = scanner_ev_handler_;
|
|
||||||
// if (h)
|
|
||||||
// {
|
|
||||||
// //wchar_t info[128] = { 0 };
|
|
||||||
// //(info, _countof(info) - 1, L"[CRAZY]%d scanner events stored but APP has no action, we try to trigger it ONCE ...\r\n", ev_cnt_);
|
|
||||||
// ev_cnt_;
|
|
||||||
// h(SANE_EVENT_UI_SCAN_COMMAND, evh_param_);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//if (uev == SANE_EVENT_SCAN_FINISHED || uev == SANE_EVENT_UI_CLOSE_NORMAL || uev == SANE_EVENT_UI_CLOSE_CANCEL)
|
|
||||||
//{
|
|
||||||
// if (uev == SANE_EVENT_UI_CLOSE_CANCEL)
|
|
||||||
// stop();
|
|
||||||
|
|
||||||
// is_scanning_ = false;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//if (uev == SANE_EVENT_UI_CLOSE_CANCEL || uev == SANE_EVENT_UI_CLOSE_NORMAL || uev == SANE_EVENT_UI_CLOSE_SETTING)
|
|
||||||
//{
|
|
||||||
// events_.clear();
|
|
||||||
// uev = SANE_EVENT_UI_CLOSE_SETTING;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//events_.save(uev, sizeof(uev));
|
|
||||||
//ev_cnt_++;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//if (ev_cnt_ == events_.count() &&
|
|
||||||
// (ev_cnt_ >= 5 || (ev_cnt_ > 1 && !is_scanning_)))
|
|
||||||
//{
|
|
||||||
// // maybe no event has been handled by APP, triggered by callback
|
|
||||||
// int(__stdcall * h)(int, void*) = scanner_ev_handler_;
|
|
||||||
// if (h)
|
|
||||||
// {
|
|
||||||
// wchar_t info[128] = { 0 };
|
|
||||||
// swprintf_s(info, _countof(info) - 1, L"[CRAZY]%d scanner events stored but APP has no action, we try to trigger it ONCE ...\r\n", ev_cnt_);
|
|
||||||
// ev_cnt_--;
|
|
||||||
// h(events_.take(), evh_param_);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
std::string scanner::choose_scanner(const std::vector<std::string>& scanners)
|
std::string scanner::choose_scanner(const std::vector<std::string>& scanners)
|
||||||
{
|
{
|
||||||
|
|
|
@ -933,7 +933,7 @@ Twpp::Result huagao_ds::deviceEventGet(const Twpp::Identity& origin, Twpp::Devic
|
||||||
Result huagao_ds::identityOpenDs(const Identity& id)
|
Result huagao_ds::identityOpenDs(const Identity& id)
|
||||||
{
|
{
|
||||||
//singleton_ = CreateMutexA(NULL, FALSE, "LookitApp");
|
//singleton_ = CreateMutexA(NULL, FALSE, "LookitApp");
|
||||||
//if (GetLastError() == ERROR_ALREADY_EXISTS) { //如果已经存在同名的Mutex会得到这个错误.
|
//if (GetLastError() == ERROR_ALREADY_EXISTS) { //如果已ç»<EFBFBD>å˜åœ¨å<EFBFBD>Œå<EFBFBD><EFBFBD>çš„Mutex会得到这个错è¯?
|
||||||
// CloseHandle(singleton_);
|
// CloseHandle(singleton_);
|
||||||
// singleton_ = NULL;
|
// singleton_ = NULL;
|
||||||
// showmsg("提示", 202);
|
// showmsg("提示", 202);
|
||||||
|
@ -1027,20 +1027,22 @@ Result huagao_ds::pendingXfersGet(const Identity&, PendingXfers& data)
|
||||||
if (!scanner_.get())
|
if (!scanner_.get())
|
||||||
return seqError();
|
return seqError();
|
||||||
|
|
||||||
int cnt = get_scanned_image_count(-1);
|
// 显示设置界é<C592>¢æ—¶ï¼Œä¸<C3A4>能阻塞在EndXfer,å<C592>¦åˆ™æœ€å<E282AC>Žä¸€å¼ å›¾ç‰‡ä¼ è¾“å<E2809C>Žæ˜¾ç¤ºä¸<C3A4>出æ<C2BA>¥ï¼Œæ•…æ¤å¤„将原æ<C5B8>¥-1çš„å<E2809E>‚数改为ä¸<C3A4>ç‰å¾…ï¼?。显示设置界é<C592>¢æ—¶ç›´æŽ¥è¿”回有图ç‰?
|
||||||
|
// int cnt = get_scanned_image_count(-1);
|
||||||
|
int cnt = show_setting_ ? 1 : get_scanned_image_count(-1);
|
||||||
data.setCount(cnt);
|
data.setCount(cnt);
|
||||||
|
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
Result huagao_ds::pendingXfersEnd(const Identity& id, PendingXfers& data)
|
Result huagao_ds::pendingXfersEnd(const Identity& id, PendingXfers& data)
|
||||||
{
|
{
|
||||||
return pendingXfersGet(id, data);
|
return pendingXfersGet(id, data);
|
||||||
}
|
}
|
||||||
Result huagao_ds::pendingXfersReset(const Identity&, PendingXfers& data)
|
Result huagao_ds::pendingXfersReset(const Identity& id, PendingXfers& data)
|
||||||
{
|
{
|
||||||
pending_xfer_.clear();
|
pending_xfer_.clear();
|
||||||
data.setCount(get_scanned_image_count(-1));
|
|
||||||
|
|
||||||
return success();
|
return pendingXfersGet(id, data);
|
||||||
}
|
}
|
||||||
Result huagao_ds::setupMemXferGet(const Identity& id, SetupMemXfer& data)
|
Result huagao_ds::setupMemXferGet(const Identity& id, SetupMemXfer& data)
|
||||||
{
|
{
|
||||||
|
@ -1186,14 +1188,17 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!scanner_->wait_image())
|
//if (!scanner_->wait_image())
|
||||||
|
//{
|
||||||
|
//// notifyCloseOk();
|
||||||
|
// return success(); // 好分数需è¦<C3A8>返回æˆ<C3A6>åŠ?
|
||||||
|
//}
|
||||||
|
if (get_scanned_image_count(-1) > 0) // 显示设置界é<C592>¢æ—¶ï¼Œä¸<C3A4>能阻塞在EndXfer,å<C592>¦åˆ™æœ€å<E282AC>Žä¸€å¼ å›¾ç‰‡ä¼ è¾“å<E2809C>Žæ˜¾ç¤ºä¸<C3A4>出æ<C2BA>¥ï¼Œæ•…在æ¤å<C2A4>šé˜»å¡žè°ƒç”¨
|
||||||
{
|
{
|
||||||
// notifyCloseOk();
|
ok = scanner_->get_first_image_header(&head, NULL, &res);
|
||||||
return success(); // 好分数需要返回成功
|
if (ok)
|
||||||
|
dpi_ = res;
|
||||||
}
|
}
|
||||||
ok = scanner_->get_first_image_header(&head, NULL, &res);
|
|
||||||
if(ok)
|
|
||||||
dpi_ = res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ok)
|
if (ok)
|
||||||
|
@ -1230,6 +1235,10 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
load_sane_util::log_info(L" imageInfoGet is false\r\n", 0);
|
load_sane_util::log_info(L" imageInfoGet is false\r\n", 0);
|
||||||
|
|
||||||
|
data.setHeight(0);
|
||||||
|
|
||||||
|
return { ReturnCode::XferDone, ConditionCode::Bummer };
|
||||||
}
|
}
|
||||||
wchar_t buf[128];
|
wchar_t buf[128];
|
||||||
std::wstring f(L"imageInfoGet:");
|
std::wstring f(L"imageInfoGet:");
|
||||||
|
@ -1618,7 +1627,7 @@ Result huagao_ds::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, v
|
||||||
//FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg)));
|
//FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg)));
|
||||||
Result rt;
|
Result rt;
|
||||||
|
|
||||||
//trigger_ProcessEvent(dg, dat, msg); // some APPs may be not trigger (Control, Event, ProcessEvent), we help them :( ... // 云阅卷扫描端不等状态改变,直接取图,此处设置一次状态 2022-11-07
|
//trigger_ProcessEvent(dg, dat, msg); // some APPs may be not trigger (Control, Event, ProcessEvent), we help them :( ... // 云阅å<EFBFBD>·æ‰«æ<EFBFBD><EFBFBD>端ä¸<EFBFBD>ç‰çŠ¶æ€<EFBFBD>改å<EFBFBD>˜ï¼Œç›´æŽ¥å<EFBFBD>–图,æ¤å¤„设置一次状æ€?2022-11-07
|
||||||
|
|
||||||
rt = Base::call(origin, dg, dat, msg, data);
|
rt = Base::call(origin, dg, dat, msg, data);
|
||||||
if (log_all_triple_ || ((int)rt.returnCode() && rt.returnCode() != ReturnCode::NotDsEvent))
|
if (log_all_triple_ || ((int)rt.returnCode() && rt.returnCode() != ReturnCode::NotDsEvent))
|
||||||
|
@ -1783,7 +1792,7 @@ void huagao_ds::init_support_caps(void)
|
||||||
}
|
}
|
||||||
load_sane_util::log_info(m_bIndicator ? L"Set show indicator: true\r\n" : L"Set show indicator: false\r\n", 0);
|
load_sane_util::log_info(m_bIndicator ? L"Set show indicator: true\r\n" : L"Set show indicator: false\r\n", 0);
|
||||||
// data.type
|
// data.type
|
||||||
if (!data.operator bool()) //具有风险性 (和气) Twain sample app ,data.m_cont is null,but DotNet(和气) data.m_cont not is null .
|
if (!data.operator bool()) //具有风险�(和气) Twain sample app ,data.m_cont is null,but DotNet(和气) data.m_cont not is null .
|
||||||
{
|
{
|
||||||
data = Capability::createEnumeration<CapType::Indicators>({ FALSE,TRUE }, m_bIndicator ? 1 : 0, 1);
|
data = Capability::createEnumeration<CapType::Indicators>({ FALSE,TRUE }, m_bIndicator ? 1 : 0, 1);
|
||||||
}
|
}
|
||||||
|
@ -3588,15 +3597,15 @@ int huagao_ds::handle_scanner_event(int ev, bool from_event_proc)
|
||||||
show_setting_ = false;
|
show_setting_ = false;
|
||||||
break;
|
break;
|
||||||
case SANE_EVENT_UI_CLOSE_CANCEL:
|
case SANE_EVENT_UI_CLOSE_CANCEL:
|
||||||
scanner_->stop();
|
//scanner_->stop();
|
||||||
//notifyCloseCancel(); // 修复点击进度框"取消"按钮,UI不能正常结束的BUG - added on 2023-02-14
|
//notifyCloseCancel(); // ä¿®å¤<EFBFBD>点击进度æ¡?å<>–消"按钮,UIä¸<C3A4>能æ£å¸¸ç»“æ<E2809C>Ÿçš„BUG - added on 2023-02-14
|
||||||
//break;
|
//break;
|
||||||
case SANE_EVENT_UI_CLOSE_NORMAL:
|
case SANE_EVENT_UI_CLOSE_NORMAL:
|
||||||
case SANE_EVENT_SCAN_FINISHED:
|
case SANE_EVENT_SCAN_FINISHED:
|
||||||
scanner_->ui_hide();
|
//scanner_->ui_hide();
|
||||||
scanner_status_ = SCANNER_STATUS_STOPPED; // notifyCloseCancel is not need, because it done in EndXfer
|
scanner_status_ = SCANNER_STATUS_STOPPED; // notifyCloseCancel is not need, because it done in EndXfer
|
||||||
if(show_setting_)
|
//if(show_setting_)
|
||||||
notifyCloseCancel();
|
// notifyCloseCancel();
|
||||||
//notifyCloseOk();
|
//notifyCloseOk();
|
||||||
//break;
|
//break;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue