//+------------------------------------------------------------------------- // // 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); }