You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
5.6 KiB
241 lines
5.6 KiB
/*++
|
|
Module Name:
|
|
|
|
JPEnum.cpp
|
|
|
|
Abstract:
|
|
|
|
This file contains the Implementation of the Class CJunctionPointEnum.
|
|
This class implements IEnumVARIANT for DfsJunctionPoint enumeration.
|
|
--*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "DfsCore.h"
|
|
#include "DfsJP.h"
|
|
#include "JPEnum.h"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ~CJunctionPointEnum
|
|
|
|
|
|
CJunctionPointEnum :: ~CJunctionPointEnum ()
|
|
{
|
|
_FreeMemberVariables();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Initialize
|
|
|
|
|
|
STDMETHODIMP CJunctionPointEnum :: Initialize
|
|
(
|
|
JUNCTIONNAMELIST* i_pjiList, // Pointer to the list of junction points.
|
|
FILTERDFSLINKS_TYPE i_lLinkFilterType,
|
|
BSTR i_bstrEnumFilter, // Filtering string expresseion
|
|
ULONG* o_pulCount // count of links that matches the filter
|
|
)
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the JunctionPointEnum object.
|
|
It copies the JunctionPoint list passed to it by the junction point
|
|
object.
|
|
|
|
Arguments:
|
|
|
|
i_pjiList - Pointer to the list of junction points.
|
|
i_lLinkFilterType - The type of link filtering.
|
|
i_bstrEnumFilter - The string expression to do prefix filtering.
|
|
o_pulCount - to hold the count of links that matches the specified filter.
|
|
|
|
--*/
|
|
|
|
if (!i_pjiList)
|
|
return E_INVALIDARG;
|
|
|
|
if (i_lLinkFilterType != FILTERDFSLINKS_TYPE_NO_FILTER &&
|
|
(!i_bstrEnumFilter || !*i_bstrEnumFilter))
|
|
return E_INVALIDARG;
|
|
|
|
if (o_pulCount)
|
|
*o_pulCount = 0;
|
|
|
|
HRESULT hr = S_OK;
|
|
JUNCTIONNAMELIST::iterator i;
|
|
JUNCTIONNAMELIST::iterator j;
|
|
|
|
for (i = i_pjiList->begin(); i != i_pjiList->end(); i++)
|
|
{ // Copy filtered junctions to its own internal list
|
|
if (i_lLinkFilterType != FILTERDFSLINKS_TYPE_NO_FILTER)
|
|
{
|
|
if ( !FilterMatch((*i)->m_bstrJPName, i_lLinkFilterType, i_bstrEnumFilter) )
|
|
continue;
|
|
}
|
|
|
|
JUNCTIONNAME* pTemp = (*i)->Copy();
|
|
BREAK_OUTOFMEMORY_IF_NULL(pTemp, &hr);
|
|
|
|
m_JunctionPoints.push_back(pTemp);
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
m_iCurrentInEnumOfJunctionPoints = m_JunctionPoints.begin();
|
|
if (o_pulCount)
|
|
*o_pulCount = m_JunctionPoints.size();
|
|
} else
|
|
_FreeMemberVariables();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IEnumVariant Methods
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Next
|
|
|
|
|
|
STDMETHODIMP CJunctionPointEnum::Next
|
|
(
|
|
ULONG i_ulNumOfJunctionPoints, //To fetch.
|
|
VARIANT* o_pIJunctionPointArray, //Array to fetch into.
|
|
ULONG* o_ulNumOfJunctionPointsFetched //The number of values fetched, (Arg can be NULL)
|
|
)
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Gets the next object in the list.
|
|
|
|
Arguments:
|
|
|
|
i_ulNumOfJunctionPoints - the number of objects to return
|
|
o_pIJunctionPointArray - an array of variants in which to return the objects
|
|
o_ulNumOfJunctionPointsFetched - the number of objects that are actually returned
|
|
|
|
Return value:
|
|
|
|
S_OK, On success
|
|
S_FALSE if the end of the list has been reached
|
|
--*/
|
|
|
|
if (!o_pIJunctionPointArray || !i_ulNumOfJunctionPoints)
|
|
return E_INVALIDARG;
|
|
|
|
HRESULT hr = S_OK;
|
|
ULONG nCount = 0;
|
|
|
|
for (nCount = 0;
|
|
nCount < i_ulNumOfJunctionPoints && m_iCurrentInEnumOfJunctionPoints != m_JunctionPoints.end();
|
|
m_iCurrentInEnumOfJunctionPoints++)
|
|
{
|
|
IDfsJunctionPoint *pIJunctionPointPtr = (*m_iCurrentInEnumOfJunctionPoints)->m_piDfsJunctionPoint;
|
|
pIJunctionPointPtr->AddRef();
|
|
|
|
o_pIJunctionPointArray[nCount].vt = VT_DISPATCH;
|
|
o_pIJunctionPointArray[nCount].pdispVal = pIJunctionPointPtr;
|
|
|
|
nCount++;
|
|
}
|
|
|
|
if (o_ulNumOfJunctionPointsFetched)
|
|
*o_ulNumOfJunctionPointsFetched = nCount;
|
|
|
|
if (SUCCEEDED(hr) && !nCount)
|
|
return S_FALSE;
|
|
else
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Skip
|
|
|
|
|
|
STDMETHODIMP CJunctionPointEnum :: Skip
|
|
(
|
|
unsigned long i_ulJunctionPointsToSkip //Items to skip
|
|
)
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Skips the next 'n' objects in the list.
|
|
|
|
Arguments:
|
|
|
|
i_ulJunctionPointsToSkip - the number of objects to skip over
|
|
|
|
Return value:
|
|
|
|
S_OK, On success
|
|
S_FALSE, if the end of the list is reached
|
|
|
|
--*/
|
|
|
|
for (unsigned int j = 0; j < i_ulJunctionPointsToSkip &&
|
|
m_iCurrentInEnumOfJunctionPoints != m_JunctionPoints.end(); j++)
|
|
{
|
|
m_iCurrentInEnumOfJunctionPoints++;
|
|
}
|
|
|
|
return (m_iCurrentInEnumOfJunctionPoints != m_JunctionPoints.end()) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Reset
|
|
|
|
|
|
STDMETHODIMP CJunctionPointEnum :: Reset()
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Resets the current enumeration pointer to the start of the list
|
|
|
|
--*/
|
|
|
|
m_iCurrentInEnumOfJunctionPoints = m_JunctionPoints.begin();
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Clone
|
|
|
|
|
|
STDMETHODIMP CJunctionPointEnum :: Clone
|
|
(
|
|
IEnumVARIANT FAR* FAR* ppenum
|
|
)
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Creates a clone of the enumerator object
|
|
|
|
Arguments:
|
|
|
|
ppenum - address of the pointer to the IEnumVARIANT interface
|
|
of the newly created enumerator object
|
|
|
|
Notes:
|
|
|
|
This has not been implemented.
|
|
--*/
|
|
|
|
return E_NOTIMPL;
|
|
}
|