Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1510 lines
35 KiB

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995
//
// File: cfserv.cxx
//
// Contents: Contains methods for the following objects
// CWinNTFileService and CWinNTFileServiceGeneralInfo.
//
//
// History: 12/11/95 ramv (Ram Viswanathan) Created.
//
//----------------------------------------------------------------------------
#include "winnt.hxx"
#pragma hdrstop
#define INITGUID
//
// class CWinNTFileService methods
//
DEFINE_IDispatch_ExtMgr_Implementation(CWinNTFileService);
DEFINE_IADsExtension_ExtMgr_Implementation(CWinNTFileService);
DEFINE_IADs_TempImplementation(CWinNTFileService);
DEFINE_IADsPropertyList_Implementation(CWinNTFileService, FileServiceClass, gdwFileServiceTableSize)
CWinNTFileService::CWinNTFileService()
{
_pDispMgr = NULL;
_pExtMgr = NULL;
_pService = NULL;
_pServiceOps = NULL;
_pszServerName = NULL;
VariantInit(&_vFilter);
_pPropertyCache = NULL;
ENLIST_TRACKING(CWinNTFileService);
return;
}
CWinNTFileService::~CWinNTFileService()
{
if(_pService){
_pService->Release();
}
if (_pServiceOps) {
_pServiceOps->Release();
}
delete _pExtMgr; // created last, destroyed first
delete _pDispMgr;
if(_pszServerName){
FreeADsStr(_pszServerName);
}
VariantClear(&_vFilter);
delete _pPropertyCache;
return;
}
//+---------------------------------------------------------------------------
//
// Function: CWinNTFileService::CreateFileService
//
// Synopsis: Static function used to create a FileService object. This
// will be called by BindToObject
//
// Arguments: [ppWinNTFileService] -- Ptr to a ptr to a new Service object.
//
// Returns: HRESULT.
//
// Modifies:
//
// History: 12-11-95 RamV Created.
//
//----------------------------------------------------------------------------
HRESULT
CWinNTFileService::CreateFileService(LPTSTR pszADsParent,
DWORD dwParentId,
LPTSTR pszDomainName,
LPTSTR pszServerName,
LPTSTR pszFileServiceName,
DWORD dwObjectState,
REFIID riid,
CWinNTCredentials& Credentials,
LPVOID * ppvoid
)
{
CWinNTFileService FAR * pCWinNTFileService = NULL;
HRESULT hr = S_OK;
//
// Create the FileService Object
//
hr = AllocateFileServiceObject(&pCWinNTFileService);
BAIL_ON_FAILURE(hr);
ADsAssert(pCWinNTFileService->_pDispMgr);
hr = pCWinNTFileService->InitializeCoreObject(pszADsParent,
pszFileServiceName,
FILESERVICE_CLASS_NAME,
FILESERVICE_SCHEMA_NAME,
CLSID_WinNTFileService,
dwObjectState);
BAIL_ON_FAILURE(hr);
pCWinNTFileService->_Credentials = Credentials;
hr = pCWinNTFileService->_Credentials.Ref(pszServerName,
pszDomainName, dwParentId);
BAIL_ON_FAILURE(hr);
hr = CWinNTService::Create(pszADsParent,
pszDomainName,
pszServerName,
pszFileServiceName,
dwObjectState,
IID_IADsService,
pCWinNTFileService->_Credentials,
(void **)(&(pCWinNTFileService->_pService)));
BAIL_ON_FAILURE(hr);
hr = (pCWinNTFileService->_pService)->QueryInterface(
IID_IADsServiceOperations,
(void **)&(pCWinNTFileService->_pServiceOps));
BAIL_ON_FAILURE(hr);
pCWinNTFileService->_pszServerName =
AllocADsStr(pszServerName);
if(!(pCWinNTFileService->_pszServerName)){
hr = E_OUTOFMEMORY;
goto error;
}
//
// Load ext mgr and extensions
//
hr = ADSILoadExtensionManager(
FILESERVICE_CLASS_NAME,
(IADsFileService *) pCWinNTFileService,
pCWinNTFileService->_pDispMgr,
Credentials,
&pCWinNTFileService->_pExtMgr
);
BAIL_ON_FAILURE(hr);
ADsAssert(pCWinNTFileService->_pExtMgr);
// check if the call is from UMI
if(Credentials.GetFlags() & ADS_AUTH_RESERVED) {
//
// we do not pass riid to InitUmiObject below. This is because UMI object
// does not support IDispatch. There are several places in ADSI code where
// riid passed into this function is defaulted to IID_IDispatch -
// IADsContainer::Create for example. To handle these cases, we always
// request IID_IUnknown from the UMI object. Subsequent code within UMI
// will QI for the appropriate interface.
//
if(3 == pCWinNTFileService->_dwNumComponents) {
pCWinNTFileService->_CompClasses[0] = L"Domain";
pCWinNTFileService->_CompClasses[1] = L"Computer";
pCWinNTFileService->_CompClasses[2] = L"FileService";
}
else
BAIL_ON_FAILURE(hr = UMI_E_FAIL);
hr = pCWinNTFileService->InitUmiObject(
pCWinNTFileService->_Credentials,
FileServiceClass,
gdwFileServiceTableSize,
pCWinNTFileService->_pPropertyCache,
(IUnknown *) (INonDelegatingUnknown *) pCWinNTFileService,
pCWinNTFileService->_pExtMgr,
IID_IUnknown,
ppvoid
);
BAIL_ON_FAILURE(hr);
//
// UMI object was created and the interface was obtained successfully.
// UMI object now has a reference to the inner unknown of IADs, since
// the call to Release() below is not going to be made in this case.
//
RRETURN(hr);
}
hr = pCWinNTFileService->QueryInterface(riid,
(void **)ppvoid);
BAIL_ON_FAILURE(hr);
pCWinNTFileService->Release();
RRETURN(hr);
error:
delete pCWinNTFileService;
RRETURN_EXP_IF_ERR(hr);
}
HRESULT
CWinNTFileService::AllocateFileServiceObject(
CWinNTFileService ** ppFileService
)
{
CWinNTFileService FAR * pFileService = NULL;
HRESULT hr = S_OK;
pFileService = new CWinNTFileService();
if (pFileService == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pFileService->_pDispMgr = new CAggregatorDispMgr;
if (pFileService->_pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(pFileService->_pDispMgr,
LIBID_ADs,
IID_IADsFileService,
(IADsFileService *)pFileService,
DISPID_REGULAR);
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(pFileService->_pDispMgr,
LIBID_ADs,
IID_IADsContainer,
(IADsContainer *)pFileService,
DISPID_NEWENUM);
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pFileService->_pDispMgr,
LIBID_ADs,
IID_IADsFileServiceOperations,
(IADsFileServiceOperations *)pFileService,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pFileService->_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);
(pFileService->_pDispMgr)->RegisterPropertyCache(
pFileService->_pPropertyCache
);
*ppFileService = pFileService;
RRETURN(hr);
error:
//
// direct memeber assignement assignement at pt of creation, so
// do NOT delete _pPropertyCache or _pDisMgr here to avoid attempt
// of deletion again in pPrintJob destructor and AV
//
delete pFileService;
RRETURN(hr);
}
/* IUnknown methods for file service object */
//----------------------------------------------------------------------------
// Function: QueryInterface
//
// Synopsis: If this object is aggregated within another object, then
// all calls will delegate to the outer object. Otherwise, the
// non-delegating QI is called
//
// Arguments:
//
// iid interface requested
// ppInterface Returns pointer to interface requested. NULL if interface
// is not supported.
//
// Returns: S_OK on success. Error code otherwise.
//
// Modifies: *ppInterface to return interface pointer
//
//----------------------------------------------------------------------------
STDMETHODIMP CWinNTFileService::QueryInterface(
REFIID iid,
LPVOID *ppInterface
)
{
if(_pUnkOuter != NULL)
RRETURN(_pUnkOuter->QueryInterface(
iid,
ppInterface
));
RRETURN(NonDelegatingQueryInterface(
iid,
ppInterface
));
}
//----------------------------------------------------------------------------
// Function: AddRef
//
// Synopsis: IUnknown::AddRef. If this object is aggregated within
// another, all calls will delegate to the outer object.
// Otherwise, the non-delegating AddRef is called
//
// Arguments:
//
// None
//
// Returns: New reference count
//
// Modifies: Nothing
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CWinNTFileService::AddRef(void)
{
if(_pUnkOuter != NULL)
RRETURN(_pUnkOuter->AddRef());
RRETURN(NonDelegatingAddRef());
}
//----------------------------------------------------------------------------
// Function: Release
//
// Synopsis: IUnknown::Release. If this object is aggregated within
// another, all calls will delegate to the outer object.
// Otherwise, the non-delegating Release is called
//
// Arguments:
//
// None
//
// Returns: New reference count
//
// Modifies: Nothing
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CWinNTFileService::Release(void)
{
if(_pUnkOuter != NULL)
RRETURN(_pUnkOuter->Release());
RRETURN(NonDelegatingRelease());
}
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::NonDelegatingQueryInterface(REFIID riid, LPVOID FAR* ppvObj)
{
HRESULT hr = S_OK;
if(!ppvObj){
RRETURN(E_POINTER);
}
if (IsEqualIID(riid, IID_IUnknown))
{
*ppvObj = (IADsFileService*)this;
}
else if (IsEqualIID(riid, IID_IDispatch))
{
*ppvObj = (IADsFileService *)this;
}
else if (IsEqualIID(riid, IID_ISupportErrorInfo))
{
*ppvObj = (ISupportErrorInfo FAR *) this;
}
else if (IsEqualIID(riid, IID_IADsFileServiceOperations))
{
*ppvObj = (IADsFileServiceOperations *)this;
}
else if (IsEqualIID(riid, IID_IADsServiceOperations))
{
*ppvObj = (IADsFileServiceOperations *)this;
}
else if (IsEqualIID(riid, IID_IADs))
{
*ppvObj = (IADsFileService FAR *) this;
}
else if (IsEqualIID(riid, IID_IADsFileService))
{
*ppvObj = (IADsFileService FAR *) this;
}
else if (IsEqualIID(riid, IID_IADsPropertyList))
{
*ppvObj = (IADsPropertyList FAR *) this;
}
else if (IsEqualIID(riid, IID_IADsService))
{
*ppvObj = (IADsService FAR *) this;
}
else if (IsEqualIID(riid, IID_IADsContainer))
{
*ppvObj = (IADsContainer FAR *) this;
}
else if( (_pDispatch != NULL) &&
IsEqualIID(riid, IID_IADsExtension) )
{
*ppvObj = (IADsExtension *) this;
}
else if (_pExtMgr)
{
RRETURN( _pExtMgr->QueryInterface(riid, ppvObj));
}
else
{
*ppvObj = NULL;
RRETURN(E_NOINTERFACE);
}
((LPUNKNOWN)*ppvObj)->AddRef();
RRETURN(S_OK);
}
/* ISupportErrorInfo method */
STDMETHODIMP
CWinNTFileService::InterfaceSupportsErrorInfo(
THIS_ REFIID riid
)
{
if (IsEqualIID(riid, IID_IADs) ||
IsEqualIID(riid, IID_IADsService) ||
IsEqualIID(riid, IID_IADsFileService) ||
IsEqualIID(riid, IID_IADsServiceOperations) ||
IsEqualIID(riid, IID_IADsFileServiceOperations) ||
IsEqualIID(riid, IID_IADsContainer) ||
IsEqualIID(riid, IID_IADsPropertyList)) {
RRETURN(S_OK);
} else {
RRETURN(S_FALSE);
}
}
//+---------------------------------------------------------------------------
//
// Function: SetInfo
//
// Synopsis:
//
// Arguments: void
//
// Returns: HRESULT.
//
// Modifies:
//
// History: RamV Created
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::SetInfo(THIS)
{
HRESULT hr;
IADsService * pADsService = NULL;
ADsAssert(_pService);
hr = _pService->SetInfo();
BAIL_IF_ERROR(hr);
hr = SetLevel1005Info();
if(SUCCEEDED(hr))
_pPropertyCache->ClearModifiedFlags();
cleanup:
RRETURN_EXP_IF_ERR(hr);
}
//+---------------------------------------------------------------------------
//
// Function: GetInfo
//
// Synopsis:
//
// Arguments: void
//
// Returns: HRESULT.
//
// Modifies:
//
// History: 12/11/95 RamV Created
//
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::GetInfo(THIS)
{
HRESULT hr =S_OK;
hr = GetInfo(1, TRUE);
if(FAILED(hr))
RRETURN_EXP_IF_ERR(hr);
hr = GetInfo(2,TRUE);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::ImplicitGetInfo(THIS)
{
HRESULT hr =S_OK;
hr = GetInfo(1, FALSE);
if(FAILED(hr))
RRETURN_EXP_IF_ERR(hr);
hr = GetInfo(2,FALSE);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::GetInfo(THIS_ DWORD dwApiLevel, BOOL fExplicit)
{
HRESULT hr =S_OK;
switch(dwApiLevel){
case 1:
ADsAssert(_pService);
hr = _pService->GetInfo();
BAIL_IF_ERROR(hr);
break;
case 2:
hr = GetLevel101Info(fExplicit);
BAIL_IF_ERROR(hr);
break;
default:
ADsAssert(FALSE);
break;
}
cleanup:
RRETURN (hr);
}
STDMETHODIMP
CWinNTFileService::SetLevel1005Info(THIS)
{
SERVER_INFO_1005 ServerInfo;
NET_API_STATUS nasStatus;
HRESULT hr = S_OK;
LPTSTR pszDescription = NULL;
memset(&ServerInfo, 0, sizeof(ServerInfo));
hr = GetLPTSTRPropertyFromCache(
_pPropertyCache,
TEXT("Description"),
&pszDescription
);
if(SUCCEEDED(hr)){
ServerInfo.sv1005_comment = pszDescription;
}
nasStatus = NetServerSetInfo(_pszServerName,
1005,
(LPBYTE)(&ServerInfo),
NULL
);
hr = HRESULT_FROM_WIN32(nasStatus);
if(pszDescription){
FreeADsStr(pszDescription);
}
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::GetLevel101Info(THIS_ BOOL fExplicit)
{
//
// here we do a NetServerGetInfo on level101 and then unmarshall the
// comment field into description
//
NET_API_STATUS nasStatus;
LPSERVER_INFO_101 lpServerInfo =NULL;
HRESULT hr;
//
// level 101 is available with user permissions,
// Level 1005 is preferable but exists only in LanMan 2.0
//
nasStatus = NetServerGetInfo(_pszServerName,
101,
(LPBYTE *)&lpServerInfo
);
hr = HRESULT_FROM_WIN32(nasStatus);
BAIL_IF_ERROR(hr);
//
// unmarshall the info into the Description field
//
ADsAssert(lpServerInfo);
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
TEXT("Description"),
lpServerInfo->sv101_comment,
fExplicit
);
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
TEXT("HostComputer"),
_Parent,
fExplicit
);
hr = SetDWORDPropertyInCache(_pPropertyCache,
TEXT("MaxUserCount"),
(DWORD)-1,
fExplicit
);
hr = SetLPTSTRPropertyInCache(
_pPropertyCache,
TEXT("Name"),
_Name,
fExplicit
);
hr = S_OK;
cleanup:
if(lpServerInfo)
NetApiBufferFree(lpServerInfo);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::Get(
THIS_ BSTR bstrName,
VARIANT FAR* pvProp
)
{
HRESULT hr = S_OK;
hr= _pService->Get(bstrName, pvProp );
if(FAILED(hr)){
hr = GenericGetPropertyManager(
_pPropertyCache,
bstrName,
pvProp
);
}
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::Put(
THIS_ BSTR bstrName,
VARIANT vProp
)
{
HRESULT hr = S_OK;
hr= _pService->Put(bstrName, vProp );
if(FAILED(hr)){
hr = GenericPutPropertyManager(_pPropertyCache,
FileServiceClass,
gdwFileServiceTableSize,
bstrName,
vProp);
}
RRETURN_EXP_IF_ERR(hr);
}
//
// IADsService Methods
//
/* IADsContainer methods */
STDMETHODIMP
CWinNTFileService::get_Count(long FAR* retval)
{
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
}
STDMETHODIMP
CWinNTFileService::get_Filter(THIS_ VARIANT FAR* pVar)
{
HRESULT hr;
VariantInit(pVar);
hr = VariantCopy(pVar, &_vFilter);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_Filter(THIS_ VARIANT Var)
{
HRESULT hr;
RRETURN(VariantCopy(&_vFilter, &Var));
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::GetObject(THIS_ BSTR ClassName,
BSTR RelativeName,
IDispatch * FAR* ppObject
)
{
HRESULT hr;
DWORD dwObjectType;
POBJECTINFO pObjectInfo = NULL;
hr = GetObjectType(gpFilters,
gdwMaxFilters,
ClassName,
(PDWORD)&dwObjectType
);
BAIL_IF_ERROR(hr);
if(dwObjectType != WINNT_FILESHARE_ID){
//
// trying to create an invalid object at this level
//
hr = E_FAIL;
goto error;
}
hr = BuildObjectInfo(_ADsPath,
RelativeName,
&pObjectInfo
);
BAIL_ON_FAILURE(hr);
hr = ValidateObject(dwObjectType,
pObjectInfo,
_Credentials
);
BAIL_ON_FAILURE(hr);
//
// The only object that has a file service as a container is
// a file share object
//
hr = CWinNTFileShare::Create(_ADsPath,
pObjectInfo->ComponentArray[1],
pObjectInfo->ComponentArray[2],
RelativeName,
ADS_OBJECT_UNBOUND,
IID_IDispatch,
_Credentials,
(void**)ppObject
);
BAIL_ON_FAILURE(hr);
error:
cleanup:
FreeObjectInfo(pObjectInfo);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get__NewEnum(THIS_ IUnknown * FAR* retval)
{
HRESULT hr = S_OK;
CWinNTFileSharesEnumVar *pCFileSharesEnumVar = NULL;
if(!retval){
RRETURN_EXP_IF_ERR(E_POINTER);
}
*retval = NULL;
hr = CWinNTFileSharesEnumVar::Create(_pszServerName,
_ADsPath,
&pCFileSharesEnumVar,
_vFilter,
_Credentials);
BAIL_ON_FAILURE(hr);
ADsAssert(pCFileSharesEnumVar);
hr = pCFileSharesEnumVar->QueryInterface(IID_IUnknown,
(void **)retval);
BAIL_ON_FAILURE(hr);
pCFileSharesEnumVar->Release();
RRETURN(hr);
error:
delete pCFileSharesEnumVar;
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::Create(THIS_ BSTR ClassName,
BSTR RelativeName,
IDispatch * FAR* ppObject
)
{
DWORD dwObjectType = 0;
HRESULT hr = S_OK;
POBJECTINFO pObjectInfo = NULL;
hr = GetObjectType(gpFilters,
gdwMaxFilters,
ClassName,
(PDWORD)&dwObjectType
);
BAIL_IF_ERROR(hr);
if(dwObjectType != WINNT_FILESHARE_ID){
//
// trying to create an invalid object at this level
//
hr = E_FAIL;
goto error;
}
hr = BuildObjectInfo(_ADsPath,
RelativeName,
&pObjectInfo
);
BAIL_ON_FAILURE(hr);
hr = ValidateObject(dwObjectType,
pObjectInfo,
_Credentials
);
if(SUCCEEDED(hr)){
hr = E_ADS_OBJECT_EXISTS;
goto error;
}
//
// The only object that has a file service as a container is
// a file share object
hr = CWinNTFileShare::Create(_ADsPath,
pObjectInfo->ComponentArray[1],
pObjectInfo->ComponentArray[2],
RelativeName,
ADS_OBJECT_UNBOUND,
IID_IDispatch,
_Credentials,
(void**)ppObject
);
BAIL_ON_FAILURE(hr);
error:
cleanup:
FreeObjectInfo(pObjectInfo);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::Delete(THIS_ BSTR Type,
BSTR SourceName
)
{
HRESULT hr;
DWORD dwObjectType = 0;
POBJECTINFO pObjectInfo = NULL;
// Make sure the input parameters are valid
if (Type == NULL || SourceName == NULL) {
RRETURN_EXP_IF_ERR(hr = E_ADS_BAD_PARAMETER);
}
hr = GetObjectType(gpFilters,
gdwMaxFilters,
Type,
(PDWORD)&dwObjectType
);
BAIL_IF_ERROR(hr);
if(dwObjectType != WINNT_FILESHARE_ID){
//
// trying to delete an invalid object at this level
//
hr = E_FAIL;
goto cleanup;
}
hr = BuildObjectInfo(_ADsPath,
SourceName,
&pObjectInfo
);
BAIL_IF_ERROR(hr);
hr = WinNTDeleteFileShare(pObjectInfo);
cleanup:
FreeObjectInfo(pObjectInfo);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_Hints(THIS_ VARIANT Var)
{
RRETURN_EXP_IF_ERR( E_NOTIMPL);
}
STDMETHODIMP
CWinNTFileService::get_Hints(THIS_ VARIANT FAR* pVar)
{
RRETURN_EXP_IF_ERR(E_NOTIMPL);
}
STDMETHODIMP
CWinNTFileService::CopyHere(THIS_ BSTR SourceName,
BSTR NewName,
IDispatch * FAR* ppObject
)
{
RRETURN_EXP_IF_ERR(E_NOTIMPL);
}
STDMETHODIMP
CWinNTFileService::MoveHere(THIS_ BSTR SourceName,
BSTR NewName,
IDispatch * FAR* ppObject
)
{
RRETURN_EXP_IF_ERR(E_NOTIMPL);
}
STDMETHODIMP
CWinNTFileService::get_Description(THIS_ BSTR FAR* retval)
{
GET_PROPERTY_BSTR((IADsFileService *)this, Description);
}
STDMETHODIMP
CWinNTFileService::put_Description(THIS_ BSTR bstrDescription)
{
PUT_PROPERTY_BSTR((IADsFileService *)this, Description);
}
STDMETHODIMP
CWinNTFileService::get_MaxUserCount(THIS_ long FAR* retval)
{
//
// here -1 signifies no limit
//
if(!retval){
RRETURN_EXP_IF_ERR(E_POINTER);
}
*retval = -1;
RRETURN(S_OK);
}
STDMETHODIMP CWinNTFileService::put_MaxUserCount(THIS_ long lnMaxUserCount)
{
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
}
STDMETHODIMP
CWinNTFileService::Sessions(THIS_ IADsCollection FAR* FAR* ppSessions)
{
//
// The session collection object is created and it is passed the server
// name. It uses this to create the session object
//
HRESULT hr = S_OK;
CWinNTSessionsCollection * pSessionsCollection = NULL;
if(!ppSessions){
RRETURN_EXP_IF_ERR(E_POINTER);
}
hr = CWinNTSessionsCollection::Create(_ADsPath,
NULL,
NULL,
_Credentials,
&pSessionsCollection
);
BAIL_IF_ERROR(hr);
hr = pSessionsCollection->QueryInterface(IID_IADsCollection,
(void **) ppSessions);
BAIL_IF_ERROR(hr);
pSessionsCollection->Release();
cleanup:
if(FAILED(hr)){
delete pSessionsCollection;
}
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::Resources(THIS_ IADsCollection FAR* FAR* ppResources)
{
//
// The resource collection object is created and it is passed the server
// name. It uses this to create the resource object
//
HRESULT hr = S_OK;
CWinNTResourcesCollection * pResourcesCollection = NULL;
if(!ppResources){
RRETURN_EXP_IF_ERR(E_POINTER);
}
hr = CWinNTResourcesCollection::Create(_ADsPath,
NULL,
NULL,
_Credentials,
&pResourcesCollection
);
BAIL_IF_ERROR(hr);
hr = pResourcesCollection->QueryInterface(IID_IADsCollection,
(void **) ppResources
);
BAIL_IF_ERROR(hr);
pResourcesCollection->Release();
cleanup:
if(FAILED(hr)){
delete pResourcesCollection;
}
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_HostComputer(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_HostComputer(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_HostComputer(THIS_ BSTR bstrHostComputer)
{
HRESULT hr;
hr = _pService->put_HostComputer(bstrHostComputer);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_DisplayName(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_DisplayName(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_DisplayName(THIS_ BSTR bstrDisplayName)
{
HRESULT hr;
hr = _pService->put_DisplayName(bstrDisplayName);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_Version(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_Version(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_Version(THIS_ BSTR bstrVersion)
{
HRESULT hr;
hr = _pService->put_Version(bstrVersion);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_ServiceType(THIS_ long FAR* retval)
{
HRESULT hr;
hr = _pService->get_ServiceType(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_ServiceType(THIS_ long lServiceType)
{
HRESULT hr;
hr = _pService->put_ServiceType(lServiceType);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_StartType(THIS_ LONG FAR* retval)
{
HRESULT hr;
hr = _pService->get_StartType(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_StartType(THIS_ LONG lStartType)
{
HRESULT hr;
hr = _pService->put_StartType(lStartType);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_Path(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_Path(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_Path(THIS_ BSTR bstrPath)
{
HRESULT hr;
hr = _pService->put_Path(bstrPath);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_StartupParameters(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_StartupParameters(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_StartupParameters(THIS_ BSTR bstrStartupParameters)
{
HRESULT hr;
hr = _pService->put_StartupParameters(bstrStartupParameters);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_ErrorControl(THIS_ LONG FAR* retval)
{
HRESULT hr;
hr = _pService->get_ErrorControl(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_ErrorControl(THIS_ LONG lErrorControl)
{
HRESULT hr;
hr = _pService->put_ErrorControl(lErrorControl);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_LoadOrderGroup(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_LoadOrderGroup(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_LoadOrderGroup(THIS_ BSTR bstrLoadOrderGroup)
{
HRESULT hr;
hr = _pService->put_LoadOrderGroup(bstrLoadOrderGroup);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_ServiceAccountName(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_ServiceAccountName(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_ServiceAccountName(THIS_ BSTR bstrServiceAccountName)
{
HRESULT hr;
hr = _pService->put_ServiceAccountName(bstrServiceAccountName);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_ServiceAccountPath(THIS_ BSTR FAR* retval)
{
HRESULT hr;
hr = _pService->get_ServiceAccountPath(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_ServiceAccountPath(THIS_ BSTR bstrServiceAccountName)
{
HRESULT hr;
hr = _pService->put_ServiceAccountPath(bstrServiceAccountName);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_Dependencies(THIS_ VARIANT FAR* retval)
{
HRESULT hr;
hr = _pService->get_Dependencies(retval);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::put_Dependencies(THIS_ VARIANT vDependencies)
{
HRESULT hr;
hr = _pService->put_Dependencies(vDependencies);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::SetPassword(THIS_ BSTR bstrNewPassword)
{
HRESULT hr;
hr = _pServiceOps->SetPassword(bstrNewPassword);
RRETURN_EXP_IF_ERR(hr);
}
//+---------------------------------------------------------------------------
//
// Function: CWinNTFileService::Start
//
// Synopsis: Attempts to start the service specified in _bstrServiceName on
// the server named in _bstrPath.
//
// Arguments:
//
// Returns: HRESULT.
//
// Modifies:
//
// History: 01/04/96 RamV Created
//
// Notes:
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::Start(THIS)
{
HRESULT hr;
hr = _pServiceOps->Start();
RRETURN_EXP_IF_ERR(hr);
}
//+---------------------------------------------------------------------------
//
// Function: CWinNTFileService::Stop
//
// Synopsis: Attempts to stop the service specified in _bstrServiceName on
// the server named in _bstrPath.
//
// Arguments:
//
// Returns: HRESULT.
//
// Modifies:
//
// History: 01/04/96 RamV Created
//
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::Stop(THIS)
{
HRESULT hr;
hr = _pServiceOps->Stop();
RRETURN_EXP_IF_ERR(hr);
}
//+---------------------------------------------------------------------------
//
// Function: CWinNTFileService::Pause
//
// Synopsis: Attempts to pause the service named _bstrServiceName on the
// server named in _bstrPath.
//
// Arguments:
//
// Returns: HRESULT.
//
// Modifies:
//
// History: 01-04-96 RamV Created
//
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::Pause(THIS)
{
HRESULT hr;
hr = _pServiceOps->Pause();
RRETURN_EXP_IF_ERR(hr);
}
//+---------------------------------------------------------------------------
//
// Function: CWinNTFileService::Continue
//
// Synopsis: Attempts to "unpause" the service specified in _bstrServiceName
// on the server named in _bstrPath.
//
// Arguments:
//
// Returns: HRESULT.
//
// Modifies:
//
// History: 01/04/96 RamV Created
//
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTFileService::Continue(THIS)
{
HRESULT hr;
hr = _pServiceOps->Continue();
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::get_Status(THIS_ long FAR* plStatusCode)
{
HRESULT hr;
hr = _pServiceOps->get_Status(plStatusCode);
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::GetEx(
THIS_ BSTR bstrName,
VARIANT FAR* pvProp
)
{
HRESULT hr = S_OK;
hr = GenericGetExPropertyManager(
ADS_OBJECT_BOUND,
_pPropertyCache,
bstrName,
pvProp
);
if(FAILED(hr)){
hr= _pService->GetEx(bstrName, pvProp );
}
RRETURN_EXP_IF_ERR(hr);
}
STDMETHODIMP
CWinNTFileService::PutEx(
THIS_ long lnControlCode,
BSTR bstrName,
VARIANT vProp
)
{
HRESULT hr = S_OK;
hr = GenericPutExPropertyManager(
_pPropertyCache,
FileServiceClass,
gdwFileServiceTableSize,
bstrName,
vProp
);
if(FAILED(hr)){
hr= _pService->PutEx(lnControlCode, bstrName, vProp );
}
RRETURN_EXP_IF_ERR(hr);
}