diff --git a/app/scanner/device_user.cpp b/app/demo/device_user.cpp similarity index 68% rename from app/scanner/device_user.cpp rename to app/demo/device_user.cpp index 6779947d..613f65f8 100644 --- a/app/scanner/device_user.cpp +++ b/app/demo/device_user.cpp @@ -1,7 +1,6 @@ #include "device_user.h" -#include -#ifdef HG_CMP_MSC +#if 0 DeviceUserMgr::DeviceUserMgr(QWidget *wnd) { @@ -37,6 +36,13 @@ DeviceUser::~DeviceUser() m_twainDS = nullptr; } +QString DeviceUser::GetName() +{ + HGChar devName[256]; + HGTwain_GetDSName(m_twainDS, devName, 256); + return QString(devName); +} + HGResult DeviceUser::ShowSettingDlg() { return HGTwain_EnableDSUIOnly(m_twainDS, (HWND)m_wnd->winId(), DSCloseReqFunc, this); @@ -56,12 +62,7 @@ void HGAPI DeviceUser::DSCloseReqFunc(HGTwainDS ds, HGPointer param) void HGAPI DeviceUser::DSImageFunc(HGTwainDS ds, HGImage image, HGPointer param) { DeviceUser* p = (DeviceUser*)param; - HGImage image2 = nullptr; - HGBase_CloneImage(image, 0, 0, &image2); - if (nullptr != image2) - { - emit p->newImage(image2); - } + emit p->newImage(image); } #else @@ -81,11 +82,15 @@ DeviceUserMgr::~DeviceUserMgr() class DeviceUser* DeviceUserMgr::OpenDeviceUser() { - Dialog_Device_Select dlg(m_saneMgr, m_wnd); - if (!dlg.exec()) + HGSaneDevice dev = nullptr; +#ifdef HG_CMP_MSC + HGSane_OpenSelectedDevice(m_saneMgr, (HWND)m_wnd->winId(), &dev); +#else + HGSane_OpenSelectedDevice(m_saneMgr, m_wnd, &dev); +#endif + if (nullptr == dev) return nullptr; - - return new DeviceUser(m_wnd, dlg.getSaneDevice()); + return new DeviceUser(m_wnd, dev); } DeviceUser::DeviceUser(QWidget *wnd, HGSaneDevice dev) @@ -100,6 +105,13 @@ DeviceUser::~DeviceUser() m_saneDev = nullptr; } +QString DeviceUser::GetName() +{ + HGChar devName[256]; + HGSane_GetDeviceName(m_saneDev, devName, 256); + return QString(devName); +} + HGResult DeviceUser::ShowSettingDlg() { #ifdef HG_CMP_MSC @@ -111,16 +123,17 @@ HGResult DeviceUser::ShowSettingDlg() HGResult DeviceUser::StartScan() { - Dialog_Device_Scan dlg(m_saneDev, m_wnd); - connect(&dlg, SIGNAL(newImage(void *)), this, SLOT(on_newImage(void *)), Qt::QueuedConnection); - dlg.exec(); - disconnect(&dlg, SIGNAL(newImage(void *)), this, SLOT(on_newImage(void *))); - return HGBASE_ERR_OK; +#ifdef HG_CMP_MSC + return HGSane_StartDeviceWithUI(m_saneDev, (HWND)m_wnd->winId(), DeviceImageFunc, this); +#else + return HGSane_StartDeviceWithUI(m_saneDev, m_wnd, DeviceImageFunc, this); +#endif } -void DeviceUser::on_newImage(void *image) +void HGAPI DeviceUser::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param) { - emit newImage(image); + DeviceUser* p = (DeviceUser*)param; + emit p->newImage(image); } #endif diff --git a/app/scanner/device_user.h b/app/demo/device_user.h similarity index 89% rename from app/scanner/device_user.h rename to app/demo/device_user.h index abc748dc..fc9e3ddc 100644 --- a/app/scanner/device_user.h +++ b/app/demo/device_user.h @@ -4,7 +4,7 @@ #include "base/HGDef.h" #include -#ifdef HG_CMP_MSC +#if 0 #include "twain_user/HGTwain.h" class DeviceUserMgr : public QObject @@ -32,6 +32,8 @@ class DeviceUser : public QObject public: ~DeviceUser(); + // 获取设备名字 + QString GetName(); // 弹出配置对话框 HGResult ShowSettingDlg(); // 弹出扫描对话框 @@ -77,17 +79,19 @@ class DeviceUser : public QObject public: ~DeviceUser(); + // 获取设备名字 + QString GetName(); // 弹出配置对话框 HGResult ShowSettingDlg(); // 弹出扫描对话框 HGResult StartScan(); +private: + static void HGAPI DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param); + signals: void newImage(void *image); -private slots: - void on_newImage(void *image); - private: QWidget *m_wnd; HGSaneDevice m_saneDev; diff --git a/app/demo/main.cpp b/app/demo/main.cpp new file mode 100644 index 00000000..fd3e5334 --- /dev/null +++ b/app/demo/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/app/demo/mainwindow.cpp b/app/demo/mainwindow.cpp new file mode 100644 index 00000000..25a55b44 --- /dev/null +++ b/app/demo/mainwindow.cpp @@ -0,0 +1,69 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "imgfmt/HGImgFmt.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + m_devUserMgr = new DeviceUserMgr(this); + m_devUser = nullptr; + ui->label_currDevName->setText(QString::fromLocal8Bit("no dev")); +} + +MainWindow::~MainWindow() +{ + if (nullptr != m_devUser) + { + disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*))); + delete m_devUser; + m_devUser = nullptr; + ui->label_currDevName->setText(QString::fromLocal8Bit("no dev")); + } + + delete m_devUserMgr; + m_devUserMgr = nullptr; + + delete ui; +} + +void MainWindow::on_newImage(void *image) +{ + static int i = 0; + char fileName[256]; + sprintf(fileName, "D:\\test_%d.jpg", i++); + HGImgFmt_SaveImage((HGImage)image, 0, NULL, fileName); +} + +void MainWindow::on_pushButton_selectDev_clicked() +{ + if (nullptr != m_devUser) + { + disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*))); + delete m_devUser; + m_devUser = nullptr; + ui->label_currDevName->setText(QString::fromLocal8Bit("no dev")); + } + + DeviceUser *devUser = m_devUserMgr->OpenDeviceUser(); + if (devUser != nullptr) + { + m_devUser = devUser; + connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*))); + ui->label_currDevName->setText(m_devUser->GetName()); + } +} + +void MainWindow::on_pushButton_setting_clicked() +{ + if (nullptr != m_devUser) + m_devUser->ShowSettingDlg(); +} + +void MainWindow::on_pushButton_scan_clicked() +{ + if (nullptr != m_devUser) + m_devUser->StartScan(); +} diff --git a/app/demo/mainwindow.h b/app/demo/mainwindow.h new file mode 100644 index 00000000..8e1720a0 --- /dev/null +++ b/app/demo/mainwindow.h @@ -0,0 +1,33 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include "device_user.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void on_newImage(void *image); + + void on_pushButton_selectDev_clicked(); + + void on_pushButton_setting_clicked(); + + void on_pushButton_scan_clicked(); + +private: + Ui::MainWindow *ui; + DeviceUserMgr *m_devUserMgr; + DeviceUser *m_devUser; +}; +#endif // MAINWINDOW_H diff --git a/app/demo/mainwindow.ui b/app/demo/mainwindow.ui new file mode 100644 index 00000000..4da8c4b0 --- /dev/null +++ b/app/demo/mainwindow.ui @@ -0,0 +1,97 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + 60 + 40 + 91 + 31 + + + + 当前设备名: + + + + + + 170 + 50 + 281 + 16 + + + + + + + + + + 60 + 170 + 131 + 51 + + + + 选择设备 + + + + + + 240 + 170 + 131 + 51 + + + + 设置参数 + + + + + + 420 + 170 + 131 + 51 + + + + 开始扫描 + + + + + + + 0 + 0 + 800 + 22 + + + + + + + + diff --git a/build-qt/HGSolution/HGDemo/HGDemo.pro b/build-qt/HGSolution/HGDemo/HGDemo.pro new file mode 100644 index 00000000..bf0e6ce7 --- /dev/null +++ b/build-qt/HGSolution/HGDemo/HGDemo.pro @@ -0,0 +1,116 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +win32 { + DEFINES += _CRT_SECURE_NO_WARNINGS + LIBS += -ladvapi32 + + if (contains(DEFINES, OEM_HANWANG) || contains(DEFINES, OEM_LISICHENG) || contains(DEFINES, OEM_CANGTIAN) || contains(DEFINES, OEM_ZHONGJING) || contains(DEFINES, OEM_ZIGUANG)) { + contains(DEFINES, OEM_HANWANG) { + LIBS += -lHWBase -lHWImgFmt -lHWImgProc -lHWSaneUser -lHWTwainUser + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/OEM/hanvon -llang + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/OEM/hanvon -llang + } + } + contains(DEFINES, OEM_LISICHENG) { + LIBS += -lLSCBase -lLSCImgFmt -lLSCImgProc -lLSCSaneUser -lLSCTwainUser + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/OEM/lanxum -llang + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/OEM/lanxum -llang + } + } + contains(DEFINES, OEM_CANGTIAN) { + LIBS += -lCTSBase -lCTSImgFmt -lCTSImgProc -lCTSSaneUser -lCTSTwainUser + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/OEM/cumtenn -llang + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/OEM/cumtenn -llang + } + } + contains(DEFINES, OEM_ZHONGJING) { + LIBS += -lZJBase -lZJImgFmt -lZJImgProc -lZJSaneUser -lZJTwainUser + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/OEM/microtek -llang + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/OEM/microtek -llang + } + } + contains(DEFINES, OEM_ZIGUANG) { + LIBS += -lZGBase -lZGImgFmt -lZGImgProc -lZGSaneUser -lZGTwainUser + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/OEM/unis -llang + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/OEM/unis -llang + } + } + } else { + LIBS += -lHGBase -lHGImgFmt -lHGImgProc -lHGSaneUser -lHGTwainUser + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/OEM/huagao -llang + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/OEM/huagao -llang + } + } + + contains(QT_ARCH, i386) { + LIBS += -L../../../../sdk/lib/win/x86/Release + CONFIG(release, debug|release) { + DESTDIR = ../../../../release/win/x86/Release/ + } + CONFIG(debug, debug|release) { + } + } + contains(QT_ARCH, x86_64){ + LIBS += -L../../../../sdk/lib/win/x64/Release + CONFIG(release, debug|release) { + DESTDIR = ../../../../release/win/x64/Release/ + } + CONFIG(debug, debug|release) { + } + } +} + +INCLUDEPATH += $$PWD/../../../app/demo/ +INCLUDEPATH += $$PWD/../../../utility/ +INCLUDEPATH += $$PWD/../../../modules/ +INCLUDEPATH += $$PWD/../../../../sdk/include/ + +SOURCES += \ + ../../../app/demo/device_user.cpp \ + ../../../app/demo/main.cpp \ + ../../../app/demo/mainwindow.cpp + +HEADERS += \ + ../../../app/demo/device_user.h \ + ../../../app/demo/mainwindow.h + +FORMS += \ + ../../../app/demo/mainwindow.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/build-qt/HGSolution/HGSaneUI/HGSaneUI.def b/build-qt/HGSolution/HGSaneUI/HGSaneUI.def new file mode 100644 index 00000000..d50d85c1 --- /dev/null +++ b/build-qt/HGSolution/HGSaneUI/HGSaneUI.def @@ -0,0 +1,7 @@ +LIBRARY + +EXPORTS + +show_devlist_ui +show_setting_ui +show_scan_ui \ No newline at end of file diff --git a/build-qt/HGSolution/HGSaneUI/HGSaneUI.pro b/build-qt/HGSolution/HGSaneUI/HGSaneUI.pro index ae400e0e..4b59cede 100644 --- a/build-qt/HGSolution/HGSaneUI/HGSaneUI.pro +++ b/build-qt/HGSolution/HGSaneUI/HGSaneUI.pro @@ -42,6 +42,7 @@ if (contains(DEFINES, OEM_HANWANG) || contains(DEFINES, OEM_LISICHENG) || contai } win32 { + DEF_FILE = HGSaneUI.def DEFINES += _CRT_SECURE_NO_WARNINGS LIBS += -ladvapi32 @@ -120,6 +121,8 @@ win32 { } unix { + CONFIG += unversioned_libname unversioned_soname + LIBS += -llang QMAKE_LFLAGS += -static-libstdc++ -static-libgcc DISTRIBUTION = $$system(cat /etc/issue | cut -d\' \' -f1) diff --git a/build-qt/HGSolution/HGSolution2.pro b/build-qt/HGSolution/HGSolution2.pro new file mode 100644 index 00000000..c1e762c2 --- /dev/null +++ b/build-qt/HGSolution/HGSolution2.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +SUBDIRS += \ + HGSaneUI \ + HGDemo \ No newline at end of file diff --git a/build/windows/HGSaneUser/HGSaneUser.def b/build/windows/HGSaneUser/HGSaneUser.def index 9b48a839..3376eb8a 100644 --- a/build/windows/HGSaneUser/HGSaneUser.def +++ b/build/windows/HGSaneUser/HGSaneUser.def @@ -5,10 +5,11 @@ EXPORTS HGSane_CreateManager HGSane_DestroyManager HGSane_GetDeviceCount -HGSane_GetDeviceName +HGSane_GetDeviceNameWithIndex HGSane_OpenDevice HGSane_OpenSelectedDevice HGSane_CloseDevice +HGSane_GetDeviceName HGSane_ShowDeviceSettingDlg HGSane_StartDevice HGSane_StopDevice diff --git a/build/windows/HGTest/HGTestDlg.cpp b/build/windows/HGTest/HGTestDlg.cpp index b7ed45d4..481dab65 100644 --- a/build/windows/HGTest/HGTestDlg.cpp +++ b/build/windows/HGTest/HGTestDlg.cpp @@ -192,11 +192,10 @@ void CHGTestDlg::OnBnClickedButton1() return; } - HGChar errInfo[256]; - HGSane_OpenDevice(m_saneMgr, 0, &m_saneDev, errInfo, 256); + HGSane_OpenSelectedDevice(m_saneMgr, m_hWnd, &m_saneDev); if (NULL != m_saneDev) { - HGResult ret = HGSane_StartDevice(m_saneDev, DeviceEventFunc, this, DeviceImageFunc, this, errInfo, 256); + HGResult ret = HGSane_StartDeviceWithUI(m_saneDev, m_hWnd, DeviceImageFunc, this); if (HGBASE_ERR_OK != ret) { HGSane_CloseDevice(m_saneDev); @@ -235,11 +234,6 @@ void CHGTestDlg::OnBnClickedButton2() } #ifdef USE_SANE -void HGAPI CHGTestDlg::DeviceEventFunc(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param) -{ - CHGTestDlg* p = (CHGTestDlg*)param; - ::PostMessage(p->m_hWnd, 2000, 0, 0); -} void HGAPI CHGTestDlg::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param) { CHGTestDlg* p = (CHGTestDlg*)param; @@ -273,24 +267,3 @@ void HGAPI CHGTestDlg::DSImageFunc(HGTwainDS ds, HGImage image, HGPointer param) HGImgFmt_SaveImage(image, 0, NULL, strName); } #endif - -LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) -{ -#ifdef USE_SANE - if (2000 == message) - { - HGSane_CloseDevice(m_saneDev); - m_saneDev = NULL; - } - else if (2001 == message) - { - HGImage image = (HGImage)wParam; - CStringA strName; - strName.Format("D:\\HGTest_%u.jpg", m_idx++); - HGImgFmt_SaveImage(image, 0, NULL, strName); - HGBase_DestroyImage(image); - } -#endif - - return CDialogEx::WindowProc(message, wParam, lParam); -} diff --git a/build/windows/HGTest/HGTestDlg.h b/build/windows/HGTest/HGTestDlg.h index 9239ee46..7a0ee330 100644 --- a/build/windows/HGTest/HGTestDlg.h +++ b/build/windows/HGTest/HGTestDlg.h @@ -4,7 +4,7 @@ #pragma once -//#define USE_SANE +#define USE_SANE // CHGTestDlg 对话框 class CHGTestDlg : public CDialogEx @@ -25,7 +25,6 @@ protected: #ifdef USE_SANE HGSaneManager m_saneMgr; HGSaneDevice m_saneDev; - static void HGAPI DeviceEventFunc(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param); static void HGAPI DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param); #else HGTwainDSM m_dsm; @@ -48,5 +47,4 @@ protected: public: afx_msg void OnBnClickedButton1(); afx_msg void OnBnClickedButton2(); - virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); }; diff --git a/build/windows/HGTwainUser/HGTwainUser.def b/build/windows/HGTwainUser/HGTwainUser.def index 0806de23..2a538b5a 100644 --- a/build/windows/HGTwainUser/HGTwainUser.def +++ b/build/windows/HGTwainUser/HGTwainUser.def @@ -5,11 +5,12 @@ EXPORTS HGTwain_CreateDSM HGTwain_DestroyDSM HGTwain_GetDSCount -HGTwain_GetDSName +HGTwain_GetDSNameWithIndex HGTwain_OpenDS HGTwain_OpenDefaultDS HGTwain_OpenSelectedDS HGTwain_CloseDS +HGTwain_GetDSName HGTwain_EnableDSUIOnly HGTwain_EnableDS HGTwain_DisableDS diff --git a/modules/sane_user/HGSane.cpp b/modules/sane_user/HGSane.cpp index 338cc467..5cfdc1de 100644 --- a/modules/sane_user/HGSane.cpp +++ b/modules/sane_user/HGSane.cpp @@ -49,7 +49,7 @@ HGResult HGAPI HGSane_GetDeviceCount(HGSaneManager mgr, HGUInt* count) return saneManagerImpl->GetDeviceCount(count); } -HGResult HGAPI HGSane_GetDeviceName(HGSaneManager mgr, HGUInt index, HGChar* name, HGUInt maxLen) +HGResult HGAPI HGSane_GetDeviceNameWithIndex(HGSaneManager mgr, HGUInt index, HGChar* name, HGUInt maxLen) { if (NULL == mgr) { @@ -109,6 +109,17 @@ HGResult HGAPI HGSane_CloseDevice(HGSaneDevice dev) return saneDeviceImpl->Close(); } +HGResult HGAPI HGSane_GetDeviceName(HGSaneDevice dev, HGChar* name, HGUInt maxLen) +{ + if (NULL == dev) + { + return HGBASE_ERR_INVALIDARG; + } + + HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev; + return saneDeviceImpl->GetName(name, maxLen); +} + HGResult HGAPI HGSane_ShowDeviceSettingDlg(HGSaneDevice dev, HGWindow parent) { if (NULL == dev) diff --git a/modules/sane_user/HGSane.h b/modules/sane_user/HGSane.h index 7ec7da98..8c8989df 100644 --- a/modules/sane_user/HGSane.h +++ b/modules/sane_user/HGSane.h @@ -20,7 +20,7 @@ HGEXPORT HGResult HGAPI HGSane_DestroyManager(HGSaneManager mgr); HGEXPORT HGResult HGAPI HGSane_GetDeviceCount(HGSaneManager mgr, HGUInt *count); -HGEXPORT HGResult HGAPI HGSane_GetDeviceName(HGSaneManager mgr, HGUInt index, HGChar *name, HGUInt maxLen); +HGEXPORT HGResult HGAPI HGSane_GetDeviceNameWithIndex(HGSaneManager mgr, HGUInt index, HGChar *name, HGUInt maxLen); HGEXPORT HGResult HGAPI HGSane_OpenDevice(HGSaneManager mgr, HGUInt index, HGSaneDevice *dev, HGChar *errInfo, HGUInt errInfoLen); @@ -28,6 +28,8 @@ HGEXPORT HGResult HGAPI HGSane_OpenSelectedDevice(HGSaneManager mgr, HGWindow pa HGEXPORT HGResult HGAPI HGSane_CloseDevice(HGSaneDevice dev); +HGEXPORT HGResult HGAPI HGSane_GetDeviceName(HGSaneDevice dev, HGChar* name, HGUInt maxLen); + HGEXPORT HGResult HGAPI HGSane_ShowDeviceSettingDlg(HGSaneDevice dev, HGWindow parent); HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam, diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index ab52be41..f724705e 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -1,6 +1,5 @@ #include "HGSaneImpl.hpp" #include "../base/HGInc.h" -#include HGSaneManagerImpl::HGSaneManagerImpl() { @@ -20,7 +19,7 @@ HGSaneManagerImpl::HGSaneManagerImpl() m_f_sane_control_option = NULL; memset(&m_saneApi, 0, sizeof(SANEAPI)); - m_saneDlgDll = NULL; + m_saneUIDll = NULL; m_f_show_devlist_ui = NULL; m_f_show_setting_ui = NULL; m_f_show_scan_ui = NULL; @@ -49,18 +48,18 @@ HGResult HGSaneManagerImpl::Create(const HGChar* sanePath) return ret; } - HGBase_CreateDll("HGSaneUI.dll", &m_saneDlgDll); - if (NULL != m_saneDlgDll) + HGBase_CreateDll("HGSaneUI.dll", &m_saneUIDll); + if (NULL != m_saneUIDll) { - HGBase_GetDllProcAddress(m_saneDlgDll, "show_devlist_ui", (HGPointer*)&m_f_show_devlist_ui); - HGBase_GetDllProcAddress(m_saneDlgDll, "show_setting_ui", (HGPointer*)&m_f_show_setting_ui); - HGBase_GetDllProcAddress(m_saneDlgDll, "show_scan_ui", (HGPointer*)&m_f_show_scan_ui); + HGBase_GetDllProcAddress(m_saneUIDll, "show_devlist_ui", (HGPointer*)&m_f_show_devlist_ui); + HGBase_GetDllProcAddress(m_saneUIDll, "show_setting_ui", (HGPointer*)&m_f_show_setting_ui); + HGBase_GetDllProcAddress(m_saneUIDll, "show_scan_ui", (HGPointer*)&m_f_show_scan_ui); } if (SANE_STATUS_GOOD != m_f_sane_init(NULL, NULL)) { - HGBase_DestroyDll(m_saneDlgDll); - m_saneDlgDll = NULL; + HGBase_DestroyDll(m_saneUIDll); + m_saneUIDll = NULL; HGBase_DestroyDll(m_dll); m_dll = NULL; return HGSANE_ERR_FAIL; @@ -80,8 +79,8 @@ HGResult HGSaneManagerImpl::Destroy() m_f_sane_exit(); - HGBase_DestroyDll(m_saneDlgDll); - m_saneDlgDll = NULL; + HGBase_DestroyDll(m_saneUIDll); + m_saneUIDll = NULL; HGBase_DestroyDll(m_dll); m_dll = NULL; return HGBASE_ERR_OK; @@ -183,14 +182,20 @@ HGResult HGSaneManagerImpl::OpenSelectedDevice(HGWindow parent, class HGSaneDevi return HGBASE_ERR_FAIL; } - SANE_Handle handle = m_f_show_devlist_ui(&m_saneApi, parent); + SANE_Handle handle = NULL; + char devName[256] = {0}; + if (-2 == m_f_show_devlist_ui(&m_saneApi, parent, &handle, devName, 256)) + { + return HGBASE_ERR_NOTSUPPORT; + } + if (NULL == handle) { return HGSANE_ERR_FAIL; } HGSaneDeviceImpl* newDeviceImpl = new HGSaneDeviceImpl(this); - HGResult ret = newDeviceImpl->Init(handle); + HGResult ret = newDeviceImpl->Init(devName, handle); if (HGBASE_ERR_OK != ret) { delete newDeviceImpl; @@ -294,6 +299,7 @@ void HGSaneManagerImpl::RemoveDevice(class HGSaneDeviceImpl* deviceImpl) HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl) { m_mgrImpl = mgrImpl; + m_devName.clear(); m_devHandle = NULL; m_buffer = NULL; m_bufferSize = 0; @@ -311,10 +317,16 @@ HGSaneDeviceImpl::~HGSaneDeviceImpl() } -HGResult HGSaneDeviceImpl::Init(SANE_Handle handle) +HGResult HGSaneDeviceImpl::Init(const HGChar* devName, SANE_Handle handle) { assert(NULL == m_devHandle); + if (NULL == devName || NULL == handle) + { + return HGBASE_ERR_INVALIDARG; + } + + m_devName = devName; m_mgrImpl->m_f_sane_set_io_mode(handle, SANE_FALSE); m_devHandle = handle; return HGBASE_ERR_OK; @@ -345,6 +357,7 @@ HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt e return HGSANE_ERR_FAIL; } + m_devName = devName; m_mgrImpl->m_f_sane_set_io_mode(handle, SANE_FALSE); m_devHandle = handle; return HGBASE_ERR_OK; @@ -357,10 +370,24 @@ HGResult HGSaneDeviceImpl::Close() Stop(); m_mgrImpl->m_f_sane_close(m_devHandle); m_devHandle = NULL; + m_devName.clear(); m_mgrImpl->RemoveDevice(this); return HGBASE_ERR_OK; } +HGResult HGSaneDeviceImpl::GetName(HGChar* name, HGUInt maxLen) +{ + if (NULL == name || 0 == maxLen) + { + return HGBASE_ERR_INVALIDARG; + } + + if (maxLen < m_devName.size() + 1) + return HGBASE_ERR_FAIL; + strcpy(name, m_devName.c_str()); + return HGBASE_ERR_OK; +} + HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent) { if (NULL != m_thread) @@ -373,7 +400,11 @@ HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent) return HGBASE_ERR_FAIL; } - m_mgrImpl->m_f_show_setting_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent); + if (-2 == m_mgrImpl->m_f_show_setting_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent)) + { + return HGBASE_ERR_NOTSUPPORT; + } + return HGBASE_ERR_OK; } @@ -476,7 +507,12 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i m_dpi = GetDpi(); m_imageFunc = imageFunc; m_imageParam = imageParam; - m_mgrImpl->m_f_show_scan_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent, ShowScanImageCallback, this); + + if (-2 == m_mgrImpl->m_f_show_scan_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent, ShowScanImageCallback, this)) + { + return HGBASE_ERR_NOTSUPPORT; + } + return HGBASE_ERR_OK; } diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index aa6b88d1..5f7436a7 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -9,6 +9,7 @@ #include "sane/sane_ex.h" #include #include +#include typedef SANE_Status (*f_sane_init)(SANE_Int* version_code, SANE_Auth_Callback authorize); typedef void (*f_sane_exit)(void); @@ -24,10 +25,10 @@ typedef SANE_Status (*f_sane_get_parameters)(SANE_Handle handle, SANE_Parameters typedef const SANE_Option_Descriptor* (*f_sane_get_option_descriptor)(SANE_Handle handle, SANE_Int option); typedef SANE_Status (*f_sane_control_option)(SANE_Handle handle, SANE_Int option, SANE_Action action, void* value, SANE_Int* info); -typedef SANE_Handle (*f_show_devlist_ui)(SANEAPI* saneApi, HGWindow parent); -typedef void (*f_show_setting_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent); -typedef void (*f_show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam); -typedef void (*f_show_scan_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, f_show_scan_ui_image_callback callback, void *callbackParam); +typedef void (*f_show_scan_ui_image_callback)(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam); +typedef int (*f_show_devlist_ui)(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char *devName, unsigned int maxLen); +typedef int (*f_show_setting_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent); +typedef int (*f_show_scan_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, f_show_scan_ui_image_callback callback, void *callbackParam); class HGSaneManagerImpl { @@ -64,7 +65,7 @@ private: f_sane_control_option m_f_sane_control_option; SANEAPI m_saneApi; - HGDll m_saneDlgDll; + HGDll m_saneUIDll; f_show_devlist_ui m_f_show_devlist_ui; f_show_setting_ui m_f_show_setting_ui; f_show_scan_ui m_f_show_scan_ui; @@ -78,9 +79,10 @@ public: HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl); ~HGSaneDeviceImpl(); - HGResult Init(SANE_Handle handle); + HGResult Init(const HGChar* devName, SANE_Handle handle); HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen); HGResult Close(); + HGResult GetName(HGChar* name, HGUInt maxLen); HGResult ShowSettingDlg(HGWindow parent); HGResult Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); @@ -94,6 +96,7 @@ private: private: HGSaneManagerImpl* m_mgrImpl; + std::string m_devName; SANE_Handle m_devHandle; HGByte* m_buffer; HGInt m_bufferSize; diff --git a/modules/saneui/HGSaneUI.cpp b/modules/saneui/HGSaneUI.cpp index bd8b7336..bbdbe1f0 100644 --- a/modules/saneui/HGSaneUI.cpp +++ b/modules/saneui/HGSaneUI.cpp @@ -1,16 +1,55 @@ #include "HGSaneUI.h" +#include "dialog_device_select.h" +#include "dialog_device_scan.h" +#include -SANE_Handle show_devlist_ui(SANEAPI* saneApi, HGWindow parent) +int show_devlist_ui(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char *devName, unsigned int maxLen) { - return nullptr; + if (nullptr == saneApi || nullptr == handle) + return -1; + if (nullptr == qApp) + return -2; + + QWidget *qParent = nullptr; +#ifdef HG_CMP_MSC + qParent = QWidget::find((WId)parent); + if (nullptr != parent && nullptr == qParent) + return -2; +#else + qParent = parent; +#endif + + *handle = nullptr; + Dialog_Device_Select dlg(saneApi, qParent); + if (dlg.exec()) + { + if (nullptr != devName) + { + std::string strDevName = dlg.GetDevName(); + if (maxLen >= strDevName.size() + 1) + strcpy(devName, strDevName.c_str()); + } + + *handle = dlg.GetDevHandle(); + } + + return 0; } -void show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent) +int show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent) { - + if (nullptr == saneApi || nullptr == handle) + return -1; + if (nullptr == qApp) + return -2; + return 0; } -void show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam) +int show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam) { - + if (nullptr == saneApi || nullptr == handle) + return -1; + if (nullptr == qApp) + return -2; + return 0; } diff --git a/modules/saneui/HGSaneUI.h b/modules/saneui/HGSaneUI.h index b312eb12..72bf585b 100644 --- a/modules/saneui/HGSaneUI.h +++ b/modules/saneui/HGSaneUI.h @@ -1,13 +1,13 @@ #ifndef SANE_UI_H #define SANE_UI_H -#include "base/HGDef.h" +#include "../base/HGDef.h" #include "sane/sane_ex.h" typedef void (*show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam); -HGEXPORT SANE_Handle show_devlist_ui(SANEAPI* saneApi, HGWindow parent); -HGEXPORT void show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent); -HGEXPORT void show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam); +HGEXPORT int show_devlist_ui(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char *devName, unsigned int maxLen); +HGEXPORT int show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent); +HGEXPORT int show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam); #endif diff --git a/modules/saneui/dialog_device_select.cpp b/modules/saneui/dialog_device_select.cpp index e3adad23..ddf07e62 100644 --- a/modules/saneui/dialog_device_select.cpp +++ b/modules/saneui/dialog_device_select.cpp @@ -2,11 +2,24 @@ #include "ui_dialog_device_select.h" #include -Dialog_Device_Select::Dialog_Device_Select(QWidget *parent) : +Dialog_Device_Select::Dialog_Device_Select(SANEAPI* saneApi, QWidget *parent) : QDialog(parent), ui(new Ui::Dialog_Device_Select) { ui->setupUi(this); + + const SANE_Device** device_list; + if (SANE_STATUS_GOOD == saneApi->sane_get_devices_api(&device_list, SANE_TRUE)) + { + const SANE_Device** p; + for (p = device_list; *p != nullptr; ++p) + { + ui->listWidget->addItem((*p)->name); + } + } + + m_devHandle = nullptr; + m_devName.clear(); } Dialog_Device_Select::~Dialog_Device_Select() @@ -14,6 +27,16 @@ Dialog_Device_Select::~Dialog_Device_Select() delete ui; } +SANE_Handle Dialog_Device_Select::GetDevHandle() +{ + return m_devHandle; +} + +std::string Dialog_Device_Select::GetDevName() +{ + return m_devName; +} + void Dialog_Device_Select::on_buttonBox_accepted() { diff --git a/modules/saneui/dialog_device_select.h b/modules/saneui/dialog_device_select.h index 58faab61..9b2df82c 100644 --- a/modules/saneui/dialog_device_select.h +++ b/modules/saneui/dialog_device_select.h @@ -4,6 +4,7 @@ #include "base/HGDef.h" #include "sane/sane_ex.h" #include +#include namespace Ui { class Dialog_Device_Select; @@ -14,14 +15,20 @@ class Dialog_Device_Select : public QDialog Q_OBJECT public: - Dialog_Device_Select(QWidget *parent = nullptr); + Dialog_Device_Select(SANEAPI* saneApi, QWidget *parent = nullptr); ~Dialog_Device_Select(); + SANE_Handle GetDevHandle(); + std::string GetDevName(); + private slots: void on_buttonBox_accepted(); private: Ui::Dialog_Device_Select *ui; + + SANE_Handle m_devHandle; + std::string m_devName; }; #endif // DIALOG_DEVICE_SELECT_H diff --git a/modules/twain_user/HGTwain.cpp b/modules/twain_user/HGTwain.cpp index 23da5716..bd0e8c1d 100644 --- a/modules/twain_user/HGTwain.cpp +++ b/modules/twain_user/HGTwain.cpp @@ -49,7 +49,7 @@ HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count) return twainDSMImpl->GetDSCount(count); } -HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen) +HGResult HGAPI HGTwain_GetDSNameWithIndex(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen) { if (NULL == dsm) { @@ -128,6 +128,17 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) return twainDSImpl->Close(); } +HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen) +{ + if (NULL == ds) + { + return HGBASE_ERR_INVALIDARG; + } + + HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; + return twainDSImpl->GetName(name, maxLen); +} + HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam) { if (NULL == ds) diff --git a/modules/twain_user/HGTwain.h b/modules/twain_user/HGTwain.h index efd8c97e..2a178b7a 100644 --- a/modules/twain_user/HGTwain.h +++ b/modules/twain_user/HGTwain.h @@ -20,7 +20,7 @@ HGEXPORT HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm); HGEXPORT HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count); -HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen); +HGEXPORT HGResult HGAPI HGTwain_GetDSNameWithIndex(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen); HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds); @@ -30,6 +30,8 @@ HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds); HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds); +HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen); + HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam); HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam, diff --git a/modules/twain_user/HGTwainImpl.cpp b/modules/twain_user/HGTwainImpl.cpp index c3cf1097..73d6de5a 100644 --- a/modules/twain_user/HGTwainImpl.cpp +++ b/modules/twain_user/HGTwainImpl.cpp @@ -352,6 +352,19 @@ HGResult HGTwainDSImpl::Close() return HGBASE_ERR_OK; } +HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen) +{ + if (NULL == name || 0 == maxLen) + { + return HGBASE_ERR_INVALIDARG; + } + + if (maxLen < strlen(m_iden.ProductName) + 1) + return HGBASE_ERR_FAIL; + strcpy(name, m_iden.ProductName); + return HGBASE_ERR_OK; +} + HGResult HGTwainDSImpl::EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam) { if (m_enable) diff --git a/modules/twain_user/HGTwainImpl.hpp b/modules/twain_user/HGTwainImpl.hpp index b42e95ab..ab3ad79e 100644 --- a/modules/twain_user/HGTwainImpl.hpp +++ b/modules/twain_user/HGTwainImpl.hpp @@ -46,6 +46,7 @@ public: public: HGResult Open(const TW_IDENTITY* iden); HGResult Close(); + HGResult GetName(HGChar* name, HGUInt maxLen); HGResult EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam); HGResult Enable(HGBool showUI, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam, HGDSImageFunc imageFunc, HGPointer imageParam);