274 lines
6.2 KiB
C++
274 lines
6.2 KiB
C++
/*
|
|
PackMnkr.cpp
|
|
PackageMoniker
|
|
|
|
This module implements the CPackagerMoniker class and
|
|
CreatePackagerMoniker()
|
|
|
|
Author:
|
|
Jason Fuller jasonful Nov-2-1992
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
*/
|
|
|
|
#include <ole2int.h>
|
|
#include "packmnkr.h"
|
|
#include "..\server\ddedebug.h"
|
|
#include <ole1cls.h>
|
|
|
|
ASSERTDATA
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::QueryInterface
|
|
(REFIID riid, LPVOID * ppvObj)
|
|
{
|
|
M_PROLOG(this);
|
|
VDATEIID (riid);
|
|
VDATEPTROUT (ppvObj, LPVOID);
|
|
|
|
if ((riid == IID_IMoniker) || (riid == IID_IUnknown) ||
|
|
(riid == IID_IPersistStream) || (riid == IID_IInternalMoniker))
|
|
{
|
|
*ppvObj = this;
|
|
++m_refs;
|
|
return NOERROR;
|
|
}
|
|
AssertSz (0, "Could not find interface\r\n");
|
|
*ppvObj = NULL;
|
|
return ReportResult(0, E_NOINTERFACE, 0, 0);
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CPackagerMoniker::AddRef()
|
|
{
|
|
M_PROLOG(this);
|
|
return ++m_refs;
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CPackagerMoniker::Release()
|
|
{
|
|
M_PROLOG(this);
|
|
Assert (m_refs > 0);
|
|
if (0 == --m_refs)
|
|
{
|
|
m_pmk->Release();
|
|
delete m_szFile;
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return m_refs;
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::GetClassID (THIS_ LPCLSID lpClassID)
|
|
{
|
|
M_PROLOG(this);
|
|
*lpClassID = CLSID_PackagerMoniker;
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::BindToObject (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
|
|
REFIID riidResult, LPVOID * ppvResult)
|
|
{
|
|
M_PROLOG(this);
|
|
WIN32_FIND_DATA fd;
|
|
HRESULT hr;
|
|
|
|
// The following code ensures that the file exists before we try to bind it.
|
|
HANDLE hFind = FindFirstFile(m_szFile, &fd);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
hr = DdeBindToObject (m_szFile, CLSID_Package, m_fLink, riidResult, ppvResult);
|
|
FindClose(hFind);
|
|
}
|
|
else
|
|
hr = MK_E_CANTOPENFILE;
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::IsRunning (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
|
|
LPMONIKER pmkNewlyRunning)
|
|
{
|
|
M_PROLOG(this);
|
|
VDATEIFACE (pbc);
|
|
|
|
if (pmkToLeft)
|
|
VDATEIFACE (pmkToLeft);
|
|
if (pmkNewlyRunning)
|
|
VDATEIFACE (pmkNewlyRunning);
|
|
|
|
// There is no way to tell if a packaged object is running
|
|
return ReportResult (0, S_FALSE, 0, 0);
|
|
}
|
|
|
|
|
|
STDAPI CreatePackagerMoniker(LPOLESTR szFile, LPMONIKER * ppmk, BOOL fLink )
|
|
{
|
|
return CPackagerMoniker::Create (szFile, ppmk, fLink);
|
|
}
|
|
|
|
HRESULT CPackagerMoniker::Create(LPOLESTR szFile,LPMONIKER * ppmk, BOOL fLink )
|
|
{
|
|
HRESULT hresult;
|
|
VDATEPTROUT (ppmk, LPMONIKER);
|
|
*ppmk = NULL;
|
|
|
|
CPackagerMoniker * pmkPack = new CPackagerMoniker;
|
|
if (NULL==pmkPack)
|
|
return ReportResult (0, E_OUTOFMEMORY, 0, 0);
|
|
ErrRtnH (CreateFileMoniker (szFile, &(pmkPack->m_pmk)));
|
|
|
|
pmkPack->m_szFile = new WCHAR [lstrlenW(szFile)+1];
|
|
lstrcpyW (pmkPack->m_szFile, szFile);
|
|
|
|
pmkPack->m_fLink = fLink;
|
|
pmkPack->m_refs = 1;
|
|
|
|
*ppmk = pmkPack;
|
|
return NOERROR;
|
|
|
|
errRtn:
|
|
Assert (0);
|
|
delete pmkPack;
|
|
return hresult;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// The rest of these methods just delegate to m_pmk
|
|
// or return some error code.
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::IsDirty (THIS)
|
|
{
|
|
M_PROLOG(this);
|
|
return ReportResult(0, S_FALSE, 0, 0);
|
|
// monikers are immutable so they are either always dirty or never dirty.
|
|
//
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::Load (THIS_ LPSTREAM pStm)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->Load(pStm);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::Save (THIS_ LPSTREAM pStm,
|
|
BOOL fClearDirty)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->Save(pStm, fClearDirty);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::GetSizeMax (THIS_ ULARGE_INTEGER * pcbSize)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->GetSizeMax (pcbSize);
|
|
}
|
|
|
|
// *** IMoniker methods ***
|
|
STDMETHODIMP CPackagerMoniker::BindToStorage (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
|
|
REFIID riid, LPVOID * ppvObj)
|
|
{
|
|
M_PROLOG(this);
|
|
*ppvObj = NULL;
|
|
return ReportResult(0, E_NOTIMPL, 0, 0);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::Reduce (THIS_ LPBC pbc, DWORD dwReduceHowFar, LPMONIKER *
|
|
ppmkToLeft, LPMONIKER * ppmkReduced)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->Reduce (pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::ComposeWith (THIS_ LPMONIKER pmkRight, BOOL fOnlyIfNotGeneric,
|
|
LPMONIKER * ppmkComposite)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->ComposeWith (pmkRight, fOnlyIfNotGeneric, ppmkComposite);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::Enum (THIS_ BOOL fForward, LPENUMMONIKER * ppenumMoniker)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->Enum (fForward, ppenumMoniker);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::IsEqual (THIS_ LPMONIKER pmkOtherMoniker)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->IsEqual (pmkOtherMoniker);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::Hash (THIS_ LPDWORD pdwHash)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->Hash (pdwHash);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::GetTimeOfLastChange (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
|
|
FILETIME * pfiletime)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->GetTimeOfLastChange (pbc, pmkToLeft, pfiletime);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::Inverse (THIS_ LPMONIKER * ppmk)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->Inverse (ppmk);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::CommonPrefixWith (LPMONIKER pmkOther, LPMONIKER *
|
|
ppmkPrefix)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->CommonPrefixWith (pmkOther, ppmkPrefix);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::RelativePathTo (THIS_ LPMONIKER pmkOther, LPMONIKER *
|
|
ppmkRelPath)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->RelativePathTo (pmkOther, ppmkRelPath);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::GetDisplayName (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
|
|
LPOLESTR * lplpszDisplayName)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->GetDisplayName (pbc, pmkToLeft, lplpszDisplayName);
|
|
}
|
|
|
|
STDMETHODIMP CPackagerMoniker::ParseDisplayName (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
|
|
LPOLESTR lpszDisplayName, ULONG * pchEaten,
|
|
LPMONIKER * ppmkOut)
|
|
{
|
|
M_PROLOG(this);
|
|
return m_pmk->ParseDisplayName (pbc, pmkToLeft, lpszDisplayName, pchEaten,
|
|
ppmkOut);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPackagerMoniker::IsSystemMoniker (THIS_ LPDWORD pdwMksys)
|
|
{
|
|
M_PROLOG(this);
|
|
VDATEPTROUT (pdwMksys, DWORD);
|
|
|
|
*pdwMksys = MKSYS_NONE;
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|