windows-nt/Source/XPSP1/NT/com/oleutest/cachetst/genforc.cpp
2020-09-26 16:20:57 +08:00

277 lines
6.5 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: genforc.cpp
//
// Contents: implementation of CEnumeratorTestForC.
// This class is a subclass of CEnumeratorTest that calls for less
// Implementation work than CEnumeratorTest but is less flexible.
//
// Classes:
//
// Functions:
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
//--------------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
//+-------------------------------------------------------------------------
//
// Member: CEnumeratorTestForC::CEnumeratorTestForC
//
// Synopsis: default constructor
//
// Arguments:
//
// Returns:
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
// Notes:
//
//--------------------------------------------------------------------------
CEnumeratorTestForC::CEnumeratorTestForC()
{
m_fnVerify = NULL;
m_fnVerifyAll = NULL;
m_fnCleanup = NULL;
}
//+-------------------------------------------------------------------------
//
// Method: CEnumeratorTestForC::Verify
//
// Synopsis: Verify one element.
//
// Arguments: None
//
// Returns: BOOL
//
// Algorithm: call the user provided function or defer to the super-class
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
// Notes:
//
//--------------------------------------------------------------------------
BOOL CEnumeratorTestForC::Verify(void *pv)
{
if (m_fnVerify)
{
return(m_fnVerify(pv ));
}
else
{
return(CEnumeratorTest::Verify(pv));
}
}
//+-------------------------------------------------------------------------
//
// Method: CEnumeratorTestForC::VerifyAll
//
// Synopsis: Verify entire array of returned results.
//
// Arguments: None
//
// Returns: BOOL
//
// Algorithm: call the user provided function or defer to the super-class
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
// Notes:
//
//--------------------------------------------------------------------------
BOOL CEnumeratorTestForC::VerifyAll(void *pv, LONG cl)
{
if (m_fnVerifyAll)
{
return(m_fnVerifyAll(pv, cl ));
}
else
{
return(CEnumeratorTest::VerifyAll(pv, cl));
}
}
//+-------------------------------------------------------------------------
//
// Method: CEnumeratorTestForC::CleanUp
//
// Synopsis: Default implementation of cleanup
//
// Arguments: [pv] - pointer to entry enumerated
//
// Algorithm: call the user provided function or do nothing.
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
//--------------------------------------------------------------------------
void CEnumeratorTestForC::Cleanup(void *pv)
{
if (m_fnCleanup)
{
m_fnCleanup(pv);
}
}
//+-------------------------------------------------------------------------
//
// Member: CEnumeratorTestForC::Create
//
// Synopsis: Static create function.
//
// Effects:
//
// Arguments: [ppEnumtest] -- TestEnumerator object pointer
// [penum] -- Enumerator Interface cast to void*
// [ElementSize] -- Size of elements return from next
// [ElementCount] -- Numer of elements that should be in the enumeration,
// -1 if unknown.
// [verify] -- verifies one element.
// [verifyall] -- verifies an array correctly contains all elements
// [cleanup] -- Frees any additional memory from next call.
// [pPassedDebugLog] -- The debug log object, NULL if none.
//
// Requires:
//
// Returns:
//
// Signals:
//
// Modifies:
//
// Derivation:
//
// Algorithm:
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
// Notes: all of the functions passed in are optional and may be NULL.
//
//--------------------------------------------------------------------------
HRESULT CEnumeratorTestForC::Create(
CEnumeratorTestForC **ppEnumTest,
void *penum,
size_t ElementSize,
LONG ElementCount,
BOOL (*verify)(void*),
BOOL (*verifyall)(void*,LONG),
void (*cleanup)(void*))
{
HRESULT hresult = S_OK;
CEnumeratorTestForC *pEnumTest;
if ((penum == NULL) || (ppEnumTest == NULL))
{
return(E_INVALIDARG);
}
*ppEnumTest = NULL;
//
// Create the new enumerator object
//
pEnumTest = new CEnumeratorTestForC();
if (pEnumTest == NULL)
{
return(E_OUTOFMEMORY);
}
//
// Initialize the enumerator and reset it.
//
pEnumTest->m_pEnumTest = (IGenEnum*)penum;
pEnumTest->m_ElementSize = ElementSize;
pEnumTest->m_ElementCount = ElementCount;
pEnumTest->m_fnVerify = verify;
pEnumTest->m_fnVerifyAll = verifyall;
pEnumTest->m_fnCleanup = cleanup;
hresult = pEnumTest->m_pEnumTest->Reset();
if (hresult != S_OK)
{
printf("IEnumnX: Reset failed (%lx)\r\n", hresult );
delete pEnumTest;
return(E_FAIL);
}
*ppEnumTest = pEnumTest;
return(hresult);
}
//+-------------------------------------------------------------------------
//
// Function: TestEnumerator
//
// Synopsis: This is the one stop testing for C programs.
//
// Arguments: [pv] - pointer to entry enumerated
//
// Algorithm: If there is nothing special to free this implementation
// can be used.
//
// History: dd-mmm-yy Author Comment
// 24-May-94 kennethm author
//
//--------------------------------------------------------------------------
HRESULT TestEnumerator(
void *penum,
size_t ElementSize,
LONG ElementCount,
BOOL (*verify)(void*),
BOOL (*verifyall)(void*,LONG),
void (*cleanup)(void*))
{
CEnumeratorTestForC *pEnumTest;
HRESULT hresult;
hresult = CEnumeratorTestForC::Create(
&pEnumTest,
penum,
ElementSize,
ElementCount,
verify,
verifyall,
cleanup);
if (SUCCEEDED(hresult))
{
hresult = pEnumTest->TestAll();
delete pEnumTest;
}
return(hresult);
}