code_app/modules/twainui/twainui.cpp

215 lines
5.2 KiB
C++

#include "twain_user/twainui.h"
#include <QMessageBox>
#include <string>
#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<DEVQUEUI> &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<char*>(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<void(ui_result)> 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<void (ui_result)> callback, std::function<void (int, void *, int)> *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(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, 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, dsmProc, appId, 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;
}