|
|
// WiaDataCallback.cpp: implementation of the CWiaDataCallback class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "wiatest.h"
#include "WiaDataCallback.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWiaDataCallback::CWiaDataCallback() { m_cRef = 0; m_pBuffer = NULL; m_BytesTransferred = 0; m_pAcquireDlg = NULL; m_lBufferSize = 65535; // default
m_bBitmapData = FALSE; m_bNewPageArrived = TRUE;
// initialize progress dialog
m_pAcquireDlg = new CWiaAcquireDlg(); if(m_pAcquireDlg){ m_pAcquireDlg->Create(IDD_DATA_ACQUISITION_DIALOG,NULL); m_pAcquireDlg->ShowWindow(TRUE); } }
CWiaDataCallback::~CWiaDataCallback() { if (m_pBuffer != NULL){ LocalFree(m_pBuffer); m_pBuffer = NULL; } if(m_pAcquireDlg){ m_pAcquireDlg->DestroyWindow(); delete m_pAcquireDlg; m_pAcquireDlg = NULL; } }
HRESULT _stdcall CWiaDataCallback::QueryInterface(const IID& iid, void** ppv) { *ppv = NULL; if (iid == IID_IUnknown || iid == IID_IWiaDataCallback) *ppv = (IWiaDataCallback*) this; else return E_NOINTERFACE; AddRef(); return S_OK; }
ULONG _stdcall CWiaDataCallback::AddRef() { InterlockedIncrement((long*) &m_cRef); return m_cRef; }
ULONG _stdcall CWiaDataCallback::Release() { ULONG ulRefCount = m_cRef - 1; if (InterlockedDecrement((long*) &m_cRef) == 0) { delete this; return 0; } return ulRefCount; }
HRESULT _stdcall CWiaDataCallback::BandedDataCallback(LONG lMessage, LONG lStatus, LONG lPercentComplete, LONG lOffset, LONG lLength, LONG lReserved, LONG lResLength, BYTE* pbBuffer) { // check for cancel button presses
if(m_pAcquireDlg->CheckCancelButton()){ return S_FALSE; }
PWIA_DATA_CALLBACK_HEADER pHeader = NULL; switch (lMessage) { case IT_MSG_DATA_HEADER: pHeader = (PWIA_DATA_CALLBACK_HEADER)pbBuffer; if(pHeader->guidFormatID == WiaImgFmt_MEMORYBMP){ m_bBitmapData = TRUE; } m_MemBlockSize = pHeader->lBufferSize; if(m_MemBlockSize <= 0) m_MemBlockSize = m_lBufferSize; m_pBuffer = (PBYTE)LocalAlloc(LPTR,m_MemBlockSize); m_BytesTransferred = 0; UpdateAcqusitionDialog(TEXT("IT_MSG_DATA_HEADER"),lPercentComplete); break; case IT_MSG_DATA: if(m_bNewPageArrived){ m_BytesTransferred = 0; m_bNewPageArrived = FALSE; } if (m_pBuffer != NULL) { m_BytesTransferred += lLength; if(m_BytesTransferred >= m_MemBlockSize){ m_MemBlockSize += (lLength * MEMORY_BLOCK_FACTOR); m_pBuffer = (PBYTE)LocalReAlloc(m_pBuffer,m_MemBlockSize,LMEM_MOVEABLE); } memcpy(m_pBuffer + lOffset, pbBuffer, lLength); } UpdateAcqusitionDialog(TEXT("IT_MSG_DATA"),lPercentComplete); break; case IT_MSG_STATUS: if (lStatus & IT_STATUS_TRANSFER_FROM_DEVICE){ UpdateAcqusitionDialog(TEXT("IT_MSG_STATUS\n(IT_STATUS_TRANSFER_FROM_DEVICE)"),lPercentComplete); } else if (lStatus & IT_STATUS_PROCESSING_DATA){ UpdateAcqusitionDialog(TEXT("IT_MSG_STATUS\n(IT_STATUS_PROCESSING_DATA)"),lPercentComplete); } else if (lStatus & IT_STATUS_TRANSFER_TO_CLIENT) { UpdateAcqusitionDialog(TEXT("IT_MSG_STATUS\n(IT_STATUS_TRANSFER_TO_CLIENT)"),lPercentComplete); } break; case IT_MSG_NEW_PAGE: UpdateAcqusitionDialog(TEXT("IT_MSG_NEWPAGE"),0); pHeader = (PWIA_DATA_CALLBACK_HEADER)pbBuffer; m_lPageCount = pHeader->lPageCount; m_bNewPageArrived = TRUE; break; case IT_MSG_FILE_PREVIEW_DATA: UpdateAcqusitionDialog(TEXT("IT_MSG_FILE_PREVIEW_DATA"),-1); break; case IT_MSG_FILE_PREVIEW_DATA_HEADER: UpdateAcqusitionDialog(TEXT("IT_MSG_FILE_PREVIEW_DATA_HEADER"),-1); break; case IT_MSG_TERMINATION: UpdateAcqusitionDialog(TEXT("IT_MSG_TERMINATION"),-1); break; default: break; } return S_OK; }
void CWiaDataCallback::UpdateAcqusitionDialog(TCHAR *szMessage, LONG lPercentComplete) { m_pAcquireDlg->SetCallbackMessage(szMessage); if(lPercentComplete > -1){ m_pAcquireDlg->SetPercentComplete(lPercentComplete); m_pAcquireDlg->m_AcquireProgressCtrl.SetPos(lPercentComplete); } }
void CWiaDataCallback::SetBufferSizeRequest(LONG lBufferSize) { m_lBufferSize = lBufferSize; }
BYTE* CWiaDataCallback::GetCallbackMemoryPtr(LONG *plDataSize) { *plDataSize = m_BytesTransferred; return m_pBuffer; }
BOOL CWiaDataCallback::IsBITMAPDATA() { return m_bBitmapData; }
|