|
|
//
// Author: DebiM
// Date: September 1996
//
//
// Class Store Schema creation and access using ADs
//
// This source file contains implementations for IClassAccess,
// interface for CClassAccess object.
//
//
//---------------------------------------------------------------------
#include "dsbase.hxx"
HRESULT CreateContainer (IADsContainer * pParent, LPOLESTR szParentName, LPOLESTR szName, LPOLESTR szDesc, IADsContainer ** ppChild) {
HRESULT hr; IADs * pADs = NULL; IDispatch * pUnknown = NULL; int l; //
// Use the Parent Container interface to Create the child.
//
hr = pParent->Create( CLASS_CS_CONTAINER, szName, &pUnknown ); RETURN_ON_FAILURE(hr);
//
// Get IADs pointer on the new object
//
hr = pUnknown->QueryInterface( IID_IADs, (void **)&pADs );
pUnknown->Release();
RETURN_ON_FAILURE(hr);
//
// Set its description
//
hr = SetProperty (pADs, DESCRIPTION, szDesc); RETURN_ON_FAILURE(hr);
//
// Set its schema version
//
hr = SetPropertyDW (pADs, STOREVERSION, SCHEMA_VERSION_NUMBER); RETURN_ON_FAILURE(hr); //
// persist the object
//
hr = StoreIt (pADs); RETURN_ON_FAILURE(hr);
if (ppChild) { //
// Get IADsContainer pointer on the child object to return
//
hr = pADs->QueryInterface( IID_IADsContainer, (void **)ppChild ); }
pADs->Release();
return hr; }
HRESULT CreateRepository(LPOLESTR szParentPath, LPOLESTR szStoreName) {
HRESULT hr; IADsContainer * pADsParent = NULL; IADsContainer * pADsContainer = NULL; LPOLESTR szContainerName = NULL; int l; WCHAR szPath [_MAX_PATH+1]; if (!szParentPath) { hr = GetRootPath(szPath); //
// If failed go away
//
if (FAILED(hr)) { return hr; } szParentPath = szPath; }
hr = ADsGetObject( szParentPath, IID_IADsContainer, (void **)&pADsParent ); RETURN_ON_FAILURE(hr); hr = CreateContainer (pADsParent, szParentPath, szStoreName, L"Application Store", &pADsContainer); pADsParent->Release(); RETURN_ON_FAILURE(hr);
//
// Create the class container
//
hr = CreateContainer (pADsContainer, szContainerName, CLASSCONTAINERNAME, L"Application Object Classes", NULL); RETURN_ON_FAILURE(hr);
//
// Create the category container
//
hr = CreateContainer (pADsContainer, szContainerName, CATEGORYCONTAINERNAME, L"Component Categories", NULL); RETURN_ON_FAILURE(hr);
//
// Create the Packages container
//
hr = CreateContainer (pADsContainer, szContainerName, PACKAGECONTAINERNAME, L"Application Packages", NULL); //CoTaskMemFree (szContainerName);
pADsContainer->Release(); RETURN_ON_FAILURE(hr); return S_OK;
}
HRESULT GetRootPath(LPOLESTR szContainer) { HRESULT hr; IEnumVARIANT * pEnum; IADs *pADs; VARIANT VariantArray[2]; IDispatch *pDispatch = NULL; ULONG cFetched; IADsContainer *pContainer = NULL; LPOLESTR pszContainer;
//
// Do a bind to the machine by a GetObject for the Path
//
hr = ADsGetObject( L"LDAP:", IID_IADsContainer, (void **)&pContainer ); RETURN_ON_FAILURE(hr);
hr = ADsBuildEnumerator( pContainer, &pEnum ); hr = ADsEnumerateNext( pEnum, 1, VariantArray, &cFetched );
pEnum->Release();
if ((hr == S_FALSE) || (cFetched == 0)) { return E_FAIL; }
pDispatch = VariantArray[0].pdispVal; memset(VariantArray, 0, sizeof(VARIANT)*2); hr = pDispatch->QueryInterface(IID_IADs, (void **) &pADs) ; pDispatch->Release(); pADs->get_ADsPath(&pszContainer); pADs->Release(); pContainer->Release();
wcscpy (szContainer, pszContainer); SysFreeString (pszContainer); return S_OK; }
|