windows-nt/Source/XPSP1/NT/ds/adsi/router/getobj.cxx
2020-09-26 16:20:57 +08:00

221 lines
4.8 KiB
C++

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996
//
// File: getobj.cxx
//
// Contents: ADs Wrapper Function to mimic Visual Basic's GetObject
//
//
// History: 11-15-95 krishnag Created.
// 07-12-96 t-danal Added path validation.
//
//----------------------------------------------------------------------------
#include "oleds.hxx"
#pragma hdrstop
extern PROUTER_ENTRY g_pRouterHead;
extern CRITICAL_SECTION g_csRouterHeadCritSect;
BOOL
IsPathOfProgId(
LPWSTR ProgId,
LPWSTR Path
);
BOOL
IsADsProgId(
LPWSTR Path
);
//+---------------------------------------------------------------------------
// Function: ADsGetObject
//
// Synopsis:
//
// Arguments: [LPWSTR lpszPathName]
// [REFIID riid]
// [void FAR * FAR * ppObject]
//
// Returns: HRESULT
//
// Modifies: -
//
// History: 07-12-95 t-danal Created.
//
//----------------------------------------------------------------------------
HRESULT
ADsGetObject(
LPCWSTR lpszPathName,
REFIID riid,
void FAR * FAR * ppObject
)
{
HRESULT hr;
hr = GetObject((LPWSTR)lpszPathName,
riid,
ppObject,
FALSE);
RRETURN(hr);
}
//+---------------------------------------------------------------------------
// Function: GetObject
//
// Synopsis:
//
// Arguments: [LPWSTR lpszPathName]
// [REFIID riid]
// [void FAR * FAR * ppObject]
// [BOOL Generic]
//
// Returns: HRESULT
//
// Modifies: -
//
// History: 11-03-95 krishnag Created.
// 07-12-95 t-danal Added router verification and
// renamed from ADsGetObject
//
//----------------------------------------------------------------------------
HRESULT
GetObject(
LPWSTR lpszPathName,
REFIID riid,
void FAR * FAR * ppObject,
BOOL bRelative
)
{
HRESULT hr;
ULONG chEaten = 0L;
IMoniker * pMoniker = NULL;
IBindCtx *pbc = NULL;
//
// Make sure the router has been initialized
//
EnterCriticalSection(&g_csRouterHeadCritSect);
if (!g_pRouterHead) {
g_pRouterHead = InitializeRouter();
}
LeaveCriticalSection(&g_csRouterHeadCritSect);
PROUTER_ENTRY lpRouter = g_pRouterHead;
if (bRelative || !IsADsProgId(lpszPathName)) {
//
// Check if the Path matches with ProviderProgId or the Aliases
//
while (lpRouter &&
(!IsPathOfProgId(lpRouter->szProviderProgId, lpszPathName) &&
!IsPathOfProgId(lpRouter->szAliases, lpszPathName)))
lpRouter = lpRouter->pNext;
if (!lpRouter)
RRETURN(E_FAIL);
}
hr = CreateBindCtx(0, &pbc);
BAIL_IF_ERROR(hr);
hr = MkParseDisplayName(pbc,
lpszPathName,
&chEaten,
&pMoniker);
BAIL_IF_ERROR(hr);
hr = pMoniker->BindToObject(pbc, NULL, riid, ppObject);
BAIL_IF_ERROR(hr);
cleanup:
if (pbc) {
pbc->Release();
}
if (pMoniker) {
pMoniker->Release();
}
RRETURN(hr);
}
//+---------------------------------------------------------------------------
// Function: IsPathOfProgId
//
// Synopsis: Checks if an OLE Path corresponds to given ProgId.
// Path must be @Foo! or Foo: style.
//
// Arguments: [LPWSTR ProgId]
// [LPWSTR Path]
//
// Returns: BOOL
//
// Modifies: -
//
// History: 07-12-95 t-danal Created
//
//----------------------------------------------------------------------------
BOOL
IsPathOfProgId(
LPWSTR ProgId,
LPWSTR Path
)
{
if (!ProgId || !Path) // Just in case...
return FALSE;
if (*Path == L'@')
Path++;
if(wcsncmp(ProgId, Path, wcslen(ProgId)))
return FALSE;
return TRUE;
}
//+---------------------------------------------------------------------------
// Function: IsADsProgId
//
// Synopsis: Checks if the ProgIds of paths is ADs progid.
// Paths must be @Foo! or Foo: style.
//
// Arguments: [LPWSTR Path]
//
// Returns: BOOL
//
// Modifies: -
//
// History: 07-12-95 t-danal Created
//
//----------------------------------------------------------------------------
BOOL
IsADsProgId(
LPWSTR Path
)
{
int cch = 0;
LPWSTR pEnd;
if (!Path)
return FALSE;
if (*Path == L'@')
Path++;
pEnd = Path;
while (*pEnd &&
*pEnd != L'!' &&
*pEnd != L':') {
pEnd++;
}
if (_wcsnicmp(L"ADS", Path, (int)(pEnd-Path)))
return FALSE;
return TRUE;
}