|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995
//
// File: cfserv.cxx
//
// Contents:
//
// History: April 19, 1996 t-ptam (Patrick Tam) Created.
//
//----------------------------------------------------------------------------
#include "nwcompat.hxx"
#pragma hdrstop
//
// Marco-ized Implementation.
//
DEFINE_IDispatch_ExtMgr_Implementation(CNWCOMPATFileService);
DEFINE_IADs_TempImplementation(CNWCOMPATFileService);
DEFINE_IADs_PutGetImplementation(CNWCOMPATFileService, FileServiceClass,gdwFileServiceTableSize);
DEFINE_IADsPropertyList_Implementation(CNWCOMPATFileService, FileServiceClass, gdwFileServiceTableSize);
//
// class CNWCOMPATFileService methods
//
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::CNWCOMPATFileService
//
// Synopsis:
//
//----------------------------------------------------------------------------
CNWCOMPATFileService::CNWCOMPATFileService(): _pDispMgr(NULL), _pExtMgr(NULL), _ServerName(NULL), _pPropertyCache(NULL) { ENLIST_TRACKING(CNWCOMPATFileService); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::~CNWCOMPATFileService
//
// Synopsis:
//
//----------------------------------------------------------------------------
CNWCOMPATFileService::~CNWCOMPATFileService() { delete _pExtMgr; // created last, destroyed first
delete _pDispMgr;
ADSFREESTRING(_ServerName);
delete _pPropertyCache; }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::CreateFileService
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATFileService::CreateFileService( LPTSTR pszADsParent, LPTSTR pszServerName, LPTSTR pszFileServiceName, DWORD dwObjectState, REFIID riid, void **ppvObj )
{ CNWCOMPATFileService FAR * pFileService = NULL; HRESULT hr = S_OK;
hr = AllocateFileServiceObject( &pFileService ); BAIL_ON_FAILURE(hr);
hr = pFileService->InitializeCoreObject( pszADsParent, pszFileServiceName, TEXT("FileService"), FILESERVICE_SCHEMA_NAME, CLSID_NWCOMPATFileService, dwObjectState ); BAIL_ON_FAILURE(hr);
hr = ADsAllocString( pszServerName , &pFileService->_ServerName); BAIL_ON_FAILURE(hr);
hr = pFileService->QueryInterface( riid, ppvObj ); BAIL_ON_FAILURE(hr);
pFileService->Release();
hr = pFileService->_pExtMgr->FinalInitializeExtensions(); BAIL_ON_FAILURE(hr);
RRETURN(hr);
error:
delete pFileService; RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::AllocateFileServiceObject
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATFileService::AllocateFileServiceObject( CNWCOMPATFileService ** ppFileService ) { CAggregatorDispMgr FAR *pDispMgr = NULL; CADsExtMgr FAR * pExtensionMgr = NULL; CNWCOMPATFileService FAR *pFileService = NULL; HRESULT hr = S_OK;
//
// Allocate memory for a FileService object.
//
pFileService = new CNWCOMPATFileService(); if (pFileService == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
//
// Create a Dispatch Manager object.
//
pDispMgr = new CAggregatorDispMgr; if (pDispMgr == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
//
// Load type info.
//
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsFileService, (IADsFileService *)pFileService, DISPID_REGULAR ); BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsFileServiceOperations, (IADsFileServiceOperations *)pFileService, DISPID_REGULAR ); BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsContainer, (IADsContainer *)pFileService, DISPID_NEWENUM ); BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPropertyList, (IADsPropertyList *)pFileService, DISPID_VALUE ); BAIL_ON_FAILURE(hr);
hr = CPropertyCache::createpropertycache( FileServiceClass, gdwFileServiceTableSize, (CCoreADsObject *)pFileService, &(pFileService->_pPropertyCache) );
BAIL_ON_FAILURE(hr);
(pDispMgr)->RegisterPropertyCache( pFileService->_pPropertyCache );
hr = ADSILoadExtensionManager( FILESERVICE_CLASS_NAME, (IADsFileService *)pFileService, pDispMgr, &pExtensionMgr ); BAIL_ON_FAILURE(hr);
//
// Return.
//
pFileService->_pExtMgr = pExtensionMgr; pFileService->_pDispMgr = pDispMgr; *ppFileService = pFileService;
RRETURN(hr);
error: delete pDispMgr; delete pExtensionMgr; delete pFileService;
RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::QueryInterface
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::QueryInterface( REFIID riid, LPVOID FAR* ppvObj ) { if (ppvObj == NULL) { RRETURN(E_POINTER); }
if (IsEqualIID(riid, IID_IUnknown)) { *ppvObj = (IADsFileService FAR *) this; } else if (IsEqualIID(riid, IID_IDispatch)) { *ppvObj = (IADsFileService FAR *) this; } else if (IsEqualIID(riid, IID_ISupportErrorInfo)) { *ppvObj = (ISupportErrorInfo FAR *) this; } else if (IsEqualIID(riid, IID_IADs)) { *ppvObj = (IADsFileService FAR *) this; } else if (IsEqualIID(riid, IID_IADsPropertyList)) { *ppvObj = (IADsPropertyList FAR *) this; } else if (IsEqualIID(riid, IID_IADsService)) { *ppvObj = (IADsFileService FAR *) this; } else if (IsEqualIID(riid, IID_IADsFileService)) { *ppvObj = (IADsFileService FAR *) this; } else if (IsEqualIID(riid, IID_IADsServiceOperations)) { *ppvObj = (IADsFileServiceOperations FAR *)this; } else if (IsEqualIID(riid, IID_IADsFileServiceOperations)) { *ppvObj = (IADsFileServiceOperations FAR *)this; } else if (IsEqualIID(riid, IID_IADsContainer)) { *ppvObj = (IADsContainer FAR *) this; } else if (_pExtMgr) { RRETURN( _pExtMgr->QueryInterface(riid, ppvObj)); } else { *ppvObj = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; }
//
// ISupportErrorInfo method
//
STDMETHODIMP CNWCOMPATFileService::InterfaceSupportsErrorInfo( THIS_ REFIID riid ) { if (IsEqualIID(riid, IID_IADs) || IsEqualIID(riid, IID_IADsContainer) || IsEqualIID(riid, IID_IADsService) || IsEqualIID(riid, IID_IADsServiceOperations) || IsEqualIID(riid, IID_IADsFileService) || IsEqualIID(riid, IID_IADsFileServiceOperations) || IsEqualIID(riid, IID_IADsPropertyList)) { RRETURN(S_OK); } else { RRETURN(S_FALSE); } }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::get_Count
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::get_Count(long FAR* retval) { //
// Too expensive to implement in term of computer execution time.
//
RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::get_Filter
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::get_Filter(THIS_ VARIANT FAR* pVar) { //
// Filter doesn't make sense on a FileService container, since it
// can only contain FileShares.
//
RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::put_Filter
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::put_Filter(THIS_ VARIANT Var) { //
// Filter doesn't make sense on a FileService container, since it
// can only contain FileShares.
//
RRETURN_EXP_IF_ERR(E_NOTIMPL); }
STDMETHODIMP CNWCOMPATFileService::put_Hints(THIS_ VARIANT Var) { RRETURN_EXP_IF_ERR( E_NOTIMPL); }
STDMETHODIMP CNWCOMPATFileService::get_Hints(THIS_ VARIANT FAR* pVar) { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::GetObject
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::GetObject( THIS_ BSTR ClassName, BSTR RelativeName, IDispatch * FAR* ppObject ) { //
// Will be implemented by Krishna on the WinNT side and be cloned
// by me afterward.
//
RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::get__NewEnum
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::get__NewEnum(THIS_ IUnknown * FAR* retval) { HRESULT hr = S_OK; IEnumVARIANT * pEnum = NULL;
*retval = NULL;
hr = CNWCOMPATFileServiceEnum::Create( (CNWCOMPATFileServiceEnum **) &pEnum, _ADsPath, _ServerName ); BAIL_ON_FAILURE(hr);
hr = pEnum->QueryInterface( IID_IUnknown, (VOID FAR* FAR*) retval ); BAIL_ON_FAILURE(hr);
if (pEnum) { pEnum->Release(); }
RRETURN(NOERROR);
error:
delete pEnum;
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::Create
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::Create( THIS_ BSTR ClassName, BSTR RelativeName, IDispatch * FAR* ppObject ) { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::Delete
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::Delete( THIS_ BSTR bstrClassName, BSTR bstrRelativeName) { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::CopyHere
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::CopyHere( THIS_ BSTR SourceName, BSTR NewName, IDispatch * FAR* ppObject ) { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::MoveHere
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::MoveHere( THIS_ BSTR SourceName, BSTR NewName, IDispatch * FAR* ppObject ) { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::SetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::SetInfo(THIS) { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::GetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::GetInfo(THIS) {
_pPropertyCache->flushpropcache();
RRETURN(GetInfo( TRUE, FSERV_WILD_CARD_ID )); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::GetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATFileService::GetInfo( THIS_ BOOL fExplicit, DWORD dwPropertyID ) { HRESULT hr = S_OK; HRESULT hrTemp = S_OK; NWCONN_HANDLE hConn = NULL; POBJECTINFO pObjectInfo = NULL;
//
// Make sure the object is bound to a tangible resource.
//
if (GetObjectState() == ADS_OBJECT_UNBOUND) { RRETURN_EXP_IF_ERR(E_ADS_OBJECT_UNBOUND); }
//
// Componentize ADs name.
//
hr = BuildObjectInfo( _Parent, _Name, &pObjectInfo ); BAIL_ON_FAILURE(hr);
//
// Get a handle to the bindery this computer object represents.
//
hr = NWApiGetBinderyHandle( &hConn, pObjectInfo->ComponentArray[0] ); BAIL_ON_FAILURE(hr);
//
// Fill in all property caches with values - explicit, or return the
// indicated property - implicit.
//
if (fExplicit) { hr = ExplicitGetInfo( hConn, pObjectInfo, fExplicit ); BAIL_ON_FAILURE(hr); } else { hr = ImplicitGetInfo( hConn, pObjectInfo, dwPropertyID, fExplicit ); BAIL_ON_FAILURE(hr); }
error:
if (pObjectInfo) { FreeObjectInfo(pObjectInfo); }
if (hConn) { hrTemp = NWApiReleaseBinderyHandle(hConn); }
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::ExplicitGetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATFileService::ExplicitGetInfo( NWCONN_HANDLE hConn, POBJECTINFO pObjectInfo, BOOL fExplicit ) { HRESULT hr = S_OK;
//
// Get GeneralInfo.
//
hr = GetProperty_MaxUserCount( hConn, fExplicit ); BAIL_ON_FAILURE(hr);
//
// Get Configuration.
//
hr = GetProperty_HostComputer( pObjectInfo, fExplicit ); BAIL_ON_FAILURE(hr);
error: RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::ImplicitGetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATFileService::ImplicitGetInfo( NWCONN_HANDLE hConn, POBJECTINFO pObjectInfo, DWORD dwPropertyID, BOOL fExplicit ) { HRESULT hr = S_OK;
switch (dwPropertyID) {
case FSERV_MAXUSERCOUNT_ID: hr = GetProperty_MaxUserCount( hConn, fExplicit ); break;
case FSERV_HOSTCOMPUTER_ID: hr = GetProperty_HostComputer( pObjectInfo, fExplicit ); break; }
RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::GetProperty_MaxUserCount
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATFileService::GetProperty_MaxUserCount( NWCONN_HANDLE hConn, BOOL fExplicit ) { HRESULT hr = S_OK; DWORD dwTemp = 0; VERSION_INFO VersionInfo;
//
// Get the Maximum number of connections supported from the Version
// Information of the FileServer.
//
hr = NWApiGetFileServerVersionInfo( hConn, &VersionInfo );
if (SUCCEEDED(hr)) {
dwTemp = VersionInfo.ConnsSupported;
//
// Unmarshall.
//
hr = SetDWORDPropertyInCache(_pPropertyCache, TEXT("MaxUserCount"), (DWORD)dwTemp, fExplicit );
BAIL_ON_FAILURE(hr);
} //
// Not a problem if we couldn't get the info, just ignore it and don't
// put it in the cache.
//
hr = S_OK; error:
RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATFileService::GetProperty_HostComputer
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATFileService::GetProperty_HostComputer( POBJECTINFO pObjectInfo, BOOL fExplicit ) { HRESULT hr = S_OK; WCHAR szBuffer[MAX_PATH];
//
// Build ADs path of Host computer from ObjectInfo.
//
wsprintf( szBuffer, L"%s://%s", pObjectInfo->ProviderName, pObjectInfo->ComponentArray[0] );
//
// Unmarshall
//
hr = SetLPTSTRPropertyInCache( _pPropertyCache, TEXT("HostComputer"), szBuffer, fExplicit );
//
// Return.
//
RRETURN(hr); }
|