code_app/modules/twainui/twainui.cpp

288 lines
6.9 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 "twainui.h"
#include <QMessageBox>
#include <string>
#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 g_manager;
g_manager = nullptr;
delete qApp;
}
}
static void Init()
{
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
else
{
if (NULL == g_manager)
{
g_manager = new Manager;
//g_manager->moveToThread(qApp->thread());
}
}
assert(nullptr != g_manager);
}
int choose_scanner(const std::vector<DEVQUEUI> &devs)
{
Init();
return g_manager->showDeviceSelect(devs);
}
char *apply_current_config(const char *dev_name, SANE_Handle device, LPSANEAPI api) // this function only called after scanner open
{
Init();
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, std::function<void(int, void*, int)> *notify)
{
Init();
return g_manager->showSettingUi(device, parent, api, devName, scanner_cfg_, with_scan, callback, notify);
}
int show_progress_ui(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)
{
Init();
return g_manager->showProgressUi(parent, callback, notify);
}
int show_messagebox_ui(HWND parent, int event, void *msg, int flag)
{
Init();
return g_manager->showMessageBoxUi(parent, event, msg, flag);
}
int show_twain_srclist_ui(const TW_IDENTITY *vds, HGUInt count, const HGChar *defDsName, HGWindow parent, TW_IDENTITY *ds)
{
Init();
return g_manager->showTwainSrcUi(vds, count, defDsName, parent, ds);
}
int show_srclist_ui(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen)
{
Init();
return g_manager->showSaneSrcUi(manuNames, sanePaths, parent, dll, saneApi, manuName, maxLen);
}
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();
if (nullptr == g_hThread)
{
//g_manager->moveToThread(QThread::currentThread());
delete g_manager;
g_manager = nullptr;
}
else
{
#if 0
QApplication::exit();
HGBase_CloseThread(g_hThread);
g_hThread = NULL;
HGBase_DestroyEvent(g_event);
g_event = NULL;
#endif
}
}
return 0;
}
void pump_ui_message(void* reserved)
{
QApplication::processEvents();
}
int abnormal_image(SANE_Image *img, HGWindow parent)
{
Init();
return g_manager->showAbnormalImgUi(img);
}