/* PackMnkr.cpp PackageMoniker This module implements the CPackagerMoniker class and CreatePackagerMoniker() Author: Jason Fuller jasonful Nov-2-1992 Copyright (c) 1992 Microsoft Corporation */ #include #include "packmnkr.h" #include "..\server\ddedebug.h" #include 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; }