diff --git a/sane/s2t_api.h b/sane/s2t_api.h index 6c81904..ffe4972 100644 --- a/sane/s2t_api.h +++ b/sane/s2t_api.h @@ -434,7 +434,7 @@ extern "C" #else __declspec(dllimport) #endif - int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker); + int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker, bool last_try); #ifdef EXPORT_SANE_API __declspec(dllexport) #else diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 1dc997a..9a53833 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -3431,13 +3431,27 @@ extern "C" #else __declspec(dllimport) #endif - int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker) + int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker, bool last_try) { if (!invoker) return SCANNER_ERR_INVALID_PARAMETER; if (!is_scanner_online(scanner_id)) + { + if (last_try) + { + HWND parent = callback::find_main_wnd(); + std::string msg(callback::language_trans("\xE6\xB2\xA1\xE6\x9C\x89\xE6\x89\xBE\xE5\x88\xB0\xE6\x89\xAB\xE6\x8F\x8F\xE4\xBB\xAA\xEF\xBC\x81", true, NULL)), + title(callback::language_trans("\xE9\x94\x99\xE8\xAF\xAF", true, NULL)); + + if (callback::show_messagebox_ui) + callback::show_messagebox_ui(parent, 0, &msg[0], SCANNER_ERR_DEVICE_NOT_FOUND); + else + MessageBoxW(parent, local_trans::a2u(msg.c_str(), CP_UTF8).c_str(), local_trans::a2u(title.c_str(), CP_UTF8).c_str(), MB_OK); + } + return SCANNER_ERR_DEVICE_NOT_FOUND; + } scanner* scn = new scanner(scanner_id); if (scn->last_error() == SCANNER_ERR_OK) @@ -3448,10 +3462,20 @@ extern "C" } else { - int ret = scn->last_error(); + int ret = scn->last_error(); scn->release(); *invoker = NULL; + if (last_try) + { + HWND parent = callback::find_main_wnd(); + std::string msg(callback::language_trans("\xE6\x89\x93\xE5\xBC\x80\xE6\x89\xAB\xE6\x8F\x8F\xE4\xBB\xAA\xE5\xA4\xB1\xE8\xB4\xA5\xE3\x80\x82", true, NULL)), + title(callback::language_trans("\xE9\x94\x99\xE8\xAF\xAF", true, NULL)); + if (callback::show_messagebox_ui) + callback::show_messagebox_ui(parent, 0, &msg[0], ret); + else + MessageBoxW(parent, local_trans::a2u(msg.c_str(), CP_UTF8).c_str(), local_trans::a2u(title.c_str(), CP_UTF8).c_str(), MB_OK); + } return ret; } diff --git a/twain/load_sane.cpp b/twain/load_sane.cpp index 9660d61..36deebf 100644 --- a/twain/load_sane.cpp +++ b/twain/load_sane.cpp @@ -10,7 +10,7 @@ namespace load_sane_util { static std::wstring sane_path(L""); static HMODULE sane_module(NULL); - static int (__stdcall* sane_inst)(SCANNERID, ISaneInvoker**) = NULL; + static int (__stdcall* sane_inst)(SCANNERID, ISaneInvoker**, bool) = NULL; static int(__stdcall* is_on)(SCANNERID) = NULL; static int(__stdcall* init)(void*) = NULL; static int(__stdcall* uninit)(void*) = NULL; @@ -87,6 +87,25 @@ namespace load_sane_util return reg_read(HKEY_LOCAL_MACHINE, path.c_str(), key.c_str()); } + std::string to_web_utf(const std::wstring& unic) + { + std::string webu(""); + char buf[20] = { 0 }; + + for (size_t i = 0; i < unic.length(); ++i) + { + wchar_t v = unic[i]; + if (v <= 0x7f) + webu.append(1, (char)v); + else + { + sprintf_s(buf, _countof(buf) - 1, "\\u%04X", v); + webu += buf; + } + } + + return webu; + } static int load_dll(const wchar_t* path_dll, HMODULE* dll) { HMODULE h = LoadLibraryW(path_dll); @@ -166,7 +185,7 @@ namespace load_sane_util else return false; } - ISaneInvoker* open(SCANNERID guid, int* err) + ISaneInvoker* open(SCANNERID guid, int* err, bool last_try) { ISaneInvoker* ret = NULL; int code = 0; @@ -175,7 +194,7 @@ namespace load_sane_util err = &code; if (sane_inst) - *err = sane_inst(guid, &ret); + *err = sane_inst(guid, &ret, last_try); return ret; } @@ -244,3 +263,4 @@ namespace load_sane_util return ret; } }; + diff --git a/twain/load_sane.h b/twain/load_sane.h index 137fe29..cd3c9be 100644 --- a/twain/load_sane.h +++ b/twain/load_sane.h @@ -10,7 +10,7 @@ namespace load_sane_util bool initialize(HMODULE me); bool is_ok(void); bool is_online(SCANNERID guid); - ISaneInvoker* open(SCANNERID guid, int* err); + ISaneInvoker* open(SCANNERID guid, int* err, bool last_try); void uninitialize(void); void log_info(const wchar_t* info, int level); @@ -20,5 +20,15 @@ namespace load_sane_util int move_file(const char* from, const char* to); int move_file(const wchar_t* from, const wchar_t* to); + + template + void to_log(const wchar_t* fmt, Args ... args) + { + size_t size = swprintf(nullptr, 0, fmt, args ...) + 2; + std::unique_ptr buf(new wchar_t[size]); + + swprintf(buf.get(), size, fmt, args ...); + log_info(buf.get(), 0); + } }; diff --git a/twain/twain/huagaods.cpp b/twain/twain/huagaods.cpp index e3dc2fd..f7e7d43 100644 --- a/twain/twain/huagaods.cpp +++ b/twain/twain/huagaods.cpp @@ -963,10 +963,10 @@ Result huagao_ds::identityOpenDs(const Identity& id) return result; } - int err = 0, attempt = 0; + int err = 0, attempt = 0, max_try = 100; // Sleep(500); - scanner_.reset(load_sane_util::open(scanner_guid, &err)); - while (err == SCANNER_ERR_DEVICE_NOT_FOUND && attempt++ < 100) + scanner_.reset(load_sane_util::open(scanner_guid, &err, false)); + while (err == SCANNER_ERR_DEVICE_NOT_FOUND && attempt++ < max_try) { if (attempt == 1) { @@ -974,7 +974,7 @@ Result huagao_ds::identityOpenDs(const Identity& id) } std::this_thread::sleep_for(std::chrono::milliseconds(5)); err = 0; - scanner_.reset(load_sane_util::open(scanner_guid, &err)); + scanner_.reset(load_sane_util::open(scanner_guid, &err, attempt >= max_try)); } if (!scanner_.get()) { @@ -3057,6 +3057,16 @@ void huagao_ds::init_support_caps(void) SET_EXISTING_EXTENSION(BKG_COLOR_RANGE, CapTypeEx::CAP_TYPE_EX_FADE_BKG_VALUE); SET_EXISTING_EXTENSION(SIZE_CHECK, CapTypeEx::CAP_TYPE_EX_SIZE_DETECT); SET_EXISTING_EXTENSION(IS_MULTI_OUT, CapTypeEx::CAP_TYPE_EX_MULTI_OUT); + + m_query[(CapType)SANE_OPT_ID_DEVICE_SERIAL_NO] = m_query[CapType::SerialNumber]; + m_caps[(CapType)SANE_OPT_ID_DEVICE_SERIAL_NO] = m_caps[CapType::SerialNumber]; + + m_query[(CapType)SANE_OPT_ID_FIRMWARE_VERSION] = m_query[(CapType)CapTypeEx::CAP_TYPE_EX_HARDWARE_VERSION]; + m_caps[(CapType)SANE_OPT_ID_FIRMWARE_VERSION] = m_caps[(CapType)CapTypeEx::CAP_TYPE_EX_HARDWARE_VERSION]; + + m_query[(CapType)SANE_OPT_ID_DEVICE_IP_ADDR] = m_query[(CapType)CapTypeEx::CAP_TYPE_EX_IP]; + m_caps[(CapType)SANE_OPT_ID_DEVICE_IP_ADDR] = m_caps[(CapType)CapTypeEx::CAP_TYPE_EX_IP]; + } void huagao_ds::init_support_caps_ex(void) {