1*161f4cd1SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*161f4cd1SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*161f4cd1SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*161f4cd1SAndrew Rist * distributed with this work for additional information 6*161f4cd1SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*161f4cd1SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*161f4cd1SAndrew Rist * "License"); you may not use this file except in compliance 9*161f4cd1SAndrew Rist * with the License. You may obtain a copy of the License at 10*161f4cd1SAndrew Rist * 11*161f4cd1SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*161f4cd1SAndrew Rist * 13*161f4cd1SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*161f4cd1SAndrew Rist * software distributed under the License is distributed on an 15*161f4cd1SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*161f4cd1SAndrew Rist * KIND, either express or implied. See the License for the 17*161f4cd1SAndrew Rist * specific language governing permissions and limitations 18*161f4cd1SAndrew Rist * under the License. 19*161f4cd1SAndrew Rist * 20*161f4cd1SAndrew Rist *************************************************************/ 21*161f4cd1SAndrew Rist 22*161f4cd1SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef _INPROCEMBOBJ_HXX_ 25cdf0e10cSrcweir #define _INPROCEMBOBJ_HXX_ 26cdf0e10cSrcweir 27cdf0e10cSrcweir #pragma warning(disable : 4668) 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <windows.h> 30cdf0e10cSrcweir #include <oleidl.h> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #include "smartpointer.hxx" 33cdf0e10cSrcweir #include "advisesink.hxx" 34cdf0e10cSrcweir 35cdf0e10cSrcweir #define DEFAULT_ARRAY_LEN 256 36cdf0e10cSrcweir 37cdf0e10cSrcweir namespace inprocserv { 38cdf0e10cSrcweir 39cdf0e10cSrcweir enum InitModes { 40cdf0e10cSrcweir NOINIT, 41cdf0e10cSrcweir INIT_FROM_STORAGE, 42cdf0e10cSrcweir LOAD_FROM_STORAGE, 43cdf0e10cSrcweir LOAD_FROM_FILE 44cdf0e10cSrcweir }; 45cdf0e10cSrcweir 46cdf0e10cSrcweir // ================================== 47cdf0e10cSrcweir // this is a common baseclass that is used to count the objects 48cdf0e10cSrcweir // ================================== 49cdf0e10cSrcweir class InprocCountedObject_Impl 50cdf0e10cSrcweir { 51cdf0e10cSrcweir public: 52cdf0e10cSrcweir InprocCountedObject_Impl(); 53cdf0e10cSrcweir ~InprocCountedObject_Impl(); 54cdf0e10cSrcweir }; 55cdf0e10cSrcweir 56cdf0e10cSrcweir // ================================== 57cdf0e10cSrcweir // this is the inprocess embedded object implementation class 58cdf0e10cSrcweir // ================================== 59cdf0e10cSrcweir class InprocEmbedDocument_Impl : public InprocCountedObject_Impl 60cdf0e10cSrcweir , public IOleObject 61cdf0e10cSrcweir , public IDataObject 62cdf0e10cSrcweir , public IPersistStorage 63cdf0e10cSrcweir , public IPersistFile 64cdf0e10cSrcweir , public IRunnableObject 65cdf0e10cSrcweir , public IViewObject2 66cdf0e10cSrcweir // , public IExternalConnection 67cdf0e10cSrcweir , public IOleInPlaceObject 68cdf0e10cSrcweir , public IDispatch 69cdf0e10cSrcweir { 70cdf0e10cSrcweir ULONG m_refCount; 71cdf0e10cSrcweir BOOLEAN m_bDeleted; 72cdf0e10cSrcweir 73cdf0e10cSrcweir GUID m_guid; 74cdf0e10cSrcweir 75cdf0e10cSrcweir ComSmart< IUnknown > m_pDefHandler; 76cdf0e10cSrcweir InitModes m_nInitMode; 77cdf0e10cSrcweir 78cdf0e10cSrcweir DWORD m_nFileOpenMode; 79cdf0e10cSrcweir wchar_t* m_pFileName; 80cdf0e10cSrcweir 81cdf0e10cSrcweir ComSmart< IStorage > m_pStorage; 82cdf0e10cSrcweir 83cdf0e10cSrcweir ComSmart< IOleClientSite > m_pClientSite; 84cdf0e10cSrcweir ComSmart< IOleContainer > m_pOleContainer; 85cdf0e10cSrcweir 86cdf0e10cSrcweir ULONG m_nCallsOnStack; 87cdf0e10cSrcweir 88cdf0e10cSrcweir // the listeners have wrappers that are directly connected to the object and call the listeners, 89cdf0e10cSrcweir // the wrappers will be reconnected correctly to the new default inprocess holder object 90cdf0e10cSrcweir ComSmart< OleWrapperAdviseSink > m_pOleAdvises[DEFAULT_ARRAY_LEN]; 91cdf0e10cSrcweir ComSmart< OleWrapperAdviseSink > m_pDataAdvises[DEFAULT_ARRAY_LEN]; 92cdf0e10cSrcweir ComSmart< OleWrapperAdviseSink > m_pViewAdvise; 93cdf0e10cSrcweir 94cdf0e10cSrcweir class InternalCacheWrapper : public IOleCache2 95cdf0e10cSrcweir { 96cdf0e10cSrcweir InprocEmbedDocument_Impl& m_rOwnDocument; 97cdf0e10cSrcweir 98cdf0e10cSrcweir public: InternalCacheWrapper(InprocEmbedDocument_Impl & rOwnDocument)99cdf0e10cSrcweir InternalCacheWrapper( InprocEmbedDocument_Impl& rOwnDocument ) 100cdf0e10cSrcweir : m_rOwnDocument( rOwnDocument ) 101cdf0e10cSrcweir {} 102cdf0e10cSrcweir 103cdf0e10cSrcweir /* IUnknown methods */ 104cdf0e10cSrcweir STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); 105cdf0e10cSrcweir STDMETHOD_(ULONG, AddRef)(); 106cdf0e10cSrcweir STDMETHOD_(ULONG, Release)(); 107cdf0e10cSrcweir 108cdf0e10cSrcweir /* IOleCache2 methods */ 109cdf0e10cSrcweir STDMETHOD(Cache)( FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection); 110cdf0e10cSrcweir STDMETHOD(Uncache)( DWORD dwConnection); 111cdf0e10cSrcweir STDMETHOD(EnumCache)( IEnumSTATDATA **ppenumSTATDATA); 112cdf0e10cSrcweir STDMETHOD(InitCache)( IDataObject *pDataObject); 113cdf0e10cSrcweir STDMETHOD(SetData)( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease); 114cdf0e10cSrcweir STDMETHOD(UpdateCache)( LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved); 115cdf0e10cSrcweir STDMETHOD(DiscardCache)( DWORD dwDiscardOptions); 116cdf0e10cSrcweir } m_aInternalCache; 117cdf0e10cSrcweir 118cdf0e10cSrcweir 119cdf0e10cSrcweir DWORD InsertAdviseLinkToList( const ComSmart<OleWrapperAdviseSink>& pOwnAdvise, ComSmart< OleWrapperAdviseSink > pAdvises[] ); 120cdf0e10cSrcweir void Clean(); 121cdf0e10cSrcweir 122cdf0e10cSrcweir 123cdf0e10cSrcweir public: 124cdf0e10cSrcweir InprocEmbedDocument_Impl(const GUID & guid)125cdf0e10cSrcweir InprocEmbedDocument_Impl( const GUID& guid ) 126cdf0e10cSrcweir : m_refCount( 0 ) 127cdf0e10cSrcweir , m_bDeleted( FALSE ) 128cdf0e10cSrcweir , m_guid( guid ) 129cdf0e10cSrcweir , m_nInitMode( NOINIT ) 130cdf0e10cSrcweir , m_nFileOpenMode( 0 ) 131cdf0e10cSrcweir , m_pFileName( NULL ) 132cdf0e10cSrcweir , m_nCallsOnStack( 0 ) 133cdf0e10cSrcweir , m_aInternalCache( *this ) 134cdf0e10cSrcweir {} 135cdf0e10cSrcweir ~InprocEmbedDocument_Impl()136cdf0e10cSrcweir virtual ~InprocEmbedDocument_Impl() 137cdf0e10cSrcweir {} 138cdf0e10cSrcweir 139cdf0e10cSrcweir HRESULT Init(); 140cdf0e10cSrcweir void SetName( LPCOLESTR pszNameFromOutside, wchar_t*& pOwnName ); 141cdf0e10cSrcweir 142cdf0e10cSrcweir BOOL CheckDefHandler(); GetDefHandler()143cdf0e10cSrcweir ComSmart< IUnknown >& GetDefHandler() { return m_pDefHandler; } 144cdf0e10cSrcweir 145cdf0e10cSrcweir /* IUnknown methods */ 146cdf0e10cSrcweir STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); 147cdf0e10cSrcweir STDMETHOD_(ULONG, AddRef)(); 148cdf0e10cSrcweir STDMETHOD_(ULONG, Release)(); 149cdf0e10cSrcweir 150cdf0e10cSrcweir /* IOleObject methods */ 151cdf0e10cSrcweir STDMETHOD(SetClientSite) ( IOleClientSite* pSite ); 152cdf0e10cSrcweir STDMETHOD(GetClientSite) ( IOleClientSite** pSite ); 153cdf0e10cSrcweir STDMETHOD(SetHostNames) ( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj ); 154cdf0e10cSrcweir STDMETHOD(Close) ( DWORD dwSaveOption); 155cdf0e10cSrcweir STDMETHOD(SetMoniker) ( DWORD dwWhichMoniker, IMoniker *pmk ); 156cdf0e10cSrcweir STDMETHOD(GetMoniker) ( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk ); 157cdf0e10cSrcweir STDMETHOD(InitFromData) ( IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved ); 158cdf0e10cSrcweir STDMETHOD(GetClipboardData) ( DWORD dwReserved, IDataObject **ppDataObject ); 159cdf0e10cSrcweir STDMETHOD(DoVerb) ( LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect ); 160cdf0e10cSrcweir STDMETHOD(EnumVerbs) ( IEnumOLEVERB **ppEnumOleVerb ); 161cdf0e10cSrcweir STDMETHOD(Update) (); 162cdf0e10cSrcweir STDMETHOD(IsUpToDate) (); 163cdf0e10cSrcweir STDMETHOD(GetUserClassID) ( CLSID *pClsid ); 164cdf0e10cSrcweir STDMETHOD(GetUserType) ( DWORD dwFormOfType, LPOLESTR *pszUserType ); 165cdf0e10cSrcweir STDMETHOD(SetExtent) ( DWORD dwDrawAspect, SIZEL *psizel ); 166cdf0e10cSrcweir STDMETHOD(GetExtent) ( DWORD dwDrawAspect, SIZEL *psizel ); 167cdf0e10cSrcweir STDMETHOD(Advise) ( IAdviseSink *pAdvSink, DWORD *pdwConnection ); 168cdf0e10cSrcweir STDMETHOD(Unadvise) ( DWORD dwConnection ); 169cdf0e10cSrcweir STDMETHOD(EnumAdvise) ( IEnumSTATDATA **ppenumAdvise ); 170cdf0e10cSrcweir STDMETHOD(GetMiscStatus) ( DWORD dwAspect, DWORD *pdwStatus ); 171cdf0e10cSrcweir STDMETHOD(SetColorScheme) ( LOGPALETTE *pLogpal ); 172cdf0e10cSrcweir 173cdf0e10cSrcweir /* IDataObject methods */ 174cdf0e10cSrcweir STDMETHOD(GetData) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium ); 175cdf0e10cSrcweir STDMETHOD(GetDataHere) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium ); 176cdf0e10cSrcweir STDMETHOD(QueryGetData) ( FORMATETC * pFormatetc ); 177cdf0e10cSrcweir STDMETHOD(GetCanonicalFormatEtc) ( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut ); 178cdf0e10cSrcweir STDMETHOD(SetData) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease ); 179cdf0e10cSrcweir STDMETHOD(EnumFormatEtc) ( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc ); 180cdf0e10cSrcweir STDMETHOD(DAdvise) ( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection ); 181cdf0e10cSrcweir STDMETHOD(DUnadvise) ( DWORD dwConnection ); 182cdf0e10cSrcweir STDMETHOD(EnumDAdvise) ( IEnumSTATDATA ** ppenumAdvise ); 183cdf0e10cSrcweir 184cdf0e10cSrcweir /* IPersistMethod */ 185cdf0e10cSrcweir STDMETHOD(GetClassID)(CLSID *pClassID); 186cdf0e10cSrcweir 187cdf0e10cSrcweir /* IPersistStorage methods */ 188cdf0e10cSrcweir STDMETHOD(IsDirty) (); 189cdf0e10cSrcweir STDMETHOD(InitNew) ( IStorage *pStg ); 190cdf0e10cSrcweir STDMETHOD(Load) ( IStorage* pStr ); 191cdf0e10cSrcweir STDMETHOD(Save) ( IStorage *pStgSave, BOOL fSameAsLoad ); 192cdf0e10cSrcweir STDMETHOD(SaveCompleted) ( IStorage *pStgNew ); 193cdf0e10cSrcweir STDMETHOD(HandsOffStorage) (void); 194cdf0e10cSrcweir 195cdf0e10cSrcweir /* IPersistFile methods */ 196cdf0e10cSrcweir STDMETHOD(Load) ( LPCOLESTR pszFileName, DWORD dwMode ); 197cdf0e10cSrcweir STDMETHOD(Save) ( LPCOLESTR pszFileName, BOOL fRemember ); 198cdf0e10cSrcweir STDMETHOD(SaveCompleted) ( LPCOLESTR pszFileName ); 199cdf0e10cSrcweir STDMETHOD(GetCurFile) ( LPOLESTR *ppszFileName ); 200cdf0e10cSrcweir 201cdf0e10cSrcweir /* IRunnableObject methods */ 202cdf0e10cSrcweir STDMETHOD(GetRunningClass) ( LPCLSID lpClsid); 203cdf0e10cSrcweir STDMETHOD(Run) ( LPBINDCTX pbc); 204cdf0e10cSrcweir virtual BOOL STDMETHODCALLTYPE IsRunning( void); 205cdf0e10cSrcweir STDMETHOD(LockRunning) ( BOOL fLock, BOOL fLastUnlockCloses ); 206cdf0e10cSrcweir STDMETHOD(SetContainedObject) ( BOOL fContained); 207cdf0e10cSrcweir 208cdf0e10cSrcweir /* IViewObject2 methods */ 209cdf0e10cSrcweir STDMETHOD(Draw)( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL ( STDMETHODCALLTYPE *pfnContinue )( ULONG_PTR dwContinue ), ULONG_PTR dwContinue); 210cdf0e10cSrcweir STDMETHOD(GetColorSet)( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet); 211cdf0e10cSrcweir STDMETHOD(Freeze)( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze); 212cdf0e10cSrcweir STDMETHOD(Unfreeze)( DWORD dwFreeze); 213cdf0e10cSrcweir STDMETHOD(SetAdvise)( DWORD aspects, DWORD advf, IAdviseSink *pAdvSink); 214cdf0e10cSrcweir STDMETHOD(GetAdvise)( DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink); 215cdf0e10cSrcweir STDMETHOD(GetExtent)( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel); 216cdf0e10cSrcweir 217cdf0e10cSrcweir /* IOleWindow methods */ 218cdf0e10cSrcweir STDMETHOD(GetWindow)( HWND *phwnd); 219cdf0e10cSrcweir STDMETHOD(ContextSensitiveHelp)( BOOL fEnterMode); 220cdf0e10cSrcweir 221cdf0e10cSrcweir /* IOleInPlaceObject methods */ 222cdf0e10cSrcweir STDMETHOD(InPlaceDeactivate)( void); 223cdf0e10cSrcweir STDMETHOD(UIDeactivate)( void); 224cdf0e10cSrcweir STDMETHOD(SetObjectRects)( LPCRECT lprcPosRect, LPCRECT lprcClipRect); 225cdf0e10cSrcweir STDMETHOD(ReactivateAndUndo)( void); 226cdf0e10cSrcweir 227cdf0e10cSrcweir /*IDispatch methods*/ 228cdf0e10cSrcweir STDMETHOD(GetTypeInfoCount)( UINT *pctinfo); 229cdf0e10cSrcweir STDMETHOD(GetTypeInfo)( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); 230cdf0e10cSrcweir STDMETHOD(GetIDsOfNames)( REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); 231cdf0e10cSrcweir STDMETHOD(Invoke)( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); 232cdf0e10cSrcweir 233cdf0e10cSrcweir }; 234cdf0e10cSrcweir 235cdf0e10cSrcweir } // namespace inprocserv 236cdf0e10cSrcweir 237cdf0e10cSrcweir #endif 238cdf0e10cSrcweir 239