From 87b0fbb5a0a98504f0d624015fc287a97bc88ea1 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Sat, 20 May 2023 12:02:26 +0800 Subject: [PATCH] =?UTF-8?q?TWAIN=E6=97=A5=E5=BF=97=E5=88=86=E7=BA=A7?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/scanned_img.cpp | 2 +- sane/scanner.cpp | 69 ++++++++++++++++++++++++++++++---------- twain/twain/huagaods.cpp | 31 +++++++++--------- 3 files changed, 69 insertions(+), 33 deletions(-) diff --git a/sane/scanned_img.cpp b/sane/scanned_img.cpp index e46c3f3..b8a4a83 100644 --- a/sane/scanned_img.cpp +++ b/sane/scanned_img.cpp @@ -140,7 +140,7 @@ void mapping_buf::init_map(const char* file, unsigned long long size) wchar_t buf[80] = { 0 }; swprintf_s(buf, _countof(buf) - 1, L"Mapping %u bytes to file: ", size); - log_info((buf + info + L"\r\n").c_str(), 0); + log_info((buf + info + L"\r\n").c_str(), 1); } } else diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 9a53833..cb4295c 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -100,7 +100,7 @@ namespace callback { wchar_t msg[218] = { 0 }; swprintf_s(msg, _countof(msg) - 1, L"Lost device(0x%08X) when event(%u) occurs!\r\n", hdev, code); - log_info(msg, 0); + log_info(msg, 1); return 0; } @@ -343,6 +343,7 @@ namespace callback // SANE_EVENT_SCAN_FINISHED - void*: (utf8*)message, flag - error code (0 is success) // SANE_EVENT_USB_DATA_RECEIVED- void* unused, be NULL, flag - unused, be 0 // SANE_EVENT_IMAGE_OK - void* unused, be NULL, flag - unused, be 0 + static HMODULE hui = NULL; int (*choose_scanner)(const std::vector& devs) = NULL; // blocked. return selected DEVQUE::id or -1 if user cancelled int (*apply_current_config)(const char* dev_name, SANE_Handle device, LPSANEAPI api) = NULL; // 应用设备的当前配�? int (*show_setting_ui)(SANE_Handle device, HWND parent, LPSANEAPI api, const char* devname, bool with_scan, std::function callback) = NULL; @@ -354,24 +355,22 @@ namespace callback static void init_ui(void) { std::string root(hg_sane_middleware::sane_path()); - HMODULE mod = NULL; root += "HGTwainUI.dll"; - - mod = LoadLibraryExA(root.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH); - if (!mod) + hui = LoadLibraryExA(root.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (!hui) { std::wstring info(L"Load '" + local_trans::a2u(root.c_str(), CP_UTF8)); info += L"' failed: " + std::to_wstring(GetLastError()) + L"\r\n"; - log_info(info.c_str(), 0); + log_info(info.c_str(), 1); } else { #define GET_API(api) \ proc = (FARPROC*)&api; \ - *proc = GetProcAddress(mod, #api); + *proc = GetProcAddress(hui, #api); FARPROC* proc = NULL; @@ -383,6 +382,20 @@ namespace callback GET_API(close_ui); } } + static void unint_ui(void) + { + choose_scanner = NULL; + apply_current_config = NULL; + show_setting_ui = NULL; + show_progress_ui = NULL; + show_messagebox_ui = NULL; + close_ui = NULL; + if (hui) + { + FreeLibrary(hui); + hui = NULL; + } + } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -653,7 +666,7 @@ void scanner::transport_config_file(void) old += pid; if (PathFileExistsW((cfg_path_ + old).c_str())) { - log_info((L"Rename config file '" + old + L"' to '" + scanner_name_.substr(0, pos) + L"'\r\n").c_str(), 0); + log_info((L"Rename config file '" + old + L"' to '" + scanner_name_.substr(0, pos) + L"'\r\n").c_str(), 1); MoveFileW((cfg_path_ + old).c_str(), (cfg_path_ + scanner_name_.substr(0, pos)).c_str()); } } @@ -1375,7 +1388,7 @@ void scanner::apply_scheme(gb::sane_config_schm* schm) { wchar_t info[128] = { 0 }; swprintf_s(info, _countof(info) - 1, L"ERROR: custom gamma data length is %u, but we expect %u.\r\n", v.length(), sizeof(SANE_Gamma)); - log_info(info, 0); + log_info(info, 1); } } } @@ -2530,7 +2543,7 @@ COM_API_IMPLEMENT(scanner, int, get_scanned_images(DWORD milliseconds)) { wchar_t msg[128] = { 0 }; swprintf_s(msg, _countof(msg) - 1, L"Wait image count = %d\r\n", count); - log_info(msg, 0); + log_info(msg, 1); } return count; @@ -3198,7 +3211,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) else if (callback::show_progress_ui && is_bIndicator) ui_notify(ev_code, data, *len); on_ui_event(ev_code, (void*)ev_code); - log_info(L"Scanning ...\r\n", 0); + log_info(L"Scanning ...\r\n", 1); } else if (ev_code == SANE_EVENT_IMAGE_OK) { @@ -3222,7 +3235,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) images_.count(&bytes); bytes /= 1024 * 1024; if (times == 1) - log_info(L"Memory usage upto limit! wait up to 100 ms ...\r\n", 0); + log_info(L"Memory usage upto limit! wait up to 100 ms ...\r\n", 1); } images_.save(img, img->bytes()); } @@ -3238,7 +3251,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) { wchar_t msg[128] = { 0 }; swprintf_s(msg, _countof(msg) - 1, L"New image(%u) received with %u bytes\r\n", img_ind_, simg->bytes); - log_info(msg, 0); + log_info(msg, 1); } } else if (ev_code == SANE_EVENT_USB_DATA_RECEIVED) @@ -3278,7 +3291,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) { wchar_t msg[128] = { 0 }; swprintf_s(msg, _countof(msg) - 1, L"Scan finished with error: %u\r\n", *len); - log_info(msg, 0); + log_info(msg, 1); } } else if (ev_code == SANE_EVENT_ERROR) @@ -3321,7 +3334,27 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) std::mutex g_lock_; std::string g_path_file_(""); FILE* g_file_ = NULL; +static int g_log_level = 1; +static int get_log_level(const char* log_file) +{ + std::string cfg(log_file); + size_t pos = cfg.rfind('\\'); + + cfg.erase(pos); + pos = cfg.rfind('\\'); + if (pos != std::string::npos) + { + if (stricmp(cfg.substr(pos).c_str(), "\\log") == 0) + { + cfg.erase(pos); + cfg += "\\config"; + } + } + cfg += "\\debug.cfg"; + + return GetPrivateProfileIntA("log", "twain_level", 1, cfg.c_str()); +} void init_log(void) { char* tmp = getenv("LOCALAPPDATA"); @@ -3368,8 +3401,10 @@ void init_log(void) wchar_t ts[128] = { 0 }, now[40] = { 0 }; hg_get_current_time_w(now); - swprintf_s(ts, _countof(ts) - 1, L"==================%s==================\r\n", now); + g_log_level = get_log_level(g_path_file_.c_str()); + swprintf_s(ts, _countof(ts) - 1, L"==================%s - %d==================\r\n", now, g_log_level); fwrite(ts, 2, lstrlenW(ts), g_file_); + } } void close_log(void) @@ -3503,6 +3538,7 @@ extern "C" hg_sane_middleware::set_callback(NULL, NULL); hg_sane_middleware::clear(); close_log(); + callback::unint_ui(); return 0; } @@ -3513,7 +3549,8 @@ extern "C" #endif void __stdcall log_info(const wchar_t* info, int level) { - log(info); + if(level >= g_log_level) + log(info); } } diff --git a/twain/twain/huagaods.cpp b/twain/twain/huagaods.cpp index f7e7d43..bec145a 100644 --- a/twain/twain/huagaods.cpp +++ b/twain/twain/huagaods.cpp @@ -761,7 +761,7 @@ static void log_attr_access(int attr, int method) else METHOD_DESC(GetDefault) swprintf_s(msg, _countof(msg) - 1, L"%s %04x\r\n", op, attr); - load_sane_util::log_info(msg, 0); + load_sane_util::log_info(msg, method == (int)Msg::Set || method == (int)Msg::Reset); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -970,7 +970,7 @@ Result huagao_ds::identityOpenDs(const Identity& id) { if (attempt == 1) { - load_sane_util::log_info(L"Driver is not ready, we wait ... \r\n", 0); + load_sane_util::log_info(L"Driver is not ready, we wait ... \r\n", 1); } std::this_thread::sleep_for(std::chrono::milliseconds(5)); err = 0; @@ -982,7 +982,7 @@ Result huagao_ds::identityOpenDs(const Identity& id) //singleton_ = NULL; wchar_t info[128] = { 0 }; swprintf_s(info, _countof(info) - 1, L"OpenDS error: %d\r\n", err); - load_sane_util::log_info(info, 0); + load_sane_util::log_info(info, 2); load_sane_util::uninitialize(); return { ReturnCode::Failure, huagao_ds::condition_code_from_hg_error(err) }; @@ -1234,7 +1234,7 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data) } else { - load_sane_util::log_info(L" imageInfoGet is false\r\n", 0); + load_sane_util::log_info(L" imageInfoGet is false\r\n", 1); data.setHeight(0); @@ -1250,7 +1250,7 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data) bool planar = data.planar(); Fix32 xr = data.xResolution(); swprintf_s(buf, _countof(buf) - 1,L"imageInfoGet: h-->%d w-->%d bitsPerPixel-->%d compression-->%d pixelType-->%d planar-->%d\r\n", h, w, bitsPerPixel, compression, pixelType, planar); - load_sane_util::log_info(buf, 0); + load_sane_util::log_info(buf, 1); return success(); } Result huagao_ds::imageLayoutGet(const Identity&, ImageLayout& data) @@ -1462,13 +1462,13 @@ Twpp::Result huagao_ds::imageFileXferGet(const Twpp::Identity& origin) swprintf_s(msg, _countof(msg) - 1, L") = %d\r\n", GetLastError()); f += msg; - load_sane_util::log_info(f.c_str(), 0); + load_sane_util::log_info(f.c_str(), 3); } img->release(); } else { - load_sane_util::log_info((L"Map file to " + load_sane_util::ansi2unic(m_fileXfer.filePath().string().c_str()) + L"\r\n").c_str(), 0); + load_sane_util::log_info((L"Map file to " + load_sane_util::ansi2unic(m_fileXfer.filePath().string().c_str()) + L"\r\n").c_str(), 1); img->keep_file(true); img->release(); @@ -1507,7 +1507,7 @@ Twpp::Result huagao_ds::imageFileXferGet(const Twpp::Identity& origin) swprintf_s(buf, _countof(buf) - 1, L"%d\r\n", GetLastError()); info += load_sane_util::ansi2unic(target.c_str()) + L"' to '" + load_sane_util::ansi2unic(file.c_str()) + L"' failed: "; - load_sane_util::log_info((info + buf).c_str(), 0); + load_sane_util::log_info((info + buf).c_str(), 3); } if (++cv_e >= 9) break; @@ -1541,7 +1541,7 @@ Twpp::Result huagao_ds::imageFileXferGet(const Twpp::Identity& origin) std::wstring info(load_sane_util::ansi2unic(m_fileXfer.filePath().string().c_str())); wchar_t r[80] = { 0 }; swprintf_s(r, _countof(r) - 1, L": status = %d(Fail: 0x%x)\r\n", (int)ret.status(), cv_e); - load_sane_util::log_info((info + r).c_str(), 0); + load_sane_util::log_info((info + r).c_str(), 1); } } @@ -1806,7 +1806,6 @@ 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); return success(); } - load_sane_util::log_info(m_bIndicator ? L"Set show indicator: true\r\n" : L"Set show indicator: false\r\n", 0); // data.type if (!data.operator bool()) //具有风险?(和气) Twain sample app ,data.m_cont is null,but DotNet(和气) data.m_cont not is null . { @@ -3645,7 +3644,7 @@ int huagao_ds::handle_scanner_event(int ev, bool from_event_proc) { wchar_t msg[128] = { 0 }, unk[20] = { 0 }; swprintf_s(msg, _countof(msg) - 1, L"[%x - %s]Fatal: start scanning from setting UI failed with error %d\r\n", GetCurrentThreadId(), desc_state(state(), unk), ret); - load_sane_util::log_info(msg, 0); + load_sane_util::log_info(msg, 1); scanner_status_ = SCANNER_STATUS_STOPPED; if(bUiOnly_) @@ -3657,7 +3656,7 @@ int huagao_ds::handle_scanner_event(int ev, bool from_event_proc) else { swprintf_s(msg, _countof(msg) - 1, L"[%x - %s]Warning: notifyCloseCancel failed with error %d after start scanning failed\r\n", GetCurrentThreadId(), desc_state(state(), unk), rc); - load_sane_util::log_info(msg, 0); + load_sane_util::log_info(msg, 1); } } else @@ -3701,7 +3700,7 @@ void huagao_ds::trigger_ProcessEvent(Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Ms { wchar_t info[128] = { 0 }, unk[20] = { 0 }; swprintf_s(info, _countof(info) - 1, L"[%x]Warning: notifyCloseCancel failed with error %s!\r\n", GetCurrentThreadId(), desc_return_code(rc, unk)); - load_sane_util::log_info(info, 0); + load_sane_util::log_info(info, 1); } } else @@ -3710,14 +3709,14 @@ void huagao_ds::trigger_ProcessEvent(Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Ms if (dg == DataGroup::Control && dat == Dat::Event && msg == Msg::ProcessEvent && scanner_status_ == SCANNER_STATUS_SCAN_1) { app_trigger_event_ = true; // nothing else to do - load_sane_util::log_info(L"Good! first event is (Control, Event, ProcessEvent) after start scanning ^_^.\r\n", 0); + load_sane_util::log_info(L"Good! first event is (Control, Event, ProcessEvent) after start scanning ^_^.\r\n", 1); } else if(!app_trigger_event_) { int ev = 0; if (scanner_status_ == SCANNER_STATUS_SCAN_1) - load_sane_util::log_info(L"Sorry, first event is not (Control, Event, ProcessEvent) after start scanning, we takeover it!\r\n", 0); + load_sane_util::log_info(L"Sorry, first event is not (Control, Event, ProcessEvent) after start scanning, we takeover it!\r\n", 1); if (scanner_.get()) { ev = scanner_->get_event(); @@ -3737,7 +3736,7 @@ void huagao_ds::trigger_ProcessEvent(Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Ms { wchar_t info[128] = { 0 }, unk[20] = { 0 }; swprintf_s(info, _countof(info) - 1, L"[%x]Warning: notifyCloseCancel failed with error %s when scanner is stopped!\r\n", GetCurrentThreadId(), desc_return_code(rc, unk)); - load_sane_util::log_info(info, 0); + load_sane_util::log_info(info, 1); } } }