xref: /AOO41X/main/framework/inc/services/frameloaderfactory.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3) !
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 __FRAMEWORK_SERVICES_FRAMELOADERFACTORY_HXX_
29 #define __FRAMEWORK_SERVICES_FRAMELOADERFACTORY_HXX_
30 
31 //_________________________________________________________________________________________________________________
32 //  my own includes
33 //_________________________________________________________________________________________________________________
34 
35 #include <classes/filtercache.hxx>
36 #include <threadhelp/threadhelpbase.hxx>
37 #include <macros/generic.hxx>
38 #include <macros/debug.hxx>
39 #include <macros/xinterface.hxx>
40 #include <macros/xtypeprovider.hxx>
41 #include <macros/xserviceinfo.hxx>
42 #include <general.h>
43 
44 //_________________________________________________________________________________________________________________
45 //  interface includes
46 //_________________________________________________________________________________________________________________
47 #include <com/sun/star/beans/PropertyValue.hpp>
48 #include <com/sun/star/lang/XInitialization.hpp>
49 #include <com/sun/star/lang/WrappedTargetException.hpp>
50 #include <com/sun/star/container/XNameAccess.hpp>
51 #include <com/sun/star/container/NoSuchElementException.hpp>
52 #include <com/sun/star/io/XInputStream.hpp>
53 
54 //_________________________________________________________________________________________________________________
55 //  other includes
56 //_________________________________________________________________________________________________________________
57 #include <cppuhelper/implbase3.hxx>
58 
59 //_________________________________________________________________________________________________________________
60 //  namespace
61 //_________________________________________________________________________________________________________________
62 
63 namespace framework{
64 
65 //_________________________________________________________________________________________________________________
66 //  exported const
67 //_________________________________________________________________________________________________________________
68 
69 //_________________________________________________________________________________________________________________
70 //  exported definitions
71 //_________________________________________________________________________________________________________________
72 
73 struct tIMPLExtractedArguments
74 {
75     ::rtl::OUString                                 sMimeType           ;
76     sal_Int32                                       nFlags              ;
77     ::rtl::OUString                                 sFilterName         ;
78     sal_Int32                                       nClipboardFormat    ;
79     ::rtl::OUString                                 sDetectService      ;
80     css::uno::Reference< css::io::XInputStream >    xInputStream        ;
81 
82     sal_Int32                                       nValidMask          ;
83 };
84 
85 /*-************************************************************************************************************//**
86     @short      factory to create frameloader-objects
87     @descr      These class can be used to create new loader for specified contents.
88                 We use cached values of the registry to lay down, wich frameloader match
89                 a given URL or filtername. To do this, we use the XMultiServiceFactory-interface.
90 
91     @ATTENTION  In a specialmode of these implementation we support a simple filterdetection.
92                 But there is no special interface. You must call some existing methods in another context!
93                 see createInstanceWithArguments() fo rfurther informations!
94 
95     @implements XInterface
96                 XTypeProvider
97                 XServiceInfo
98                 XMultiServiceFactory
99                 XNameAccess
100                 XElementAccess
101     @base       ThreadHelpBase
102                 OWeakObject
103 
104     @devstatus  deprecated
105 *//*-*************************************************************************************************************/
106 
107 class FrameLoaderFactory    :   public ThreadHelpBase                           ,       // Struct for right initalization of mutex member! Mst first of baseclasses
108                                 public ::cppu::WeakImplHelper3< ::com::sun::star::lang::XServiceInfo,::com::sun::star::lang::XMultiServiceFactory,::com::sun::star::container::XNameAccess >
109 {
110     //-------------------------------------------------------------------------------------------------------------
111     //  public methods
112     //-------------------------------------------------------------------------------------------------------------
113 
114     public:
115 
116         //---------------------------------------------------------------------------------------------------------
117         //  constructor / destructor
118         //---------------------------------------------------------------------------------------------------------
119 
120         /*-****************************************************************************************************//**
121             @short      standard constructor
122             @descr      Initialize a new instance and fill the registrycache with values.
123                         To do this - xFactory must be valid!
124 
125             @seealso    class RegistryCache
126             @seealso    member m_aRegistryCache
127 
128             @param      "xFactory", factory which has created us.
129             @return     -
130 
131             @onerror    An ASSERTION is thrown in debug version, if xFactory is invalid or cache can't filled.
132         *//*-*****************************************************************************************************/
133 
134         FrameLoaderFactory( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory );
135 
136         /*-****************************************************************************************************//**
137             @short      standard destructor to delete instance
138             @descr      We use it to clear ouer cache.
139 
140             @seealso    class RegistryCache
141 
142             @param      -
143             @return     -
144 
145             @onerror    -
146         *//*-*****************************************************************************************************/
147 
148         virtual ~FrameLoaderFactory();
149 
150         //---------------------------------------------------------------------------------------------------------
151         //  XInterface, XTypeProvider, XServiceInfo
152         //---------------------------------------------------------------------------------------------------------
153 
154         DECLARE_XSERVICEINFO
155 
156         //---------------------------------------------------------------------------------------------------------
157         //  XMultiServiceFactory
158         //---------------------------------------------------------------------------------------------------------
159 
160         /*-****************************************************************************************************//**
161             @short      create a new frameloder (without arguments!)
162             @descr      We search for an agreement between given type name and our cache-content.
163                         If we found some information, we create the registered frameloader for these type.
164                         Otherwise - we return NULL.
165                         We search from begin to end of internal loader list!
166 
167             @seealso    method impl_createFrameLoader()
168             @seealso    method createInstanceWithArguments()
169 
170             @param      "sTypeName", type name of a document to filter, open or save.
171             @return     A reference to a new created frameloader.
172 
173             @onerror    A null reference is returned.
174         *//*-*****************************************************************************************************/
175 
176         virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( const ::rtl::OUString& sTypeName ) throw(  css::uno::Exception         ,
177                                                                                                                                 css::uno::RuntimeException  );
178 
179         /*-****************************************************************************************************//**
180             @short      create a new frameloder
181             @descr      We search for an agreement between given type name and our cache-content.
182                         If we found some information, we create the registered frameloader for these type.
183                         Otherwise - we return NULL.
184                         You can give us some optional arguments to influence our search!
185 
186             @seealso    method impl_createFrameLoader()
187             @seealso    method createInstance()
188 
189             @param      "sTypeName", type name of a document to filter, open or save.
190             @param      "seqArguments", list of optional arguments for initializing of new frameloader.
191             @return     A reference to a new created frameloader.
192 
193             @onerror    A null reference is returned.
194         *//*-*****************************************************************************************************/
195 
196         virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments(   const   ::rtl::OUString&                        sTypeName   ,
197                                                                                                     const   css::uno::Sequence< css::uno::Any >&    seqArguments) throw(    css::uno::Exception     ,
198                                                                                                                                                                             css::uno::RuntimeException);
199 
200         /*-****************************************************************************************************//**
201             @short      not supported
202             @descr      Please use XNameAcces instead of these!
203 
204             @seealso    -
205 
206             @param      -
207             @return     -
208 
209             @onerror    -
210         *//*-*****************************************************************************************************/
211 
212         virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getAvailableServiceNames() throw( css::uno::RuntimeException );
213 
214         //---------------------------------------------------------------------------------------------------------
215         //  XNameAccess
216         //---------------------------------------------------------------------------------------------------------
217 
218         /*-****************************************************************************************************//**
219             @short      return properties of registered frame loader specified by his implementation name
220             @descr      Use these method to get all informations about our internal loader cache
221                         and a special frame loader.
222                         We return a Sequence< PropertyValue > in an Any packed as result.
223 
224                         structure of return value:
225                             [0].Name    =   "Types"
226                             [0].Value   =   list of supported types of these loader as [sequence< oustring >]
227 
228                             [1].Name    =   "UIName"
229                             [1].Value   =   localized name of loader as [string]
230 
231             @seealso    method getElementNames()
232             @seealso    method hasByName()
233 
234             @param      "sName", the name of searched frame loader (use getElementNames() to get it!)
235             @return     A Sequence< PropertyValue > packed in an Any.
236 
237             @onerror    If given name not exist a NoSuchElementException is thrown.
238         *//*-*****************************************************************************************************/
239 
240         virtual css::uno::Any SAL_CALL getByName( const ::rtl::OUString& sName ) throw( css::container::NoSuchElementException  ,
241                                                                                         css::lang::WrappedTargetException       ,
242                                                                                         css::uno::RuntimeException              );
243 
244         /*-****************************************************************************************************//**
245             @short      return list of all well known loader names from configuration
246             @descr      Use these method to get all names of well known loader.
247                         You can use it to get the properties of a loader by calling getByName()!
248 
249             @seealso    method getByName()
250             @seealso    method hasByName()
251 
252             @param      -
253             @return     A list of well known loader. Is static at runtime!
254 
255             @onerror    No error should occure.
256         *//*-*****************************************************************************************************/
257 
258         virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames() throw( css::uno::RuntimeException );
259 
260         /*-****************************************************************************************************//**
261             @short      check if searched frame loader exist in configuration
262             @descr      Normaly nobody need these method realy (use getElementNames() in combination with getByName()).
263                         We guarantee correctness of these mechanism. There is no reason to check for existing elements then ...
264                         but if you have an unknwon name and has no fun to search it in returned sequence ...
265                         you can call these ...
266 
267             @seealso    method getByName()
268             @seealso    method getElementNames()
269 
270             @param      "sName", implementation name of searched frame loader
271             @return     sal_True if loader exist, sal_False otherwise.
272 
273             @onerror    No error should occure.
274         *//*-*****************************************************************************************************/
275 
276         virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& sName ) throw( css::uno::RuntimeException );
277 
278         //---------------------------------------------------------------------------------------------------------
279         //  XElementAccess
280         //---------------------------------------------------------------------------------------------------------
281 
282         /*-****************************************************************************************************//**
283             @short      return the type of retrun value of method XNameAccess::getByName()
284             @descr      In these implementation its a Sequence< PropertyValue > everytime!
285 
286             @seealso    description of interface XNameAccess
287 
288             @param      -
289             @return     Type of Sequence< PropertyValue >.
290 
291             @onerror    No error should occure.
292         *//*-*****************************************************************************************************/
293 
294         virtual css::uno::Type SAL_CALL getElementType() throw( css::uno::RuntimeException );
295 
296         /*-****************************************************************************************************//**
297             @short      return state if informations about frame loader available
298             @descr      If these method return false - no information could'nt read from configuration ...
299                         I think nothing will work then. Normaly we return sal_True!
300 
301             @seealso    class FilterCache!
302 
303             @param      -
304             @return     sal_True if information available, sal_False otherwise.
305 
306             @onerror    No error should occure.
307         *//*-*****************************************************************************************************/
308 
309         virtual sal_Bool SAL_CALL hasElements() throw( css::uno::RuntimeException );
310 
311     //-------------------------------------------------------------------------------------------------------------
312     //  protected methods
313     //-------------------------------------------------------------------------------------------------------------
314 
315     protected:
316 
317     //-------------------------------------------------------------------------------------------------------------
318     //  private methods
319     //-------------------------------------------------------------------------------------------------------------
320 
321     private:
322 
323         /*-****************************************************************************************************//**
324             @short      try to set configuration properties at created loader
325             @descr      We support the old async. loader interface ( XFrameLoader ) and the new one XSynchronousFrameLoader.
326                         The new one should implement a property set on which we can set his configuration values!
327                         We try to cast given loader to these interface - if it's exist we set the values - otherwise not!
328 
329             @seealso    service FrameLoader
330             @seealso    service SynchronousFrameLoader
331 
332             @param      "xLoader" loader with generic XInterface! (We don't know before which service type is used!)
333             @param      "pLoaderInfo" configuration structure of these loader.
334             @return     -
335 
336             @onerror    No error should occure.
337         *//*-*****************************************************************************************************/
338 
339         void impl_initializeLoader( css::uno::Reference< css::uno::XInterface >& xLoader, const Loader& pLoaderInfo );
340 
341     //-------------------------------------------------------------------------------------------------------------
342     //  debug methods
343     //  (should be private everyway!)
344     //-------------------------------------------------------------------------------------------------------------
345 
346         /*-****************************************************************************************************//**
347             @short      debug-method to check incoming parameter of some other mehods of this class
348             @descr      The following methods are used to check parameters for other methods
349                         of this class. The return value is used directly for an ASSERT(...).
350 
351             @seealso    ASSERTs in implementation!
352 
353             @param      references to checking variables
354             @return     sal_False ,on invalid parameter
355             @return     sal_True  ,otherwise
356 
357             @onerror    -
358         *//*-*****************************************************************************************************/
359 
360 
361     #ifdef ENABLE_ASSERTIONS
362 
363     private:
364 
365         static sal_Bool impldbg_checkParameter_FrameLoaderFactory           (   const   css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory    );
366         static sal_Bool impldbg_checkParameter_createInstance               (   const   ::rtl::OUString&                                        sTypeName   );
367         static sal_Bool impldbg_checkParameter_createInstanceWithArguments  (   const   ::rtl::OUString&                                        sTypeName   ,
368                                                                                 const   css::uno::Sequence< css::uno::Any >&                    seqArguments);
369         static sal_Bool impldbg_checkParameter_getByName                    (   const   ::rtl::OUString&                                        sName       );
370         static sal_Bool impldbg_checkParameter_hasByName                    (   const   ::rtl::OUString&                                        sName       );
371 
372     #endif  //  #ifdef ENABLE_ASSERTIONS
373 
374     //-------------------------------------------------------------------------------------------------------------
375     //  private variables
376     //  (should be private everyway!)
377     //-------------------------------------------------------------------------------------------------------------
378 
379     private:
380 
381         css::uno::Reference< css::lang::XMultiServiceFactory >      m_xFactory          ;
382         FilterCache                                                 m_aCache            ;
383 
384 };      //  class FrameLoaderFactory
385 
386 }       //  namespace framework
387 
388 #endif  //  #ifndef __FRAMEWORK_SERVICES_FRAMELOADERFACTORY_HXX_
389