278 lines
5.9 KiB
C++
278 lines
5.9 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: cenumfs.cxx
|
|
//
|
|
// Contents: NetWare 3.X Enumerator Code
|
|
//
|
|
// CNWCOMPATFileServiceEnum::Create
|
|
// CNWCOMPATFileServiceEnum::CNWCOMPATFileServiceEnum
|
|
// CNWCOMPATFileServiceEnum::~CNWCOMPATFileServiceEnum
|
|
// CNWCOMPATFileServiceEnum::Next
|
|
//
|
|
// History:
|
|
//----------------------------------------------------------------------------
|
|
#include "NWCOMPAT.hxx"
|
|
#pragma hdrstop
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATFileServiceEnum::Create
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT
|
|
CNWCOMPATFileServiceEnum::Create(
|
|
CNWCOMPATFileServiceEnum FAR* FAR* ppEnumVariant,
|
|
BSTR ADsPath,
|
|
BSTR bstrServerName,
|
|
CCredentials &Credentials
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CNWCOMPATFileServiceEnum FAR* pEnumVariant = NULL;
|
|
|
|
pEnumVariant = new CNWCOMPATFileServiceEnum();
|
|
if (pEnumVariant == NULL){
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
//
|
|
// Get a handle to the bindery (FileServer) that is going to be enumerated
|
|
// on.
|
|
//
|
|
|
|
hr = NWApiGetBinderyHandle(
|
|
&pEnumVariant->_hConn,
|
|
bstrServerName,
|
|
Credentials
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Get FileServer VersionInfo. The Version Info structure has the maximum
|
|
// number of volumes.
|
|
//
|
|
|
|
hr = NWApiGetFileServerVersionInfo(
|
|
pEnumVariant->_hConn,
|
|
&pEnumVariant->_FileServerInfo
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Save ADsPath.
|
|
//
|
|
|
|
hr = ADsAllocString(ADsPath, &pEnumVariant->_ADsPath);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Save Credentials
|
|
//
|
|
pEnumVariant->_Credentials = Credentials;
|
|
|
|
//
|
|
// Return.
|
|
//
|
|
|
|
*ppEnumVariant = pEnumVariant;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
delete pEnumVariant;
|
|
|
|
NW_RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATFileServiceEnum::CNWCOMPATFileServiceEnum
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CNWCOMPATFileServiceEnum::CNWCOMPATFileServiceEnum():
|
|
|
|
_ADsPath(NULL),
|
|
_bResumeVolumeID(0),
|
|
_hConn(NULL)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CNWCOMPATFileServiceEnum::~CNWCOMPATFileServiceEnum()
|
|
{
|
|
if (_ADsPath)
|
|
SysFreeString(_ADsPath);
|
|
if (_hConn)
|
|
NWApiReleaseBinderyHandle(_hConn);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
STDMETHODIMP
|
|
CNWCOMPATFileServiceEnum::Next(
|
|
ULONG cElements,
|
|
VARIANT FAR* pvar,
|
|
ULONG FAR* pcElementFetched
|
|
)
|
|
{
|
|
ULONG cElementFetched = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = EnumFileShares(
|
|
cElements,
|
|
pvar,
|
|
&cElementFetched
|
|
);
|
|
|
|
if (pcElementFetched) {
|
|
*pcElementFetched = cElementFetched;
|
|
}
|
|
|
|
NW_RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATFileServiceEnum::EnumFileShares
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT
|
|
CNWCOMPATFileServiceEnum::EnumFileShares(
|
|
ULONG cElements,
|
|
VARIANT FAR* pvar,
|
|
ULONG FAR* pcElementFetched
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IDispatch *pDispatch = NULL;
|
|
DWORD i = 0;
|
|
|
|
while (i < cElements) {
|
|
|
|
hr = GetFileShareObject(&pDispatch);
|
|
if (hr == S_FALSE) {
|
|
break;
|
|
}
|
|
|
|
VariantInit(&pvar[i]);
|
|
pvar[i].vt = VT_DISPATCH;
|
|
pvar[i].pdispVal = pDispatch;
|
|
(*pcElementFetched)++;
|
|
i++;
|
|
}
|
|
|
|
return(hr);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CNWCOMPATFileServiceEnum::GetFileShareObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT
|
|
CNWCOMPATFileServiceEnum::GetFileShareObject(
|
|
IDispatch ** ppDispatch
|
|
)
|
|
{
|
|
LPTSTR pszObjectName = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
*ppDispatch = NULL;
|
|
|
|
//
|
|
// Since Volume Number of defined Volume doesn't necessarily exist in
|
|
// consecutive chunk, a loop is needed to skip all the "holes".
|
|
//
|
|
|
|
while (_bResumeVolumeID < _FileServerInfo.maxVolumes) {
|
|
|
|
//
|
|
// Get the name of the next Volume.
|
|
//
|
|
|
|
hr = NWApiGetVolumeName(
|
|
_hConn,
|
|
_bResumeVolumeID,
|
|
&pszObjectName
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
if (wcscmp(pszObjectName, L"")) {
|
|
|
|
break;
|
|
}
|
|
else {
|
|
|
|
_bResumeVolumeID++;
|
|
}
|
|
|
|
if (pszObjectName){
|
|
FreeADsStr(pszObjectName);
|
|
pszObjectName = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Check if the last volume was reached already.
|
|
//
|
|
|
|
if (_bResumeVolumeID >= _FileServerInfo.maxVolumes) {
|
|
RRETURN(S_FALSE);
|
|
}
|
|
|
|
//
|
|
// Create a FileShare object.
|
|
//
|
|
|
|
hr = CNWCOMPATFileShare::CreateFileShare(
|
|
_ADsPath,
|
|
pszObjectName,
|
|
_Credentials,
|
|
ADS_OBJECT_BOUND,
|
|
IID_IDispatch,
|
|
(void **)ppDispatch
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Increase the current volume number.
|
|
//
|
|
|
|
_bResumeVolumeID++;
|
|
|
|
//
|
|
// Return.
|
|
//
|
|
|
|
error:
|
|
if (pszObjectName) {
|
|
FreeADsStr(pszObjectName);
|
|
}
|
|
|
|
RRETURN_ENUM_STATUS(hr);
|
|
}
|