diff --git a/app/demo/device_user.cpp b/app/demo/device_user.cpp index 22a0a838..12ec6928 100644 --- a/app/demo/device_user.cpp +++ b/app/demo/device_user.cpp @@ -18,7 +18,7 @@ DeviceUserMgr::~DeviceUserMgr() class DeviceUser* DeviceUserMgr::OpenDeviceUser() { HGTwainDS ds = nullptr; - HGTwain_OpenSelectedDS(m_twainDSM, &ds); + HGTwain_OpenSelectedDSEx(m_twainDSM, &ds); if (nullptr == ds) return nullptr; return new DeviceUser(m_wnd, ds); diff --git a/build2/qt/HGSaneUI/HGSaneUI.def b/build2/qt/HGSaneUI/HGSaneUI.def index 21529525..ecb3640f 100644 --- a/build2/qt/HGSaneUI/HGSaneUI.def +++ b/build2/qt/HGSaneUI/HGSaneUI.def @@ -5,4 +5,5 @@ EXPORTS show_srclist_ui show_devlist_ui show_setting_ui -show_scan_ui \ No newline at end of file +show_scan_ui +show_twain_srclist_ui \ No newline at end of file diff --git a/build2/qt/HGSaneUI/HGSaneUI.pro b/build2/qt/HGSaneUI/HGSaneUI.pro index b200b53e..6de41afe 100644 --- a/build2/qt/HGSaneUI/HGSaneUI.pro +++ b/build2/qt/HGSaneUI/HGSaneUI.pro @@ -66,9 +66,14 @@ win32 { SOURCES += ../../../modules/saneui/qmfcapp.cpp SOURCES += ../../../modules/saneui/qwinhost.cpp SOURCES += ../../../modules/saneui/qwinwidget.cpp + SOURCES += ../../../modules/saneui/dialog_twain_source_select.cpp + HEADERS += ../../../modules/saneui/qmfcapp.hpp HEADERS += ../../../modules/saneui/qwinhost.hpp HEADERS += ../../../modules/saneui/qwinwidget.hpp + HEADERS += ../../../modules/saneui/dialog_twain_source_select.h + + FORMS += ../../../modules/saneui/dialog_twain_source_select.ui MY_OS = windows TARGET = $${OEM_PREFIX}SaneUI diff --git a/build2/qt/HGSolution.pro b/build2/qt/HGSolution.pro index 5e99472c..25937264 100644 --- a/build2/qt/HGSolution.pro +++ b/build2/qt/HGSolution.pro @@ -2,78 +2,79 @@ TEMPLATE = subdirs SUBDIRS += \ HGBase \ - HGImgFmt \ - HGImgProc \ - HGSaneUI \ - HGSaneUser \ - HGTwainUser \ - HGVersion \ - HGScannerLib \ - HGUpload \ - HGWebScan \ - HGWebService \ - HGDemo \ - HGUpgrade \ - HGFWUpgrade \ - HGScanner + HGImgFmt \ + HGImgProc \ + HGSaneUI \ + HGSaneUser \ + HGTwainUser \ + HGVersion \ + HGScannerLib \ + HGUpload \ + HGWebScan \ + HGWebService \ + HGDemo \ + HGUpgrade \ + HGFWUpgrade \ + HGScanner HGImgFmt.depends = \ HGBase HGImgProc.depends = \ HGBase \ - HGImgFmt + HGImgFmt HGSaneUI.depends = \ HGBase HGSaneUser.depends = \ HGBase \ - HGSaneUI + HGSaneUI HGTwainUser.depends = \ - HGBase + HGBase \ + HGSaneUI HGVersion.depends = \ HGBase HGScannerLib.depends = \ HGBase \ - HGImgFmt \ - HGImgProc + HGImgFmt \ + HGImgProc HGUpload.depends = \ HGBase HGWebScan.depends = \ HGBase \ - HGImgFmt \ - HGImgProc + HGImgFmt \ + HGImgProc HGWebService.depends = \ HGBase \ - HGImgFmt \ - HGImgProc + HGImgFmt \ + HGImgProc HGDemo.depends = \ HGBase \ - HGImgFmt \ - HGImgProc \ - HGSaneUser \ - HGTwainUser + HGImgFmt \ + HGImgProc \ + HGSaneUser \ + HGTwainUser HGUpgrade.depends = \ - HGBase \ - HGVersion + HGBase \ + HGVersion HGFWUpgrade.depends = \ HGBase \ - HGImgFmt \ - HGImgProc \ - HGVersion + HGImgFmt \ + HGImgProc \ + HGVersion HGScanner.depends = \ HGBase \ - HGImgFmt \ - HGImgProc \ - HGVersion + HGImgFmt \ + HGImgProc \ + HGVersion diff --git a/build2/qt/HGTwainUser/HGTwainUser.def b/build2/qt/HGTwainUser/HGTwainUser.def index 2a538b5a..d172802b 100644 --- a/build2/qt/HGTwainUser/HGTwainUser.def +++ b/build2/qt/HGTwainUser/HGTwainUser.def @@ -9,6 +9,7 @@ HGTwain_GetDSNameWithIndex HGTwain_OpenDS HGTwain_OpenDefaultDS HGTwain_OpenSelectedDS +HGTwain_OpenSelectedDSEx HGTwain_CloseDS HGTwain_GetDSName HGTwain_EnableDSUIOnly diff --git a/build2/qt/HGTwainUser/HGTwainUser.pro b/build2/qt/HGTwainUser/HGTwainUser.pro index e5ac0d54..12ce5c3c 100644 --- a/build2/qt/HGTwainUser/HGTwainUser.pro +++ b/build2/qt/HGTwainUser/HGTwainUser.pro @@ -94,7 +94,7 @@ win32 { DEF_FILE = HGTwainUser.def LIBS += -lgdi32 -lgdiplus -ldbghelp -luser32 - LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base + LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base -l$${OEM_PREFIX}SaneUI } unix { @@ -131,11 +131,11 @@ unix { QMAKE_LFLAGS += -z defs -B direct LIBS += -lpthread -ldl - LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX2}Base + LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX2}Base -l$${OEM_PREFIX2}SaneUI } INCLUDEPATH += $$PWD/../../../modules -INCLUDEPATH += $$PWD/../../../third_party/twain +INCLUDEPATH += $$PWD/../../../../sdk/include DESTDIR = $$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} UI_DIR = $$PWD/../../temp/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE}/$${TARGET} diff --git a/modules/saneui/HGSaneUI.cpp b/modules/saneui/HGSaneUI.cpp index ede2cd68..03736228 100644 --- a/modules/saneui/HGSaneUI.cpp +++ b/modules/saneui/HGSaneUI.cpp @@ -2,6 +2,7 @@ #include "dialog_source_select.h" #include "dialog_device_select.h" #include "dialog_device_scan.h" +#include "dialog_twain_source_select.h" #include "hg_settingdialog.h" #include "lang/app_language.h" #include @@ -161,3 +162,40 @@ int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName QCoreApplication::removeTranslator(&translator); return 0; } + +#if defined(HG_CMP_MSC) +int show_twain_srclist_ui(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds) +{ + if (nullptr == dsmProc || nullptr == appId || nullptr == ds) + return -1; + + QWidget *qParent = nullptr; +#ifdef HG_CMP_MSC + if (!g_ownApplication) + g_ownApplication = QMfcApp::pluginInstance(g_hInst); + QWinWidget win(parent); + win.showCentered(); + qParent = &win; +#else + qParent = parent; +#endif + + QTranslator translator; + int cp = lang_get_cur_code_page(); + if (20127 == cp) + translator.load(":translation/SaneUI_zh_EN.qm"); + else + translator.load(":translation/SaneUI_zh_CN.qm"); + QCoreApplication::installTranslator(&translator); + + memset(ds, 0, sizeof(TW_IDENTITY)); + Dialog_Twain_Source_Select dlg(dsmProc, appId, qParent); + if (dlg.exec()) + { + dlg.GetIdentify(ds); + } + + QCoreApplication::removeTranslator(&translator); + return 0; +} +#endif diff --git a/modules/saneui/HGSaneUI.h b/modules/saneui/HGSaneUI.h index 415424ac..565a1873 100644 --- a/modules/saneui/HGSaneUI.h +++ b/modules/saneui/HGSaneUI.h @@ -4,6 +4,9 @@ #include "../base/HGDef.h" #include "../base/HGDll.h" #include "sane/sane_ex.h" +#if defined(HG_CMP_MSC) +#include "twain/twain.h" +#endif typedef void (*show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam); @@ -14,4 +17,8 @@ HGEXPORT int show_setting_ui(const SANEAPI* saneApi, SANE_Handle handle, const c HGEXPORT int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam); +#if defined(HG_CMP_MSC) +HGEXPORT int show_twain_srclist_ui(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds); +#endif + #endif diff --git a/modules/saneui/SaneUI_zh_CN.qm b/modules/saneui/SaneUI_zh_CN.qm index b6a2d1c7..edcd1dc4 100644 Binary files a/modules/saneui/SaneUI_zh_CN.qm and b/modules/saneui/SaneUI_zh_CN.qm differ diff --git a/modules/saneui/SaneUI_zh_CN.ts b/modules/saneui/SaneUI_zh_CN.ts index 9f933ded..ef4497e9 100644 --- a/modules/saneui/SaneUI_zh_CN.ts +++ b/modules/saneui/SaneUI_zh_CN.ts @@ -1451,6 +1451,24 @@ Please make sure the two passwords are the same. 查找函数失败 + + Dialog_Twain_Source_Select + + + Select source + 选择源 + + + + OK + 确定 + + + + Cancel + 取消 + + Dialog_WriteSettings diff --git a/modules/saneui/SaneUI_zh_EN.qm b/modules/saneui/SaneUI_zh_EN.qm index d0bf0aef..735d7e7c 100644 Binary files a/modules/saneui/SaneUI_zh_EN.qm and b/modules/saneui/SaneUI_zh_EN.qm differ diff --git a/modules/saneui/SaneUI_zh_EN.ts b/modules/saneui/SaneUI_zh_EN.ts index 72859445..8b992877 100644 --- a/modules/saneui/SaneUI_zh_EN.ts +++ b/modules/saneui/SaneUI_zh_EN.ts @@ -1328,6 +1328,24 @@ Please make sure the two passwords are the same. Find function failed + + Dialog_Twain_Source_Select + + + Select source + Select source + + + + OK + OK + + + + Cancel + Cancel + + Dialog_WriteSettings diff --git a/modules/saneui/dialog_device_scan.h b/modules/saneui/dialog_device_scan.h index 283d94fa..6232cccd 100644 --- a/modules/saneui/dialog_device_scan.h +++ b/modules/saneui/dialog_device_scan.h @@ -3,7 +3,6 @@ #include "base/HGDef.h" #include "base/HGThread.h" -#include "sane/sane_ex.h" #include "HGSaneUI.h" #include diff --git a/modules/saneui/dialog_device_select.h b/modules/saneui/dialog_device_select.h index d62663e0..126c7223 100644 --- a/modules/saneui/dialog_device_select.h +++ b/modules/saneui/dialog_device_select.h @@ -1,8 +1,7 @@ #ifndef DIALOG_DEVICE_SELECT_H #define DIALOG_DEVICE_SELECT_H -#include "base/HGDef.h" -#include "sane/sane_ex.h" +#include "HGSaneUI.h" #include #include #include diff --git a/modules/saneui/dialog_twain_source_select.cpp b/modules/saneui/dialog_twain_source_select.cpp new file mode 100644 index 00000000..c1eedfdf --- /dev/null +++ b/modules/saneui/dialog_twain_source_select.cpp @@ -0,0 +1,60 @@ +#include "dialog_twain_source_select.h" +#include "ui_dialog_twain_source_select.h" + +Dialog_Twain_Source_Select::Dialog_Twain_Source_Select(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, QWidget *parent) : + QDialog(parent), + ui(new Ui::Dialog_Twain_Source_Select) +{ + ui->setupUi(this); + + m_vSource.clear(); + m_dsmProc = dsmProc; + memcpy(&m_appId, appId, sizeof(TW_IDENTITY)); + memset(&m_ds, 0, sizeof(TW_IDENTITY)); + + setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); + + TW_IDENTITY ds; + if (TWRC_SUCCESS == m_dsmProc(&m_appId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds)) + { + m_vSource.push_back(ds); + ui->listWidget->addItem(ds.ProductName); + while (TWRC_SUCCESS == m_dsmProc(&m_appId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds)) + { + m_vSource.push_back(ds); + ui->listWidget->addItem(ds.ProductName); + } + } + + if (!m_vSource.empty()) + { + ui->listWidget->setCurrentRow(0); + } +} + +Dialog_Twain_Source_Select::~Dialog_Twain_Source_Select() +{ + delete ui; +} + +void Dialog_Twain_Source_Select::GetIdentify(TW_IDENTITY *ds) +{ + memcpy(ds, &m_ds, sizeof(TW_IDENTITY)); +} + +void Dialog_Twain_Source_Select::on_pushButton_OK_clicked() +{ + int index = ui->listWidget->currentRow(); + if (index < 0) + { + return; + } + + memcpy(&m_ds, &m_vSource[index], sizeof(TW_IDENTITY)); + accept(); +} + +void Dialog_Twain_Source_Select::on_pushButton_Cancel_clicked() +{ + reject(); +} diff --git a/modules/saneui/dialog_twain_source_select.h b/modules/saneui/dialog_twain_source_select.h new file mode 100644 index 00000000..74da2863 --- /dev/null +++ b/modules/saneui/dialog_twain_source_select.h @@ -0,0 +1,34 @@ +#ifndef DIALOG_TWAIN_SOURCE_SELECT_H +#define DIALOG_TWAIN_SOURCE_SELECT_H + +#include "HGSaneUI.h" +#include + +namespace Ui { +class Dialog_Twain_Source_Select; +} + +class Dialog_Twain_Source_Select : public QDialog +{ + Q_OBJECT + +public: + explicit Dialog_Twain_Source_Select(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, QWidget *parent = nullptr); + ~Dialog_Twain_Source_Select(); + + void GetIdentify(TW_IDENTITY *ds); + +private slots: + void on_pushButton_OK_clicked(); + + void on_pushButton_Cancel_clicked(); + +private: + Ui::Dialog_Twain_Source_Select *ui; + std::vector m_vSource; + DSMENTRYPROC m_dsmProc; + TW_IDENTITY m_appId; + TW_IDENTITY m_ds; +}; + +#endif // DIALOG_TWAIN_SOURCE_SELECT_H diff --git a/modules/saneui/dialog_twain_source_select.ui b/modules/saneui/dialog_twain_source_select.ui new file mode 100644 index 00000000..b1f3ae3d --- /dev/null +++ b/modules/saneui/dialog_twain_source_select.ui @@ -0,0 +1,59 @@ + + + Dialog_Twain_Source_Select + + + + 0 + 0 + 343 + 203 + + + + Select source + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + diff --git a/modules/twain_user/HGTwain.cpp b/modules/twain_user/HGTwain.cpp index bd0e8c1d..58b2ca2f 100644 --- a/modules/twain_user/HGTwain.cpp +++ b/modules/twain_user/HGTwain.cpp @@ -117,6 +117,25 @@ HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds) return HGBASE_ERR_OK; } +HGResult HGAPI HGTwain_OpenSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds) +{ + if (NULL == dsm) + { + return HGBASE_ERR_INVALIDARG; + } + + HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; + class HGTwainDSImpl* dsImpl = NULL; + HGResult ret = twainDSMImpl->OpenSelectedDSEx(&dsImpl); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + *ds = (HGTwainDS)dsImpl; + return HGBASE_ERR_OK; +} + HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) { if (NULL == ds) @@ -171,4 +190,4 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; return twainDSImpl->Disable(); -} \ No newline at end of file +} diff --git a/modules/twain_user/HGTwain.h b/modules/twain_user/HGTwain.h index 2a178b7a..77ce0edb 100644 --- a/modules/twain_user/HGTwain.h +++ b/modules/twain_user/HGTwain.h @@ -28,6 +28,8 @@ HGEXPORT HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds); HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds); +HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds); + HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds); HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen); @@ -39,4 +41,4 @@ HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND paren HGEXPORT HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds); -#endif /* __HGTWAIN_H__ */ \ No newline at end of file +#endif /* __HGTWAIN_H__ */ diff --git a/modules/twain_user/HGTwainImpl.cpp b/modules/twain_user/HGTwainImpl.cpp index 73d6de5a..d1ff0a48 100644 --- a/modules/twain_user/HGTwainImpl.cpp +++ b/modules/twain_user/HGTwainImpl.cpp @@ -235,6 +235,38 @@ HGResult HGTwainDSMImpl::OpenSelectedDS(class HGTwainDSImpl** dsImpl) return HGBASE_ERR_OK; } +HGResult HGTwainDSMImpl::OpenSelectedDSEx(class HGTwainDSImpl** dsImpl) +{ + if (NULL == dsImpl) + { + return HGBASE_ERR_INVALIDARG; + } + + TW_IDENTITY selectDS; + memset(&selectDS, 0, sizeof(TW_IDENTITY)); + if (-2 == show_twain_srclist_ui(m_pDSMProc, &m_AppId, m_hWnd, &selectDS)) + { + return HGBASE_ERR_NOTSUPPORT; + } + + if (0 == selectDS.Id) + { + return HGBASE_ERR_FAIL; + } + + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); + HGResult ret = newDSImpl->Open(&selectDS); + if (HGBASE_ERR_OK != ret) + { + delete newDSImpl; + return ret; + } + + m_listDSImpl.push_back(newDSImpl); + *dsImpl = newDSImpl; + return HGBASE_ERR_OK; +} + void HGTwainDSMImpl::RemoveDS(class HGTwainDSImpl* dsImpl) { std::vector::iterator iter; @@ -326,11 +358,12 @@ HGTwainDSImpl::~HGTwainDSImpl() } -HGResult HGTwainDSImpl::Open(const TW_IDENTITY* iden) +HGResult HGTwainDSImpl::Open(TW_IDENTITY* iden) { assert(!m_open); + assert(NULL != iden); - USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden); + USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, iden); if (TWRC_SUCCESS != ret) { return HGTWAIN_ERR_FAIL; @@ -563,4 +596,4 @@ HGResult HGTwainDSImpl::Reset() } return HGBASE_ERR_OK; -} \ No newline at end of file +} diff --git a/modules/twain_user/HGTwainImpl.hpp b/modules/twain_user/HGTwainImpl.hpp index 62e18545..0c2b14f7 100644 --- a/modules/twain_user/HGTwainImpl.hpp +++ b/modules/twain_user/HGTwainImpl.hpp @@ -3,7 +3,8 @@ #include "HGTwain.h" #include "../base/HGDll.h" -#include "twain.h" +#include "twain/twain.h" +#include "saneui/HGSaneUI.h" #include #include @@ -21,6 +22,7 @@ public: HGResult OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl); HGResult OpenDefaultDS(class HGTwainDSImpl** dsImpl); HGResult OpenSelectedDS(class HGTwainDSImpl** dsImpl); + HGResult OpenSelectedDSEx(class HGTwainDSImpl** dsImpl); private: void RemoveDS(class HGTwainDSImpl* dsImpl); @@ -44,7 +46,7 @@ public: ~HGTwainDSImpl(); public: - HGResult Open(const TW_IDENTITY* iden); + HGResult Open(TW_IDENTITY* iden); HGResult Close(); HGResult GetName(HGChar* name, HGUInt maxLen); HGResult EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam);