添加sane和twain标准调用测试工程

This commit is contained in:
luoliangyi 2023-03-29 16:16:19 +08:00
parent ac0923f386
commit f75c49dff4
26 changed files with 574 additions and 95 deletions

View File

@ -1,7 +1,6 @@
#include "device_user.h"
#include <QMessageBox>
#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

View File

@ -4,7 +4,7 @@
#include "base/HGDef.h"
#include <QDialog>
#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;

11
app/demo/main.cpp Normal file
View File

@ -0,0 +1,11 @@
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

69
app/demo/mainwindow.cpp Normal file
View File

@ -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();
}

33
app/demo/mainwindow.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#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

97
app/demo/mainwindow.ui Normal file
View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>60</x>
<y>40</y>
<width>91</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>当前设备名:</string>
</property>
</widget>
<widget class="QLabel" name="label_currDevName">
<property name="geometry">
<rect>
<x>170</x>
<y>50</y>
<width>281</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPushButton" name="pushButton_selectDev">
<property name="geometry">
<rect>
<x>60</x>
<y>170</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>选择设备</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_setting">
<property name="geometry">
<rect>
<x>240</x>
<y>170</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>设置参数</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_scan">
<property name="geometry">
<rect>
<x>420</x>
<y>170</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>开始扫描</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -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

View File

@ -0,0 +1,7 @@
LIBRARY
EXPORTS
show_devlist_ui
show_setting_ui
show_scan_ui

View File

@ -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)

View File

@ -0,0 +1,5 @@
TEMPLATE = subdirs
SUBDIRS += \
HGSaneUI \
HGDemo

View File

@ -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

View File

@ -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);
}

View File

@ -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);
};

View File

@ -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

View File

@ -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)

View File

@ -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,

View File

@ -1,6 +1,5 @@
#include "HGSaneImpl.hpp"
#include "../base/HGInc.h"
#include <string>
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;
}

View File

@ -9,6 +9,7 @@
#include "sane/sane_ex.h"
#include <list>
#include <vector>
#include <string>
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;

View File

@ -1,16 +1,55 @@
#include "HGSaneUI.h"
#include "dialog_device_select.h"
#include "dialog_device_scan.h"
#include <QApplication>
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;
}

View File

@ -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

View File

@ -2,11 +2,24 @@
#include "ui_dialog_device_select.h"
#include <QMessageBox>
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()
{

View File

@ -4,6 +4,7 @@
#include "base/HGDef.h"
#include "sane/sane_ex.h"
#include <QDialog>
#include <string>
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

View File

@ -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)

View File

@ -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,

View File

@ -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)

View File

@ -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);