336 lines
6.5 KiB
C++
336 lines
6.5 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: genenum.cpp
|
|
//
|
|
// Contents: implementation of CGenDataObject
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 24-May-94 kennethm author
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "oletest.h"
|
|
#include "genenum.h"
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CEnumeratorTest::CEnumeratorTest
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [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.
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Derivation:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 24-May-94 kennethm author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
CEnumeratorTest::CEnumeratorTest(
|
|
void *penum,
|
|
size_t ElementSize,
|
|
LONG ElementCount,
|
|
HRESULT& rhr)
|
|
{
|
|
assert(penum);
|
|
|
|
m_pEnumTest = (IGenEnum*)penum;
|
|
|
|
m_ElementSize = ElementSize;
|
|
m_ElementCount = ElementCount;
|
|
|
|
rhr = m_pEnumTest->Reset();
|
|
|
|
if (rhr != S_OK)
|
|
{
|
|
OutputStr(("IEnumnX: Reset failed (%lx)\r\n", rhr));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: CEnumeratorTest::GetNext
|
|
//
|
|
// Synopsis: Internal Next Implementation. Does some basic checks on the
|
|
// return values.
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [celt] -- the number of items to fetch
|
|
// [pceltFetched] -- the number of items fetched
|
|
// [phresult] -- the return from next
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: True if the basic tests passed, false if they didn't
|
|
// The result of the next call itself is passed in param 3.
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm: Checks:
|
|
// That if s_ok is returned celt and pceltFetched are ==
|
|
// If a verify is provided it is called
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 24-May-94 kennethm author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
BOOL CEnumeratorTest::GetNext( ULONG celt,
|
|
ULONG* pceltFetched,
|
|
HRESULT* phresult
|
|
)
|
|
{
|
|
void* prgelt;
|
|
ULONG ul;
|
|
BOOL fRet = TRUE;
|
|
|
|
// Allocate memory for the return elements
|
|
|
|
prgelt = new char[m_ElementSize * celt];
|
|
|
|
assert(prgelt);
|
|
|
|
// Call next
|
|
|
|
*phresult = m_pEnumTest->Next(celt, prgelt, pceltFetched);
|
|
|
|
// If the return result is S_OK make sure the numbers match
|
|
|
|
if (*phresult == S_OK)
|
|
{
|
|
if ((pceltFetched) && (celt != *pceltFetched))
|
|
{
|
|
OutputStr(("IEnumX::Next return S_OK but celt"
|
|
" and pceltFetch mismatch.\r\n"));
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
// Call verify to make sure the elements are ok.
|
|
|
|
if ((*phresult == NOERROR) || (*phresult == ResultFromScode(S_FALSE)))
|
|
{
|
|
// loop through every returned element
|
|
|
|
for (ul=0; ul < *pceltFetched ; ul++)
|
|
{
|
|
if (!Verify(prgelt))
|
|
{
|
|
OutputStr(("Data elment %d returned by IEnumX::Next is bad.\r\n",
|
|
ul));
|
|
|
|
fRet = FALSE;
|
|
// we keep looping anyway just to
|
|
// free up resources.
|
|
}
|
|
|
|
// If the user supplied a cleanup function there is additional
|
|
// memory that needs to be freed
|
|
|
|
CleanUp(prgelt);
|
|
}
|
|
|
|
}
|
|
|
|
free (prgelt);
|
|
|
|
return fRet;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CEnumeratorTest::TestNext
|
|
//
|
|
// Synopsis: Test the next enumerator methods
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: None.
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 24-May-94 kennethm author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT CEnumeratorTest::TestNext(void)
|
|
{
|
|
ULONG celtFetched;
|
|
LONG InternalCount = 0;
|
|
HRESULT hresult;
|
|
|
|
// First we want to count the element by doing a next on each one.
|
|
|
|
do {
|
|
if (!GetNext(1, &celtFetched, &hresult))
|
|
{
|
|
return ResultFromScode(E_FAIL);
|
|
}
|
|
if (hresult == S_OK)
|
|
{
|
|
InternalCount++;
|
|
}
|
|
|
|
} while ( hresult == S_OK );
|
|
|
|
// If the user passed in an ammount make sure it matches what we got
|
|
|
|
if ((m_ElementCount != -1) && (InternalCount != m_ElementCount))
|
|
{
|
|
OutputStr(("IEnumX: enumerated count and passed count do not match!\r\n"));
|
|
return ResultFromScode(E_FAIL);
|
|
}
|
|
|
|
m_pEnumTest->Reset();
|
|
|
|
// Make sure we fail on ...Next(celt>1, ...,NULL)
|
|
|
|
/* BUGBUG: clipboard enumerator fails on this test
|
|
|
|
if (GetNext(2, NULL, &hresult))
|
|
{
|
|
if ((hresult == S_OK ) || (hresult == S_FALSE))
|
|
{
|
|
(("IEnumX: celt>1 pceltFetched==NULL returned S_OK\r\n"));
|
|
return(E_FAIL);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return(E_FAIL);
|
|
}
|
|
|
|
*/
|
|
|
|
return(S_OK);
|
|
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CEnumeratorTest::TestAll
|
|
//
|
|
// Synopsis: This function calls all the tests
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 24-May-94 kennethm author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT CEnumeratorTest::TestAll(void)
|
|
{
|
|
return(TestNext());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CEnumeratorTest::VerifyAll
|
|
//
|
|
// Synopsis: Verify entire array of returned results.
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Algorithm: Just default to saying everything is ok
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 24-May-94 ricksa author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
BOOL CEnumeratorTest::VerifyAll(void *pv, LONG cl)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CEnumeratorTest::CleanUp
|
|
//
|
|
// Synopsis: Default implementation of cleanup
|
|
//
|
|
// 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 ricksa author
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CEnumeratorTest::CleanUp(void *pv)
|
|
{
|
|
return;
|
|
}
|