code_app/modules/twainui/twainui.cpp

301 lines
7.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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"
#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;
#ifdef HG_CMP_MSC
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;
}
}
#endif
int choose_scanner(const std::vector<DEVQUEUI> &devs)
{
#ifdef HG_CMP_MSC
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
#endif
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
{
#ifdef HG_CMP_MSC
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
#endif
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<char*>(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<void(ui_result)> callback)
{
#ifdef HG_CMP_MSC
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
#endif
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<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)
{
#ifdef HG_CMP_MSC
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
#endif
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)
{
#ifdef HG_CMP_MSC
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
#endif
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)
{
#ifdef HG_CMP_MSC
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
#endif
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;
}