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