276 lines
12 KiB
C++
276 lines
12 KiB
C++
#ifndef pack2cpp_h__
|
|
#define pack2cpp_h__
|
|
|
|
#include <priv.h>
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#undef DebugMsg
|
|
#define DebugMsg TraceMsg
|
|
|
|
////////////////////////////////
|
|
// CPackage Definition
|
|
//
|
|
class CPackage : public IEnumOLEVERB,
|
|
public IOleCommandTarget,
|
|
public IOleObject,
|
|
public IViewObject2,
|
|
public IDataObject,
|
|
public IPersistStorage,
|
|
public IAdviseSink,
|
|
public IRunnableObject,
|
|
public IPersistFile,
|
|
public IOleCache,
|
|
public IExternalConnection
|
|
|
|
// cleanup -- inherit interfaces
|
|
{
|
|
|
|
|
|
public:
|
|
CPackage(); // constructor
|
|
~CPackage(); // destructor
|
|
|
|
HRESULT Init(); // used to initialze fields that could fail
|
|
BOOL RunWizard();
|
|
|
|
// IUnknown methods...
|
|
STDMETHODIMP QueryInterface(REFIID,void **);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IEnumOLEVERB methods...
|
|
STDMETHODIMP Next(ULONG celt, OLEVERB* rgVerbs, ULONG* pceltFetched);
|
|
STDMETHODIMP Skip(ULONG celt);
|
|
STDMETHODIMP Reset();
|
|
STDMETHODIMP Clone(IEnumOLEVERB** ppEnum);
|
|
|
|
// IOleCommandTarget methods
|
|
STDMETHODIMP QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText);
|
|
STDMETHODIMP Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG* pvaIn, VARIANTARG* pvaOut);
|
|
|
|
// IPersistStorage Methods...
|
|
STDMETHODIMP GetClassID(LPCLSID pClassID);
|
|
STDMETHODIMP IsDirty(void);
|
|
STDMETHODIMP InitNew(IStorage* pstg);
|
|
STDMETHODIMP Load(IStorage* pstg);
|
|
STDMETHODIMP Save(IStorage* pstg, BOOL fSameAsLoad);
|
|
STDMETHODIMP SaveCompleted(IStorage* pstg);
|
|
STDMETHODIMP HandsOffStorage(void);
|
|
|
|
// IPersistFile Methods...
|
|
// STDMETHODIMP GetClassID(LPCLSID pClassID);
|
|
// STDMETHODIMP IsDirty(void);
|
|
STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwdMode);
|
|
STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember);
|
|
STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName);
|
|
STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName);
|
|
|
|
|
|
// IDataObject Methods...
|
|
STDMETHODIMP GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM);
|
|
STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
|
|
STDMETHODIMP QueryGetData(LPFORMATETC pFE);
|
|
STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut);
|
|
STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease);
|
|
STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum);
|
|
STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink,
|
|
DWORD *pdwConnection);
|
|
STDMETHODIMP DUnadvise(DWORD dwConnection);
|
|
STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *ppEnum);
|
|
|
|
// IOleObject Methods...
|
|
STDMETHODIMP SetClientSite(LPOLECLIENTSITE pClientSite);
|
|
STDMETHODIMP GetClientSite(LPOLECLIENTSITE *ppClientSite);
|
|
STDMETHODIMP SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj);
|
|
STDMETHODIMP Close(DWORD dwSaveOption);
|
|
STDMETHODIMP SetMoniker(DWORD dwWhichMoniker, LPMONIKER pmk);
|
|
STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMonkier,LPMONIKER *ppmk);
|
|
STDMETHODIMP InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation,
|
|
DWORD dwReserved);
|
|
STDMETHODIMP GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject);
|
|
STDMETHODIMP DoVerb(LONG iVerb, LPMSG lpmsg, LPOLECLIENTSITE pActiveSite,
|
|
LONG lindex, HWND hwndParent, LPCRECT lprcPosRect);
|
|
STDMETHODIMP EnumVerbs(LPENUMOLEVERB *ppEnumOleVerb);
|
|
STDMETHODIMP Update(void);
|
|
STDMETHODIMP IsUpToDate(void);
|
|
STDMETHODIMP GetUserClassID(LPCLSID pClsid);
|
|
STDMETHODIMP GetUserType(DWORD dwFromOfType, LPOLESTR *pszUserType);
|
|
STDMETHODIMP SetExtent(DWORD dwDrawAspect, LPSIZEL psizel);
|
|
STDMETHODIMP GetExtent(DWORD dwDrawAspect, LPSIZEL psizel);
|
|
STDMETHODIMP Advise(LPADVISESINK pAdvSink, DWORD *pdwConnection);
|
|
STDMETHODIMP Unadvise(DWORD dwConnection);
|
|
STDMETHODIMP EnumAdvise(LPENUMSTATDATA *ppenumAdvise);
|
|
STDMETHODIMP GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus);
|
|
STDMETHODIMP SetColorScheme(LPLOGPALETTE pLogpal);
|
|
|
|
// IViewObject2 Methods...
|
|
STDMETHODIMP Draw(DWORD dwDrawAspect, LONG lindex, void *pvAspect,
|
|
DVTARGETDEVICE *ptd, HDC hdcTargetDev,
|
|
HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds,
|
|
BOOL (CALLBACK *pfnContinue)(ULONG_PTR), ULONG_PTR dwContinue);
|
|
STDMETHODIMP GetColorSet(DWORD dwAspect, LONG lindex, void *pvAspect,
|
|
DVTARGETDEVICE *ptd, HDC hdcTargetDev,
|
|
LPLOGPALETTE *ppColorSet);
|
|
STDMETHODIMP Freeze(DWORD dwDrawAspect, LONG lindex, void * pvAspect,
|
|
DWORD *pdwFreeze);
|
|
STDMETHODIMP Unfreeze(DWORD dwFreeze);
|
|
STDMETHODIMP SetAdvise(DWORD dwAspects, DWORD dwAdvf,
|
|
LPADVISESINK pAdvSink);
|
|
STDMETHODIMP GetAdvise(DWORD *pdwAspects, DWORD *pdwAdvf,
|
|
LPADVISESINK *ppAdvSink);
|
|
STDMETHODIMP GetExtent(DWORD dwAspect, LONG lindex, DVTARGETDEVICE *ptd,
|
|
LPSIZEL pszl);
|
|
// IAdviseSink Methods...
|
|
STDMETHODIMP_(void) OnDataChange(LPFORMATETC, LPSTGMEDIUM);
|
|
STDMETHODIMP_(void) OnViewChange(DWORD, LONG);
|
|
STDMETHODIMP_(void) OnRename(LPMONIKER);
|
|
STDMETHODIMP_(void) OnSave(void);
|
|
STDMETHODIMP_(void) OnClose(void);
|
|
|
|
// IRunnable Object methods...
|
|
STDMETHODIMP GetRunningClass(LPCLSID);
|
|
STDMETHODIMP Run(LPBC);
|
|
STDMETHODIMP_(BOOL) IsRunning();
|
|
STDMETHODIMP LockRunning(BOOL,BOOL);
|
|
STDMETHODIMP SetContainedObject(BOOL);
|
|
|
|
// IOleCache methods
|
|
// We need an IOLECache Interface to Keep Office97 happy.
|
|
STDMETHODIMP Cache(FORMATETC * pFormatetc, DWORD advf, DWORD * pdwConnection);
|
|
STDMETHODIMP Uncache(DWORD dwConnection);
|
|
STDMETHODIMP EnumCache(IEnumSTATDATA ** ppenumSTATDATA);
|
|
STDMETHODIMP InitCache(IDataObject *pDataObject);
|
|
|
|
// IExternalConnection
|
|
// Some applications RealeaseConnect and then we never hear from them again.
|
|
// This allows us to call OnClose() after the activations.
|
|
STDMETHODIMP_(DWORD) AddConnection(DWORD exconn, DWORD dwreserved );
|
|
STDMETHODIMP_(DWORD) ReleaseConnection(DWORD extconn, DWORD dwreserved, BOOL fLastReleaseCloses );
|
|
|
|
protected:
|
|
LONG _cRef; // package reference count
|
|
UINT _cf; // package clipboard format
|
|
|
|
LPIC _lpic; // icon for the packaged object
|
|
PANETYPE _panetype; // tells us whether we have a cmdlink or embed
|
|
PSSTATE _psState; // persistent storage state
|
|
// These are mutually exclusive, so should probably be made into a union,
|
|
// but that's a minor point.
|
|
LPEMBED _pEmbed; // embedded file structure
|
|
LPCML _pCml; // command line structure
|
|
|
|
BOOL _fLoaded; // true if data from persistent storage
|
|
|
|
// IOleObject vars from SetHostNames
|
|
LPOLESTR _lpszContainerApp;
|
|
LPOLESTR _lpszContainerObj;
|
|
|
|
BOOL _fIsDirty; // dirty flag for our internal storage from the pov of our container
|
|
DWORD _dwCookie; // connection value for AdviseSink
|
|
|
|
// Advise interfaces
|
|
LPDATAADVISEHOLDER _pIDataAdviseHolder;
|
|
LPOLEADVISEHOLDER _pIOleAdviseHolder;
|
|
LPOLECLIENTSITE _pIOleClientSite;
|
|
|
|
// Excel hack: when Excel hosts what it thinks is a link it always NULLs out
|
|
// it's "object" pointer. If we call anything on IOleClientSite other than
|
|
// save then it will fault.
|
|
BOOL _fNoIOleClientSiteCalls;
|
|
|
|
BOOL _fFrozen;
|
|
|
|
// to be able to send view change notifications we need these vars
|
|
IAdviseSink *_pViewSink;
|
|
DWORD _dwViewAspects;
|
|
DWORD _dwViewAdvf;
|
|
|
|
// IEnumOLEVERB variables:
|
|
ULONG _cVerbs;
|
|
ULONG _nCurVerb;
|
|
OLEVERB* _pVerbs;
|
|
IContextMenu* _pcm;
|
|
|
|
// IEnumOLEVERB helper methods:
|
|
HRESULT InitVerbEnum(OLEVERB* pVerbs, ULONG cVerbs);
|
|
HRESULT GetContextMenu(IContextMenu** ppcm);
|
|
VOID ReleaseContextMenu();
|
|
|
|
// if fInitFile is TRUE, then we will totally initialize ourselves
|
|
// from the given filename. In other words, all our structures will be
|
|
// initialized after calling this is fInitFile = TRUE. On the other hand,
|
|
// if it's FALSE, then we'll just reinit our data and not update icon
|
|
// and filename information.
|
|
//
|
|
HRESULT EmbedInitFromFile(LPCTSTR lpFileName, BOOL fInitFile);
|
|
HRESULT CmlInitFromFile(LPTSTR lpFilename, BOOL fUpdateIcon, PANETYPE paneType);
|
|
HRESULT InitFromPackInfo(LPPACKAGER_INFO lppi);
|
|
|
|
HRESULT CreateTempFile(bool deleteExisting = false);
|
|
HRESULT CreateTempFileName();
|
|
HRESULT _IconRefresh();
|
|
void _DestroyIC();
|
|
BOOL _IconCalcSize(LPIC lpic);
|
|
VOID _IconDraw(LPIC,HDC, LPRECT);
|
|
LPIC _IconCreateFromFile(LPCTSTR lpstrFile);
|
|
VOID _GetCurrentIcon(LPIC lpic);
|
|
void _CreateSaferIconTitle(LPTSTR szSaferTitle, LPCTSTR szIconTitle);
|
|
void _DrawIconToDC(HDC hdcMF, LPIC lpic, bool stripAlpha, LPCTSTR pszActualFileName);
|
|
|
|
// Data Transfer functions...
|
|
HRESULT GetFileDescriptor(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
|
|
HRESULT GetFileContents(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
|
|
HRESULT GetMetafilePict(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
|
|
HRESULT GetEnhMetafile(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
|
|
HRESULT GetObjectDescriptor(LPFORMATETC pFE, LPSTGMEDIUM pSTM) ;
|
|
|
|
HRESULT CreateShortcutOnStream(IStream* pstm);
|
|
|
|
// Packager Read/Write Functions...
|
|
HRESULT PackageReadFromStream(IStream* pstm);
|
|
HRESULT IconReadFromStream(IStream* pstm);
|
|
HRESULT EmbedReadFromStream(IStream* pstm);
|
|
HRESULT CmlReadFromStream(IStream* pstm);
|
|
HRESULT PackageWriteToStream(IStream* pstm);
|
|
HRESULT IconWriteToStream(IStream* pstm, DWORD *pdw);
|
|
HRESULT EmbedWriteToStream(IStream* pstm, DWORD *pdw);
|
|
HRESULT CmlWriteToStream(IStream* pstm, DWORD *pdw);
|
|
|
|
// Some utility functions and data
|
|
void _FixupTempFile(IPersistFile * ppf, LPEMBED pEmbed);
|
|
|
|
int _GiveWarningMsg();
|
|
|
|
// Misc AppCompat Stuff
|
|
int _iPropertiesMenuItem;
|
|
BOOL _bClosed; // the close happened
|
|
BOOL _bCloseIt; // that we should close at the end of the activate
|
|
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////
|
|
//
|
|
// Package Wizard and Edit Package Dialog Procs and functions
|
|
//
|
|
|
|
// Pages for Wizard
|
|
INT_PTR APIENTRY PackWiz_CreatePackageDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
INT_PTR APIENTRY PackWiz_SelectFileDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
INT_PTR APIENTRY PackWiz_SelectLabelDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
|
|
// Edit dialog procs
|
|
INT_PTR APIENTRY PackWiz_EditEmbedPackageDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
INT_PTR APIENTRY PackWiz_EditCmdPackakgeDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
|
|
// functions
|
|
int PackWiz_CreateWizard(HWND,LPPACKAGER_INFO);
|
|
int PackWiz_EditPackage(HWND,int,LPPACKAGER_INFO);
|
|
VOID PackWiz_FillInPropertyPage(PROPSHEETPAGE *, INT, DLGPROC);
|
|
|
|
|
|
#endif // __cplusplus
|
|
|
|
#endif
|