//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996 // // File: core.cxx // // Contents: // // History: 06-15-96 yihsins Created. // //---------------------------------------------------------------------------- #include "ldap.hxx" #pragma hdrstop HRESULT CCoreADsObject::InitializeCoreObject( BSTR Parent, BSTR Name, BSTR SchemaClass, REFCLSID rclsid, DWORD dwObjectState ) { HRESULT hr = S_OK; // // Both should never be NULL, replacing the ADsAsserts with // this check to make sure that we never get into this problem // on all builds. // if (!Parent || !Name) { BAIL_ON_FAILURE(hr = E_FAIL); } hr = BuildADsPath( Parent, Name, &_ADsPath ); BAIL_ON_FAILURE(hr); hr = BuildADsGuid( rclsid, &_ADsGuid ); BAIL_ON_FAILURE(hr); hr = ADsAllocString( Parent, &_Parent); BAIL_ON_FAILURE(hr); hr = ADsAllocString( Name, &_Name); BAIL_ON_FAILURE(hr); hr = ADsAllocString( SchemaClass, &_SchemaClass); BAIL_ON_FAILURE(hr); _dwObjectState = dwObjectState; error: RRETURN(hr); } CCoreADsObject::CCoreADsObject(): _Name(NULL), _ADsPath(NULL), _Parent(NULL), _ADsClass(NULL), _SchemaClass(NULL), _ADsGuid(NULL), _pUnkOuter(NULL), _dwObjectState(0) { } CCoreADsObject::~CCoreADsObject() { if (_Name) { ADsFreeString(_Name); } if (_ADsPath) { ADsFreeString(_ADsPath); } if (_Parent) { ADsFreeString(_Parent); } if (_ADsClass) { ADsFreeString(_ADsClass); } if (_SchemaClass) { ADsFreeString(_SchemaClass); } if (_ADsGuid) { ADsFreeString(_ADsGuid); } } HRESULT CCoreADsObject::get_CoreName(BSTR * retval) { HRESULT hr; // // Make sure that the last error is reset // Macro_ClearADsLastError(L"LDAP Provider"); 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; // // Make sure that the last error is reset // Macro_ClearADsLastError(L"LDAP Provider"); 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; // // Make sure that the last error is reset // Macro_ClearADsLastError(L"LDAP Provider"); if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); } if ( _SchemaClass == NULL || *_SchemaClass == 0 ) { hr = ADsAllocString(_ADsClass, retval); RRETURN_EXP_IF_ERR(hr); } hr = ADsAllocString(_SchemaClass, retval); // report the actual class RRETURN_EXP_IF_ERR(hr); } HRESULT CCoreADsObject::get_CoreParent(BSTR * retval) { HRESULT hr; // // Make sure that the last error is reset // Macro_ClearADsLastError(L"LDAP Provider"); 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; // // Make sure that the last error is reset // Macro_ClearADsLastError(L"LDAP Provider"); if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); } if ( _SchemaClass == NULL || *_SchemaClass == 0 ) RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED); hr = BuildSchemaPath( _ADsPath, _SchemaClass, retval ); RRETURN_EXP_IF_ERR(hr); } HRESULT CCoreADsObject::get_CoreGUID(BSTR * retval) { HRESULT hr; // // Make sure that the last error is reset // Macro_ClearADsLastError(L"LDAP Provider"); if (FAILED(hr = ValidateOutParameter(retval))){ RRETURN_EXP_IF_ERR(hr); } hr = ADsAllocString(_ADsGuid, retval); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CCoreADsObject::GetInfo(THIS_ DWORD dwFlags) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CCoreADsObject::GetInfo( THIS_ LPWSTR szPropertyName, DWORD dwSyntaxId, BOOL fExplicit ) { RRETURN(E_NOTIMPL); } //---------------------------------------------------------------------------- // Function: InitUmiObject // // Synopsis: Initializes UMI object. // // Arguments: // // 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 // // 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( INTF_PROP_DATA intfProps[], CPropertyCache * pPropertyCache, IADs *pIADs, IUnknown *pUnkInner, REFIID riid, LPVOID *ppvObj, CCredentials *pCreds, DWORD dwPort, // defaulted to -1 LPWSTR pszServerName, // defaulted to NULL LPWSTR pszLdapDn, // defaulted to NULL PADSLDP pLdapHandle, // defaulted to NULL, CADsExtMgr *pExtMgr // defaulted to NULL ) { HRESULT hr = S_OK; CLDAPUmiObject *pUmiObject = NULL; if (!ppvObj) { RRETURN(E_INVALIDARG); } hr = CLDAPUmiObject::CreateLDAPUmiObject( intfProps, pPropertyCache, pUnkInner, this, // pCoreObj pIADs, pCreds, &pUmiObject, dwPort, pLdapHandle, pszServerName, pszLdapDn, pExtMgr ); 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 LDAP object. // pUnkInner->AddRef(); hr = pUmiObject->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr); // // Ref on umi object is now 2, reduce by one. // pUmiObject->Release(); // // Restore ref count of inner unknown // pUnkInner->Release(); RRETURN(S_OK); error: if (pUmiObject) { delete pUmiObject; } RRETURN(hr); }