221 lines
4.8 KiB
C++
221 lines
4.8 KiB
C++
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
|