xref: /trunk/main/embeddedobj/source/inc/commonembobj.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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