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 _EMBEDDOC_HXX_ 29 #define _EMBEDDOC_HXX_ 30 #if defined(_MSC_VER) && (_MSC_VER >= 1300) 31 #undef _DEBUG 32 #endif 33 #if defined(_MSC_VER) && (_MSC_VER > 1310) 34 #pragma warning(disable : 4917 4555) 35 #endif 36 37 #include "common.h" 38 #include <oleidl.h> 39 #include <objidl.h> 40 41 #include <hash_map> 42 #include <com/sun/star/uno/Reference.h> 43 #ifndef _COM_SUN_STAR_UNO_SEQUENCE_H_ 44 #include <com/sun/star/uno/SEQUENCE.h> 45 #endif 46 47 #include "embeddocaccess.hxx" 48 #include "docholder.hxx" 49 50 typedef ::std::hash_map< DWORD, IAdviseSink* > AdviseSinkHashMap; 51 typedef ::std::hash_map< DWORD, IAdviseSink* >::iterator AdviseSinkHashMapIterator; 52 53 class GDIMetaFile; 54 class CIIAObj; 55 56 class EmbedDocument_Impl 57 : public IPersistStorage, 58 public IDataObject, 59 public IOleObject, 60 public IOleInPlaceObject, 61 public IPersistFile, 62 public IDispatch, 63 public IExternalConnection 64 { 65 protected: 66 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > 67 fillArgsForLoading_Impl( ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > xStream, 68 DWORD nStreamMode, 69 LPCOLESTR pFilePath = NULL ); 70 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > 71 fillArgsForStoring_Impl( ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > xStream ); 72 73 HRESULT SaveTo_Impl( IStorage* pStg ); 74 75 sal_uInt64 getMetaFileHandle_Impl( sal_Bool isEnhMeta ); 76 77 public: 78 EmbedDocument_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& smgr, 79 const GUID* guid ); 80 virtual ~EmbedDocument_Impl(); 81 82 /* IUnknown methods */ 83 STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); 84 STDMETHOD_(ULONG, AddRef)(); 85 STDMETHOD_(ULONG, Release)(); 86 87 /* IPersistMethod */ 88 STDMETHOD(GetClassID)(CLSID *pClassID); 89 90 /* IPersistStorage methods */ 91 STDMETHOD(IsDirty) (); 92 STDMETHOD(InitNew) ( IStorage *pStg ); 93 STDMETHOD(Load) ( IStorage* pStr ); 94 STDMETHOD(Save) ( IStorage *pStgSave, BOOL fSameAsLoad ); 95 STDMETHOD(SaveCompleted) ( IStorage *pStgNew ); 96 STDMETHOD(HandsOffStorage) (void); 97 98 /* IDataObject methods */ 99 STDMETHOD(GetData) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium ); 100 STDMETHOD(GetDataHere) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium ); 101 STDMETHOD(QueryGetData) ( FORMATETC * pFormatetc ); 102 STDMETHOD(GetCanonicalFormatEtc) ( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut ); 103 STDMETHOD(SetData) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease ); 104 STDMETHOD(EnumFormatEtc) ( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc ); 105 STDMETHOD(DAdvise) ( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection ); 106 STDMETHOD(DUnadvise) ( DWORD dwConnection ); 107 STDMETHOD(EnumDAdvise) ( IEnumSTATDATA ** ppenumAdvise ); 108 109 /* IOleObject methods */ 110 STDMETHOD(SetClientSite) ( IOleClientSite* pSite ); 111 STDMETHOD(GetClientSite) ( IOleClientSite** pSite ); 112 STDMETHOD(SetHostNames) ( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj ); 113 STDMETHOD(Close) ( DWORD dwSaveOption); 114 STDMETHOD(SetMoniker) ( DWORD dwWhichMoniker, IMoniker *pmk ); 115 STDMETHOD(GetMoniker) ( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk ); 116 STDMETHOD(InitFromData) ( IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved ); 117 STDMETHOD(GetClipboardData) ( DWORD dwReserved, IDataObject **ppDataObject ); 118 STDMETHOD(DoVerb) ( LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect ); 119 STDMETHOD(EnumVerbs) ( IEnumOLEVERB **ppEnumOleVerb ); 120 STDMETHOD(Update) (); 121 STDMETHOD(IsUpToDate) (); 122 STDMETHOD(GetUserClassID) ( CLSID *pClsid ); 123 STDMETHOD(GetUserType) ( DWORD dwFormOfType, LPOLESTR *pszUserType ); 124 STDMETHOD(SetExtent) ( DWORD dwDrawAspect, SIZEL *psizel ); 125 STDMETHOD(GetExtent) ( DWORD dwDrawAspect, SIZEL *psizel ); 126 STDMETHOD(Advise) ( IAdviseSink *pAdvSink, DWORD *pdwConnection ); 127 STDMETHOD(Unadvise) ( DWORD dwConnection ); 128 STDMETHOD(EnumAdvise) ( IEnumSTATDATA **ppenumAdvise ); 129 STDMETHOD(GetMiscStatus) ( DWORD dwAspect, DWORD *pdwStatus ); 130 STDMETHOD(SetColorScheme) ( LOGPALETTE *pLogpal ); 131 132 /* IOleInPlaceObject methods */ 133 STDMETHOD(GetWindow)(HWND *); 134 STDMETHOD(ContextSensitiveHelp)(BOOL); 135 STDMETHOD(InPlaceDeactivate)(); 136 STDMETHOD(UIDeactivate)(); 137 STDMETHOD(SetObjectRects)(LPCRECT, LPCRECT); 138 STDMETHOD(ReactivateAndUndo)(); 139 140 /* IPersistFile methods */ 141 STDMETHOD(Load) ( LPCOLESTR pszFileName, DWORD dwMode ); 142 STDMETHOD(Save) ( LPCOLESTR pszFileName, BOOL fRemember ); 143 STDMETHOD(SaveCompleted) ( LPCOLESTR pszFileName ); 144 STDMETHOD(GetCurFile) ( LPOLESTR *ppszFileName ); 145 146 /* IDispatch methods */ 147 STDMETHOD(GetTypeInfoCount) ( unsigned int FAR* pctinfo ); 148 STDMETHOD(GetTypeInfo) ( unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo ); 149 STDMETHOD(GetIDsOfNames) ( REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId ); 150 STDMETHOD(Invoke) ( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr ); 151 152 /* IExternalConnection methods */ 153 virtual DWORD STDMETHODCALLTYPE AddConnection( DWORD extconn, DWORD reserved); 154 virtual DWORD STDMETHODCALLTYPE ReleaseConnection( DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses); 155 156 // c++ - methods 157 158 void notify( bool bDataChanged = true ); 159 HRESULT SaveObject(); 160 HRESULT ShowObject(); 161 GUID GetGUID() const { return m_guid; } 162 HRESULT OLENotifyClosing(); 163 164 void Deactivate(); 165 HRESULT OLENotifyDeactivation(); 166 167 protected: 168 oslInterlockedCount m_refCount; 169 170 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xFactory; 171 172 DocumentHolder* m_pDocHolder; 173 ::rtl::OUString m_aFileName; 174 175 CComPtr< IStorage > m_pMasterStorage; 176 CComPtr< IStream > m_pOwnStream; 177 CComPtr< IStream > m_pExtStream; 178 GUID m_guid; 179 180 sal_Bool m_bIsDirty; 181 182 CComPtr< IOleClientSite > m_pClientSite; 183 CComPtr< IDataAdviseHolder > m_pDAdviseHolder; 184 185 AdviseSinkHashMap m_aAdviseHashMap; 186 DWORD m_nAdviseNum; 187 188 ::rtl::Reference< EmbeddedDocumentInstanceAccess_Impl > m_xOwnAccess; 189 190 sal_Bool m_bIsInVerbHandling; 191 }; 192 193 class BooleanGuard_Impl 194 { 195 sal_Bool& m_bValue; 196 197 public: 198 BooleanGuard_Impl( sal_Bool& bValue ) 199 : m_bValue( bValue ) 200 { 201 m_bValue = sal_True; 202 } 203 204 ~BooleanGuard_Impl() 205 { 206 m_bValue = sal_False; 207 } 208 }; 209 210 #endif //_EMBEDDOC_HXX_ 211