From 35ca04e7abe6600bb70420d524f6c9e6f48803b4 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Tue, 4 Apr 2023 13:18:13 +0800 Subject: [PATCH] =?UTF-8?q?HGSaneUI=E4=B8=AD=E5=AE=9E=E7=8E=B0twain?= =?UTF-8?q?=E6=BA=90=E9=80=89=E6=8B=A9=E5=AF=B9=E8=AF=9D=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/demo/device_user.cpp | 2 +- build2/qt/HGSaneUI/HGSaneUI.def | 3 +- build2/qt/HGSaneUI/HGSaneUI.pro | 5 ++ build2/qt/HGSolution.pro | 71 +++++++++--------- build2/qt/HGTwainUser/HGTwainUser.def | 1 + build2/qt/HGTwainUser/HGTwainUser.pro | 6 +- modules/saneui/HGSaneUI.cpp | 38 ++++++++++ modules/saneui/HGSaneUI.h | 7 ++ modules/saneui/SaneUI_zh_CN.qm | Bin 4140 -> 4340 bytes modules/saneui/SaneUI_zh_CN.ts | 18 +++++ modules/saneui/SaneUI_zh_EN.qm | Bin 7308 -> 7536 bytes modules/saneui/SaneUI_zh_EN.ts | 18 +++++ modules/saneui/dialog_device_scan.h | 1 - modules/saneui/dialog_device_select.h | 3 +- modules/saneui/dialog_twain_source_select.cpp | 60 +++++++++++++++ modules/saneui/dialog_twain_source_select.h | 34 +++++++++ modules/saneui/dialog_twain_source_select.ui | 59 +++++++++++++++ modules/twain_user/HGTwain.cpp | 21 +++++- modules/twain_user/HGTwain.h | 4 +- modules/twain_user/HGTwainImpl.cpp | 39 +++++++++- modules/twain_user/HGTwainImpl.hpp | 6 +- 21 files changed, 346 insertions(+), 50 deletions(-) create mode 100644 modules/saneui/dialog_twain_source_select.cpp create mode 100644 modules/saneui/dialog_twain_source_select.h create mode 100644 modules/saneui/dialog_twain_source_select.ui 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 b6a2d1c76e783f1951ae5b997e0933df6579a3f3..edcd1dc458d6b45828c925d64c2ad341f4352e38 100644 GIT binary patch delta 544 zcmZ3Z@I`Tgh~p0i23BhZ2B!HCnq?7$W-SNO(F_dC{R|B3K$Z{|C;D4UcZ%rAR;XP@N02gHi&JpUS*Z0VvMJ`-1tt?LDAtGAF*3te@ez2k3Y^mi5iy zKs(<-Xyy!7xexvf44mw&ZsE;9rOd4EU)q6gp33U}XF5>*JJ$Pafp)VgvdOia1Ilk_ z1DnIOnr)5FQlOn3Y-@J40_D$etcvIa`bnE(y(Ul}TOP-e=3l@7+QxD9BQOlOm)CO! z1uOx2Y9?orF)%O~e{+6b1~iZ>oQp#T=qZ*M?sc;7fDW_aJ|Xc6sDY3BLtGcoVP!l! z&I1F9^Et1=hEkyVTfChC;=q`(;=Qj0=qs_kCj$ecA`_bhGtgpoChhzq3=Ay7Ob(w*7#O&g zGtHIvVqoBQVcMl62UK6p^xe}G$e+UOpp*dQZ)M)702Jr7V7_mA59r{XEHga!06mri zp_y%=^aGal&EY@?yaUtq49pp^gaY;rB6ZIj_QoQlPjNZ)bow&}UY>_qBk0##p|TBA`Q9F7ijL4*-VT y8UDOdAfM?R|MzJ?nkO)mfq~Bm7^Vyo3p;&>Tn!$)+vj&q6>t+^?4;%oy_JETB 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 d0bf0aef17664bc9badfab2e977394ec424aedf6..735d7e7cf81df8e773dd0fb9ba5dfe7ee284a6d3 100644 GIT binary patch delta 734 zcmZvaUr1A77{;G-&d%96XMc`Po6~5{34x{{#3IW|Lb3(cQgIT|GLkgXrEXak4AKmv zGFwy^ilEhnSX(J!QjjG5BU?98STr%Z$U-Mtf|>T#u7a+9ocBEM_df6Qedn_y8!pAC zj037X06PJGBOu(5Qc8_dHnn9YGgEB^W}mhKuw{`n9Vod6B*X&KkBRSqnGwMB9hlup z%^gMJaVfY5V~374>Lzi2J$(aHFWG&jw;nVeID{z<8Q5q*ar> zRAxLphPFxBx6FKM9RrfqG1Gi4ojk=X71>GA!wTy;AYR3;aSsFHUN(2u0~iFhBY6jL zh8?t;N#DTE+igIcm&>UN0qg>oYu!)ve(vzl7a-Bf-L;TzMJE^D^bycrRte>_Eo)O{ z*1rJ!b<9fNb^Aj=daDXFI%#rElN;x$0-=EJwi znfy&KH@&8bg7Ej8Sc}k`ag!X42)%=6NdHVUw$mi0S-j$@q-;-$J*6$=Xh{sD(K(vk zK5@8lfePi~=nREtXp%%9g=TU|g^n9^XNA&%wG<{lC(YiXK`}vD%%CX5A^Az<0fp?) z+*vh6yr6k*ngn9~n#jI$fa21^bBqS&Xa_d-rvL; ziVxP3XSqNhZl-%?Li)wdR9dRFW71x(lR=bMa-dg`fDfNHlN0QmU PUAtQMPe)&mc0&0L${@y% delta 650 zcmX9+Sx8i26#nkLbFcT#cHMHE2N%YA81o^L0kuVoN))SM3blxc>Y)T34K)g49wrT2 zFqvopC8UKCbu2?{=pjkWq#7YCFld4bDkDe664b2EeEK+?^Z(y+PPE`+{^ex*C}7wI zU>6{70F;3h)Uw)K8T%YSTo)ju5ktfx;u!G=u(}X1wF9noe4GuGKLk>?1Jh3dn;DpS z1*AHG*jCp0L@)6uq~DtX^O?3Dn=c;f%U^(T3zDXm0BHipPI6H1!{ov^uxda^bk9&QQ?DIa#vl6J)n(83^gsJ~MdBkGwcqNW M7vF3BotCiv4`g+#MgRZ+ 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);