|
|
//+---------------------------------------------------------------------------
//
// 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;
}
|