diff --git a/build/windows/HGTest/HGTestDlg.cpp b/build/windows/HGTest/HGTestDlg.cpp index 90e5934e..584545da 100644 --- a/build/windows/HGTest/HGTestDlg.cpp +++ b/build/windows/HGTest/HGTestDlg.cpp @@ -129,8 +129,7 @@ BOOL CHGTestDlg::OnInitDialog() #ifdef USE_SANE HGSane_CreateManager("sane.dll", &m_saneMgr); #else - HGTwain_LoadDSM(&m_dsm); - HGTwain_OpenDSM(m_dsm, m_hWnd); + HGTwain_CreateDSM(m_hWnd, &m_dsm); #endif return TRUE; // 除非将焦点设置到控件,否则返回 TRUE @@ -207,11 +206,12 @@ void CHGTestDlg::OnBnClickedButton1() return; } - HGTwain_SelectDS(m_dsm, &m_ds); - if (NULL != m_ds) + HGTwain_OpenSelectedDS(m_dsm, &m_ds); + HGResult ret = HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this, DSImageCallback, this); + if (HGBASE_ERR_OK != ret) { - HGTwain_OpenDS(m_ds); - HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this); + HGTwain_CloseDS(m_ds); + m_ds = NULL; } #endif } @@ -237,50 +237,25 @@ void HGAPI CHGTestDlg::DeviceEventCallback(HGSaneDevice dev, HGUInt error, const void HGAPI CHGTestDlg::DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param) { CHGTestDlg* p = (CHGTestDlg*)param; - CStringA strName; strName.Format("D:\\HGTest_%u.jpg", p->m_idx++); HGImgFmt_SaveImage(image, 0, NULL, strName); } #else -void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param) +void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt error, const HGChar* errInfo, HGPointer param) { CHGTestDlg* p = (CHGTestDlg*)param; - if (HGTWAIN_DSEVENT_XFERREADY == event) - { - while (1) - { - HGImage image = NULL; - HGTwain_ImageNativeXfer(p->m_ds, 0, 0, &image); - CStringA strName; - strName.Format("D:\\Twain_%u.jpg", p->m_idx++); - HGImgFmt_SaveImage(image, 0, NULL, strName); - HGBase_DestroyImage(image); - - HGUInt count = 0; - HGTwain_EndXfer(p->m_ds, &count); - if (0 == count) - { - break; - } - } - - HGTwain_Reset(p->m_ds); - } - else if (HGTWAIN_DSEVENT_CLOSEDSREQ == event) - { - HGTwain_CloseDS(p->m_ds); - p->m_ds = NULL; - } - else if (HGTWAIN_DSEVENT_CLOSEDSOK == event) - { - HGTwain_CloseDS(p->m_ds); - p->m_ds = NULL; - } + ::PostMessage(p->m_hWnd, 2000, 0, 0); +} +void HGAPI CHGTestDlg::DSImageCallback(HGTwainDS ds, HGImage image, HGPointer param) +{ + CHGTestDlg* p = (CHGTestDlg*)param; + CStringA strName; + strName.Format("D:\\HGTest_%u.jpg", p->m_idx++); + HGImgFmt_SaveImage(image, 0, NULL, strName); } #endif - LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (2000 == message) @@ -288,6 +263,9 @@ LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) #ifdef USE_SANE HGSane_CloseDevice(m_saneDev); m_saneDev = NULL; +#else + HGTwain_CloseDS(m_ds); + m_ds = NULL; #endif } diff --git a/build/windows/HGTest/HGTestDlg.h b/build/windows/HGTest/HGTestDlg.h index 954ffe6a..9edb035b 100644 --- a/build/windows/HGTest/HGTestDlg.h +++ b/build/windows/HGTest/HGTestDlg.h @@ -30,7 +30,8 @@ protected: #else HGTwainDSM m_dsm; HGTwainDS m_ds; - static void HGAPI DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param); + static void HGAPI DSEventCallback(HGTwainDS ds, HGUInt error, const HGChar* errInfo, HGPointer param); + static void HGAPI DSImageCallback(HGTwainDS ds, HGImage image, HGPointer param); #endif // 实现 diff --git a/build/windows/HGTwainUser/HGTwainUser.def b/build/windows/HGTwainUser/HGTwainUser.def index b343909c..0806de23 100644 --- a/build/windows/HGTwainUser/HGTwainUser.def +++ b/build/windows/HGTwainUser/HGTwainUser.def @@ -2,21 +2,14 @@ LIBRARY EXPORTS -HGTwain_LoadDSM -HGTwain_UnloadDSM -HGTwain_OpenDSM -HGTwain_CloseDSM -HGTwain_GetDSList -HGTwain_GetDefaultDS -HGTwain_SelectDS +HGTwain_CreateDSM +HGTwain_DestroyDSM +HGTwain_GetDSCount HGTwain_GetDSName HGTwain_OpenDS +HGTwain_OpenDefaultDS +HGTwain_OpenSelectedDS HGTwain_CloseDS -HGTwain_SetCapability -HGTwain_GetCapability HGTwain_EnableDSUIOnly HGTwain_EnableDS HGTwain_DisableDS -HGTwain_ImageNativeXfer -HGTwain_EndXfer -HGTwain_Reset diff --git a/modules/sane_user/HGSane.h b/modules/sane_user/HGSane.h index 33f3fbcc..20104823 100644 --- a/modules/sane_user/HGSane.h +++ b/modules/sane_user/HGSane.h @@ -10,7 +10,7 @@ HG_DECLARE_HANDLE(HGSaneManager); HG_DECLARE_HANDLE(HGSaneDevice); -/* Sane设备回调 +/* Sane回调 */ typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt error, const HGChar *errInfo, HGPointer param); typedef void (HGAPI* HGSane_DeviceImageFunc)(HGSaneDevice dev, HGImage image, HGPointer param); diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index 87dc74f0..eecdc5cb 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -26,10 +26,7 @@ HGSaneManagerImpl::~HGSaneManagerImpl() HGResult HGSaneManagerImpl::Create(const HGChar* sanePath) { - if (NULL != m_dll) - { - return HGBASE_ERR_FAIL; - } + assert(NULL == m_dll); HGResult ret = HGBase_CreateDll(sanePath, &m_dll); if (HGBASE_ERR_OK != ret) @@ -57,18 +54,16 @@ HGResult HGSaneManagerImpl::Create(const HGChar* sanePath) HGResult HGSaneManagerImpl::Destroy() { + assert(NULL != m_dll); + if (!m_listDeviceImpl.empty()) { return HGBASE_ERR_FAIL; } - if (NULL != m_dll) - { - m_f_sane_exit(); - HGBase_DestroyDll(m_dll); - m_dll = NULL; - } - + m_f_sane_exit(); + HGBase_DestroyDll(m_dll); + m_dll = NULL; return HGBASE_ERR_OK; } @@ -256,10 +251,7 @@ HGSaneDeviceImpl::~HGSaneDeviceImpl() HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt errInfoLen) { - if (NULL != m_devHandle) - { - return HGBASE_ERR_FAIL; - } + assert(NULL == m_devHandle); if (NULL == devName) { @@ -289,10 +281,7 @@ HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt e HGResult HGSaneDeviceImpl::Close() { - if (NULL == m_devHandle) - { - return HGBASE_ERR_FAIL; - } + assert(NULL != m_devHandle); Stop(); m_mgrImpl->m_f_sane_close(m_devHandle); diff --git a/modules/twain_user/HGTwain.cpp b/modules/twain_user/HGTwain.cpp index a4f5b3e4..a3e93af9 100644 --- a/modules/twain_user/HGTwain.cpp +++ b/modules/twain_user/HGTwain.cpp @@ -1,7 +1,7 @@ #include "HGTwain.h" #include "HGTwainImpl.hpp" -HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm) +HGResult HGAPI HGTwain_CreateDSM(HWND hwnd, HGTwainDSM* dsm) { if (NULL == dsm) { @@ -9,7 +9,7 @@ HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm) } HGTwainDSMImpl* twainDSMImpl = new HGTwainDSMImpl; - HGResult ret = twainDSMImpl->LoadDSM(); + HGResult ret = twainDSMImpl->Create(hwnd); if (HGBASE_ERR_OK != ret) { delete twainDSMImpl; @@ -20,7 +20,7 @@ HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm) return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm) +HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm) { if (NULL == dsm) { @@ -28,7 +28,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm) } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - HGResult ret = twainDSMImpl->UnloadDSM(); + HGResult ret = twainDSMImpl->Destroy(); if (HGBASE_ERR_OK != ret) { return ret; @@ -38,7 +38,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm) return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd) +HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count) { if (NULL == dsm) { @@ -46,10 +46,10 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd) } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - return twainDSMImpl->OpenDSM(hwnd); + return twainDSMImpl->GetDSCount(count); } -HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm) +HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen) { if (NULL == dsm) { @@ -57,10 +57,10 @@ HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm) } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - return twainDSMImpl->CloseDSM(); + return twainDSMImpl->GetDSName(index, name, maxLen); } -HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS* ds, HGUInt* size) +HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS* ds) { if (NULL == dsm) { @@ -68,10 +68,18 @@ HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS* ds, HGUInt* size) } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - return twainDSMImpl->GetDSList((HGTwainDSImpl**)ds, size); + class HGTwainDSImpl* dsImpl = NULL; + HGResult ret = twainDSMImpl->OpenDS(index, &dsImpl); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + *ds = (HGTwainDS)dsImpl; + return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) +HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) { if (NULL == dsm) { @@ -79,10 +87,18 @@ HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - return twainDSMImpl->GetDefaultDS((HGTwainDSImpl**)ds); + class HGTwainDSImpl* dsImpl = NULL; + HGResult ret = twainDSMImpl->OpenDefaultDS(&dsImpl); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + *ds = (HGTwainDS)dsImpl; + return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds) +HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds) { if (NULL == dsm) { @@ -90,29 +106,15 @@ HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds) } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - return twainDSMImpl->SelectDS((HGTwainDSImpl**)ds); -} - -HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen) -{ - if (NULL == ds) + class HGTwainDSImpl* dsImpl = NULL; + HGResult ret = twainDSMImpl->OpenSelectedDS(&dsImpl); + if (HGBASE_ERR_OK != ret) { - return HGBASE_ERR_INVALIDARG; + return ret; } - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->GetName(name, maxLen); -} - -HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->Open(); + *ds = (HGTwainDS)dsImpl; + return HGBASE_ERR_OK; } HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) @@ -126,7 +128,7 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) return twainDSImpl->Close(); } -HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value) +HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam) { if (NULL == ds) { @@ -134,10 +136,11 @@ HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->SetCap(cap, value); + return twainDSImpl->EnableUIOnly(showUI, parent, eventFunc, eventParam); } -HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value) +HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam, + HGDSImageFunc imageFunc, HGPointer imageParam) { if (NULL == ds) { @@ -145,29 +148,7 @@ HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->GetCap(cap, value); -} - -HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->EnableUIOnly(showUI, parent, func, param); -} - -HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->Enable(showUI, parent, func, param); + return twainDSImpl->Enable(showUI, parent, eventFunc, eventParam, imageFunc, imageParam); } HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) @@ -179,37 +160,4 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; return twainDSImpl->Disable(); -} - -HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage* image) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->ImageNativeXfer(type, origin, image); -} - -HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->EndXfer(count); -} - -HGResult HGAPI HGTwain_Reset(HGTwainDS ds) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->Reset(); } \ No newline at end of file diff --git a/modules/twain_user/HGTwain.h b/modules/twain_user/HGTwain.h index b9b1e42d..2e3ed66b 100644 --- a/modules/twain_user/HGTwain.h +++ b/modules/twain_user/HGTwain.h @@ -9,199 +9,32 @@ HG_DECLARE_HANDLE(HGTwainDSM); HG_DECLARE_HANDLE(HGTwainDS); -/* 能力 */ -#define HGTWAIN_DSCAP_DUPLEX 1L -#define HGTWAIN_DSCAP_DUPLEXENABLED 2L -#define HGTWAIN_DSCAP_XFERCOUNT 3L - -/* 未知事件, 可能是该库未进行处理的事件 */ -#define HGTWAIN_DSEVENT_UNKNOWN 0L -#define HGTWAIN_DSEVENT_XFERREADY 1L -#define HGTWAIN_DSEVENT_CLOSEDSREQ 2L -#define HGTWAIN_DSEVENT_CLOSEDSOK 3L - -/* twain事件回调 -* 参数: -* 1) ds: in, DS句柄 -* 2) event: in, 事件, 参见HGTWAIN_DSEVENT_* -* 3) param: in, 回调参数 -* 说明: -* 1) 如果event为HGTWAIN_EVENT_XFERREADY, TWAIN状态从5变为6 -* 2) 如果event为HGTWAIN_EVENT_CLOSEDSREQ, 表示需要关闭该DS +/* ds回调 */ -typedef void (HGAPI *HGDSEventFunc)(HGTwainDS ds, HGUInt event, HGPointer param); +typedef void (HGAPI *HGDSEventFunc)(HGTwainDS ds, HGUInt error, const HGChar* errInfo, HGPointer param); +typedef void (HGAPI* HGDSImageFunc)(HGTwainDS ds, HGImage image, HGPointer param); -/* 加载DSM -* 参数: -* 1) dsm: out, DSM句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从1变为2 -*/ -HGEXPORT HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM *dsm); +HGEXPORT HGResult HGAPI HGTwain_CreateDSM(HWND hwnd, HGTwainDSM *dsm); -/* 卸载DSM -* 参数: -* 1) dsm: in, DSM句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从2变为1 -*/ -HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm); +HGEXPORT HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm); -/* 打开DSM -* 参数: -* 1) dsm: in, DSM句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从2变为3 -* 2) 调用该函数的线程需要有消息循环 -*/ -HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd); +HGEXPORT HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count); -/* 关闭DSM -* 参数: -* 1) dsm: in, DSM句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从3变为2 -*/ -HGEXPORT HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm); +HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen); -/* 获取DS列表 -* 参数: -* 1) dsm: in, DSM句柄 -* 2) ds: out, DS句柄列表 -* 3) size: in, out, DS句柄列表大小/返回的DS句柄数量 -* 说明: -* 1) 该函数需要TWAIN状态为3 -* 2) size既作为输入, 也作为输出 -*/ -HGEXPORT HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS *ds, HGUInt *size); +HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds); -/* 获取默认的DS -* 参数: -* 1) dsm: in, DSM句柄 -* 2) ds: out, DS句柄 -* 说明: -* 1) 该函数需要TWAIN状态为3 -*/ -HGEXPORT HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds); +HGEXPORT HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds); -/* 弹出DS选择框,并返回选择的DS -* 参数: -* 1) dsm: in, DSM句柄 -* 2) ds: out, DS句柄 -* 说明: -* 1) 该函数需要TWAIN状态为3 -*/ -HGEXPORT HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds); +HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds); -/* 获取DS名称 -* 参数: -* 1) ds: in, DS句柄 -* 2) name: out, DS名字数据区地址 -* 3) maxLen: in, DS名字数据区长度 -* 说明: -* 1) 该函数需要TWAIN状态为3 -* 2) size既作为输入, 也作为输出, 返回的size包括空字符 -*/ -HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar *name, HGUInt maxLen); - -/* 打开DS -* 参数: -* 1) ds: in, DS句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从3变为4 -*/ -HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds); - -/* 关闭DS -* 参数: -* 1) ds: in, DS句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从4变为3 -*/ HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds); -/* 设置DS的能力 -* 参数: -* 1) ds: in, DS句柄 -* 2) cap: in, 能力 -* 3) value: in, 值 -* 说明: -* 1) 该函数需要TWAIN状态为4 -*/ -HGEXPORT HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value); +HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam); -/* 获取DS的能力 -* 参数: -* 1) ds: in, DS句柄 -* 2) cap: in, 能力 -* 3) value: out, 值 -* 说明: -* 1) 该函数需要TWAIN状态为4-7 -*/ -HGEXPORT HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value); +HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam, + HGDSImageFunc imageFunc, HGPointer imageParam); -/* 启动DS, 仅仅用作参数设置 -* 参数: -* 1) ds: in, DS句柄 -* 2) showUI: in, 是否显示UI -* 3) parent: in, 父窗口句柄 -* 4) func: in, 回调函数 -* 5) param: in, 回调参数 -* 说明: -* 1) 执行此函数后,TWAIN状态从4变为5 -*/ -HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param); - -/* 启动DS -* 参数: -* 1) ds: in, DS句柄 -* 2) showUI: in, 是否显示UI -* 3) parent: in, 父窗口句柄 -* 4) func: in, 回调函数 -* 5) param: in, 回调参数 -* 说明: -* 1) 执行此函数后,TWAIN状态从4变为5 -*/ -HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param); - -/* 停止DS -* 参数: -* 1) ds: in, DS句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态从5变为4 -*/ HGEXPORT HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds); -/* 本地传输图像 -* 参数: -* 1) ds: in, DS句柄 -* 2) type: in, 图像类型 -* 3) origin: in, 图像数据排列方式 -* 4) image: out, 获取的图像 -* 说明: -* 1) 该函数需要在状态6调用 -* 2) 执行此函数时,TWAIN状态从6变为7 -* 3) 生成的image需要调用HGBase_DestroyImage销毁 -*/ -HGEXPORT HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage *image); - -/* 停止本次传输 -* 参数: -* 1) ds: in, DS句柄 -* 2) count: out, 还剩下的未传输的图像数量 -* 说明: -* 1) 执行此函数后,TWAIN状态变为6 -* 2) 当count为0时, 可以关闭DS -*/ -HGEXPORT HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count); - -/* 停止所有传输 -* 参数: -* 1) ds: in, DS句柄 -* 说明: -* 1) 执行此函数后,TWAIN状态变为5 -* 2) 可以关闭DS -*/ -HGEXPORT HGResult HGAPI HGTwain_Reset(HGTwainDS ds); - #endif /* __HGTWAIN_H__ */ \ No newline at end of file diff --git a/modules/twain_user/HGTwainImpl.cpp b/modules/twain_user/HGTwainImpl.cpp index d57261ce..a00de4b1 100644 --- a/modules/twain_user/HGTwainImpl.cpp +++ b/modules/twain_user/HGTwainImpl.cpp @@ -8,22 +8,36 @@ HGTwainDSMImpl::HGTwainDSMImpl() { m_hDll = NULL; m_pDSMProc = NULL; - GetIdentity(); + + m_AppId.Id = 0; // Initialize to 0 (Source Manager will assign real value) + m_AppId.Version.MajorNum = 3; //Your app's version number + m_AppId.Version.MinorNum = 8; + m_AppId.Version.Language = TWLG_USA; + m_AppId.Version.Country = TWCY_USA; + strcpy(m_AppId.Version.Info, "3.8"); + m_AppId.ProtocolMajor = TWON_PROTOCOLMAJOR; + m_AppId.ProtocolMinor = TWON_PROTOCOLMINOR; + m_AppId.SupportedGroups = DG_IMAGE | DG_CONTROL; + strcpy(m_AppId.Manufacturer, "MICSS"); + strcpy(m_AppId.ProductFamily, "Generic"); + strcpy(m_AppId.ProductName, "MyTwain"); + m_hWnd = NULL; m_oldWndProc = NULL; - m_DSMOpen = HGFALSE; } HGTwainDSMImpl::~HGTwainDSMImpl() { - UnloadDSM(); + } -HGResult HGTwainDSMImpl::LoadDSM() +HGResult HGTwainDSMImpl::Create(HWND hwnd) { - if (NULL != m_pDSMProc) + assert(NULL == m_oldWndProc); + + if (NULL == hwnd) { - return HGBASE_ERR_FAIL; + return HGBASE_ERR_INVALIDARG; } assert(NULL == m_hDll); @@ -33,6 +47,7 @@ HGResult HGTwainDSMImpl::LoadDSM() return HGBASE_ERR_FAIL; } + assert(NULL == m_pDSMProc); HGBase_GetDllProcAddress(m_hDll, MAKEINTRESOURCEA(1), (HGPointer*)&m_pDSMProc); if (NULL == m_pDSMProc) { @@ -41,81 +56,30 @@ HGResult HGTwainDSMImpl::LoadDSM() return HGBASE_ERR_FAIL; } - return HGBASE_ERR_OK; -} - -HGResult HGTwainDSMImpl::UnloadDSM() -{ - if (NULL == m_pDSMProc) - { - return HGBASE_ERR_FAIL; - } - - // 先必须关闭DSM - CloseDSM(); - - m_pDSMProc = NULL; - HGBase_DestroyDll(m_hDll); - m_hDll = NULL; - return HGBASE_ERR_OK; -} - -HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd) -{ - if (NULL == m_pDSMProc || m_DSMOpen) - { - return HGBASE_ERR_FAIL; - } - - if (NULL == hwnd) - { - return HGBASE_ERR_INVALIDARG; - } - USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hwnd); if (TWRC_SUCCESS != ret) { - return HGBASE_ERR_FAIL; + m_pDSMProc = NULL; + HGBase_DestroyDll(m_hDll); + m_hDll = NULL; + return HGTWAIN_ERR_FAIL; } m_hWnd = hwnd; m_mapWnd[m_hWnd] = this; m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc); - m_DSMOpen = HGTRUE; - - // 获取DS列表 - TW_IDENTITY ds; - ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds); - if (TWRC_SUCCESS == ret) - { - HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds); - m_vpDSImpl.push_back(dsImpl); - - while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds)) - { - HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds); - m_vpDSImpl.push_back(dsImpl); - } - } - return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::CloseDSM() +HGResult HGTwainDSMImpl::Destroy() { - if (!m_DSMOpen) + assert(NULL != m_oldWndProc); + + if (!m_listDSImpl.empty()) { return HGBASE_ERR_FAIL; } - // 先必须关闭DS - for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) - { - m_vpDSImpl[i]->Close(); - delete m_vpDSImpl[i]; - } - m_vpDSImpl.clear(); - m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd); SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc); m_oldWndProc = NULL; @@ -129,117 +93,160 @@ HGResult HGTwainDSMImpl::CloseDSM() } } m_hWnd = NULL; - m_DSMOpen = HGFALSE; + + m_pDSMProc = NULL; + HGBase_DestroyDll(m_hDll); + m_hDll = NULL; return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size) +HGResult HGTwainDSMImpl::GetDSCount(HGUInt* count) { - if (!m_DSMOpen) - { - return HGBASE_ERR_FAIL; - } - - if (NULL == dsImpl || NULL == size || 0 == *size) + if (NULL == count) { return HGBASE_ERR_INVALIDARG; } - HGUInt count = 0; - for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) + HGUInt num = 0; + TW_IDENTITY ds; + if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds)) { - dsImpl[i] = m_vpDSImpl[i]; - ++count; - - if (count >= *size) + ++num; + while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds)) { + ++num; + } + } + + *count = num; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSMImpl::GetDSName(HGUInt index, HGChar* name, HGUInt maxLen) +{ + if (NULL == name || 0 == maxLen) + { + return HGBASE_ERR_INVALIDARG; + } + + std::vector vds; + TW_IDENTITY ds; + if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds)) + { + vds.push_back(ds); + while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds)) + { + vds.push_back(ds); + } + } + + if (index >= (HGUInt)vds.size()) + return HGBASE_ERR_INVALIDARG; + + if (maxLen < strlen(vds[index].ProductName) + 1) + return HGBASE_ERR_FAIL; + strcpy(name, vds[index].ProductName); + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSMImpl::OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl) +{ + if (NULL == dsImpl) + { + return HGBASE_ERR_INVALIDARG; + } + + std::vector vds; + TW_IDENTITY ds; + if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds)) + { + vds.push_back(ds); + while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds)) + { + vds.push_back(ds); + } + } + + if (index >= (HGUInt)vds.size()) + return HGBASE_ERR_INVALIDARG; + + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); + HGResult ret = newDSImpl->Open(&vds[index]); + if (HGBASE_ERR_OK != ret) + { + delete newDSImpl; + return ret; + } + + m_listDSImpl.push_back(newDSImpl); + *dsImpl = newDSImpl; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSMImpl::OpenDefaultDS(class HGTwainDSImpl** dsImpl) +{ + if (NULL == dsImpl) + { + return HGBASE_ERR_INVALIDARG; + } + + TW_IDENTITY defDS; + if (TWRC_SUCCESS != m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &defDS)) + { + return HGTWAIN_ERR_FAIL; + } + + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); + HGResult ret = newDSImpl->Open(&defDS); + if (HGBASE_ERR_OK != ret) + { + delete newDSImpl; + return ret; + } + + m_listDSImpl.push_back(newDSImpl); + *dsImpl = newDSImpl; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSMImpl::OpenSelectedDS(class HGTwainDSImpl** dsImpl) +{ + if (NULL == dsImpl) + { + return HGBASE_ERR_INVALIDARG; + } + + TW_IDENTITY selectDS; + if (TWRC_SUCCESS != m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &selectDS)) + { + return HGTWAIN_ERR_FAIL; + } + + class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this); + HGResult ret = newDSImpl->Open(&selectDS); + if (HGBASE_ERR_OK != ret) + { + delete newDSImpl; + return ret; + } + + m_listDSImpl.push_back(newDSImpl); + *dsImpl = newDSImpl; + return HGBASE_ERR_OK; +} + +void HGTwainDSMImpl::RemoveDS(class HGTwainDSImpl* dsImpl) +{ + std::vector::iterator iter; + for (iter = m_listDSImpl.begin(); iter != m_listDSImpl.end(); ++iter) + { + if (*iter == dsImpl) + { + m_listDSImpl.erase(iter); + delete dsImpl; break; } } - - *size = count; - return HGBASE_ERR_OK; -} - -HGResult HGTwainDSMImpl::GetDefaultDS(class HGTwainDSImpl** dsImpl) -{ - if (!m_DSMOpen) - { - return HGBASE_ERR_FAIL; - } - - if (NULL == dsImpl) - { - return HGBASE_ERR_INVALIDARG; - } - - assert(NULL != m_pDSMProc); - TW_IDENTITY defDS; - USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &defDS); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) - { - if (0 == memcmp(&defDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY))) - { - *dsImpl = m_vpDSImpl[i]; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::SelectDS(class HGTwainDSImpl** dsImpl) -{ - if (!m_DSMOpen) - { - return HGBASE_ERR_FAIL; - } - - if (NULL == dsImpl) - { - return HGBASE_ERR_INVALIDARG; - } - - assert(NULL != m_pDSMProc); - TW_IDENTITY selectDS; - USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &selectDS); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) - { - if (0 == memcmp(&selectDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY))) - { - *dsImpl = m_vpDSImpl[i]; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -void HGTwainDSMImpl::GetIdentity() -{ - m_AppId.Id = 0; // Initialize to 0 (Source Manager - // will assign real value) - m_AppId.Version.MajorNum = 3; //Your app's version number - m_AppId.Version.MinorNum = 8; - m_AppId.Version.Language = TWLG_USA; - m_AppId.Version.Country = TWCY_USA; - strcpy(m_AppId.Version.Info, "3.8"); - m_AppId.ProtocolMajor = TWON_PROTOCOLMAJOR; - m_AppId.ProtocolMinor = TWON_PROTOCOLMINOR; - m_AppId.SupportedGroups = DG_IMAGE | DG_CONTROL; - strcpy(m_AppId.Manufacturer, "MICSS"); - strcpy(m_AppId.ProductFamily, "Generic"); - strcpy(m_AppId.ProductName, "MyTwain"); } LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) @@ -253,36 +260,45 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, msg2.wParam = wParam; msg2.lParam = lParam; - for (int i = 0; i < (int)p->m_vpDSImpl.size(); ++i) + for (int i = 0; i < (int)p->m_listDSImpl.size(); ++i) { - if (p->m_vpDSImpl[i]->m_enable) + if (p->m_listDSImpl[i]->m_enable) { TW_EVENT twEvent; twEvent.pEvent = (TW_MEMREF)&msg2; twEvent.TWMessage = MSG_NULL; - USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_vpDSImpl[i]->m_iden, DG_CONTROL, DAT_EVENT, + USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_listDSImpl[i]->m_iden, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, (TW_MEMREF)&twEvent); if (TWRC_DSEVENT == ret) { - HGUInt event = HGTWAIN_DSEVENT_UNKNOWN; if (MSG_XFERREADY == twEvent.TWMessage) { - HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_XFERREADY"); - event = HGTWAIN_DSEVENT_XFERREADY; + while (1) + { + HGImage image = NULL; + p->m_listDSImpl[i]->ImageNativeXfer(0, 0, &image); + if (NULL != image) + { + if (NULL != p->m_listDSImpl[i]->m_imageFunc) + p->m_listDSImpl[i]->m_imageFunc((HGTwainDS)p->m_listDSImpl[i], image, p->m_listDSImpl[i]->m_imageParam); + HGBase_DestroyImage(image); + } + + HGUInt count = 0; + p->m_listDSImpl[i]->EndXfer(&count); + if (0 == count) + { + break; + } + } + + p->m_listDSImpl[i]->Reset(); } - else if (MSG_CLOSEDSREQ == twEvent.TWMessage) + else if (MSG_CLOSEDSREQ == twEvent.TWMessage/* || MSG_CLOSEDSOK == twEvent.TWMessage*/) { - HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSREQ"); - event = HGTWAIN_DSEVENT_CLOSEDSREQ; + if (NULL != p->m_listDSImpl[i]->m_eventFunc) + p->m_listDSImpl[i]->m_eventFunc((HGTwainDS)p->m_listDSImpl[i], HGBASE_ERR_OK, NULL, p->m_listDSImpl[i]->m_eventParam); } - else if (MSG_CLOSEDSOK == twEvent.TWMessage) - { - HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSOK"); - event = HGTWAIN_DSEVENT_CLOSEDSOK; - } - - if (NULL != p->m_vpDSImpl[i]->m_eventFunc) - p->m_vpDSImpl[i]->m_eventFunc((HGTwainDS)p->m_vpDSImpl[i], event, p->m_vpDSImpl[i]->m_eventParam); } } } @@ -291,15 +307,17 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, } -HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY* iden) +HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl) { m_dsmImpl = dsmImpl; - memcpy(&m_iden, iden, sizeof(TW_IDENTITY)); + memset(&m_iden, 0, sizeof(TW_IDENTITY)); m_open = HGFALSE; m_showUI = HGFALSE; m_parent = NULL; m_eventFunc = NULL; m_eventParam = NULL; + m_imageFunc = NULL; + m_imageParam = NULL; m_enable = HGFALSE; } @@ -308,136 +326,35 @@ HGTwainDSImpl::~HGTwainDSImpl() } -HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen) +HGResult HGTwainDSImpl::Open(const TW_IDENTITY* iden) { - strcpy_s(name, maxLen, m_iden.ProductName); - return HGBASE_ERR_OK; -} - -HGResult HGTwainDSImpl::Open() -{ - if (m_open) - { - return HGBASE_ERR_FAIL; - } + assert(!m_open); USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden); if (TWRC_SUCCESS != ret) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } + memcpy(&m_iden, iden, sizeof(TW_IDENTITY)); m_open = HGTRUE; return HGBASE_ERR_OK; } HGResult HGTwainDSImpl::Close() { - if (!m_open) - { - return HGBASE_ERR_FAIL; - } + assert(m_open); Disable(); m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden); - m_open = HGFALSE; + m_dsmImpl->RemoveDS(this); return HGBASE_ERR_OK; } -HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value) +HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam) { - if (!m_open) - { - return HGBASE_ERR_FAIL; - } - - TW_UINT16 cap2 = 0; - if (HGTWAIN_DSCAP_DUPLEX == cap) - cap2 = CAP_DUPLEX; - else if (HGTWAIN_DSCAP_DUPLEXENABLED == cap) - cap2 = CAP_DUPLEXENABLED; - else if (HGTWAIN_DSCAP_XFERCOUNT == cap) - cap2 = CAP_XFERCOUNT; - if (0 == cap2) - { - return HGBASE_ERR_FAIL; - } - - TW_CAPABILITY twCap; - twCap.Cap = (TW_UINT16)cap2; - twCap.ConType = TWON_ONEVALUE; - twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE)); - if (NULL == twCap.hContainer) - { - return HGBASE_ERR_FAIL; - } - - pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer); - assert(NULL != pVal); - pVal->ItemType = TWTY_INT32; - pVal->Item = (TW_UINT32)value; - GlobalUnlock(twCap.hContainer); - - USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCap); - if (TWRC_SUCCESS != ret) - { - GlobalFree(twCap.hContainer); - return HGBASE_ERR_FAIL; - } - - GlobalFree(twCap.hContainer); - return HGBASE_ERR_OK; -} - -HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value) -{ - if (!m_open) - { - return HGBASE_ERR_FAIL; - } - - if (NULL == value) - { - return HGBASE_ERR_INVALIDARG; - } - - TW_UINT16 cap2 = 0; - if (HGTWAIN_DSCAP_DUPLEX == cap) - cap2 = CAP_DUPLEX; - else if (HGTWAIN_DSCAP_DUPLEXENABLED == cap) - cap2 = CAP_DUPLEXENABLED; - else if (HGTWAIN_DSCAP_XFERCOUNT == cap) - cap2 = CAP_XFERCOUNT; - if (0 == cap2) - { - return HGBASE_ERR_FAIL; - } - - TW_CAPABILITY twCap; - twCap.Cap = (TW_UINT16)cap2; - twCap.ConType = TWON_ONEVALUE; - twCap.hContainer = NULL; - - USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCap); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - assert(NULL != twCap.hContainer); - pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer); - assert(NULL != pVal); - *value = pVal->Item; - GlobalUnlock(twCap.hContainer); - - GlobalFree(twCap.hContainer); - return HGBASE_ERR_OK; -} - -HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) -{ - if (!m_open || m_enable) + if (m_enable) { return HGBASE_ERR_FAIL; } @@ -448,20 +365,23 @@ HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc f USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDSUIONLY, (TW_MEMREF)&twUI); if (TWRC_SUCCESS != ret) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } m_showUI = showUI; m_parent = parent; - m_eventFunc = func; - m_eventParam = param; + m_eventFunc = eventFunc; + m_eventParam = eventParam; + m_imageFunc = NULL; + m_imageParam = NULL; m_enable = HGTRUE; return HGBASE_ERR_OK; } -HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) +HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam, + HGDSImageFunc imageFunc, HGPointer imageParam) { - if (!m_open || m_enable) + if (m_enable) { return HGBASE_ERR_FAIL; } @@ -472,13 +392,15 @@ HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, H USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, (TW_MEMREF)&twUI); if (TWRC_SUCCESS != ret) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } m_showUI = showUI; m_parent = parent; - m_eventFunc = func; - m_eventParam = param; + m_eventFunc = eventFunc; + m_eventParam = eventParam; + m_imageFunc = imageFunc; + m_imageParam = imageParam; m_enable = HGTRUE; return HGBASE_ERR_OK; } @@ -499,10 +421,68 @@ HGResult HGTwainDSImpl::Disable() m_parent = NULL; m_eventFunc = NULL; m_eventParam = NULL; + m_imageFunc = NULL; + m_imageParam = NULL; m_enable = HGFALSE; return HGBASE_ERR_OK; } +HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value) +{ + TW_CAPABILITY twCap; + twCap.Cap = (TW_UINT16)cap; + twCap.ConType = TWON_ONEVALUE; + twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE)); + if (NULL == twCap.hContainer) + { + return HGBASE_ERR_FAIL; + } + + pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer); + assert(NULL != pVal); + pVal->ItemType = TWTY_INT32; + pVal->Item = (TW_UINT32)value; + GlobalUnlock(twCap.hContainer); + + USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCap); + if (TWRC_SUCCESS != ret) + { + GlobalFree(twCap.hContainer); + return HGTWAIN_ERR_FAIL; + } + + GlobalFree(twCap.hContainer); + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value) +{ + if (NULL == value) + { + return HGBASE_ERR_INVALIDARG; + } + + TW_CAPABILITY twCap; + twCap.Cap = (TW_UINT16)cap; + twCap.ConType = TWON_ONEVALUE; + twCap.hContainer = NULL; + + USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCap); + if (TWRC_SUCCESS != ret) + { + return HGTWAIN_ERR_FAIL; + } + + assert(NULL != twCap.hContainer); + pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer); + assert(NULL != pVal); + *value = pVal->Item; + GlobalUnlock(twCap.hContainer); + + GlobalFree(twCap.hContainer); + return HGBASE_ERR_OK; +} + HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image) { if (!m_enable) @@ -518,13 +498,13 @@ HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* ima TW_IMAGEINFO info; if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, (TW_MEMREF)&info)) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } HANDLE hMem = NULL; if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem)) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image); @@ -548,7 +528,7 @@ HGResult HGTwainDSImpl::EndXfer(HGUInt* count) USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, (TW_MEMREF)&twPend); if (TWRC_SUCCESS != ret) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } *count = twPend.Count; @@ -566,7 +546,7 @@ HGResult HGTwainDSImpl::Reset() USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, (TW_MEMREF)&twPend); if (TWRC_SUCCESS != ret) { - return HGBASE_ERR_FAIL; + return HGTWAIN_ERR_FAIL; } return HGBASE_ERR_OK; diff --git a/modules/twain_user/HGTwainImpl.hpp b/modules/twain_user/HGTwainImpl.hpp index fcdab893..b59d4064 100644 --- a/modules/twain_user/HGTwainImpl.hpp +++ b/modules/twain_user/HGTwainImpl.hpp @@ -14,16 +14,16 @@ public: HGTwainDSMImpl(); ~HGTwainDSMImpl(); - HGResult LoadDSM(); - HGResult UnloadDSM(); - HGResult OpenDSM(HWND hwnd); - HGResult CloseDSM(); - HGResult GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size); - HGResult GetDefaultDS(class HGTwainDSImpl** dsImpl); - HGResult SelectDS(class HGTwainDSImpl** dsImpl); + HGResult Create(HWND hwnd); + 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); private: - void GetIdentity(); + void RemoveDS(class HGTwainDSImpl* dsImpl); static LRESULT CALLBACK NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); private: @@ -33,26 +33,27 @@ private: HWND m_hWnd; static std::map m_mapWnd; WNDPROC m_oldWndProc; - HGBool m_DSMOpen; - std::vector m_vpDSImpl; + std::vector m_listDSImpl; }; class HGTwainDSImpl { friend class HGTwainDSMImpl; public: - HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY *iden); + HGTwainDSImpl(HGTwainDSMImpl* dsmImpl); ~HGTwainDSImpl(); public: - HGResult GetName(HGChar* name, HGUInt maxLen); - HGResult Open(); + HGResult Open(const TW_IDENTITY* iden); HGResult Close(); + HGResult EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam); + HGResult Enable(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam, + HGDSImageFunc imageFunc, HGPointer imageParam); + HGResult Disable(); + +private: HGResult SetCap(HGUInt cap, HGInt value); HGResult GetCap(HGUInt cap, HGInt* value); - HGResult EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param); - HGResult Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param); - HGResult Disable(); HGResult ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image); HGResult EndXfer(HGUInt* count); HGResult Reset(); @@ -65,6 +66,8 @@ private: HWND m_parent; HGDSEventFunc m_eventFunc; HGPointer m_eventParam; + HGDSImageFunc m_imageFunc; + HGPointer m_imageParam; HGBool m_enable; };