diff --git a/app/scanner2/device_user.cpp b/app/scanner2/device_user.cpp index 7bc0c8a6..73f59296 100644 --- a/app/scanner2/device_user.cpp +++ b/app/scanner2/device_user.cpp @@ -6,7 +6,7 @@ #if defined(HG_CMP_MSC) -DeviceUserMgr::DeviceUserMgr(QString password, QWidget *wnd) +DeviceUserMgr::DeviceUserMgr(const QString &password, QWidget *wnd) { m_password = password; m_wnd = wnd; @@ -23,7 +23,7 @@ DeviceUserMgr::~DeviceUserMgr() class DeviceUser* DeviceUserMgr::OpenDeviceUser() { HGTwainDS ds = nullptr; - HGTwain_OpenSelectedDSEx(m_twainDSM, &ds); + HGTwain_CreateSelectedDSEx(m_twainDSM, &ds); if (nullptr == ds) return nullptr; return new DeviceUser(m_wnd, ds, m_password); @@ -32,13 +32,13 @@ class DeviceUser* DeviceUserMgr::OpenDeviceUser() DeviceUser *DeviceUserMgr::OpenDefaultDeviceUser() { HGTwainDS ds = nullptr; - HGTwain_OpenDefaultDS(m_twainDSM, &ds); + HGTwain_CreateDefaultDS(m_twainDSM, &ds); if (nullptr == ds) return nullptr; return new DeviceUser(m_wnd, ds, m_password); } -DeviceUser::DeviceUser(QWidget *wnd, HGTwainDS ds, QString password) +DeviceUser::DeviceUser(QWidget *wnd, HGTwainDS ds, const QString &password) { m_wnd = wnd; m_twainDS = ds; @@ -48,9 +48,20 @@ DeviceUser::DeviceUser(QWidget *wnd, HGTwainDS ds, QString password) DeviceUser::~DeviceUser() { HGTwain_CloseDS(m_twainDS); + HGTwain_DestroyDS(m_twainDS); m_twainDS = nullptr; } +HGResult DeviceUser::Open() +{ + return HGTwain_OpenDS(m_twainDS); +} + +HGResult DeviceUser::Close() +{ + return HGTwain_CloseDS(m_twainDS); +} + QString DeviceUser::GetName() { HGChar devName[256] = {0}; @@ -147,11 +158,11 @@ void HGAPI DeviceUser::DSImageFunc(HGTwainDS ds, HGImage image, HGPointer param) #else -DeviceUserMgr::DeviceUserMgr(QString password, QWidget *wnd) +DeviceUserMgr::DeviceUserMgr(const QString &password, QWidget *wnd) { m_wnd = wnd; - m_saneMgr = nullptr; m_password = password; + m_saneMgr = nullptr; HGSane_CreateManager(&m_saneMgr); } @@ -168,38 +179,7 @@ class DeviceUser* DeviceUserMgr::OpenDeviceUser() if (nullptr == source) return nullptr; - HGUInt devCount = 0; - HGSane_GetDeviceCount(source, &devCount); - if (0 == devCount) - { - HGSane_CloseSource(source); - QMessageBox::information(m_wnd, tr("tips"), tr("no device")); - return nullptr; - } -// else if (1 == devCount) -// { -// HGChar errInfo[256]; -// HGSaneDevice dev = nullptr; -// HGSane_OpenDevice(source, 0, &dev, errInfo, 256); -// if (nullptr == dev) -// { -// HGSane_CloseSource(source); -// QMessageBox::information(m_wnd, tr("tips"), QString::fromUtf8(errInfo)); -// return nullptr; -// } - -// return new DeviceUser(m_wnd, source, dev, m_password); -// } - - HGSaneDevice dev = nullptr; - HGSane_OpenSelectedDevice(source, m_wnd, &dev); - if (nullptr == dev) - { - HGSane_CloseSource(source); - return nullptr; - } - - return new DeviceUser(m_wnd, source, dev, m_password); + return new DeviceUser(m_wnd, source, m_password); } DeviceUser *DeviceUserMgr::OpenDefaultDeviceUser() @@ -209,45 +189,14 @@ DeviceUser *DeviceUserMgr::OpenDefaultDeviceUser() if (nullptr == source) return nullptr; - HGUInt devCount = 0; - HGSane_GetDeviceCount(source, &devCount); - if (0 == devCount) - { - HGSane_CloseSource(source); - QMessageBox::information(m_wnd, tr("tips"), tr("no device")); - return nullptr; - } - else if (1 == devCount) - { - HGChar errInfo[256]; - HGSaneDevice dev = nullptr; - HGSane_OpenDevice(source, 0, &dev, errInfo, 256); - if (nullptr == dev) - { - HGSane_CloseSource(source); - QMessageBox::information(m_wnd, tr("tips"), QString::fromUtf8(errInfo)); - return nullptr; - } - - return new DeviceUser(m_wnd, source, dev, m_password); - } - - HGSaneDevice dev = nullptr; - HGSane_OpenSelectedDevice(source, m_wnd, &dev); - if (nullptr == dev) - { - HGSane_CloseSource(source); - return nullptr; - } - - return new DeviceUser(m_wnd, source, dev, m_password); + return new DeviceUser(m_wnd, source, m_password); } -DeviceUser::DeviceUser(QWidget *wnd, HGSaneSource source, HGSaneDevice dev, QString password) +DeviceUser::DeviceUser(QWidget *wnd, HGSaneSource source, const QString &password) { m_wnd = wnd; m_source = source; - m_saneDev = dev; + m_saneDev = nullptr; m_password = password; } @@ -259,6 +208,28 @@ DeviceUser::~DeviceUser() m_source = nullptr; } +HGResult DeviceUser::Open() +{ + if (nullptr != m_saneDev) + { + return HGSANE_ERR_FAIL; + } + + return HGSane_OpenSelectedDevice(m_source, m_wnd, &m_saneDev); +} + +HGResult DeviceUser::Close() +{ + if (nullptr == m_saneDev) + { + return HGSANE_ERR_FAIL; + } + + HGSane_CloseDevice(m_saneDev); + m_saneDev = nullptr; + return HGBASE_ERR_OK; +} + QString DeviceUser::GetName() { HGChar devName[256]; diff --git a/app/scanner2/device_user.h b/app/scanner2/device_user.h index c61e5a91..b6fe5a37 100644 --- a/app/scanner2/device_user.h +++ b/app/scanner2/device_user.h @@ -12,7 +12,7 @@ class DeviceUserMgr : public QObject Q_OBJECT public: - DeviceUserMgr(QString password, QWidget *wnd); + DeviceUserMgr(const QString &password, QWidget *wnd); ~DeviceUserMgr(); // 弹出设备选择对话框,选择twain源 @@ -30,10 +30,12 @@ class DeviceUser : public QObject Q_OBJECT friend class DeviceUserMgr; - DeviceUser(QWidget *wnd, HGTwainDS ds, QString password); + DeviceUser(QWidget *wnd, HGTwainDS ds, const QString &password); public: ~DeviceUser(); + HGResult Open(); + HGResult Close(); // 获取设备名字 QString GetName(); // 弹出配置对话框 @@ -73,7 +75,7 @@ class DeviceUserMgr : public QObject Q_OBJECT public: - DeviceUserMgr(QString password, QWidget *wnd); + DeviceUserMgr(const QString &password, QWidget *wnd); ~DeviceUserMgr(); // 弹出设备选择对话框,选择设备 @@ -91,10 +93,12 @@ class DeviceUser : public QObject Q_OBJECT friend class DeviceUserMgr; - DeviceUser(QWidget *wnd, HGSaneSource source, HGSaneDevice dev, QString password); + DeviceUser(QWidget *wnd, HGSaneSource source, const QString &password); public: ~DeviceUser(); + HGResult Open(); + HGResult Close(); // 获取设备名字 QString GetName(); // 弹出配置对话框 diff --git a/app/scanner2/mainwindow.cpp b/app/scanner2/mainwindow.cpp index 49bddca9..c11eebb8 100644 --- a/app/scanner2/mainwindow.cpp +++ b/app/scanner2/mainwindow.cpp @@ -360,14 +360,22 @@ MainWindow::MainWindow(const QString& appLang, QWidget *parent) m_devUser = m_devUserMgr->OpenDefaultDeviceUser(); if (m_devUser != nullptr) { - m_wndStatusBar->setDeviceStatusInfo(tr("Device %1 is open").arg(m_devUser->GetName()), false); - connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection); - connect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()), Qt::QueuedConnection); - connect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()), Qt::QueuedConnection); + if (HGBASE_ERR_OK == m_devUser->Open()) + { + m_wndStatusBar->setDeviceStatusInfo(tr("Device %1 is open").arg(m_devUser->GetName()), false); + connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection); + connect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()), Qt::QueuedConnection); + connect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()), Qt::QueuedConnection); -#if !defined(HG_CMP_MSC) - checkRollerLife(); -#endif + #if !defined(HG_CMP_MSC) + checkRollerLife(); + #endif + } + else + { + delete m_devUser; + m_devUser = nullptr; + } } QString password = getCfgValue("login", "password", QString("")); @@ -4405,29 +4413,36 @@ void MainWindow::on_act_selectDevice_triggered() m_versionDll->PostUserLogoutInfo(HGVERSION_APPNAME_SCANNER, m_oemName); } - if (nullptr != m_devUser) - { - disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*))); - disconnect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent())); - disconnect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent())); - m_devUser->Logout(); - delete m_devUser; - m_devUser = nullptr; - m_wndStatusBar->setDeviceStatusInfo(tr("Please go to 'Menu Bar ->Scan' to select a device"), false); - updateActionStatus(); - } - DeviceUser *devUser = m_devUserMgr->OpenDeviceUser(); if (devUser != nullptr) { - m_devUser = devUser; - m_wndStatusBar->setDeviceStatusInfo(tr("Device %1 is open").arg(m_devUser->GetName()), false); - connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection); - connect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()), Qt::QueuedConnection); - connect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()), Qt::QueuedConnection); -#if !defined(HG_CMP_MSC) - checkRollerLife(); -#endif - updateActionStatus(); + if (nullptr != m_devUser) + { + disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*))); + disconnect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent())); + disconnect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent())); + m_devUser->Logout(); + delete m_devUser; + m_devUser = nullptr; + m_wndStatusBar->setDeviceStatusInfo(tr("Please go to 'Menu Bar ->Scan' to select a device"), false); + updateActionStatus(); + } + + if (HGBASE_ERR_OK == devUser->Open()) + { + m_devUser = devUser; + m_wndStatusBar->setDeviceStatusInfo(tr("Device %1 is open").arg(m_devUser->GetName()), false); + connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection); + connect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()), Qt::QueuedConnection); + connect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()), Qt::QueuedConnection); + #if !defined(HG_CMP_MSC) + checkRollerLife(); + #endif + updateActionStatus(); + } + else + { + delete devUser; + } } } diff --git a/build2/qt/HGTwainUser/HGTwainUser.def b/build2/qt/HGTwainUser/HGTwainUser.def index da1c84ba..4b469939 100644 --- a/build2/qt/HGTwainUser/HGTwainUser.def +++ b/build2/qt/HGTwainUser/HGTwainUser.def @@ -6,10 +6,12 @@ HGTwain_CreateDSM HGTwain_DestroyDSM HGTwain_GetDSCount HGTwain_GetDSNameWithIndex +HGTwain_CreateDS +HGTwain_CreateDefaultDS +HGTwain_CreateSelectedDS +HGTwain_CreateSelectedDSEx +HGTwain_DestroyDS HGTwain_OpenDS -HGTwain_OpenDefaultDS -HGTwain_OpenSelectedDS -HGTwain_OpenSelectedDSEx HGTwain_CloseDS HGTwain_GetDSName HGTwain_GetDSDeviceName diff --git a/modules/twain_user/HGTwain.cpp b/modules/twain_user/HGTwain.cpp index 395f6679..853a8ea2 100644 --- a/modules/twain_user/HGTwain.cpp +++ b/modules/twain_user/HGTwain.cpp @@ -60,7 +60,7 @@ HGResult HGAPI HGTwain_GetDSNameWithIndex(HGTwainDSM dsm, HGUInt index, HGChar* return twainDSMImpl->GetDSName(index, name, maxLen); } -HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS* ds) +HGResult HGAPI HGTwain_CreateDS(HGTwainDSM dsm, HGUInt index, HGTwainDS* ds) { if (NULL == dsm) { @@ -69,7 +69,7 @@ HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS* ds) HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; class HGTwainDSImpl* dsImpl = NULL; - HGResult ret = twainDSMImpl->OpenDS(index, &dsImpl); + HGResult ret = twainDSMImpl->CreateDS(index, &dsImpl); if (HGBASE_ERR_OK != ret) { return ret; @@ -79,7 +79,7 @@ HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS* ds) return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) +HGResult HGAPI HGTwain_CreateDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) { if (NULL == dsm) { @@ -88,7 +88,7 @@ HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; class HGTwainDSImpl* dsImpl = NULL; - HGResult ret = twainDSMImpl->OpenDefaultDS(&dsImpl); + HGResult ret = twainDSMImpl->CreateDefaultDS(&dsImpl); if (HGBASE_ERR_OK != ret) { return ret; @@ -98,7 +98,7 @@ HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds) +HGResult HGAPI HGTwain_CreateSelectedDS(HGTwainDSM dsm, HGTwainDS* ds) { if (NULL == dsm) { @@ -107,7 +107,7 @@ HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds) HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; class HGTwainDSImpl* dsImpl = NULL; - HGResult ret = twainDSMImpl->OpenSelectedDS(&dsImpl); + HGResult ret = twainDSMImpl->CreateSelectedDS(&dsImpl); if (HGBASE_ERR_OK != ret) { return ret; @@ -117,7 +117,7 @@ HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds) return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_OpenSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds) +HGResult HGAPI HGTwain_CreateSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds) { if (NULL == dsm) { @@ -126,7 +126,7 @@ HGResult HGAPI HGTwain_OpenSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds) HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; class HGTwainDSImpl* dsImpl = NULL; - HGResult ret = twainDSMImpl->OpenSelectedDSEx(&dsImpl); + HGResult ret = twainDSMImpl->CreateSelectedDSEx(&dsImpl); if (HGBASE_ERR_OK != ret) { return ret; @@ -136,6 +136,28 @@ HGResult HGAPI HGTwain_OpenSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds) return HGBASE_ERR_OK; } +HGResult HGAPI HGTwain_DestroyDS(HGTwainDS ds) +{ + if (NULL == ds) + { + return HGBASE_ERR_INVALIDARG; + } + + HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; + return twainDSImpl->Destroy(); +} + +HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds) +{ + if (NULL == ds) + { + return HGBASE_ERR_INVALIDARG; + } + + HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; + return twainDSImpl->Open(); +} + HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) { if (NULL == ds) diff --git a/modules/twain_user/HGTwain.h b/modules/twain_user/HGTwain.h index a830c091..6a041503 100644 --- a/modules/twain_user/HGTwain.h +++ b/modules/twain_user/HGTwain.h @@ -51,13 +51,17 @@ HGEXPORT HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count); HGEXPORT HGResult HGAPI HGTwain_GetDSNameWithIndex(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen); -HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds); +HGEXPORT HGResult HGAPI HGTwain_CreateDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds); -HGEXPORT HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds); +HGEXPORT HGResult HGAPI HGTwain_CreateDefaultDS(HGTwainDSM dsm, HGTwainDS* ds); -HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds); +HGEXPORT HGResult HGAPI HGTwain_CreateSelectedDS(HGTwainDSM dsm, HGTwainDS* ds); -HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds); +HGEXPORT HGResult HGAPI HGTwain_CreateSelectedDSEx(HGTwainDSM dsm, HGTwainDS* ds); + +HGEXPORT HGResult HGAPI HGTwain_DestroyDS(HGTwainDS ds); + +HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds); HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds); diff --git a/modules/twain_user/HGTwainImpl.cpp b/modules/twain_user/HGTwainImpl.cpp index 841ea1e8..8cf973e3 100644 --- a/modules/twain_user/HGTwainImpl.cpp +++ b/modules/twain_user/HGTwainImpl.cpp @@ -149,7 +149,7 @@ HGResult HGTwainDSMImpl::GetDSName(HGUInt index, HGChar* name, HGUInt maxLen) return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl) +HGResult HGTwainDSMImpl::CreateDS(HGUInt index, class HGTwainDSImpl** dsImpl) { if (NULL == dsImpl) { @@ -159,13 +159,7 @@ HGResult HGTwainDSMImpl::OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl) if (index >= (HGUInt)m_vds.size()) return HGBASE_ERR_INVALIDARG; - class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); - HGResult ret = newDSImpl->Open(&m_vds[index]); - if (HGBASE_ERR_OK != ret) - { - delete newDSImpl; - return ret; - } + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this, &m_vds[index]); std::string DSName = m_vds[index].ProductName; saveCfgValue("twain", "source", DSName); @@ -174,7 +168,7 @@ HGResult HGTwainDSMImpl::OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl) return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::OpenDefaultDS(class HGTwainDSImpl** dsImpl) +HGResult HGTwainDSMImpl::CreateDefaultDS(class HGTwainDSImpl** dsImpl) { if (NULL == dsImpl) { @@ -203,13 +197,7 @@ HGResult HGTwainDSMImpl::OpenDefaultDS(class HGTwainDSImpl** dsImpl) index = 0; } - class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); - HGResult ret = newDSImpl->Open(&m_vds[index]); - if (HGBASE_ERR_OK != ret) - { - delete newDSImpl; - return ret; - } + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this, &m_vds[index]); std::string DSName = m_vds[index].ProductName; saveCfgValue("twain", "source", DSName); @@ -218,7 +206,7 @@ HGResult HGTwainDSMImpl::OpenDefaultDS(class HGTwainDSImpl** dsImpl) return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::OpenSelectedDS(class HGTwainDSImpl** dsImpl) +HGResult HGTwainDSMImpl::CreateSelectedDS(class HGTwainDSImpl** dsImpl) { if (NULL == dsImpl) { @@ -231,13 +219,7 @@ HGResult HGTwainDSMImpl::OpenSelectedDS(class HGTwainDSImpl** dsImpl) return HGTWAIN_ERR_CANCELUI; } - class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); - HGResult ret = newDSImpl->Open(&selectDS); - if (HGBASE_ERR_OK != ret) - { - delete newDSImpl; - return ret; - } + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this, &selectDS); std::string DSName = selectDS.ProductName; saveCfgValue("twain", "source", DSName); @@ -246,7 +228,7 @@ HGResult HGTwainDSMImpl::OpenSelectedDS(class HGTwainDSImpl** dsImpl) return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::OpenSelectedDSEx(class HGTwainDSImpl** dsImpl) +HGResult HGTwainDSMImpl::CreateSelectedDSEx(class HGTwainDSImpl** dsImpl) { if (NULL == dsImpl) { @@ -267,13 +249,7 @@ HGResult HGTwainDSMImpl::OpenSelectedDSEx(class HGTwainDSImpl** dsImpl) return HGTWAIN_ERR_CANCELUI; } - class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); - HGResult ret = newDSImpl->Open(&selectDS); - if (HGBASE_ERR_OK != ret) - { - delete newDSImpl; - return ret; - } + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this, &selectDS); std::string DSName = selectDS.ProductName; saveCfgValue("twain", "source", DSName); @@ -359,10 +335,11 @@ bool HGTwainDSMImpl::filterTwainSource(const char* sourceName, int majorNum) } -HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl) +HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, TW_IDENTITY* iden) { m_dsmImpl = dsmImpl; - memset(&m_iden, 0, sizeof(TW_IDENTITY)); + assert(NULL != iden); + memcpy(&m_iden, iden, sizeof(TW_IDENTITY)); m_open = HGFALSE; m_singleScan = HGFALSE; m_oldXferCount = -1; @@ -382,19 +359,26 @@ HGTwainDSImpl::~HGTwainDSImpl() } -HGResult HGTwainDSImpl::Open(TW_IDENTITY* iden) +HGResult HGTwainDSImpl::Destroy() { - assert(!m_open); - assert(NULL != iden); + Close(); + m_dsmImpl->RemoveDS(this); + return HGBASE_ERR_OK; +} - USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, iden); +HGResult HGTwainDSImpl::Open() +{ + if (m_open) + { + return HGTWAIN_ERR_FAIL; + } + + USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden); if (TWRC_SUCCESS != ret) { return HGTWAIN_ERR_FAIL; } - memcpy(&m_iden, iden, sizeof(TW_IDENTITY)); - HGBase_CreateEvent(HGFALSE, HGFALSE, &m_event); m_stopThread = HGFALSE; HGBase_OpenThread(ThreadFunc, this, &m_thread); @@ -405,7 +389,10 @@ HGResult HGTwainDSImpl::Open(TW_IDENTITY* iden) HGResult HGTwainDSImpl::Close() { - assert(m_open); + if (!m_open) + { + return HGTWAIN_ERR_FAIL; + } Disable(); m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden); @@ -418,7 +405,6 @@ HGResult HGTwainDSImpl::Close() m_event = NULL; m_open = HGFALSE; - m_dsmImpl->RemoveDS(this); return HGBASE_ERR_OK; } diff --git a/modules/twain_user/HGTwainImpl.hpp b/modules/twain_user/HGTwainImpl.hpp index 7a952197..1a1a5c2b 100644 --- a/modules/twain_user/HGTwainImpl.hpp +++ b/modules/twain_user/HGTwainImpl.hpp @@ -21,10 +21,10 @@ public: HGResult Destroy(); HGResult GetDSCount(HGUInt* count); HGResult GetDSName(HGUInt index, HGChar* name, HGUInt maxLen); - HGResult OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl); - HGResult OpenDefaultDS(class HGTwainDSImpl** dsImpl); - HGResult OpenSelectedDS(class HGTwainDSImpl** dsImpl); - HGResult OpenSelectedDSEx(class HGTwainDSImpl** dsImpl); + HGResult CreateDS(HGUInt index, class HGTwainDSImpl** dsImpl); + HGResult CreateDefaultDS(class HGTwainDSImpl** dsImpl); + HGResult CreateSelectedDS(class HGTwainDSImpl** dsImpl); + HGResult CreateSelectedDSEx(class HGTwainDSImpl** dsImpl); private: void RemoveDS(class HGTwainDSImpl* dsImpl); @@ -46,11 +46,12 @@ class HGTwainDSImpl { friend class HGTwainDSMImpl; public: - HGTwainDSImpl(HGTwainDSMImpl* dsmImpl); + HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, TW_IDENTITY* iden); ~HGTwainDSImpl(); public: - HGResult Open(TW_IDENTITY* iden); + HGResult Destroy(); + HGResult Open(); HGResult Close(); HGResult GetName(HGChar* name, HGUInt maxLen); HGResult GetDeviceName(HGChar* name, HGUInt maxLen);