/*++ Copyright (c) 1999 Microsoft Corporation Module Name: TestWiaDataTransfer.cpp Abstract: Test routines for the WIA IWiaDataTransfer interface Author: Hakki T. Bostanci (hakkib) 17-Dec-1999 Revision History: --*/ #include "stdafx.h" #include "WiaStress.h" #include "DataCallback.h" #include "CheckBmp.h" ////////////////////////////////////////////////////////////////////////// // // CWiaStressThread::TestGetData // // Routine Description: // tests IWiaDataTransfer::idtGetData and IWiaDataTransfer::idtGetBandedData // // Arguments: // // Return Value: // void CWiaStressThread::TestGetData(CWiaItemData *pItemData) { if (!(pItemData->lItemType & (WiaItemTypeFile | WiaItemTypeImage))) { return; } // get the interface pointers CComQIPtr pWiaDataTransfer(pItemData->pWiaItem); CHECK(pWiaDataTransfer != 0); CComQIPtr pProp(pItemData->pWiaItem); CHECK(pProp != 0); // transfer the data in basic formats CWiaFormatInfo MemoryBmp(&WiaImgFmt_MEMORYBMP, TYMED_CALLBACK); CWiaFormatInfo FileBmp(&WiaImgFmt_BMP, TYMED_FILE); SubTestGetData(MemoryBmp, pProp, pWiaDataTransfer, pItemData->bstrFullName); SubTestGetData(FileBmp, pProp, pWiaDataTransfer, pItemData->bstrFullName); if (!m_bBVTMode) { // get all available transfer formats CComPtr pEnumWIA_FORMAT_INFO; CHECK_HR(pWiaDataTransfer->idtEnumWIA_FORMAT_INFO(&pEnumWIA_FORMAT_INFO)); ULONG nFormats = -1; CHECK_HR(pEnumWIA_FORMAT_INFO->GetCount(&nFormats)); FOR_SELECTED(i, nFormats) { CWiaFormatInfo WiaFormatInfo; CHECK_HR(pEnumWIA_FORMAT_INFO->Next(1, &WiaFormatInfo, 0)); if (WiaFormatInfo != MemoryBmp && WiaFormatInfo != FileBmp) { SubTestGetData(WiaFormatInfo, pProp, pWiaDataTransfer, pItemData->bstrFullName); } } } // test invalid cases // todo: } ////////////////////////////////////////////////////////////////////////// // // CWiaStressThread::SubTestGetData // // Routine Description: // // Arguments: // // Return Value: // void CWiaStressThread::SubTestGetData( CWiaFormatInfo &WiaFormatInfo, CMyWiaPropertyStorage *pProp, IWiaDataTransfer *pWiaDataTransfer, BSTR bstrFullName ) { // we don't want any other thread to mess with the image trasfer properties s_PropWriteCritSect.Enter(); // set the image transfer properties CHECK_HR(pProp->WriteVerifySingle(WIA_IPA_FORMAT, WiaFormatInfo.guidFormatID)); CHECK_HR(pProp->WriteVerifySingle(WIA_IPA_TYMED, WiaFormatInfo.lTymed)); // transfer the item switch (WiaFormatInfo.lTymed) { case TYMED_CALLBACK: { FOR_SELECTED(bCreateSharedSection, 2) { FOR_SELECTED(bDoubleBuffered, 2) { LOG_INFO( _T("Testing idtGetBandedData() on %ws, Format=%s, Tymed=%s, %s created section, %s buffered"), bstrFullName, (PCTSTR) GuidToStr(WiaFormatInfo.guidFormatID), (PCTSTR) TymedToStr((TYMED) WiaFormatInfo.lTymed), bCreateSharedSection ? _T("client") : _T("WIA"), bDoubleBuffered ? _T("double") : _T("single") ); // determine the transfer buffer size CPropVariant varBufferSize; HRESULT hr = pProp->ReadSingle(WIA_IPA_MIN_BUFFER_SIZE, &varBufferSize, VT_UI4); ULONG ulBufferSize = hr == S_OK ? varBufferSize.ulVal : 64*1024; // create the section CFileMapping Section( INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, (bDoubleBuffered ? 2 * ulBufferSize : ulBufferSize) ); ULONG ulSection = PtrToUlong((HANDLE)Section); // initiate the transfer CWiaDataTransferInfo WiaDataTransferInfo( bCreateSharedSection ? ulSection : 0, ulBufferSize, bDoubleBuffered ); CComPtr pDataCallback(new CDataCallback); CHECK(pDataCallback != 0); if (LOG_HR(pWiaDataTransfer->idtGetBandedData(&WiaDataTransferInfo, pDataCallback), == S_OK)) { // check the results if we understand the format if (WiaFormatInfo.guidFormatID == WiaImgFmt_MEMORYBMP) { CheckBmp( pDataCallback->m_pBuffer, pDataCallback->m_lBufferSize, TRUE ); } else if (WiaFormatInfo.guidFormatID == WiaImgFmt_BMP) { CheckBmp( pDataCallback->m_pBuffer, pDataCallback->m_lBufferSize, TRUE //FALSE bug 123640 ); } else if (WiaFormatInfo.guidFormatID == WiaImgFmt_JPEG) { // todo: write a jpeg checker } else if (WiaFormatInfo.guidFormatID == WiaImgFmt_TIFF) { // todo: write a tiff checker } } LOG_CMP(pDataCallback->m_cRef, ==, 1); } } break; } case TYMED_FILE: { LOG_INFO( _T("Testing idtGetData() on %ws, Format=%s, Tymed=%s"), bstrFullName, (PCTSTR) GuidToStr(WiaFormatInfo.guidFormatID), (PCTSTR) TymedToStr((TYMED) WiaFormatInfo.lTymed) ); CStgMedium StgMedium; StgMedium.tymed = TYMED_FILE; CComPtr pDataCallback(new CDataCallback); CHECK(pDataCallback != 0); if (LOG_HR(pWiaDataTransfer->idtGetData(&StgMedium, pDataCallback), == S_OK)) { USES_CONVERSION; PCTSTR pszFileName = W2T(StgMedium.lpszFileName); // check the results if we understand the format if (WiaFormatInfo.guidFormatID == WiaImgFmt_BMP) { CheckBmp(pszFileName); } else if (WiaFormatInfo.guidFormatID == WiaImgFmt_JPEG) { // todo: write a jpeg checker } else if (WiaFormatInfo.guidFormatID == WiaImgFmt_TIFF) { // todo: write a tiff checker } DeleteFile(pszFileName); } LOG_CMP(pDataCallback->m_cRef, ==, 1); break; } default: OutputDebugStringF(_T("Unhandled tymed %s"), (PCTSTR) TymedToStr((TYMED) WiaFormatInfo.lTymed)); ASSERT(FALSE); break; } s_PropWriteCritSect.Leave(); } ////////////////////////////////////////////////////////////////////////// // // // void CWiaStressThread::TestQueryData(CWiaItemData *pItemData) { if (!(pItemData->lItemType & (WiaItemTypeImage | WiaItemTypeFile))) { return; } LOG_INFO(_T("Testing idtQueryData() on %ws"), pItemData->bstrFullName); CComQIPtr pWiaDataTransfer(pItemData->pWiaItem); CHECK(pWiaDataTransfer != 0); // these two should be supported by all devices LOG_HR(pWiaDataTransfer->idtQueryGetData(&CWiaFormatInfo(&WiaImgFmt_MEMORYBMP, TYMED_CALLBACK)), == S_OK); LOG_HR(pWiaDataTransfer->idtQueryGetData(&CWiaFormatInfo(&WiaImgFmt_BMP, TYMED_FILE)), == S_OK); // ask the device for the formats it supports and verify each format CComPtr pEnumWIA_FORMAT_INFO; CHECK_HR(pWiaDataTransfer->idtEnumWIA_FORMAT_INFO(&pEnumWIA_FORMAT_INFO)); ULONG nFormats; CHECK_HR(pEnumWIA_FORMAT_INFO->GetCount(&nFormats)); for (int i = 0; i < nFormats; ++i) { CWiaFormatInfo WiaFormatInfo; CHECK_HR(pEnumWIA_FORMAT_INFO->Next(1, &WiaFormatInfo, 0)); LOG_HR(pWiaDataTransfer->idtQueryGetData(&WiaFormatInfo), == S_OK); } // test invalid cases if (m_bRunBadParamTests) { LOG_HR(pWiaDataTransfer->idtQueryGetData(&CWiaFormatInfo(&GUID_NULL, TYMED_FILE)), == E_INVALIDARG); LOG_HR(pWiaDataTransfer->idtQueryGetData(&CWiaFormatInfo(&WiaImgFmt_BMP, 0)), == DV_E_TYMED); LOG_HR(pWiaDataTransfer->idtQueryGetData(&CWiaFormatInfo(&GUID_NULL, 0)), == DV_E_TYMED); LOG_HR(pWiaDataTransfer->idtQueryGetData(0), != S_OK); } } ////////////////////////////////////////////////////////////////////////// // // // void CWiaStressThread::TestEnumWIA_FORMAT_INFO(CWiaItemData *pItemData) { if (!(pItemData->lItemType & (WiaItemTypeImage | WiaItemTypeFile))) { return; } LOG_INFO(_T("Testing idtEnumWIA_FORMAT_INFO() on %ws"), pItemData->bstrFullName); CComQIPtr pWiaDataTransfer(pItemData->pWiaItem); CHECK(pWiaDataTransfer != 0); // test valid cases CComPtr pEnumWIA_FORMAT_INFO; if (LOG_HR(pWiaDataTransfer->idtEnumWIA_FORMAT_INFO(&pEnumWIA_FORMAT_INFO), == S_OK)) { TestEnum(pEnumWIA_FORMAT_INFO, _T("idtEnumWIA_FORMAT_INFO")); } // test invalid cases if (m_bRunBadParamTests) { LOG_HR(pWiaDataTransfer->idtEnumWIA_FORMAT_INFO(0), != S_OK); } }