#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" #include "app_cfg.h" #ifdef HG_CMP_MSC #include "qwinwidget.hpp" extern HINSTANCE g_hInst; #endif extern HGEvent g_event; extern HGThread g_hThread; extern Manager *g_manager; static gb::scanner_cfg* scanner_cfg_ = nullptr; static void HGAPI ThreadFunc(HGThread thread, HGPointer param) { #ifdef HG_CMP_MSC bool ownApplication = false; ownApplication = QMfcApp::pluginInstance(g_hInst); #else bool ownApplication = true; int argc = 0; (void)new QApplication(argc, 0); #endif 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) // this function only called after scanner open { 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; } dev_que devQue; gb::scanner_cfg *cur_cfg_ = nullptr; gb::sane_config_schm *curScheme = nullptr; HGChar cfgpath[512] = {0}; GetConfigPath(cfgpath, 512); 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; } std::string fileName = std::string(cfgpath) + devName + ".cfg"; gb::sane_config_schm* schm = nullptr; std::string name(""); if (scanner_cfg_) scanner_cfg_->release(); scanner_cfg_ = new gb::scanner_cfg(); scanner_cfg_->load_file(fileName.c_str()); schm = scanner_cfg_->get_scheme(); hg_settingdialog::apply_scheme(device, api, schm); if (schm) { name = schm->get_scheme_name(); schm->release(); } else name = QObject::tr("default_setting").toStdString(); char* cfgn = new char[name.length() + 4]; strcpy(cfgn, name.c_str()); return cfgn; /*/ 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; //////////////*//////////////////////////////////////////// } int apply_given_config(const char* content, SANE_Handle device, LPSANEAPI api) // 应用指定的配置,content为配置数据流,返回0表示成功 { gb::scanner_cfg* cfg = new gb::scanner_cfg(); gb::sane_config_schm* schm = nullptr; cfg->load_mem(content, true); schm = cfg->get_scheme(); hg_settingdialog::apply_scheme(device, api, schm); if (schm) schm->release(); cfg->release(); return 0; } // 功能: 获取配置文件内容 // // 参数: dev_name - 设备名称 // // name - 指定的文件内容,NULL表示获取默认方案的配置文件内容 // // 返回: 配置文件内容内存,调用twain_ui_free释放 char* get_config_content(const char* dev_name, const char* name) { char* buf = nullptr; if (scanner_cfg_) { std::string text(scanner_cfg_->to_text(true)); buf = new char[text.length() + 4]; strcpy(buf, text.c_str()); } else { buf = new char[20]; strcpy(buf, "{}"); } return buf; } 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, scanner_cfg_, 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(); } return 0; }