293 lines
7.1 KiB
C++
293 lines
7.1 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"
|
||
#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<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) // 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<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)
|
||
{
|
||
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<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(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;
|
||
}
|