mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
3.5 KiB
161 lines
3.5 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: mkparse.cxx
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 06-Nov-92 jasonful Created
|
|
// 12-27-93 ErikGav Commented
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <ole2int.h>
|
|
|
|
#include "cbasemon.hxx"
|
|
#include "ccompmon.hxx"
|
|
#include "citemmon.hxx"
|
|
#include "mnk.h"
|
|
|
|
// Moved here as a temporary measure since this macro is not used in 32 bit
|
|
#define RetErr(x) {HRESULT hresult; if (NOERROR != (hresult=(x))) {return hresult;}}
|
|
|
|
// INTERNAL Ole10_ParseMoniker
|
|
//
|
|
// If pmk is a file moniker or a file::item composite, then return
|
|
// the obvious strings in *pszFile and *pszItem.
|
|
// NOTE: these strings must be deleted.
|
|
// Return error if moniker is of some other type.
|
|
//
|
|
// Can pass NULL, meaning you don't care about the strings
|
|
//
|
|
INTERNAL Ole10_ParseMoniker
|
|
(LPMONIKER pmk,
|
|
LPWSTR FAR* pszFile,
|
|
LPWSTR FAR* pszItem)
|
|
{
|
|
LPWSTR szFile = NULL;
|
|
LPWSTR szItem = NULL;
|
|
LPMONIKER pmkFile= NULL;
|
|
LPMONIKER pmkItem= NULL;
|
|
HRESULT hr = ResultFromScode (E_UNSPEC);
|
|
LPBC pbc = NULL;
|
|
|
|
CCompositeMoniker *pCMk = NULL;
|
|
CItemMoniker *pIMk = NULL;
|
|
|
|
if (IsFileMoniker(pmk))
|
|
{
|
|
RetErr (CreateBindCtx(0, &pbc));
|
|
Assert(pbc != NULL);
|
|
if (NOERROR != pmk->GetDisplayName (pbc, NULL, &szFile))
|
|
{
|
|
Assert(szFile == NULL);
|
|
CairoleAssert(0 && "Could not get Display name for file piece");
|
|
goto errRtn;
|
|
}
|
|
// AssertOutPtrParam(NOERROR, szFile);
|
|
}
|
|
else if ((pCMk = IsCompositeMoniker(pmk)) != NULL)
|
|
{
|
|
pmkFile = pCMk->First();
|
|
if (NULL==pmkFile)
|
|
{
|
|
CairoleAssert(0 && "Composite moniker does not have car");
|
|
hr = ResultFromScode(E_UNSPEC);
|
|
goto errRtn;
|
|
}
|
|
// Is first piece a file moniker?
|
|
if (IsFileMoniker (pmkFile))
|
|
{
|
|
RetErr (CreateBindCtx(0, &pbc));
|
|
Assert(pbc != NULL);
|
|
if (NOERROR != pmkFile->GetDisplayName (pbc, NULL, &szFile))
|
|
{
|
|
Assert(szFile == NULL);
|
|
CairoleAssert(0 && "Could not get Display name for file piece");
|
|
goto errRtn;
|
|
}
|
|
// AssertOutPtrParam(NOERROR, szFile);
|
|
}
|
|
else
|
|
{
|
|
CairoleAssert(0 && "First piece is not a file moniker");
|
|
hr = NOERROR;
|
|
goto errRtn;
|
|
}
|
|
|
|
// Get Item Moniker
|
|
|
|
pmkItem = pCMk->AllButFirst();
|
|
if (NULL==pmkItem)
|
|
{
|
|
CairoleAssert(0 && "Composite moniker does not have cdr");
|
|
hr = ResultFromScode(E_UNSPEC);
|
|
goto errRtn;
|
|
}
|
|
if ((pIMk = IsItemMoniker (pmkItem)) != NULL)
|
|
{
|
|
// This is the case we want: FileMoniker :: ItemMoniker
|
|
|
|
if (NULL==(szItem = pIMk->m_lpszItem))
|
|
{
|
|
CairoleAssert(0 && "Could not get string for item moniker");
|
|
goto errRtn;
|
|
}
|
|
szItem = UtDupString (szItem); // so it'll be allocated like
|
|
// an out parm from GetDisplayName
|
|
}
|
|
else
|
|
{
|
|
// This is the FileMoniker - ItemMoniker - ItemMoniker... case
|
|
// We cannot convert this to 1.0
|
|
hr = ResultFromScode(S_FALSE);
|
|
goto errRtn;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CairoleAssert(0 && "Cannot identify moniker type");
|
|
hr = ResultFromScode (E_UNSPEC);
|
|
goto errRtn;
|
|
}
|
|
|
|
if (pszFile)
|
|
*pszFile = szFile;
|
|
else
|
|
CoTaskMemFree(szFile);
|
|
|
|
if (pszItem)
|
|
*pszItem = szItem;
|
|
else
|
|
CoTaskMemFree(szItem);
|
|
|
|
if (pmkFile)
|
|
pmkFile->Release();
|
|
if (pmkItem)
|
|
pmkItem->Release();
|
|
|
|
if (pbc)
|
|
pbc->Release();
|
|
|
|
return NOERROR;
|
|
|
|
errRtn:
|
|
CoTaskMemFree(szFile);
|
|
CoTaskMemFree(szItem);
|
|
if (pmkFile)
|
|
pmkFile->Release();
|
|
if (pmkItem)
|
|
pmkItem->Release();
|
|
if (pbc)
|
|
pbc->Release();
|
|
|
|
return hr;
|
|
}
|