242 lines
5.6 KiB
C++
242 lines
5.6 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: cenumvar.cxx
|
|
//
|
|
// Contents: Windows NT 3.5 Enumerator Code
|
|
//
|
|
// CNWCOMPATNamespaceEnum::Create
|
|
// CNWCOMPATNamespaceEnum::CNWCOMPATNamespaceEnum
|
|
// CNWCOMPATNamespaceEnum::~CNWCOMPATNamespaceEnum
|
|
// CNWCOMPATNamespaceEnum::QueryInterface
|
|
// CNWCOMPATNamespaceEnum::AddRef
|
|
// CNWCOMPATNamespaceEnum::Release
|
|
// CNWCOMPATNamespaceEnum::Next
|
|
// CNWCOMPATNamespaceEnum::Skip
|
|
// CNWCOMPATNamespaceEnum::Clone
|
|
//
|
|
// History:
|
|
//----------------------------------------------------------------------------
|
|
#include "NWCOMPAT.hxx"
|
|
#pragma hdrstop
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATNamespaceEnum::Create
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [pCollection]
|
|
// [ppEnumVariant]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 01-30-95 krishnag Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT
|
|
CNWCOMPATNamespaceEnum::Create(
|
|
CNWCOMPATNamespaceEnum FAR* FAR* ppenumvariant
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CNWCOMPATNamespaceEnum FAR* penumvariant = NULL;
|
|
|
|
penumvariant = new CNWCOMPATNamespaceEnum();
|
|
|
|
if (penumvariant == NULL){
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
hr = NWApiGetAnyBinderyHandle(
|
|
&penumvariant->_hConn
|
|
);
|
|
|
|
*ppenumvariant = penumvariant;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (penumvariant) {
|
|
delete penumvariant;
|
|
}
|
|
|
|
RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATNamespaceEnum::CNWCOMPATNamespaceEnum
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 01-30-95 krishnag Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CNWCOMPATNamespaceEnum::CNWCOMPATNamespaceEnum()
|
|
{
|
|
_dwResumeObjectID = 0xffffffff;
|
|
_hConn = NULL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATNamespaceEnum::~CNWCOMPATNamespaceEnum
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 01-30-95 krishnag Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CNWCOMPATNamespaceEnum::~CNWCOMPATNamespaceEnum()
|
|
{
|
|
if (_hConn) {
|
|
NWApiReleaseBinderyHandle(_hConn);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATNamespaceEnum::Next
|
|
//
|
|
// Synopsis: Returns cElements number of requested ADs objects in the
|
|
// array supplied in pvar.
|
|
//
|
|
// Arguments: [cElements] -- The number of elements requested by client
|
|
// [pvar] -- ptr to array of VARIANTs to for return objects
|
|
// [pcElementFetched] -- if non-NULL, then number of elements
|
|
// -- actually returned is placed here
|
|
//
|
|
// Returns: HRESULT -- S_OK if number of elements requested are returned
|
|
// -- S_FALSE if number of elements is < requested
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
STDMETHODIMP
|
|
CNWCOMPATNamespaceEnum::Next(
|
|
ULONG cElements,
|
|
VARIANT FAR* pvar,
|
|
ULONG FAR* pcElementFetched
|
|
)
|
|
{
|
|
ULONG cElementFetched = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = EnumComputers(
|
|
cElements,
|
|
pvar,
|
|
&cElementFetched
|
|
);
|
|
|
|
if (pcElementFetched) {
|
|
*pcElementFetched = cElementFetched;
|
|
}
|
|
RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATNamespaceEnum::EnumComputers
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CNWCOMPATNamespaceEnum::EnumComputers(
|
|
ULONG cElements,
|
|
VARIANT FAR* pvar,
|
|
ULONG FAR* pcElementFetched
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IDispatch *pDispatch = NULL;
|
|
DWORD i = 0;
|
|
|
|
while (i < cElements) {
|
|
|
|
hr = GetComputerObject(&pDispatch);
|
|
if (hr == S_FALSE) {
|
|
break;
|
|
}
|
|
|
|
VariantInit(&pvar[i]);
|
|
pvar[i].vt = VT_DISPATCH;
|
|
pvar[i].pdispVal = pDispatch;
|
|
(*pcElementFetched)++;
|
|
i++;
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATNamespaceEnum::GetComputerObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CNWCOMPATNamespaceEnum::GetComputerObject(
|
|
IDispatch ** ppDispatch
|
|
)
|
|
{
|
|
LPWSTR pszObjectName = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
*ppDispatch = NULL;
|
|
|
|
hr = NWApiObjectEnum(
|
|
_hConn,
|
|
OT_FILE_SERVER,
|
|
&pszObjectName,
|
|
&_dwResumeObjectID
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Now send back the current object
|
|
//
|
|
|
|
hr = CNWCOMPATComputer::CreateComputer(
|
|
bstrProviderPrefix,
|
|
pszObjectName,
|
|
ADS_OBJECT_BOUND,
|
|
IID_IDispatch,
|
|
(void **)ppDispatch
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
error:
|
|
if (pszObjectName) {
|
|
FreeADsStr(pszObjectName);
|
|
}
|
|
|
|
RRETURN_ENUM_STATUS(hr);
|
|
}
|