windows-nt/Source/XPSP1/NT/ds/adsi/nw312/cenumns.cxx
2020-09-26 16:20:57 +08:00

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