diff --git a/build/windows/HGTest/HGTestDlg.cpp b/build/windows/HGTest/HGTestDlg.cpp index 7fa5a21a..90e5934e 100644 --- a/build/windows/HGTest/HGTestDlg.cpp +++ b/build/windows/HGTest/HGTestDlg.cpp @@ -130,7 +130,7 @@ BOOL CHGTestDlg::OnInitDialog() HGSane_CreateManager("sane.dll", &m_saneMgr); #else HGTwain_LoadDSM(&m_dsm); - HGTwain_OpenDSM(m_dsm, m_hWnd, DSEventCallback, this); + HGTwain_OpenDSM(m_dsm, m_hWnd); #endif return TRUE; // 除非将焦点设置到控件,否则返回 TRUE @@ -195,7 +195,7 @@ void CHGTestDlg::OnBnClickedButton1() HGChar errInfo[256]; HGSane_OpenDevice(m_saneMgr, 0, &m_saneDev, errInfo, 256); - HGResult ret = HGSane_StartDevice(m_saneDev, SaneDeviceEventCallback, this, SaneDeviceImageCallback, this, errInfo, 256); + HGResult ret = HGSane_StartDevice(m_saneDev, DeviceEventCallback, this, DeviceImageCallback, this, errInfo, 256); if (HGBASE_ERR_OK != ret) { HGSane_CloseDevice(m_saneDev); @@ -211,7 +211,7 @@ void CHGTestDlg::OnBnClickedButton1() if (NULL != m_ds) { HGTwain_OpenDS(m_ds); - HGTwain_EnableDS(m_ds, HGTRUE, NULL); + HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this); } #endif } @@ -229,12 +229,12 @@ void CHGTestDlg::OnBnClickedButton2() } #ifdef USE_SANE -void HGAPI CHGTestDlg::SaneDeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param) +void HGAPI CHGTestDlg::DeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param) { CHGTestDlg* p = (CHGTestDlg*)param; ::PostMessage(p->m_hWnd, 2000, 0, 0); } -void HGAPI CHGTestDlg::SaneDeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param) +void HGAPI CHGTestDlg::DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param) { CHGTestDlg* p = (CHGTestDlg*)param; @@ -248,29 +248,21 @@ void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param) CHGTestDlg* p = (CHGTestDlg*)param; if (HGTWAIN_DSEVENT_XFERREADY == event) { - ULONG idx = 0; - - HGImage image = NULL; - HGTwain_ImageNativeXfer(p->m_ds, 0, HGBASE_IMGORIGIN_TOP, &image); - CStringA strName; - strName.Format("D:\\Twain_%u.bmp", idx); - HGImgFmt_SaveImage(image, 0, NULL, strName); - HGBase_DestroyImage(image); - - HGUInt count = 0; - HGTwain_EndXfer(p->m_ds, &count); - while (count != 0) + while (1) { - ++idx; - HGImage image = NULL; - HGTwain_ImageNativeXfer(p->m_ds, 0, HGBASE_IMGORIGIN_TOP, &image); + HGTwain_ImageNativeXfer(p->m_ds, 0, 0, &image); CStringA strName; - strName.Format("D:\\Twain_%u.bmp", idx); + 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); diff --git a/build/windows/HGTest/HGTestDlg.h b/build/windows/HGTest/HGTestDlg.h index 27d82c67..954ffe6a 100644 --- a/build/windows/HGTest/HGTestDlg.h +++ b/build/windows/HGTest/HGTestDlg.h @@ -25,8 +25,8 @@ protected: #ifdef USE_SANE HGSaneManager m_saneMgr; HGSaneDevice m_saneDev; - static void HGAPI SaneDeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param); - static void HGAPI SaneDeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param); + static void HGAPI DeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param); + static void HGAPI DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param); #else HGTwainDSM m_dsm; HGTwainDS m_ds; diff --git a/modules/base/HGImage.cpp b/modules/base/HGImage.cpp index 413725ee..a9814cbb 100644 --- a/modules/base/HGImage.cpp +++ b/modules/base/HGImage.cpp @@ -511,6 +511,11 @@ static HGResult LoadGdiImage(Gdiplus::Image* pImage, const HGImageRoi* roi, HGUI type = GetType(pImage); } + if (0 == origin) + { + origin = HGBASE_IMGORIGIN_TOP; + } + HGResult ret = HGBase_CreateImage(roi2.right - roi2.left, roi2.bottom - roi2.top, type, origin, image); if (HGBASE_ERR_OK != ret) { @@ -598,15 +603,17 @@ HGResult HGAPI HGBase_CreateImageFromDIB(HGLOBAL hMem, const HGImageRoi* roi, Gdiplus::GdiplusStartup(&nToken, &input, &output); assert(0 != nToken); - Gdiplus::Image img(pStream); - Gdiplus::Status status = img.GetLastStatus(); + Gdiplus::Image *img = new Gdiplus::Image(pStream); + Gdiplus::Status status = img->GetLastStatus(); if (Gdiplus::Ok == status) { - ret = LoadGdiImage(&img, roi, type, origin, image); + ret = LoadGdiImage(img, roi, type, origin, image); } + delete img; Gdiplus::GdiplusShutdown(nToken); nToken = 0; + pStream->Release(); } diff --git a/modules/sane_user/HGSane.cpp b/modules/sane_user/HGSane.cpp index 1a00a7da..59fe5d9e 100644 --- a/modules/sane_user/HGSane.cpp +++ b/modules/sane_user/HGSane.cpp @@ -101,8 +101,8 @@ HGResult HGAPI HGSane_GetDeviceHandle(HGSaneDevice dev, SANE_Handle* handle) return saneDeviceImpl->GetHandle(handle); } -HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, - HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen) +HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam, + HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen) { if (NULL == dev) { diff --git a/modules/sane_user/HGSane.h b/modules/sane_user/HGSane.h index 502332bc..33f3fbcc 100644 --- a/modules/sane_user/HGSane.h +++ b/modules/sane_user/HGSane.h @@ -12,8 +12,8 @@ HG_DECLARE_HANDLE(HGSaneDevice); /* Sane设备回调 */ -typedef void (HGAPI* HGSane_DeviceEventCallback)(HGSaneDevice dev, HGUInt error, const HGChar *errInfo, HGPointer param); -typedef void (HGAPI* HGSane_DeviceImageCallback)(HGSaneDevice dev, HGImage image, HGPointer param); +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); HGEXPORT HGResult HGAPI HGSane_CreateManager(const HGChar *sanePath, HGSaneManager* mgr); @@ -29,8 +29,8 @@ HGEXPORT HGResult HGAPI HGSane_CloseDevice(HGSaneDevice dev); HGEXPORT HGResult HGAPI HGSane_GetDeviceHandle(HGSaneDevice dev, SANE_Handle *handle); -HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, - HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); +HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam, + HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); HGEXPORT HGResult HGAPI HGSane_StopDevice(HGSaneDevice dev); diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index c2f6c5a6..87dc74f0 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -234,9 +234,9 @@ void HGSaneManagerImpl::RemoveDevice(class HGSaneDeviceImpl* deviceImpl) } -HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneManagerImpl* mgr) +HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl) { - m_mgrImpl = mgr; + m_mgrImpl = mgrImpl; m_devHandle = NULL; m_buffer = NULL; m_bufferSize = 0; @@ -312,8 +312,8 @@ HGResult HGSaneDeviceImpl::GetHandle(SANE_Handle* handle) return HGBASE_ERR_OK; } -HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, - HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen) +HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam, + HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen) { if (NULL != m_thread) { diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index d94e3640..2be2e289 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -63,14 +63,14 @@ private: class HGSaneDeviceImpl { public: - HGSaneDeviceImpl(HGSaneManagerImpl* mgr); + HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl); ~HGSaneDeviceImpl(); HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen); HGResult Close(); HGResult GetHandle(SANE_Handle* handle); - HGResult Start(HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, - HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); + HGResult Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam, + HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); HGResult Stop(); private: @@ -78,14 +78,14 @@ private: static void HGAPI ThreadFunc(HGThread thread, HGPointer param); private: - class HGSaneManagerImpl* m_mgrImpl; + HGSaneManagerImpl* m_mgrImpl; SANE_Handle m_devHandle; HGByte* m_buffer; HGInt m_bufferSize; HGUInt m_dpi; - HGSane_DeviceEventCallback m_eventFunc; + HGSane_DeviceEventFunc m_eventFunc; HGPointer m_eventParam; - HGSane_DeviceImageCallback m_imageFunc; + HGSane_DeviceImageFunc m_imageFunc; HGPointer m_imageParam; volatile HGBool m_stopThread; HGThread m_thread; diff --git a/modules/twain_user/HGTwain.cpp b/modules/twain_user/HGTwain.cpp index 94e3be9e..a4f5b3e4 100644 --- a/modules/twain_user/HGTwain.cpp +++ b/modules/twain_user/HGTwain.cpp @@ -38,7 +38,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm) return HGBASE_ERR_OK; } -HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HGPointer param) +HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd) { if (NULL == dsm) { @@ -46,7 +46,7 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HG } HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; - return twainDSMImpl->OpenDSM(hwnd, func, param); + return twainDSMImpl->OpenDSM(hwnd); } HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm) @@ -101,7 +101,7 @@ HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->GetDSName(twainDSImpl, name, maxLen); + return twainDSImpl->GetName(name, maxLen); } HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds) @@ -112,7 +112,7 @@ HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->OpenDS(twainDSImpl); + return twainDSImpl->Open(); } HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) @@ -123,7 +123,7 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->CloseDS(twainDSImpl); + return twainDSImpl->Close(); } HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value) @@ -134,7 +134,7 @@ HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->SetCapability(twainDSImpl, cap, value); + return twainDSImpl->SetCap(cap, value); } HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value) @@ -145,10 +145,10 @@ HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->GetCapability(twainDSImpl, cap, value); + return twainDSImpl->GetCap(cap, value); } -HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent) +HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) { if (NULL == ds) { @@ -156,10 +156,10 @@ HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->EnableDSUIOnly(twainDSImpl, showUI, parent); + return twainDSImpl->EnableUIOnly(showUI, parent, func, param); } -HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent) +HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) { if (NULL == ds) { @@ -167,7 +167,7 @@ HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->EnableDS(twainDSImpl, showUI, parent); + return twainDSImpl->Enable(showUI, parent, func, param); } HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) @@ -178,7 +178,7 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->DisableDS(twainDSImpl); + return twainDSImpl->Disable(); } HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage* image) @@ -189,7 +189,7 @@ HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->ImageNativeXfer(twainDSImpl, type, origin, image); + return twainDSImpl->ImageNativeXfer(type, origin, image); } HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count) @@ -200,7 +200,7 @@ HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->EndXfer(twainDSImpl, count); + return twainDSImpl->EndXfer(count); } HGResult HGAPI HGTwain_Reset(HGTwainDS ds) @@ -211,5 +211,5 @@ HGResult HGAPI HGTwain_Reset(HGTwainDS ds) } HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; - return twainDSImpl->dsmImpl->Reset(twainDSImpl); + return twainDSImpl->Reset(); } \ No newline at end of file diff --git a/modules/twain_user/HGTwain.h b/modules/twain_user/HGTwain.h index 94e04a35..b9b1e42d 100644 --- a/modules/twain_user/HGTwain.h +++ b/modules/twain_user/HGTwain.h @@ -54,7 +54,7 @@ HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm); * 1) 执行此函数后,TWAIN状态从2变为3 * 2) 调用该函数的线程需要有消息循环 */ -HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HGPointer param); +HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd); /* 关闭DSM * 参数: @@ -150,7 +150,7 @@ HGEXPORT HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* v * 说明: * 1) 执行此函数后,TWAIN状态从4变为5 */ -HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent); +HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param); /* 启动DS * 参数: @@ -162,7 +162,7 @@ HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND * 说明: * 1) 执行此函数后,TWAIN状态从4变为5 */ -HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent); +HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param); /* 停止DS * 参数: diff --git a/modules/twain_user/HGTwainImpl.cpp b/modules/twain_user/HGTwainImpl.cpp index 54c961ec..d57261ce 100644 --- a/modules/twain_user/HGTwainImpl.cpp +++ b/modules/twain_user/HGTwainImpl.cpp @@ -1,5 +1,6 @@ #include "HGTwainImpl.hpp" #include "../base/HGInc.h" +#include "../base/HGInfo.h" std::map HGTwainDSMImpl::m_mapWnd; @@ -10,8 +11,6 @@ HGTwainDSMImpl::HGTwainDSMImpl() GetIdentity(); m_hWnd = NULL; m_oldWndProc = NULL; - m_dsEventFunc = NULL; - m_dsEventParam = NULL; m_DSMOpen = HGFALSE; } @@ -61,13 +60,18 @@ HGResult HGTwainDSMImpl::UnloadDSM() return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param) +HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd) { - if (NULL == m_pDSMProc || m_DSMOpen || NULL == hwnd || NULL == func) + 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) { @@ -77,8 +81,6 @@ HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param) m_hWnd = hwnd; m_mapWnd[m_hWnd] = this; m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc); - m_dsEventFunc = func; - m_dsEventParam = param; m_DSMOpen = HGTRUE; // 获取DS列表 @@ -86,15 +88,13 @@ HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param) ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds); if (TWRC_SUCCESS == ret) { - HGTwainDSImpl dsImpl(this); - memcpy(&dsImpl.ds, &ds, sizeof(TW_IDENTITY)); - m_DSList.push_back(dsImpl); + 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(this); - memcpy(&dsImpl.ds, &ds, sizeof(TW_IDENTITY)); - m_DSList.push_back(dsImpl); + HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds); + m_vpDSImpl.push_back(dsImpl); } } @@ -109,13 +109,12 @@ HGResult HGTwainDSMImpl::CloseDSM() } // 先必须关闭DS - for (int i = 0; i < (int)m_DSList.size(); ++i) + for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) { - CloseDS(&m_DSList[i]); + m_vpDSImpl[i]->Close(); + delete m_vpDSImpl[i]; } - - // 清理DS列表 - m_DSList.clear(); + 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); @@ -130,28 +129,26 @@ HGResult HGTwainDSMImpl::CloseDSM() } } m_hWnd = NULL; - m_dsEventFunc = NULL; - m_dsEventParam = NULL; m_DSMOpen = HGFALSE; return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::GetDSList(HGTwainDSImpl** ds, HGUInt* size) +HGResult HGTwainDSMImpl::GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size) { - if (NULL == ds || NULL == size || 0 == *size) - { - return HGBASE_ERR_INVALIDARG; - } - if (!m_DSMOpen) { return HGBASE_ERR_FAIL; } - HGUInt count = 0; - for (int i = 0; i < (int)m_DSList.size(); ++i) + if (NULL == dsImpl || NULL == size || 0 == *size) { - ds[i] = &m_DSList[i]; + return HGBASE_ERR_INVALIDARG; + } + + HGUInt count = 0; + for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) + { + dsImpl[i] = m_vpDSImpl[i]; ++count; if (count >= *size) @@ -164,18 +161,18 @@ HGResult HGTwainDSMImpl::GetDSList(HGTwainDSImpl** ds, HGUInt* size) return HGBASE_ERR_OK; } -HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds) +HGResult HGTwainDSMImpl::GetDefaultDS(class HGTwainDSImpl** dsImpl) { - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - 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); @@ -184,11 +181,11 @@ HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds) return HGBASE_ERR_FAIL; } - for (int i = 0; i < (int)m_DSList.size(); ++i) + for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) { - if (0 == memcmp(&defDS, &m_DSList[i].ds, sizeof(TW_IDENTITY))) + if (0 == memcmp(&defDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY))) { - *ds = &m_DSList[i]; + *dsImpl = m_vpDSImpl[i]; return HGBASE_ERR_OK; } } @@ -196,18 +193,18 @@ HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds) return HGBASE_ERR_FAIL; } -HGResult HGTwainDSMImpl::SelectDS(HGTwainDSImpl** ds) +HGResult HGTwainDSMImpl::SelectDS(class HGTwainDSImpl** dsImpl) { - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - 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); @@ -216,407 +213,11 @@ HGResult HGTwainDSMImpl::SelectDS(HGTwainDSImpl** ds) return HGBASE_ERR_FAIL; } - for (int i = 0; i < (int)m_DSList.size(); ++i) + for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) { - if (0 == memcmp(&selectDS, &m_DSList[i].ds, sizeof(TW_IDENTITY))) + if (0 == memcmp(&selectDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY))) { - *ds = &m_DSList[i]; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::GetDSName(HGTwainDSImpl* ds, HGChar* name, HGUInt maxLen) -{ - if (NULL == ds || NULL == name || 0 == maxLen) - { - return HGBASE_ERR_INVALIDARG; - } - - if (!m_DSMOpen) - { - return HGBASE_ERR_FAIL; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - strcpy_s(name, maxLen, m_DSList[i].ds.ProductName); - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::OpenDS(HGTwainDSImpl* ds) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - if (!m_DSMOpen) - { - return HGBASE_ERR_FAIL; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (m_DSList[i].open) - { - return HGBASE_ERR_FAIL; - } - - USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_DSList[i].ds); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - m_DSList[i].open = HGTRUE; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::CloseDS(HGTwainDSImpl* ds) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].open) - { - return HGBASE_ERR_FAIL; - } - - DisableDS(ds); - m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_DSList[i].ds); - - m_DSList[i].open = HGFALSE; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::SetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt value) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].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_pDSMProc(&m_AppId, &m_DSList[i].ds, 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; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::GetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt* value) -{ - if (NULL == ds || NULL == value) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].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 = NULL; - - USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, 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; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].open || m_DSList[i].enable) - { - return HGBASE_ERR_FAIL; - } - - TW_USERINTERFACE twUI; - twUI.ShowUI = (TW_BOOL)showUI; - twUI.hParent = (TW_HANDLE)parent; - USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDSUIONLY, (TW_MEMREF)&twUI); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - m_DSList[i].showUI = showUI; - m_DSList[i].parent = parent; - m_DSList[i].enable = HGTRUE; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].open || m_DSList[i].enable) - { - return HGBASE_ERR_FAIL; - } - - TW_USERINTERFACE twUI; - twUI.ShowUI = (TW_BOOL)showUI; - twUI.hParent = (TW_HANDLE)parent; - USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, (TW_MEMREF)&twUI); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - m_DSList[i].showUI = showUI; - m_DSList[i].parent = parent; - m_DSList[i].enable = HGTRUE; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::DisableDS(HGTwainDSImpl* ds) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].enable) - { - return HGBASE_ERR_FAIL; - } - - TW_USERINTERFACE twUI; - twUI.ShowUI = (TW_BOOL)m_DSList[i].showUI; - twUI.hParent = (TW_HANDLE)m_DSList[i].parent; - m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &twUI); - - m_DSList[i].showUI = HGFALSE; - m_DSList[i].parent = NULL; - m_DSList[i].enable = HGFALSE; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::ImageNativeXfer(HGTwainDSImpl* ds, HGUInt type, HGUInt origin, HGImage* image) -{ - if (NULL == ds || NULL == image) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].enable) - { - return HGBASE_ERR_FAIL; - } - - TW_IMAGEINFO info; - if (TWRC_SUCCESS != m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, (TW_MEMREF)&info)) - { - return HGBASE_ERR_FAIL; - } - - HANDLE hMem = NULL; - if (TWRC_XFERDONE != m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem)) - { - return HGBASE_ERR_FAIL; - } - - HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image); - GlobalFree(hMem); - return ret; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::EndXfer(HGTwainDSImpl* ds, HGUInt* count) -{ - if (NULL == ds || NULL == count) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].enable) - { - return HGBASE_ERR_FAIL; - } - - TW_PENDINGXFERS twPend; - USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, (TW_MEMREF)&twPend); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - - *count = twPend.Count; - return HGBASE_ERR_OK; - } - } - - return HGBASE_ERR_FAIL; -} - -HGResult HGTwainDSMImpl::Reset(HGTwainDSImpl* ds) -{ - if (NULL == ds) - { - return HGBASE_ERR_INVALIDARG; - } - - for (int i = 0; i < (int)m_DSList.size(); ++i) - { - if (ds == &m_DSList[i]) - { - if (!m_DSList[i].enable) - { - return HGBASE_ERR_FAIL; - } - - TW_PENDINGXFERS twPend; - USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, (TW_MEMREF)&twPend); - if (TWRC_SUCCESS != ret) - { - return HGBASE_ERR_FAIL; - } - + *dsImpl = m_vpDSImpl[i]; return HGBASE_ERR_OK; } } @@ -652,29 +253,321 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, msg2.wParam = wParam; msg2.lParam = lParam; - for (int i = 0; i < (int)p->m_DSList.size(); ++i) + for (int i = 0; i < (int)p->m_vpDSImpl.size(); ++i) { - if (p->m_DSList[i].enable) + if (p->m_vpDSImpl[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_DSList[i].ds, DG_CONTROL, DAT_EVENT, + USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_vpDSImpl[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; + } else if (MSG_CLOSEDSREQ == twEvent.TWMessage) + { + HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSREQ"); event = HGTWAIN_DSEVENT_CLOSEDSREQ; + } else if (MSG_CLOSEDSOK == twEvent.TWMessage) + { + HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSOK"); event = HGTWAIN_DSEVENT_CLOSEDSOK; + } - p->m_dsEventFunc((HGTwainDS)&p->m_DSList[i], event, p->m_dsEventParam); + 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); } } } return CallWindowProcW(p->m_oldWndProc, hWnd, msg, wParam, lParam); +} + + +HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY* iden) +{ + m_dsmImpl = dsmImpl; + memcpy(&m_iden, iden, sizeof(TW_IDENTITY)); + m_open = HGFALSE; + m_showUI = HGFALSE; + m_parent = NULL; + m_eventFunc = NULL; + m_eventParam = NULL; + m_enable = HGFALSE; +} + +HGTwainDSImpl::~HGTwainDSImpl() +{ + +} + +HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen) +{ + strcpy_s(name, maxLen, m_iden.ProductName); + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::Open() +{ + if (m_open) + { + return HGBASE_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 HGBASE_ERR_FAIL; + } + + m_open = HGTRUE; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::Close() +{ + if (!m_open) + { + return HGBASE_ERR_FAIL; + } + + Disable(); + m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden); + + m_open = HGFALSE; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value) +{ + 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) + { + return HGBASE_ERR_FAIL; + } + + TW_USERINTERFACE twUI; + twUI.ShowUI = (TW_BOOL)showUI; + twUI.hParent = (TW_HANDLE)parent; + 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; + } + + m_showUI = showUI; + m_parent = parent; + m_eventFunc = func; + m_eventParam = param; + m_enable = HGTRUE; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) +{ + if (!m_open || m_enable) + { + return HGBASE_ERR_FAIL; + } + + TW_USERINTERFACE twUI; + twUI.ShowUI = (TW_BOOL)showUI; + twUI.hParent = (TW_HANDLE)parent; + 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; + } + + m_showUI = showUI; + m_parent = parent; + m_eventFunc = func; + m_eventParam = param; + m_enable = HGTRUE; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::Disable() +{ + if (!m_enable) + { + return HGBASE_ERR_FAIL; + } + + TW_USERINTERFACE twUI; + twUI.ShowUI = (TW_BOOL)m_showUI; + twUI.hParent = (TW_HANDLE)m_parent; + m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &twUI); + + m_showUI = HGFALSE; + m_parent = NULL; + m_eventFunc = NULL; + m_eventParam = NULL; + m_enable = HGFALSE; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image) +{ + if (!m_enable) + { + return HGBASE_ERR_FAIL; + } + + if (NULL == image) + { + return HGBASE_ERR_INVALIDARG; + } + + 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; + } + + 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; + } + + HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image); + GlobalFree(hMem); + return ret; +} + +HGResult HGTwainDSImpl::EndXfer(HGUInt* count) +{ + if (!m_enable) + { + return HGBASE_ERR_FAIL; + } + + if (NULL == count) + { + return HGBASE_ERR_INVALIDARG; + } + + TW_PENDINGXFERS twPend; + 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; + } + + *count = twPend.Count; + return HGBASE_ERR_OK; +} + +HGResult HGTwainDSImpl::Reset() +{ + if (!m_enable) + { + return HGBASE_ERR_FAIL; + } + + TW_PENDINGXFERS twPend; + 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 HGBASE_ERR_OK; } \ No newline at end of file diff --git a/modules/twain_user/HGTwainImpl.hpp b/modules/twain_user/HGTwainImpl.hpp index 58143c3e..fcdab893 100644 --- a/modules/twain_user/HGTwainImpl.hpp +++ b/modules/twain_user/HGTwainImpl.hpp @@ -7,52 +7,20 @@ #include #include -struct HGTwainDSImpl -{ - HGTwainDSImpl(class HGTwainDSMImpl *dsm) - { - dsmImpl = dsm; - memset(&ds, 0, sizeof(TW_IDENTITY)); - open = HGFALSE; - showUI = HGFALSE; - parent = NULL; - enable = HGFALSE; - } - - class HGTwainDSMImpl* dsmImpl; - TW_IDENTITY ds; - HGBool open; - HGBool showUI; - HWND parent; - HGBool enable; -}; - class HGTwainDSMImpl { + friend class HGTwainDSImpl; public: HGTwainDSMImpl(); ~HGTwainDSMImpl(); HGResult LoadDSM(); HGResult UnloadDSM(); - HGResult OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param); + HGResult OpenDSM(HWND hwnd); HGResult CloseDSM(); - - HGResult GetDSList(HGTwainDSImpl** ds, HGUInt* size); - HGResult GetDefaultDS(HGTwainDSImpl** ds); - HGResult SelectDS(HGTwainDSImpl** ds); - HGResult GetDSName(HGTwainDSImpl* ds, HGChar* name, HGUInt maxLen); - HGResult OpenDS(HGTwainDSImpl* ds); - HGResult CloseDS(HGTwainDSImpl* ds); - HGResult SetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt value); - HGResult GetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt* value); - - HGResult EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent); - HGResult EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent); - HGResult DisableDS(HGTwainDSImpl* ds); - HGResult ImageNativeXfer(HGTwainDSImpl* ds, HGUInt type, HGUInt origin, HGImage* image); - HGResult EndXfer(HGTwainDSImpl* ds, HGUInt* count); - HGResult Reset(HGTwainDSImpl* ds); + HGResult GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size); + HGResult GetDefaultDS(class HGTwainDSImpl** dsImpl); + HGResult SelectDS(class HGTwainDSImpl** dsImpl); private: void GetIdentity(); @@ -65,10 +33,39 @@ private: HWND m_hWnd; static std::map m_mapWnd; WNDPROC m_oldWndProc; - HGDSEventFunc m_dsEventFunc; - HGPointer m_dsEventParam; HGBool m_DSMOpen; - std::vector m_DSList; + std::vector m_vpDSImpl; +}; + +class HGTwainDSImpl +{ + friend class HGTwainDSMImpl; +public: + HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY *iden); + ~HGTwainDSImpl(); + +public: + HGResult GetName(HGChar* name, HGUInt maxLen); + HGResult Open(); + HGResult Close(); + 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(); + +private: + HGTwainDSMImpl* m_dsmImpl; + TW_IDENTITY m_iden; + HGBool m_open; + HGBool m_showUI; + HWND m_parent; + HGDSEventFunc m_eventFunc; + HGPointer m_eventParam; + HGBool m_enable; }; #endif /* __HGTWAINIMPL_HPP__ */ \ No newline at end of file