|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: core.cxx
//
// Contents:
//
// History: 11-1-95 krishnag Created.
//
//----------------------------------------------------------------------------
#include "winnt.hxx"
#pragma hdrstop
HRESULT CCoreADsObject::InitializeCoreObject( LPWSTR Parent, LPWSTR Name, LPWSTR ClassName, LPWSTR Schema, REFCLSID rclsid, DWORD dwObjectState ) { HRESULT hr = S_OK; ADsAssert(Parent); ADsAssert(Name); ADsAssert(ClassName);
hr = BuildADsGuid( rclsid, &_ADsGuid ); BAIL_ON_FAILURE(hr);
if ( ( _tcsicmp( ClassName, PRINTJOB_CLASS_NAME ) == 0 ) || ( _tcsicmp( ClassName, SESSION_CLASS_NAME ) == 0 ) || ( _tcsicmp( ClassName, RESOURCE_CLASS_NAME ) == 0 ) ) { //
// This three classes are not really DS objects so they don't
// really have a parent. Hence, we set the parent string to empty
// string.
//
_ADsPath = AllocADsStr(TEXT("")); hr = (_ADsPath ? S_OK: E_OUTOFMEMORY);
BAIL_ON_FAILURE(hr);
_Parent = AllocADsStr(TEXT("")); hr = (_Parent ? S_OK: E_OUTOFMEMORY);
_dwNumComponents = 0;
} else { hr = BuildADsPath( Parent, Name, &_ADsPath );
BAIL_ON_FAILURE(hr);
// get the number of components in the ADsPath
hr = GetNumComponents(); BAIL_ON_FAILURE(hr);
_Parent = AllocADsStr(Parent); hr = (_Parent ? S_OK: E_OUTOFMEMORY);
}
BAIL_ON_FAILURE(hr);
_Name = AllocADsStr(Name); hr = (_Name ? S_OK: E_OUTOFMEMORY);
BAIL_ON_FAILURE(hr);
_ADsClass = AllocADsStr(ClassName); hr = (_ADsClass ? S_OK: E_OUTOFMEMORY);
BAIL_ON_FAILURE(hr);
hr = BuildSchemaPath( Parent, Name, Schema, &_Schema ); BAIL_ON_FAILURE(hr);
_dwObjectState = dwObjectState;
error: RRETURN(hr);
}
CCoreADsObject::CCoreADsObject(): _Name(NULL), _ADsPath(NULL), _Parent(NULL), _ADsClass(NULL), _Schema(NULL), _ADsGuid(NULL), _dwObjectState(0), _pUnkOuter(NULL), _pObjectInfo(NULL), _pDispatch(NULL) { }
CCoreADsObject::~CCoreADsObject() { if (_Name) { FreeADsStr(_Name); }
if (_ADsPath) { FreeADsStr(_ADsPath); }
if (_Parent) { FreeADsStr(_Parent); }
if (_ADsClass) { FreeADsStr(_ADsClass); }
if (_Schema) { FreeADsStr(_Schema); }
if (_ADsGuid) { FreeADsStr(_ADsGuid); }
if(_pObjectInfo != NULL) { FreeObjectInfo(&_ObjectInfo, TRUE); }
}
HRESULT CCoreADsObject::get_CoreName(BSTR * retval) { HRESULT hr;
if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); }
hr = ADsAllocString(_Name, retval); RRETURN_EXP_IF_ERR(hr); }
HRESULT CCoreADsObject::get_CoreADsPath(BSTR * retval) { HRESULT hr;
if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); }
hr = ADsAllocString(_ADsPath, retval); RRETURN_EXP_IF_ERR(hr);
}
HRESULT CCoreADsObject::get_CoreADsClass(BSTR * retval) { HRESULT hr;
if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); }
hr = ADsAllocString(_ADsClass, retval); RRETURN_EXP_IF_ERR(hr); }
HRESULT CCoreADsObject::get_CoreParent(BSTR * retval) {
HRESULT hr;
if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); }
hr = ADsAllocString(_Parent, retval); RRETURN_EXP_IF_ERR(hr); }
HRESULT CCoreADsObject::get_CoreSchema(BSTR * retval) {
HRESULT hr;
if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); }
if ( _Schema == NULL || *_Schema == 0 ) RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
hr = ADsAllocString(_Schema, retval); RRETURN_EXP_IF_ERR(hr); }
HRESULT CCoreADsObject::get_CoreGUID(BSTR * retval) { HRESULT hr;
if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); }
hr = ADsAllocString(_ADsGuid, retval); RRETURN_EXP_IF_ERR(hr); }
STDMETHODIMP CCoreADsObject::GetInfo(THIS_ DWORD dwApiLevel, BOOL fExplicit) { RRETURN(E_NOTIMPL); }
STDMETHODIMP CCoreADsObject::ImplicitGetInfo(void) { RRETURN(E_NOTIMPL); }
//----------------------------------------------------------------------------
// Function: InitUmiObject
//
// Synopsis: Initializes UMI object.
//
// Arguments:
//
// Credentials Credentials stored in the underlying WinNT object
// pSchema Pointer to schema for this object
// dwSchemaSize Size of schema array
// pPropCache Pointer to property cache for this object
// pUnkInner Pointer to inner unknown of WinNT object
// pExtMgr Pointer to extension manager object on WinNT object
// riid Interface requested
// ppvObj Returns pointer to interface
// pClassInfo Pointer to class information if this object is a class object.
// NULL otherwise.
//
// Returns: S_OK if a UMI object is created and the interface is obtained.
// Error code otherwise
//
// Modifies: *ppvObj to return the UMI interface requested.
//
//----------------------------------------------------------------------------
HRESULT CCoreADsObject::InitUmiObject( CWinNTCredentials& Credentials, PPROPERTYINFO pSchema, DWORD dwSchemaSize, CPropertyCache * pPropertyCache, IUnknown *pUnkInner, CADsExtMgr *pExtMgr, REFIID riid, LPVOID *ppvObj, CLASSINFO *pClassInfo ) { CUmiObject *pUmiObject = NULL; HRESULT hr = S_OK;
// riid is a UMI interface
if(NULL == ppvObj) RRETURN(E_POINTER);
pUmiObject = new CUmiObject(); if(NULL == pUmiObject) RRETURN(E_OUTOFMEMORY);
hr = pUmiObject->FInit( Credentials, pSchema, dwSchemaSize, pPropertyCache, pUnkInner, pExtMgr, this, pClassInfo ); BAIL_ON_FAILURE(hr); //
// Bump up reference count of pUnkInner. On any error after this point,
// the UMI object's destructor will call Release() on pUnkInner and we
// don't want this to delete the WinNT object.
//
pUnkInner->AddRef();
hr = pUmiObject->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr);
// DECLARE_STD_REFCOUNTING initializes the refcount to 1. Call Release()
// on the created object, so that releasing the interface pointer will
// free the object.
pUmiObject->Release();
// Restore ref count of inner unknown
pUnkInner->Release();
//
// reset ADS_AUTH_RESERVED flag in credentials. This is so that the
// underlying WinNT object may be returned through IUmiCustomInterface to
// the client. Doing this will ensure that the WinNT object should behave
// like a ADSI object, not a UMI object.
//
Credentials.ResetUmiFlag();
RRETURN(S_OK);
error:
if(pUmiObject != NULL) delete pUmiObject;
RRETURN(hr); } //----------------------------------------------------------------------------
// Function: GetNumComponents
//
// Synopsis: This function returns the number of components in the ADsPath.
// A component is enclosed by '/' in an ADsPath.
//
// Arguments:
//
// None
//
// Returns: S_OK on success. Error code otherwise.
//
// Modifies: Nothing.
//
//----------------------------------------------------------------------------
HRESULT CCoreADsObject::GetNumComponents(void) { CLexer Lexer(_ADsPath); HRESULT hr = S_OK;
_pObjectInfo = &_ObjectInfo; memset(_pObjectInfo, 0, sizeof(OBJECTINFO)); hr = Object(&Lexer, _pObjectInfo); if(FAILED(hr)) { _pObjectInfo = NULL; // so we don't attempt to free object info later
goto error; }
_dwNumComponents = _pObjectInfo->NumComponents;
RRETURN(S_OK);
error:
if(_pObjectInfo != NULL) FreeObjectInfo(&_ObjectInfo, TRUE);
RRETURN(hr); }
|