277 lines
6.5 KiB
C++
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);
|
||
|
}
|
||
|
|
||
|
|