1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _INC_COMMONEMBOBJ_HXX_ 25 #define _INC_COMMONEMBOBJ_HXX_ 26 27 #include <com/sun/star/uno/Sequence.hxx> 28 #include <com/sun/star/uno/Reference.hxx> 29 #include <com/sun/star/uno/Any.hxx> 30 #include <com/sun/star/container/XChild.hpp> 31 #include <com/sun/star/document/XStorageBasedDocument.hpp> 32 #include <com/sun/star/embed/XEmbeddedObject.hpp> 33 #include <com/sun/star/embed/XVisualObject.hpp> 34 #include <com/sun/star/embed/XEmbedPersist.hpp> 35 #include <com/sun/star/embed/XLinkageSupport.hpp> 36 #include <com/sun/star/embed/XClassifiedObject.hpp> 37 #include <com/sun/star/embed/XComponentSupplier.hpp> 38 #include <com/sun/star/embed/XInplaceObject.hpp> 39 #include <com/sun/star/embed/XStateChangeBroadcaster.hpp> 40 #include <com/sun/star/awt/XWindow.hpp> 41 #include <com/sun/star/awt/Rectangle.hpp> 42 #include <com/sun/star/document/XEventBroadcaster.hpp> 43 #include <com/sun/star/util/XCloseable.hpp> 44 #include <com/sun/star/chart2/XDefaultSizeTransmitter.hpp> 45 #include <cppuhelper/weak.hxx> 46 47 namespace com { namespace sun { namespace star { 48 namespace embed { 49 class XStorage; 50 } 51 namespace frame { 52 class XModel; 53 class XFrame; 54 } 55 namespace lang { 56 class XMultiServiceFactory; 57 } 58 namespace util { 59 class XCloseListener; 60 } 61 namespace beans { 62 struct PropertyValue; 63 struct NamedValue; 64 } 65 }}} 66 67 namespace cppu { 68 class OMultiTypeInterfaceContainerHelper; 69 } 70 71 namespace comphelper { 72 class NamedValueCollection; 73 } 74 75 #define NUM_SUPPORTED_STATES 5 76 // #define NUM_SUPPORTED_VERBS 5 77 78 #include "docholder.hxx" 79 80 class Interceptor; 81 82 class OCommonEmbeddedObject : public ::com::sun::star::embed::XEmbeddedObject 83 , public ::com::sun::star::embed::XEmbedPersist 84 , public ::com::sun::star::embed::XLinkageSupport 85 , public ::com::sun::star::embed::XInplaceObject 86 , public ::com::sun::star::container::XChild 87 , public ::com::sun::star::chart2::XDefaultSizeTransmitter 88 , public ::cppu::OWeakObject 89 { 90 protected: 91 ::osl::Mutex m_aMutex; 92 93 DocumentHolder* m_pDocHolder; 94 95 ::cppu::OMultiTypeInterfaceContainerHelper* m_pInterfaceContainer; 96 97 sal_Bool m_bReadOnly; 98 99 sal_Bool m_bDisposed; 100 sal_Bool m_bClosed; 101 102 sal_Int32 m_nObjectState; 103 sal_Int32 m_nTargetState; // should be -1 except during state changing 104 sal_Int32 m_nUpdateMode; 105 106 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xFactory; 107 108 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > m_aDocMediaDescriptor; 109 110 ::com::sun::star::uno::Sequence< sal_Int8 > m_aClassID; 111 ::rtl::OUString m_aClassName; 112 113 ::rtl::OUString m_aDocServiceName; 114 ::rtl::OUString m_aPresetFilterName; 115 116 sal_Int64 m_nMiscStatus; 117 118 ::com::sun::star::uno::Sequence< ::com::sun::star::embed::VerbDescriptor > m_aObjectVerbs; 119 120 ::com::sun::star::uno::Sequence< sal_Int32 > m_aAcceptedStates; 121 ::com::sun::star::uno::Sequence< sal_Int32 > m_pIntermediateStatesSeqs[NUM_SUPPORTED_STATES][NUM_SUPPORTED_STATES]; 122 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< sal_Int32 > > m_aVerbTable; 123 124 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient > m_xClientSite; 125 126 ::rtl::OUString m_aContainerName; 127 ::rtl::OUString m_aDefaultParentBaseURL; 128 ::rtl::OUString m_aModuleName; 129 sal_Bool m_bEmbeddedScriptSupport; 130 sal_Bool m_bDocumentRecoverySupport; 131 132 Interceptor* m_pInterceptor; 133 134 // following information will be used between SaveAs and SaveCompleted 135 sal_Bool m_bWaitSaveCompleted; 136 ::rtl::OUString m_aNewEntryName; 137 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xNewParentStorage; 138 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xNewObjectStorage; 139 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > m_aNewDocMediaDescriptor; 140 141 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > m_xClientWindow; // ??? 142 ::com::sun::star::awt::Rectangle m_aOwnRectangle; 143 ::com::sun::star::awt::Rectangle m_aClipRectangle; 144 145 sal_Bool m_bIsLink; 146 147 // embedded object related stuff 148 ::rtl::OUString m_aEntryName; 149 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xParentStorage; 150 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xObjectStorage; 151 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xRecoveryStorage; 152 153 // link related stuff 154 ::rtl::OUString m_aLinkURL; 155 ::rtl::OUString m_aLinkFilterName; 156 sal_Bool m_bLinkHasPassword; 157 ::rtl::OUString m_aLinkPassword; 158 159 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent; 160 161 sal_Bool m_bHasClonedSize; // the object has cached size 162 ::com::sun::star::awt::Size m_aClonedSize; 163 sal_Int32 m_nClonedMapUnit; 164 ::com::sun::star::awt::Size m_aDefaultSizeForChart_In_100TH_MM;//#i103460# charts do not necessarily have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this member 165 166 private: 167 void CommonInit_Impl( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& aObjectProps ); 168 169 void LinkInit_Impl( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& aObjectProps, 170 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aMediaDescr, 171 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aObjectDescr ); 172 173 174 void SwitchOwnPersistence( 175 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewParentStorage, 176 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewObjectStorage, 177 const ::rtl::OUString& aNewName ); 178 179 void SwitchOwnPersistence( 180 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewParentStorage, 181 const ::rtl::OUString& aNewName ); 182 GetDocumentServiceName() const183 ::rtl::OUString GetDocumentServiceName() const { return m_aDocServiceName; } GetPresetFilterName() const184 ::rtl::OUString GetPresetFilterName() const { return m_aPresetFilterName; } 185 186 ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > 187 StoreDocumentToTempStream_Impl( sal_Int32 nStorageFormat, 188 const ::rtl::OUString& aBaseURL, 189 const ::rtl::OUString& aHierarchName ); 190 191 sal_Int32 ConvertVerbToState_Impl( sal_Int32 nVerb ); 192 193 void Deactivate(); 194 195 void StateChangeNotification_Impl( sal_Bool bBeforeChange, sal_Int32 nOldState, sal_Int32 nNewState,::osl::ResettableMutexGuard& _rGuard ); 196 197 void SwitchStateTo_Impl( sal_Int32 nNextState ); 198 199 ::com::sun::star::uno::Sequence< sal_Int32 > GetIntermediateStatesSequence_Impl( sal_Int32 nNewState ); 200 201 ::rtl::OUString GetFilterName( sal_Int32 nVersion ) const; 202 ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > LoadDocumentFromStorage_Impl(); 203 204 ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > LoadLink_Impl(); 205 206 ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > InitNewDocument_Impl(); 207 208 void StoreDocToStorage_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 209 sal_Int32 nStorageVersion, 210 const ::rtl::OUString& aBaseURL, 211 const ::rtl::OUString& aHierarchName, 212 sal_Bool bAttachToStorage ); 213 214 void SwitchDocToStorage_Impl( 215 const ::com::sun::star::uno::Reference< ::com::sun::star::document::XStorageBasedDocument >& xDoc, 216 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage ); 217 218 void FillDefaultLoadArgs_Impl( 219 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& i_rxStorage, 220 ::comphelper::NamedValueCollection& o_rLoadArgs 221 ) const; 222 223 void EmbedAndReparentDoc_Impl( 224 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable >& i_rxDocument 225 ) const; 226 227 ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > CreateDocFromMediaDescr_Impl( 228 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aMedDescr ); 229 230 ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > CreateTempDocFromLink_Impl(); 231 232 ::rtl::OUString GetBaseURL_Impl() const; 233 ::rtl::OUString GetBaseURLFrom_Impl( 234 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, 235 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ); 236 237 public: 238 OCommonEmbeddedObject( 239 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory, 240 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& aObjectProps ); 241 242 // no persistence for linked objects, so the descriptors are provided in constructor 243 OCommonEmbeddedObject( 244 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory, 245 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& aObjectProps, 246 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aMediaDescr, 247 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aObjectDescr ); 248 249 virtual ~OCommonEmbeddedObject(); 250 251 void SaveObject_Impl(); 252 253 void requestPositioning( const ::com::sun::star::awt::Rectangle& aRect ); 254 255 // not a real listener and should not be 256 void PostEvent_Impl( const ::rtl::OUString& aEventName, 257 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xSource = 258 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() ); 259 260 // XInterface 261 262 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& rType ) ; 263 264 virtual void SAL_CALL acquire() 265 throw(); 266 267 virtual void SAL_CALL release() 268 throw(); 269 270 // XTypeProvider 271 272 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() ; 273 274 virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() ; 275 276 // XEmbeddedObject 277 278 virtual void SAL_CALL changeState( sal_Int32 nNewState ); 279 280 virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getReachableStates(); 281 282 virtual sal_Int32 SAL_CALL getCurrentState(); 283 284 virtual void SAL_CALL doVerb( sal_Int32 nVerbID ); 285 286 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::embed::VerbDescriptor > SAL_CALL getSupportedVerbs(); 287 288 virtual void SAL_CALL setClientSite( 289 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient >& xClient ); 290 291 virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient > SAL_CALL getClientSite(); 292 293 virtual void SAL_CALL update(); 294 295 virtual void SAL_CALL setUpdateMode( sal_Int32 nMode ); 296 297 virtual sal_Int64 SAL_CALL getStatus( sal_Int64 nAspect ); 298 299 virtual void SAL_CALL setContainerName( const ::rtl::OUString& sName ); 300 301 302 // XVisualObject 303 304 virtual void SAL_CALL setVisualAreaSize( sal_Int64 nAspect, const ::com::sun::star::awt::Size& aSize ); 305 306 virtual ::com::sun::star::awt::Size SAL_CALL getVisualAreaSize( sal_Int64 nAspect ); 307 308 virtual ::com::sun::star::embed::VisualRepresentation SAL_CALL getPreferredVisualRepresentation( ::sal_Int64 nAspect ); 309 310 virtual sal_Int32 SAL_CALL getMapUnit( sal_Int64 nAspect ); 311 312 // XEmbedPersist 313 314 virtual void SAL_CALL setPersistentEntry( 315 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 316 const ::rtl::OUString& sEntName, 317 sal_Int32 nEntryConnectionMode, 318 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, 319 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ); 320 321 virtual void SAL_CALL storeToEntry( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ); 322 323 virtual void SAL_CALL storeAsEntry( 324 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 325 const ::rtl::OUString& sEntName, 326 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, 327 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ); 328 329 virtual void SAL_CALL saveCompleted( sal_Bool bUseNew ); 330 331 virtual sal_Bool SAL_CALL hasEntry(); 332 333 virtual ::rtl::OUString SAL_CALL getEntryName(); 334 335 // XLinkageSupport 336 337 virtual void SAL_CALL breakLink( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 338 const ::rtl::OUString& sEntName ); 339 340 virtual sal_Bool SAL_CALL isLink(); 341 342 virtual ::rtl::OUString SAL_CALL getLinkURL(); 343 344 345 // XCommonEmbedPersist 346 347 virtual void SAL_CALL storeOwn(); 348 349 virtual sal_Bool SAL_CALL isReadonly(); 350 351 virtual void SAL_CALL reload( 352 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, 353 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ); 354 355 356 // XInplaceObject 357 358 virtual void SAL_CALL setObjectRectangles( const ::com::sun::star::awt::Rectangle& aPosRect, 359 const ::com::sun::star::awt::Rectangle& aClipRect ); 360 361 virtual void SAL_CALL enableModeless( sal_Bool bEnable ); 362 363 virtual void SAL_CALL translateAccelerators( 364 const ::com::sun::star::uno::Sequence< ::com::sun::star::awt::KeyEvent >& aKeys ); 365 366 // XClassifiedObject 367 368 virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getClassID(); 369 370 virtual ::rtl::OUString SAL_CALL getClassName(); 371 372 virtual void SAL_CALL setClassInfo( 373 const ::com::sun::star::uno::Sequence< sal_Int8 >& aClassID, const ::rtl::OUString& aClassName ); 374 375 376 // XComponentSupplier 377 378 virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > SAL_CALL getComponent(); 379 380 // XStateChangeBroadcaster 381 virtual void SAL_CALL addStateChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener >& xListener ); 382 virtual void SAL_CALL removeStateChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener >& xListener ); 383 384 // XCloseable 385 386 virtual void SAL_CALL close( sal_Bool DeliverOwnership ); 387 388 virtual void SAL_CALL addCloseListener( 389 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener >& Listener ); 390 391 virtual void SAL_CALL removeCloseListener( 392 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener >& Listener ); 393 394 // XEventBroadcaster 395 virtual void SAL_CALL addEventListener( 396 const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& Listener ); 397 398 virtual void SAL_CALL removeEventListener( 399 const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& Listener ); 400 401 // XChild 402 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent( ); 403 virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ); 404 405 // XDefaultSizeTransmitter 406 //#i103460# charts do not necessarily have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this method 407 virtual void SAL_CALL setDefaultSize( const ::com::sun::star::awt::Size& rSize_100TH_MM ); 408 }; 409 410 #endif 411