修改twainuser接口,将打开twain源和打开设备分开处理

This commit is contained in:
luoliangyi 2023-08-15 15:28:23 +08:00
parent 559851ebab
commit 7be7e50272
8 changed files with 172 additions and 167 deletions

View File

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

View File

@ -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();
// 弹出配置对话框

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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