399 lines
7.4 KiB
C++
399 lines
7.4 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1999-2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
SessEnum.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
SessEnum.cpp : Implementation of CRemoteDesktopHelpSessionEnum
|
||
|
|
||
|
Author:
|
||
|
|
||
|
HueiWang 2/17/2000
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Sessmgr.h"
|
||
|
#include "helpmgr.h"
|
||
|
#include "helpsess.h"
|
||
|
#include "SessEnum.h"
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CRemoteDesktopHelpSessionEnum
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::Next(
|
||
|
IN ULONG uCount,
|
||
|
IN OUT IRemoteDesktopHelpSession **ppIHelpSession,
|
||
|
IN ULONG *pcFetched
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Retrieve number of items, refer to standard COM enumerator for detail.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
uCount : Number of item to retrieves.
|
||
|
ppIHelpSession : Pointer to buffer to receive items, buffer must be
|
||
|
big enough to hold at least uCount items.
|
||
|
pcFetched : actual number of item returned.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
E_POINTER Invalid input parameter
|
||
|
S_FALSE No more item in the list or number items retrieve is less than uCount.
|
||
|
S_OK Success.
|
||
|
|
||
|
Error code from QueryInterface(), normally, internal error.
|
||
|
|
||
|
Note:
|
||
|
|
||
|
|
||
|
Code modified from ATL's IEnumOnSTLImpl::Next()
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
if( ppIHelpSession == NULL || uCount != 1 && pcFetched == NULL )
|
||
|
{
|
||
|
return E_POINTER;
|
||
|
}
|
||
|
|
||
|
if( m_iter == m_pcollection.end() )
|
||
|
{
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
ULONG nActual = 0;
|
||
|
HRESULT hRes = S_OK;
|
||
|
IRemoteDesktopHelpSession** pelt = ppIHelpSession;
|
||
|
|
||
|
while( SUCCEEDED(hRes) && m_iter != m_pcollection.end() && nActual < uCount )
|
||
|
{
|
||
|
hRes = (*m_iter)->QueryInterface(
|
||
|
IID_IRemoteDesktopHelpSession,
|
||
|
reinterpret_cast<void **>(pelt)
|
||
|
);
|
||
|
if( FAILED(hRes) )
|
||
|
{
|
||
|
while( ppIHelpSession < pelt )
|
||
|
{
|
||
|
(*ppIHelpSession)->Release();
|
||
|
ppIHelpSession++;
|
||
|
}
|
||
|
|
||
|
nActual = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pelt++;
|
||
|
m_iter++;
|
||
|
nActual++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( NULL != pcFetched )
|
||
|
{
|
||
|
*pcFetched = nActual;
|
||
|
}
|
||
|
|
||
|
if( SUCCEEDED(hRes) && (nActual < uCount) )
|
||
|
{
|
||
|
hRes = S_FALSE;
|
||
|
}
|
||
|
|
||
|
return hRes;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::Reset()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Reset enumeration from beginning, refer to standard COM enumerator for detail.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
S_OK
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
m_iter = m_pcollection.begin();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::Skip(
|
||
|
IN ULONG celt
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Skip number of items in the list and start enumeration from there.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
celt : number of item to skip.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
S_OK or S_FALSE if end of the list reached.
|
||
|
|
||
|
Note:
|
||
|
|
||
|
Refer to standard COM enumerator for detail.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//
|
||
|
// Code copied from ATL's IEnumOnSTLImpl::Skip()
|
||
|
//
|
||
|
HRESULT hr = S_OK;
|
||
|
while (celt--)
|
||
|
{
|
||
|
if (m_iter != m_pcollection.end())
|
||
|
{
|
||
|
m_iter++;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::Clone(
|
||
|
OUT IRemoteDesktopHelpSessionEnum **ppIEnum
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Make a copy of this enumerator.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
ppIEnum : Return a new enumerator
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
S_OK or E_OUTOFMEMORY.
|
||
|
|
||
|
Note:
|
||
|
|
||
|
Refer to standard COM enumerator for detail.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
HRESULT hRes;
|
||
|
|
||
|
CComObject<CRemoteDesktopHelpSessionEnum>* p = NULL;
|
||
|
hRes = CComObject< CRemoteDesktopHelpSessionEnum >::CreateInstance( &p );
|
||
|
|
||
|
if( SUCCEEDED(hRes) )
|
||
|
{
|
||
|
HelpSessionObjList::iterator it = m_pcollection.begin();
|
||
|
|
||
|
// copy item to new enumerator
|
||
|
for( ; it != m_pcollection.end() && SUCCEEDED(hRes); it++ )
|
||
|
{
|
||
|
// add will addref() to HelpSession object
|
||
|
hRes = p->Add( *it );
|
||
|
}
|
||
|
|
||
|
p->Reset();
|
||
|
hRes = p->QueryInterface( IID_IRemoteDesktopHelpSessionEnum, reinterpret_cast<void **>(ppIEnum) );
|
||
|
}
|
||
|
|
||
|
return hRes;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::get_Count(
|
||
|
OUT long *pVal
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Return number of item in the list.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
pVal : return number of item
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
S_OK
|
||
|
|
||
|
Note:
|
||
|
|
||
|
Refer to standard COM enumerator for detail.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
*pVal = m_pcollection.size();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::get_Item(
|
||
|
IN long Index,
|
||
|
OUT VARIANT *pVal
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Given an index, return item in the list.
|
||
|
|
||
|
Parameters
|
||
|
|
||
|
Index : item index.
|
||
|
pVal : Return (VT_DISPATCH) IRemoteDesktopHelpSession interface.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
E_POINTER, E_FAIL, or S_OK.
|
||
|
|
||
|
Note:
|
||
|
|
||
|
Refer to standard COM enumerator for detail, code
|
||
|
copied from ICollectionOnSTLImpl::get_Item()
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//Index is 1-based
|
||
|
if (pVal == NULL)
|
||
|
{
|
||
|
return E_POINTER;
|
||
|
}
|
||
|
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
Index--;
|
||
|
HelpSessionObjList::iterator iter = m_pcollection.begin();
|
||
|
while (iter != m_pcollection.end() && Index > 0)
|
||
|
{
|
||
|
iter++;
|
||
|
Index--;
|
||
|
}
|
||
|
if (iter != m_pcollection.end())
|
||
|
{
|
||
|
VariantInit(pVal);
|
||
|
|
||
|
pVal->vt = VT_DISPATCH;
|
||
|
hr = (*iter)->QueryInterface( IID_IDispatch, (void **)&(pVal->pdispVal) );
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CRemoteDesktopHelpSessionEnum::get__NewEnum(
|
||
|
LPUNKNOWN *pVal
|
||
|
)
|
||
|
/*++
|
||
|
Routine Description:
|
||
|
|
||
|
Identical to Clone() except this routine exists to support
|
||
|
VB scripting.
|
||
|
|
||
|
Parameters
|
||
|
|
||
|
pVal : Return an IRemoteDesktopHelpSessionEnum interface.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
S_OK, E_OUTOFMEMORY.
|
||
|
|
||
|
Note:
|
||
|
|
||
|
Refer to standard COM enumerator for detail, code copied
|
||
|
from Alhen's WMI provider.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
HRESULT hRes;
|
||
|
HelpSessionObjList::iterator it;
|
||
|
VARIANT * rgVariant = NULL;
|
||
|
|
||
|
typedef CComObject< CComEnum< IEnumVARIANT,&IID_IEnumVARIANT ,VARIANT, _Copy< VARIANT > > > CComEnumSessions;
|
||
|
CComObject< CComEnumSessions > *pEnum = NULL;
|
||
|
|
||
|
hRes = CComObject< CComEnumSessions >::CreateInstance( &pEnum );
|
||
|
if( SUCCEEDED(hRes) )
|
||
|
{
|
||
|
rgVariant = new VARIANT [ m_pcollection.size() ];
|
||
|
|
||
|
if( NULL != rgVariant )
|
||
|
{
|
||
|
VARIANT * pVariant = rgVariant;
|
||
|
|
||
|
// package a list of dispinterfaces to requester
|
||
|
for( it = m_pcollection.begin(); it != m_pcollection.end() && SUCCEEDED(hRes); it++, pVariant++ )
|
||
|
{
|
||
|
pVariant->vt = VT_DISPATCH;
|
||
|
|
||
|
hRes = (*it)->QueryInterface( IID_IDispatch, reinterpret_cast<void **>(&(pVariant->pdispVal)) );
|
||
|
}
|
||
|
|
||
|
if( SUCCEEDED (hRes) )
|
||
|
{
|
||
|
pEnum->AddRef();
|
||
|
|
||
|
hRes = pEnum->Init( &rgVariant[0], &rgVariant[ m_pcollection.size() ] , NULL, AtlFlagTakeOwnership);
|
||
|
|
||
|
if( SUCCEEDED( hRes ) )
|
||
|
{
|
||
|
hRes = pEnum->QueryInterface (
|
||
|
IID_IUnknown,
|
||
|
reinterpret_cast<void **>(pVal)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
pEnum->Release( );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hRes = E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
if( FAILED(hRes) )
|
||
|
{
|
||
|
pEnum->Release();
|
||
|
|
||
|
if( NULL != rgVariant )
|
||
|
{
|
||
|
delete [] rgVariant;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hRes;
|
||
|
}
|