226 lines
4.9 KiB
C++
226 lines
4.9 KiB
C++
//+---------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
||
//
|
||
// File: pathmgmt.cxx
|
||
//
|
||
// Contents:
|
||
//
|
||
// Functions:
|
||
//
|
||
// History: 25-April-97 KrishnaG Created.
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
|
||
#include "ldap.hxx"
|
||
#pragma hdrstop
|
||
|
||
|
||
HRESULT
|
||
BuildADsPath(
|
||
BSTR Parent,
|
||
BSTR Name,
|
||
BSTR *pADsPath
|
||
)
|
||
{
|
||
LPWSTR pszADsPath = NULL;
|
||
HRESULT hr = S_OK;
|
||
|
||
hr = BuildADsPathFromParent( Parent, Name, &pszADsPath );
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = ADsAllocString( pszADsPath, pADsPath);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
error:
|
||
|
||
if ( pszADsPath )
|
||
FreeADsMem( pszADsPath );
|
||
|
||
RRETURN(hr);
|
||
}
|
||
|
||
HRESULT
|
||
BuildSchemaPath(
|
||
BSTR bstrADsPath,
|
||
BSTR bstrClass,
|
||
BSTR *pSchemaPath
|
||
)
|
||
{
|
||
TCHAR *pszADsSchema = NULL;
|
||
OBJECTINFO ObjectInfo;
|
||
POBJECTINFO pObjectInfo = &ObjectInfo;
|
||
HRESULT hr = S_OK;
|
||
WCHAR szPort[32];
|
||
DWORD dwLen;
|
||
|
||
memset(pObjectInfo, 0, sizeof(OBJECTINFO));
|
||
|
||
if (bstrClass && *bstrClass) {
|
||
|
||
hr = ADsObject(bstrADsPath, pObjectInfo);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
if (pObjectInfo->TreeName) {
|
||
|
||
dwLen = wcslen(pObjectInfo->NamespaceName) +
|
||
wcslen(pObjectInfo->TreeName) +
|
||
wcslen(bstrClass) +
|
||
11 + // ":///schema/"
|
||
1;
|
||
|
||
if ( IS_EXPLICIT_PORT(pObjectInfo->PortNumber) ) {
|
||
wsprintf(szPort, L":%d", pObjectInfo->PortNumber);
|
||
dwLen += wcslen(szPort);
|
||
}
|
||
|
||
pszADsSchema = (LPWSTR) AllocADsMem( dwLen * sizeof(WCHAR) );
|
||
if ( pszADsSchema == NULL )
|
||
{
|
||
hr = E_OUTOFMEMORY;
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
wsprintf(pszADsSchema,TEXT("%s://"),pObjectInfo->NamespaceName);
|
||
wcscat(pszADsSchema, pObjectInfo->TreeName);
|
||
|
||
if (IS_EXPLICIT_PORT(pObjectInfo->PortNumber) ) {
|
||
wsprintf(szPort, L":%d", pObjectInfo->PortNumber);
|
||
wcscat(pszADsSchema, szPort);
|
||
}
|
||
|
||
wcscat(pszADsSchema, TEXT("/schema/"));
|
||
wcscat(pszADsSchema, bstrClass);
|
||
|
||
}else {
|
||
|
||
pszADsSchema = (LPTSTR) AllocADsMem(
|
||
( _tcslen(pObjectInfo->NamespaceName) +
|
||
_tcslen(bstrClass) +
|
||
12 ) * sizeof(TCHAR)); //includes ":///schema/"
|
||
|
||
if ( pszADsSchema == NULL )
|
||
{
|
||
hr = E_OUTOFMEMORY;
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
_stprintf(pszADsSchema,TEXT("%s://"),pObjectInfo->NamespaceName);
|
||
_tcscat(pszADsSchema, TEXT("schema/"));
|
||
_tcscat(pszADsSchema, bstrClass);
|
||
|
||
}
|
||
}
|
||
|
||
hr = ADsAllocString( pszADsSchema? pszADsSchema : TEXT(""), pSchemaPath);
|
||
|
||
error:
|
||
|
||
if ( pszADsSchema )
|
||
FreeADsStr( pszADsSchema );
|
||
|
||
FreeObjectInfo( &ObjectInfo );
|
||
|
||
RRETURN(hr);
|
||
}
|
||
|
||
|
||
HRESULT
|
||
BuildADsPathFromLDAPDN(
|
||
BSTR bstrParent,
|
||
BSTR bstrObject,
|
||
LPTSTR *ppszADsPath
|
||
)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
LPTSTR pszTemp = NULL;
|
||
int i;
|
||
int j;
|
||
int nCount;
|
||
int *aIndex = NULL;
|
||
|
||
if ( bstrObject == NULL || *bstrObject == 0 )
|
||
{
|
||
BAIL_ON_FAILURE(hr=E_ADS_BAD_PATHNAME);
|
||
}
|
||
|
||
*ppszADsPath = (LPTSTR) AllocADsMem( ( _tcslen(bstrParent)
|
||
+ _tcslen(bstrObject)
|
||
+ 1) * sizeof(TCHAR) );
|
||
|
||
if ( *ppszADsPath == NULL )
|
||
{
|
||
BAIL_ON_FAILURE(hr=E_OUTOFMEMORY);
|
||
}
|
||
|
||
_tcscpy( *ppszADsPath, bstrParent );
|
||
|
||
pszTemp = _tcschr( *ppszADsPath, TEXT(':'));
|
||
|
||
if ( pszTemp )
|
||
{
|
||
pszTemp += _tcslen(TEXT("://"));
|
||
|
||
if ( pszTemp )
|
||
{
|
||
pszTemp = _tcschr( pszTemp, TEXT('/'));
|
||
}
|
||
}
|
||
|
||
if ( pszTemp == NULL )
|
||
{
|
||
BAIL_ON_FAILURE(hr=E_ADS_BAD_PATHNAME);
|
||
}
|
||
|
||
i = 0;
|
||
nCount = 1;
|
||
while ( bstrObject[i] != 0 )
|
||
{
|
||
if ( bstrObject[i++] == TEXT(',') )
|
||
nCount++;
|
||
}
|
||
|
||
aIndex = (int *) AllocADsMem( nCount * sizeof(int));
|
||
if ( aIndex == NULL )
|
||
{
|
||
hr = E_OUTOFMEMORY;
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
i = 0; j = 0;
|
||
aIndex[j++] = 0;
|
||
while ( bstrObject[i] != 0 )
|
||
{
|
||
if ( bstrObject[i++] == TEXT(',') )
|
||
aIndex[j++] = i;
|
||
}
|
||
|
||
for ( i = nCount; i > 0; i-- )
|
||
{
|
||
*(pszTemp++) = TEXT('/');
|
||
j = aIndex[i-1];
|
||
while ( ( bstrObject[j] != 0 ) && ( bstrObject[j] != TEXT(',') ))
|
||
*(pszTemp++) = bstrObject[j++];
|
||
}
|
||
|
||
*pszTemp = 0;
|
||
|
||
error:
|
||
|
||
if ( aIndex )
|
||
FreeADsMem( aIndex );
|
||
|
||
if ( FAILED(hr))
|
||
{
|
||
if ( *ppszADsPath )
|
||
FreeADsStr( *ppszADsPath );
|
||
|
||
*ppszADsPath = NULL;
|
||
}
|
||
|
||
return hr;
|
||
|
||
}
|
||
|
||
|