#include "twain_user/twainui.h" #include #include #include "dialog_device_select.h" #include "dialog_progress_ui.h" #include "hg_settingdialog.h" #include "dialog_twain_source_select.h" #include "device_menu.h" #include "base/HGBase.h" #include "Manager.h" #ifdef HG_CMP_MSC #include "qwinwidget.hpp" extern HINSTANCE g_hInst; extern HGEvent g_event; extern Manager *g_manager; extern HGThread g_hThread; #endif static void HGAPI ThreadFunc(HGThread thread, HGPointer param) { bool ownApplication = false; ownApplication = QMfcApp::pluginInstance(g_hInst); if (ownApplication) { qApp->setQuitOnLastWindowClosed(false); g_manager = new Manager; HGBase_SetEvent(g_event); qApp->exec(); delete qApp; } } int choose_scanner(const std::vector &devs) { if (!qApp) { HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event); HGBase_OpenThread(ThreadFunc, NULL, &g_hThread); HGBase_WaitEvent(g_event); } if (NULL == g_manager) { g_manager = new Manager; } return g_manager->showDeviceSelect(nullptr == g_hThread, devs); } char *apply_current_config(const char *dev_name, SANE_Handle device, LPSANEAPI api) { dev_que devQue; gb::scanner_cfg *cur_cfg_ = nullptr; gb::sane_config_schm *curScheme = nullptr; HGChar cfgpath[512] = {0}; HGBase_GetConfigPath(cfgpath, _countof(cfgpath) - 1); HGBase_CreateDir(cfgpath); devQue.set_root_dir(cfgpath); QString old = QString::fromStdString(cfgpath) + PATH_SYMBOL + "scanner.schm"; if(QFile::exists(old)) dev_que::update_old_cfg(old.toStdString().c_str()); int pid = 0; api->sane_control_option_api(device, (SANE_Int)0x8853, SANE_ACTION_GET_VALUE, &pid, NULL); char buf[10] = { 0 }; sprintf(buf, "%x", pid); std::string devName = dev_name; if (pid != 0) { devName = devName.substr(0, devName.find(" ")) + " " + buf; } devQue.add_scanner(devName.c_str()); devQue.open_scanner(api, device, devName.c_str(), true); std::string n(devQue.opened_scanner_name()); for(int i = 0; i < devQue.scanners(); ++i) { SCANNER s = devQue.get_at(i); if(s.name == n) { cur_cfg_ = s.cfg; break; } } curScheme = cur_cfg_->get_scheme(); if(!curScheme) curScheme = new gb::sane_config_schm(); curScheme->begin_setting(); std::string name = curScheme->get_scheme_name(); char *str = const_cast(name.c_str()); char *buf2 = new char[strlen(str) + 4]; memcpy(buf2, str, sizeof(str)); return buf2; } void twain_ui_free(void *buf) { if (buf != nullptr) { delete[] buf; buf = nullptr; } } int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function callback) { if (!qApp) { HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event); HGBase_OpenThread(ThreadFunc, NULL, &g_hThread); HGBase_WaitEvent(g_event); } if (NULL == g_manager) { g_manager = new Manager; } return g_manager->showSettingUi(nullptr == g_hThread, device, parent, api, devName, with_scan, callback); } int show_progress_ui(HWND parent, std::function callback, std::function *notify) { if (!qApp) { HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event); HGBase_OpenThread(ThreadFunc, NULL, &g_hThread); HGBase_WaitEvent(g_event); } if (NULL == g_manager) { g_manager = new Manager; } return g_manager->showProgressUi(nullptr == g_hThread, parent, callback, notify); } int show_messagebox_ui(HWND parent, int event, void *msg, int flag) { if (!qApp) { HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event); HGBase_OpenThread(ThreadFunc, NULL, &g_hThread); HGBase_WaitEvent(g_event); } if (NULL == g_manager) { g_manager = new Manager; } return g_manager->showMessageBoxUi(nullptr == g_hThread, parent, event, msg, flag); } int show_twain_srclist_ui(const TW_IDENTITY *vds, HGUInt count, const HGChar *defDsName, HGWindow parent, TW_IDENTITY *ds) { if (!qApp) { HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event); HGBase_OpenThread(ThreadFunc, NULL, &g_hThread); HGBase_WaitEvent(g_event); } if (NULL == g_manager) { g_manager = new Manager; } return g_manager->showTwainSrcUi(nullptr == g_hThread, vds, count, defDsName, parent, ds); } int close_ui(int which) { if (NULL == g_manager) { return 0; } if (UI_INDICATOR & which) { g_manager->closeProgressUi(); } if (UI_SETTING & which) { g_manager->closeSettingUi(); } if (UI_MSG_BOX & which) { g_manager->closeMessageBoxUi(); } if (which == UI_UNLOAD_MODULE) { g_manager->clear_functions(); //g_manager->closeManager(); //if (NULL != g_hThread) //{ // HGBase_CloseThread(g_hThread); // g_hThread = NULL; // HGBase_DestroyEvent(g_event); // g_event = NULL; //} } return 0; }