/*++ Copyright (c) 2000 Microsoft Corporation Module Name: DataCallback.cpp Abstract: WIA data callback class Author: Hakki T. Bostanci (hakkib) 06-Apr-2000 Revision History: --*/ #include "StdAfx.h" #include "WiaStress.h" #include "DataCallback.h" #include "ToStr.h" ////////////////////////////////////////////////////////////////////////// // // // CDataCallback::CDataCallback() { m_cRef = 0; m_pBuffer = 0; m_lBufferSize = 0; m_TimeDeviceBegin.QuadPart = 0; m_TimeDeviceEnd.QuadPart = 0; m_TimeProcessBegin.QuadPart = 0; m_TimeProcessEnd.QuadPart = 0; m_TimeClientBegin.QuadPart = 0; m_TimeClientEnd.QuadPart = 0; } ////////////////////////////////////////////////////////////////////////// // // // CDataCallback::~CDataCallback() { PrintTimes(); delete [] m_pBuffer; } ////////////////////////////////////////////////////////////////////////// // // // STDMETHODIMP CDataCallback::QueryInterface(REFIID iid, LPVOID *ppvObj) { if (ppvObj == 0) { return E_POINTER; } if (iid == IID_IUnknown) { AddRef(); *ppvObj = (IUnknown*) this; return S_OK; } if (iid == IID_IWiaDataCallback) { AddRef(); *ppvObj = (IWiaDataCallback *) this; return S_OK; } *ppvObj = 0; return E_NOINTERFACE; } ////////////////////////////////////////////////////////////////////////// // // // STDMETHODIMP_(ULONG) CDataCallback::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////////// // // // STDMETHODIMP_(ULONG) CDataCallback::Release() { LONG cRef = InterlockedDecrement(&m_cRef); if (cRef == 0) { delete this; } return cRef; } ////////////////////////////////////////////////////////////////////////// // // // STDMETHODIMP CDataCallback::BandedDataCallback( LONG lReason, LONG lStatus, LONG lPercentComplete, LONG lOffset, LONG lLength, LONG lReserved, LONG lResLength, PBYTE pbBuffer ) { OutputDebugStringF( _T("DataCallback: Reason=%s Stat=%s %d%% Offset=%d Length=%d (%dK) Buf=%p\n"), (PCTSTR) WiaCallbackReasonToStr(lReason), (PCTSTR) WiaCallbackStatusToStr(lStatus), lPercentComplete, lOffset, lLength, lLength / 1024, pbBuffer ); switch (lReason) { case IT_MSG_DATA_HEADER: { // allocate memory for the image PWIA_DATA_CALLBACK_HEADER pHeader = (PWIA_DATA_CALLBACK_HEADER) pbBuffer; m_lBufferSize = pHeader->lBufferSize; ASSERT(m_pBuffer == 0); //bugbug m_pBuffer = new BYTE[m_lBufferSize]; if (m_pBuffer == 0) { return S_FALSE; } break; } case IT_MSG_DATA: { // copy the transfer buffer QueryStartTimes(lStatus, lPercentComplete); if (pbBuffer != 0 && lOffset + lLength <= m_lBufferSize) { CopyMemory(m_pBuffer + lOffset, pbBuffer, lLength); } else { } QueryStopTimes(lStatus, lPercentComplete); break; } case IT_MSG_STATUS: { QueryStartTimes(lStatus, lPercentComplete); QueryStopTimes(lStatus, lPercentComplete); break; } case IT_MSG_TERMINATION: break; case IT_MSG_NEW_PAGE: break; default: break; } return S_OK; } ////////////////////////////////////////////////////////////////////////// // // // void CDataCallback::QueryStartTimes(LONG lStatus, LONG lPercentComplete) { if (lStatus & IT_STATUS_TRANSFER_FROM_DEVICE && (lPercentComplete == 0 || m_TimeDeviceBegin.QuadPart == 0)) { QueryPerformanceCounter(&m_TimeDeviceBegin); } if (lStatus & IT_STATUS_PROCESSING_DATA && (lPercentComplete == 0 || m_TimeProcessBegin.QuadPart == 0)) { QueryPerformanceCounter(&m_TimeProcessBegin); } if (lStatus & IT_STATUS_TRANSFER_TO_CLIENT && (lPercentComplete == 0 || m_TimeClientBegin.QuadPart == 0)) { QueryPerformanceCounter(&m_TimeClientBegin); } } void CDataCallback::QueryStopTimes(LONG lStatus, LONG lPercentComplete) { if (lStatus & IT_STATUS_TRANSFER_FROM_DEVICE && lPercentComplete == 100) { QueryPerformanceCounter(&m_TimeDeviceEnd); } if (lStatus & IT_STATUS_PROCESSING_DATA && lPercentComplete == 100) { QueryPerformanceCounter(&m_TimeProcessEnd); } if (lStatus & IT_STATUS_TRANSFER_TO_CLIENT && lPercentComplete == 100) { QueryPerformanceCounter(&m_TimeClientEnd); } } void CDataCallback::PrintTimes() { LARGE_INTEGER Freq; QueryPerformanceFrequency(&Freq); double nTimeDevice = (double) (m_TimeDeviceEnd.QuadPart - m_TimeDeviceBegin.QuadPart) / (double) Freq.QuadPart; double nTimeProcess = (double) (m_TimeProcessEnd.QuadPart - m_TimeProcessBegin.QuadPart) / (double) Freq.QuadPart; double nTimeClient = (double) (m_TimeClientEnd.QuadPart - m_TimeClientBegin.QuadPart) / (double) Freq.QuadPart; OutputDebugStringF( _T("TRANSFER_FROM_DEVICE = %.02lf secs\n") _T("PROCESSING_DATA = %.02lf secs\n") _T("TRANSFER_TO_CLIENT = %.02lf secs\n") _T("\n"), nTimeDevice, nTimeProcess, nTimeClient ); }