twain_user类关系调整

This commit is contained in:
luoliangyi 2023-03-25 18:03:47 +08:00
parent ed7e7638ff
commit 42d3ef90ee
11 changed files with 435 additions and 546 deletions

View File

@ -130,7 +130,7 @@ BOOL CHGTestDlg::OnInitDialog()
HGSane_CreateManager("sane.dll", &m_saneMgr); HGSane_CreateManager("sane.dll", &m_saneMgr);
#else #else
HGTwain_LoadDSM(&m_dsm); HGTwain_LoadDSM(&m_dsm);
HGTwain_OpenDSM(m_dsm, m_hWnd, DSEventCallback, this); HGTwain_OpenDSM(m_dsm, m_hWnd);
#endif #endif
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
@ -195,7 +195,7 @@ void CHGTestDlg::OnBnClickedButton1()
HGChar errInfo[256]; HGChar errInfo[256];
HGSane_OpenDevice(m_saneMgr, 0, &m_saneDev, 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) if (HGBASE_ERR_OK != ret)
{ {
HGSane_CloseDevice(m_saneDev); HGSane_CloseDevice(m_saneDev);
@ -211,7 +211,7 @@ void CHGTestDlg::OnBnClickedButton1()
if (NULL != m_ds) if (NULL != m_ds)
{ {
HGTwain_OpenDS(m_ds); HGTwain_OpenDS(m_ds);
HGTwain_EnableDS(m_ds, HGTRUE, NULL); HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this);
} }
#endif #endif
} }
@ -229,12 +229,12 @@ void CHGTestDlg::OnBnClickedButton2()
} }
#ifdef USE_SANE #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; CHGTestDlg* p = (CHGTestDlg*)param;
::PostMessage(p->m_hWnd, 2000, 0, 0); ::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; CHGTestDlg* p = (CHGTestDlg*)param;
@ -248,29 +248,21 @@ void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param)
CHGTestDlg* p = (CHGTestDlg*)param; CHGTestDlg* p = (CHGTestDlg*)param;
if (HGTWAIN_DSEVENT_XFERREADY == event) if (HGTWAIN_DSEVENT_XFERREADY == event)
{ {
ULONG idx = 0; while (1)
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)
{ {
++idx;
HGImage image = NULL; HGImage image = NULL;
HGTwain_ImageNativeXfer(p->m_ds, 0, HGBASE_IMGORIGIN_TOP, &image); HGTwain_ImageNativeXfer(p->m_ds, 0, 0, &image);
CStringA strName; CStringA strName;
strName.Format("D:\\Twain_%u.bmp", idx); strName.Format("D:\\Twain_%u.jpg", p->m_idx++);
HGImgFmt_SaveImage(image, 0, NULL, strName); HGImgFmt_SaveImage(image, 0, NULL, strName);
HGBase_DestroyImage(image); HGBase_DestroyImage(image);
HGUInt count = 0;
HGTwain_EndXfer(p->m_ds, &count); HGTwain_EndXfer(p->m_ds, &count);
if (0 == count)
{
break;
}
} }
HGTwain_Reset(p->m_ds); HGTwain_Reset(p->m_ds);

View File

@ -25,8 +25,8 @@ protected:
#ifdef USE_SANE #ifdef USE_SANE
HGSaneManager m_saneMgr; HGSaneManager m_saneMgr;
HGSaneDevice m_saneDev; HGSaneDevice m_saneDev;
static void HGAPI SaneDeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param); static void HGAPI DeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param);
static void HGAPI SaneDeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param); static void HGAPI DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param);
#else #else
HGTwainDSM m_dsm; HGTwainDSM m_dsm;
HGTwainDS m_ds; HGTwainDS m_ds;

View File

@ -511,6 +511,11 @@ static HGResult LoadGdiImage(Gdiplus::Image* pImage, const HGImageRoi* roi, HGUI
type = GetType(pImage); 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); HGResult ret = HGBase_CreateImage(roi2.right - roi2.left, roi2.bottom - roi2.top, type, origin, image);
if (HGBASE_ERR_OK != ret) if (HGBASE_ERR_OK != ret)
{ {
@ -598,15 +603,17 @@ HGResult HGAPI HGBase_CreateImageFromDIB(HGLOBAL hMem, const HGImageRoi* roi,
Gdiplus::GdiplusStartup(&nToken, &input, &output); Gdiplus::GdiplusStartup(&nToken, &input, &output);
assert(0 != nToken); assert(0 != nToken);
Gdiplus::Image img(pStream); Gdiplus::Image *img = new Gdiplus::Image(pStream);
Gdiplus::Status status = img.GetLastStatus(); Gdiplus::Status status = img->GetLastStatus();
if (Gdiplus::Ok == status) if (Gdiplus::Ok == status)
{ {
ret = LoadGdiImage(&img, roi, type, origin, image); ret = LoadGdiImage(img, roi, type, origin, image);
} }
delete img;
Gdiplus::GdiplusShutdown(nToken); Gdiplus::GdiplusShutdown(nToken);
nToken = 0; nToken = 0;
pStream->Release(); pStream->Release();
} }

View File

@ -101,8 +101,8 @@ HGResult HGAPI HGSane_GetDeviceHandle(HGSaneDevice dev, SANE_Handle* handle)
return saneDeviceImpl->GetHandle(handle); return saneDeviceImpl->GetHandle(handle);
} }
HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen) HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen)
{ {
if (NULL == dev) if (NULL == dev)
{ {

View File

@ -12,8 +12,8 @@ HG_DECLARE_HANDLE(HGSaneDevice);
/* Sane设备回调 /* Sane设备回调
*/ */
typedef void (HGAPI* HGSane_DeviceEventCallback)(HGSaneDevice dev, HGUInt error, const HGChar *errInfo, HGPointer param); typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt error, const HGChar *errInfo, HGPointer param);
typedef void (HGAPI* HGSane_DeviceImageCallback)(HGSaneDevice dev, HGImage image, HGPointer param); typedef void (HGAPI* HGSane_DeviceImageFunc)(HGSaneDevice dev, HGImage image, HGPointer param);
HGEXPORT HGResult HGAPI HGSane_CreateManager(const HGChar *sanePath, HGSaneManager* mgr); 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_GetDeviceHandle(HGSaneDevice dev, SANE_Handle *handle);
HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
HGEXPORT HGResult HGAPI HGSane_StopDevice(HGSaneDevice dev); HGEXPORT HGResult HGAPI HGSane_StopDevice(HGSaneDevice dev);

View File

@ -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_devHandle = NULL;
m_buffer = NULL; m_buffer = NULL;
m_bufferSize = 0; m_bufferSize = 0;
@ -312,8 +312,8 @@ HGResult HGSaneDeviceImpl::GetHandle(SANE_Handle* handle)
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen) HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen)
{ {
if (NULL != m_thread) if (NULL != m_thread)
{ {

View File

@ -63,14 +63,14 @@ private:
class HGSaneDeviceImpl class HGSaneDeviceImpl
{ {
public: public:
HGSaneDeviceImpl(HGSaneManagerImpl* mgr); HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl);
~HGSaneDeviceImpl(); ~HGSaneDeviceImpl();
HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen); HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen);
HGResult Close(); HGResult Close();
HGResult GetHandle(SANE_Handle* handle); HGResult GetHandle(SANE_Handle* handle);
HGResult Start(HGSane_DeviceEventCallback eventFunc, HGPointer eventParam, HGResult Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen); HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
HGResult Stop(); HGResult Stop();
private: private:
@ -78,14 +78,14 @@ private:
static void HGAPI ThreadFunc(HGThread thread, HGPointer param); static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
private: private:
class HGSaneManagerImpl* m_mgrImpl; HGSaneManagerImpl* m_mgrImpl;
SANE_Handle m_devHandle; SANE_Handle m_devHandle;
HGByte* m_buffer; HGByte* m_buffer;
HGInt m_bufferSize; HGInt m_bufferSize;
HGUInt m_dpi; HGUInt m_dpi;
HGSane_DeviceEventCallback m_eventFunc; HGSane_DeviceEventFunc m_eventFunc;
HGPointer m_eventParam; HGPointer m_eventParam;
HGSane_DeviceImageCallback m_imageFunc; HGSane_DeviceImageFunc m_imageFunc;
HGPointer m_imageParam; HGPointer m_imageParam;
volatile HGBool m_stopThread; volatile HGBool m_stopThread;
HGThread m_thread; HGThread m_thread;

View File

@ -38,7 +38,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
return HGBASE_ERR_OK; 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) if (NULL == dsm)
{ {
@ -46,7 +46,7 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HG
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->OpenDSM(hwnd, func, param); return twainDSMImpl->OpenDSM(hwnd);
} }
HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm) HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm)
@ -101,7 +101,7 @@ HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->GetDSName(twainDSImpl, name, maxLen); return twainDSImpl->GetName(name, maxLen);
} }
HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds) HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
@ -112,7 +112,7 @@ HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->OpenDS(twainDSImpl); return twainDSImpl->Open();
} }
HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
@ -123,7 +123,7 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->CloseDS(twainDSImpl); return twainDSImpl->Close();
} }
HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value) 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; 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) 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; 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) if (NULL == ds)
{ {
@ -156,10 +156,10 @@ HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; 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) if (NULL == ds)
{ {
@ -167,7 +167,7 @@ HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->EnableDS(twainDSImpl, showUI, parent); return twainDSImpl->Enable(showUI, parent, func, param);
} }
HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
@ -178,7 +178,7 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)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) 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; 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) HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count)
@ -200,7 +200,7 @@ HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->EndXfer(twainDSImpl, count); return twainDSImpl->EndXfer(count);
} }
HGResult HGAPI HGTwain_Reset(HGTwainDS ds) HGResult HGAPI HGTwain_Reset(HGTwainDS ds)
@ -211,5 +211,5 @@ HGResult HGAPI HGTwain_Reset(HGTwainDS ds)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->dsmImpl->Reset(twainDSImpl); return twainDSImpl->Reset();
} }

View File

@ -54,7 +54,7 @@ HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm);
* 1) TWAIN状态从2变为3 * 1) TWAIN状态从2变为3
* 2) 线 * 2) 线
*/ */
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HGPointer param); HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd);
/* 关闭DSM /* 关闭DSM
* : * :
@ -150,7 +150,7 @@ HGEXPORT HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* v
* : * :
* 1) TWAIN状态从4变为5 * 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 /* 启动DS
* : * :
@ -162,7 +162,7 @@ HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND
* : * :
* 1) TWAIN状态从4变为5 * 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 /* 停止DS
* : * :

View File

@ -1,5 +1,6 @@
#include "HGTwainImpl.hpp" #include "HGTwainImpl.hpp"
#include "../base/HGInc.h" #include "../base/HGInc.h"
#include "../base/HGInfo.h"
std::map<HWND, HGTwainDSMImpl*> HGTwainDSMImpl::m_mapWnd; std::map<HWND, HGTwainDSMImpl*> HGTwainDSMImpl::m_mapWnd;
@ -10,8 +11,6 @@ HGTwainDSMImpl::HGTwainDSMImpl()
GetIdentity(); GetIdentity();
m_hWnd = NULL; m_hWnd = NULL;
m_oldWndProc = NULL; m_oldWndProc = NULL;
m_dsEventFunc = NULL;
m_dsEventParam = NULL;
m_DSMOpen = HGFALSE; m_DSMOpen = HGFALSE;
} }
@ -61,13 +60,18 @@ HGResult HGTwainDSMImpl::UnloadDSM()
return HGBASE_ERR_OK; 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; 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); USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hwnd);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
@ -77,8 +81,6 @@ HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param)
m_hWnd = hwnd; m_hWnd = hwnd;
m_mapWnd[m_hWnd] = this; m_mapWnd[m_hWnd] = this;
m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc); m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
m_dsEventFunc = func;
m_dsEventParam = param;
m_DSMOpen = HGTRUE; m_DSMOpen = HGTRUE;
// 获取DS列表 // 获取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); ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds);
if (TWRC_SUCCESS == ret) if (TWRC_SUCCESS == ret)
{ {
HGTwainDSImpl dsImpl(this); HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
memcpy(&dsImpl.ds, &ds, sizeof(TW_IDENTITY)); m_vpDSImpl.push_back(dsImpl);
m_DSList.push_back(dsImpl);
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds)) while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
{ {
HGTwainDSImpl dsImpl(this); HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
memcpy(&dsImpl.ds, &ds, sizeof(TW_IDENTITY)); m_vpDSImpl.push_back(dsImpl);
m_DSList.push_back(dsImpl);
} }
} }
@ -109,13 +109,12 @@ HGResult HGTwainDSMImpl::CloseDSM()
} }
// 先必须关闭DS // 先必须关闭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];
} }
m_vpDSImpl.clear();
// 清理DS列表
m_DSList.clear();
m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd); m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd);
SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc); SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc);
@ -130,28 +129,26 @@ HGResult HGTwainDSMImpl::CloseDSM()
} }
} }
m_hWnd = NULL; m_hWnd = NULL;
m_dsEventFunc = NULL;
m_dsEventParam = NULL;
m_DSMOpen = HGFALSE; m_DSMOpen = HGFALSE;
return HGBASE_ERR_OK; 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) if (!m_DSMOpen)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
HGUInt count = 0; if (NULL == dsImpl || NULL == size || 0 == *size)
for (int i = 0; i < (int)m_DSList.size(); ++i)
{ {
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; ++count;
if (count >= *size) if (count >= *size)
@ -164,18 +161,18 @@ HGResult HGTwainDSMImpl::GetDSList(HGTwainDSImpl** ds, HGUInt* size)
return HGBASE_ERR_OK; 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) if (!m_DSMOpen)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
assert(NULL != m_pDSMProc); assert(NULL != m_pDSMProc);
TW_IDENTITY defDS; TW_IDENTITY defDS;
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &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; 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; return HGBASE_ERR_OK;
} }
} }
@ -196,18 +193,18 @@ HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds)
return HGBASE_ERR_FAIL; 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) if (!m_DSMOpen)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
assert(NULL != m_pDSMProc); assert(NULL != m_pDSMProc);
TW_IDENTITY selectDS; TW_IDENTITY selectDS;
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &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; 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]; *dsImpl = m_vpDSImpl[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;
}
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
} }
@ -652,29 +253,321 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam,
msg2.wParam = wParam; msg2.wParam = wParam;
msg2.lParam = lParam; 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; TW_EVENT twEvent;
twEvent.pEvent = (TW_MEMREF)&msg2; twEvent.pEvent = (TW_MEMREF)&msg2;
twEvent.TWMessage = MSG_NULL; 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); MSG_PROCESSEVENT, (TW_MEMREF)&twEvent);
if (TWRC_DSEVENT == ret) if (TWRC_DSEVENT == ret)
{ {
HGUInt event = HGTWAIN_DSEVENT_UNKNOWN; HGUInt event = HGTWAIN_DSEVENT_UNKNOWN;
if (MSG_XFERREADY == twEvent.TWMessage) if (MSG_XFERREADY == twEvent.TWMessage)
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_XFERREADY");
event = HGTWAIN_DSEVENT_XFERREADY; event = HGTWAIN_DSEVENT_XFERREADY;
}
else if (MSG_CLOSEDSREQ == twEvent.TWMessage) else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSREQ");
event = HGTWAIN_DSEVENT_CLOSEDSREQ; event = HGTWAIN_DSEVENT_CLOSEDSREQ;
}
else if (MSG_CLOSEDSOK == twEvent.TWMessage) else if (MSG_CLOSEDSOK == twEvent.TWMessage)
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSOK");
event = HGTWAIN_DSEVENT_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); 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;
}

View File

@ -7,52 +7,20 @@
#include <vector> #include <vector>
#include <map> #include <map>
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 class HGTwainDSMImpl
{ {
friend class HGTwainDSImpl;
public: public:
HGTwainDSMImpl(); HGTwainDSMImpl();
~HGTwainDSMImpl(); ~HGTwainDSMImpl();
HGResult LoadDSM(); HGResult LoadDSM();
HGResult UnloadDSM(); HGResult UnloadDSM();
HGResult OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param); HGResult OpenDSM(HWND hwnd);
HGResult CloseDSM(); HGResult CloseDSM();
HGResult GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size);
HGResult GetDSList(HGTwainDSImpl** ds, HGUInt* size); HGResult GetDefaultDS(class HGTwainDSImpl** dsImpl);
HGResult GetDefaultDS(HGTwainDSImpl** ds); HGResult SelectDS(class HGTwainDSImpl** dsImpl);
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);
private: private:
void GetIdentity(); void GetIdentity();
@ -65,10 +33,39 @@ private:
HWND m_hWnd; HWND m_hWnd;
static std::map<HWND, HGTwainDSMImpl*> m_mapWnd; static std::map<HWND, HGTwainDSMImpl*> m_mapWnd;
WNDPROC m_oldWndProc; WNDPROC m_oldWndProc;
HGDSEventFunc m_dsEventFunc;
HGPointer m_dsEventParam;
HGBool m_DSMOpen; HGBool m_DSMOpen;
std::vector<HGTwainDSImpl> m_DSList; std::vector<class HGTwainDSImpl *> 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__ */ #endif /* __HGTWAINIMPL_HPP__ */