xref: /AOO41X/main/framework/inc/classes/filtercache.hxx (revision f8e07b45f7e1fb69563504f404bb0b75210f0be6)
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 /*TODO
25     - late init
26     - order by number!
27     - insert default detector and loader as last ones in hashes ... don't hold it as an extra member!
28       => CheckedIterator will be obsolete!
29  */
30 
31 #ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_
32 #define __FRAMEWORK_CLASSES_FILTERCACHE_HXX_
33 
34 //_________________________________________________________________________________________________________________
35 //  my own includes
36 //_________________________________________________________________________________________________________________
37 
38 #include <classes/filtercachedata.hxx>
39 #include <threadhelp/threadhelpbase.hxx>
40 
41 #ifndef __FRAMEWORK_THREADHELP_TRANSACTIONBASE_HXX_
42 #include <threadhelp/transactionbase.hxx>
43 #endif
44 #include <general.h>
45 #include <queries.h>
46 
47 //_________________________________________________________________________________________________________________
48 //  interface includes
49 //_________________________________________________________________________________________________________________
50 #include <com/sun/star/uno/Reference.hxx>
51 #include <com/sun/star/uno/Sequence.hxx>
52 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
53 #include <com/sun/star/registry/XRegistryKey.hpp>
54 #include <com/sun/star/beans/PropertyValue.hpp>
55 #include <com/sun/star/container/ElementExistException.hpp>
56 #include <com/sun/star/container/NoSuchElementException.hpp>
57 
58 //_________________________________________________________________________________________________________________
59 //  other includes
60 //_________________________________________________________________________________________________________________
61 #include <rtl/ustring.hxx>
62 
63 #ifdef ENABLE_GENERATEFILTERCACHE
64     #ifndef _RTL_USTRBUF_HXX_
65     #include <rtl/ustrbuf.hxx>
66     #endif
67 #endif
68 
69 //_________________________________________________________________________________________________________________
70 //  namespace
71 //_________________________________________________________________________________________________________________
72 
73 namespace framework{
74 
75 //_________________________________________________________________________________________________________________
76 //  exported const
77 //_________________________________________________________________________________________________________________
78 
79 //_________________________________________________________________________________________________________________
80 //  exported definitions
81 //_________________________________________________________________________________________________________________
82 
83 /*-************************************************************************************************************//**
84     @short          cache for all filter and type information
85     @descr          Frameloader- and filterfactory need some informations about our current registered filters and types.
86                     For better performance its neccessary to cache all needed values.
87 
88     @implements     -
89     @base           ThreadHelpBase
90                     TransactionBase
91 
92     @devstatus      ready to use
93     @threadsafe     yes
94 *//*-*************************************************************************************************************/
95 
96 class FilterCache   :   private ThreadHelpBase
97                     ,   private TransactionBase
98 {
99     public:
100 
101     //-------------------------------------------------------------------------------------------------------------
102     //  public methods
103     //-------------------------------------------------------------------------------------------------------------
104 
105     public:
106 
107         //---------------------------------------------------------------------------------------------------------
108         //  constructor / destructor
109         //---------------------------------------------------------------------------------------------------------
110 
111         FilterCache( sal_Int32 nVersion = DEFAULT_FILTERCACHE_VERSION,
112                      sal_Int16 nMode    = DEFAULT_FILTERCACHE_MODE   );
113 
114         /*-****************************************************************************************************//**
115             @short      standard destructor to delete instance
116             @descr      This will clear the cache if last owner release it.
117 
118             @seealso    -
119 
120             @param      -
121             @return     -
122 
123             @onerror    -
124         *//*-*****************************************************************************************************/
125 
126         virtual ~FilterCache();
127 
128         void flush( DataContainer::ECFGType eType );
129 
130         /*-****************************************************************************************************//**
131             @short      get the current state of the cache
132             @descr      Call this methods to get information about the state of the current cache.
133 
134             @seealso    -
135 
136             @param      -
137             @return     -
138             @return     -
139 
140             @onerror    -
141         *//*-*****************************************************************************************************/
142 
143         sal_Bool isValidOrRepairable() const;
144         sal_Bool hasTypes           () const;
145         sal_Bool hasFilters         () const;
146         sal_Bool hasDetectors       () const;
147         sal_Bool hasLoaders         () const;
148         sal_Bool hasContentHandlers () const;
149 
150         /*-****************************************************************************************************//**
151             @short      search routines to find items which match given parameter
152             @descr      Mostly we search for a type first and get all informations about filter, detector and loader
153                         services from the other configuration tables which are registered for this type.
154                         These operations support a FindFirst/Next mechanism.
155                         If you call search...( ... nStartEntry=0 ... ) we search for
156                         the first entry. If these return a value different from <empty> you can work with these value.
157                         If found value isn't the right one - you can call search method again.
158                         DONT'T CHANGE THE VALUE OF "rStartEntry" between two search calls!
159                         You can use returned value as parameter for getBy...Name() functions of this implementation too!
160 
161             @attention  returned type name is an internal name
162                         returned filter name is an internal name
163                         returned loader name is an implementation name of a service
164                         returned detector name is an implementation name of a service
165 
166             @seealso    -
167 
168             @param      "sResult", name of found type, filter, ...
169             @return     true, if search was successful,
170                         false, otherwise.
171 
172             @onerror    We return false.
173         *//*-*****************************************************************************************************/
174 
175         sal_Bool searchType                     (   const   ::rtl::OUString&            sURL                ,
176                                                     const   ::rtl::OUString&            sMediaType          ,
177                                                     const   ::rtl::OUString&            sClipboardFormat    ,
178                                                             CheckedTypeIterator&        aStartEntry         ,
179                                                             ::rtl::OUString&            sResult             ) const;
180 
181         sal_Bool searchFilterForType            (   const   ::rtl::OUString&            sInternalTypeName   ,
182                                                             CheckedStringListIterator&  aStartEntry         ,
183                                                             ::rtl::OUString&            sResult             ) const;
184 
185         sal_Bool searchDetectorForType          (   const   ::rtl::OUString&            sInternalTypeName   ,
186                                                             CheckedStringListIterator&  aStartEntry         ,
187                                                             ::rtl::OUString&            sResult             ) const;
188 
189         sal_Bool searchLoaderForType            (   const   ::rtl::OUString&            sInternalTypeName   ,
190                                                             CheckedStringListIterator&  aStartEntry         ,
191                                                             ::rtl::OUString&            sResult             ) const;
192 
193         sal_Bool searchContentHandlerForType    (   const   ::rtl::OUString&            sInternalTypeName   ,
194                                                             CheckedStringListIterator&  aStartEntry         ,
195                                                             ::rtl::OUString&            sResult             ) const;
196 
197         /*-****************************************************************************************************//**
198             @short      get all properties of a cache entry by given name
199             @descr      If you need additional informations about our internal cache values
200                         you can use these methods to get a list of all cached config values
201                         and subkeys of specified entry.
202 
203             @seealso    -
204 
205             @param      "sName", name of suspected entry in cache
206             @return     A structure with valid information if item exists! An empty Any otherwise.
207 
208             @onerror    We return an empty Any.
209         *//*-*****************************************************************************************************/
210 
211         css::uno::Sequence< ::rtl::OUString >               getAllTypeNames                 () const;
212         css::uno::Sequence< ::rtl::OUString >               getAllFilterNames               () const;
213         css::uno::Sequence< ::rtl::OUString >               getAllDetectorNames             () const;   // without default detector!
214         css::uno::Sequence< ::rtl::OUString >               getAllLoaderNames               () const;   // without default loader!
215         css::uno::Sequence< ::rtl::OUString >               getAllContentHandlerNames       () const;
216         css::uno::Sequence< ::rtl::OUString >               getAllDetectorNamesWithDefault  () const;   // default detector is last one!
217         css::uno::Sequence< ::rtl::OUString >               getAllLoaderNamesWithDefault    () const;   // default loader is last one!
218         ::rtl::OUString                                     getDefaultLoader                () const;
219 
220         css::uno::Sequence< css::beans::PropertyValue >     getTypeProperties               (   const   ::rtl::OUString&    sName   ) const;
221         css::uno::Sequence< css::beans::PropertyValue >     getFilterProperties             (   const   ::rtl::OUString&    sName   ) const;
222         css::uno::Sequence< css::beans::PropertyValue >     getDetectorProperties           (   const   ::rtl::OUString&    sName   ) const;
223         css::uno::Sequence< css::beans::PropertyValue >     getLoaderProperties             (   const   ::rtl::OUString&    sName   ) const;
224         css::uno::Sequence< css::beans::PropertyValue >     getContentHandlerProperties     (   const   ::rtl::OUString&    sName   ) const;
225 
226         FileType                                            getType                         (   const   ::rtl::OUString&    sName   ) const;
227         Filter                                              getFilter                       (   const   ::rtl::OUString&    sName   ) const;
228         Detector                                            getDetector                     (   const   ::rtl::OUString&    sName   ) const;
229         Loader                                              getLoader                       (   const   ::rtl::OUString&    sName   ) const;
230         ContentHandler                                      getContentHandler               (   const   ::rtl::OUString&    sName   ) const;
231 
232         sal_Bool                                            existsType                      (   const   ::rtl::OUString&    sName   ) const;
233         sal_Bool                                            existsFilter                    (   const   ::rtl::OUString&    sName   ) const;
234         sal_Bool                                            existsDetector                  (   const   ::rtl::OUString&    sName   ) const;
235         sal_Bool                                            existsLoader                    (   const   ::rtl::OUString&    sName   ) const;
236         sal_Bool                                            existsContentHandler            (   const   ::rtl::OUString&    sName   ) const;
237 
238         /*-****************************************************************************************************//**
239             @short      support special query modes
240             @descr      Our owner services need sometimes a special mode to query for subsets of our configuration!
241                         They give us a special query string - we return right values.
242 
243             @seealso    file queries.h
244             @seealso    class FilterFactory
245             @seealso    class FrameLoaderFactory
246             @seealso    class TypeDetection
247 
248             @param      "sName", name of query
249             @return     A structure with valid information!
250 
251             @onerror    We return an empty result set.
252         *//*-*****************************************************************************************************/
253 
254         css::uno::Any queryFilters( const ::rtl::OUString& sQuery ) const;
255 
256         /*-****************************************************************************************************//**
257             @short      support registration of elements in current configuration
258             @descr      Use this methods to add or remove items in our configuration files.
259                         We use the globale configuration to do that ... in fat office "share/config/registry/..."!
260 
261                         *** structure of type properties **********************************************************
262 
263                             PropertyValue.Name                  PropertyValue.Value                 Description
264                             ---------------------------------------------------------------------------------------
265                             ...
266 
267                         *** structure of filter properties ********************************************************
268 
269                             PropertyValue.Name                  PropertyValue.Value                 Description
270                             ---------------------------------------------------------------------------------------
271                             "Name"                              [string]                            internal name
272                             "Type"                              [string]                            registered for these type
273                             "UIName"                            [string]                            localized name for UI (valid for current locale at runtime!)
274                             "UINames"                           [stringlist]                        assignment of all supported localized names to right locales
275                             "DocumentService"                   [string]                            uno servicename of document services
276                             "FilterService"                     [string]                            uno servicename of filter implementation
277                             "Flags"                             [long]                              describe filter
278                             "UserData"                          [stringlist]                        additional user data (format not fixed!)
279                             "FileFormatVersion"                 [long]                              version numbher of supported files
280                             "TemplateName"                      [string]                            name of template
281 
282                         *** structure of detector properties ******************************************************
283 
284                             PropertyValue.Name                  PropertyValue.Value                 Description
285                             ---------------------------------------------------------------------------------------
286                             ...
287 
288                         *** structure of loader properties ********************************************************
289 
290                             PropertyValue.Name                  PropertyValue.Value                 Description
291                             ---------------------------------------------------------------------------------------
292                             ...
293 
294             @seealso    -
295 
296             @param      "sName"         , name of type, filter ...
297             @param      "lProperties"   , values of new type, filter
298             @return     state of operation as bool
299 
300             @onerror    We return false then.
301         *//*-*****************************************************************************************************/
302 
303         sal_Bool addFilter    ( const ::rtl::OUString&                                 sName       ,
304                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
305                                       sal_Bool                                         bException  ) throw(css::container::ElementExistException  ,
306                                                                                                            css::registry::InvalidRegistryException);
307         sal_Bool replaceFilter( const ::rtl::OUString&                                 sName       ,
308                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
309                                       sal_Bool                                         bException  ) throw(css::container::NoSuchElementException  ,
310                                                                                                            css::registry::InvalidRegistryException);
311         sal_Bool removeFilter ( const ::rtl::OUString&                                 sName       ,
312                                       sal_Bool                                         bException  ) throw(css::container::NoSuchElementException  ,
313                                                                                                            css::registry::InvalidRegistryException);
314 
315         sal_Bool addType      ( const ::rtl::OUString&                                 sName       ,
316                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
317                                       sal_Bool                                         bException  ) throw(css::container::ElementExistException  ,
318                                                                                                            css::registry::InvalidRegistryException);
319         sal_Bool replaceType  ( const ::rtl::OUString&                                 sName       ,
320                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
321                                       sal_Bool                                         bException  ) throw(css::container::NoSuchElementException  ,
322                                                                                                            css::registry::InvalidRegistryException);
323         sal_Bool removeType   ( const ::rtl::OUString&                                 sName       ,
324                                       sal_Bool                                         bException  ) throw(css::container::NoSuchElementException  ,
325                                                                                                            css::registry::InvalidRegistryException);
326 
327         sal_Bool addDetector    ( const ::rtl::OUString&                                 sName       ,
328                                   const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
329                                         sal_Bool                                         bException  ) throw(css::container::ElementExistException  ,
330                                                                                                              css::registry::InvalidRegistryException);
331         sal_Bool replaceDetector( const ::rtl::OUString&                                 sName       ,
332                                   const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
333                                         sal_Bool                                         bException  ) throw(css::container::NoSuchElementException  ,
334                                                                                                              css::registry::InvalidRegistryException);
335         sal_Bool removeDetector ( const ::rtl::OUString&                                 sName       ,
336                                         sal_Bool                                         bException  ) throw(css::container::NoSuchElementException  ,
337                                                                                                              css::registry::InvalidRegistryException);
338 
339         sal_Bool validateAndRepair();
340         sal_Bool validateAndRepairTypes();
341         sal_Bool validateAndRepairFilter();
342         sal_Bool validateAndRepairDetectors();
343         sal_Bool validateAndRepairLoader();
344         sal_Bool validateAndRepairHandler();
345 
346     //-------------------------------------------------------------------------------------------------------------
347     //  protected methods
348     //-------------------------------------------------------------------------------------------------------------
349 
350     protected:
351 
352     //-------------------------------------------------------------------------------------------------------------
353     //  private methods
354     //-------------------------------------------------------------------------------------------------------------
355 
356     private:
357 
358     //-------------------------------------------------------------------------------------------------------------
359     //  debug methods
360     //-------------------------------------------------------------------------------------------------------------
361 
362         /*-****************************************************************************************************//**
363             @short      debug-method to check incoming parameter of some other mehods of this class
364             @descr      The following methods are used to check parameters for other methods
365                         of this class. The return value is used directly for an ASSERT(...).
366 
367             @seealso    ASSERT in implementation!
368 
369             @param      references to checking variables
370             @return     sal_False ,on invalid parameter
371             @return     sal_True  ,otherwise
372 
373             @onerror    -
374         *//*-*****************************************************************************************************/
375 
376     #ifdef ENABLE_ASSERTIONS
377 
378     private:
379 
380         static sal_Bool implcp_searchType                           (   const   ::rtl::OUString&                                    sURL                ,
381                                                                         const   ::rtl::OUString*                                    pMediaType          ,
382                                                                         const   ::rtl::OUString*                                    pClipboardFormat    ,
383                                                                         const   CheckedTypeIterator&                                aStartEntry         ,
384                                                                         const   ::rtl::OUString&                                    sResult             );
385         static sal_Bool implcp_searchFilterForType                  (   const   ::rtl::OUString&                                    sInternalTypeName   ,
386                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
387                                                                         const   ::rtl::OUString&                                    sResult             );
388         static sal_Bool implcp_searchDetectorForType                (   const   ::rtl::OUString&                                    sInternalTypeName   ,
389                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
390                                                                         const   ::rtl::OUString&                                    sResult             );
391         static sal_Bool implcp_searchLoaderForType                  (   const   ::rtl::OUString&                                    sInternalTypeName   ,
392                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
393                                                                         const   ::rtl::OUString&                                    sResult             );
394         static sal_Bool implcp_searchContentHandlerForType          (   const   ::rtl::OUString&                                    sInternalTypeName   ,
395                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
396                                                                         const   ::rtl::OUString&                                    sResult             );
397         static sal_Bool implcp_getTypeProperties                    (   const   ::rtl::OUString&                                    sName               );
398         static sal_Bool implcp_getFilterProperties                  (   const   ::rtl::OUString&                                    sName               );
399         static sal_Bool implcp_getDetectorProperties                (   const   ::rtl::OUString&                                    sName               );
400         static sal_Bool implcp_getLoaderProperties                  (   const   ::rtl::OUString&                                    sName               );
401         static sal_Bool implcp_getContentHandlerProperties          (   const   ::rtl::OUString&                                    sName               );
402         static sal_Bool implcp_getType                              (   const   ::rtl::OUString&                                    sName               );
403         static sal_Bool implcp_getFilter                            (   const   ::rtl::OUString&                                    sName               );
404         static sal_Bool implcp_getDetector                          (   const   ::rtl::OUString&                                    sName               );
405         static sal_Bool implcp_getLoader                            (   const   ::rtl::OUString&                                    sName               );
406         static sal_Bool implcp_getContentHandler                    (   const   ::rtl::OUString&                                    sName               );
407         static sal_Bool implcp_existsType                           (   const   ::rtl::OUString&                                    sName               );
408         static sal_Bool implcp_existsFilter                         (   const   ::rtl::OUString&                                    sName               );
409         static sal_Bool implcp_existsDetector                       (   const   ::rtl::OUString&                                    sName               );
410         static sal_Bool implcp_existsLoader                         (   const   ::rtl::OUString&                                    sName               );
411         static sal_Bool implcp_existsContentHandler                 (   const   ::rtl::OUString&                                    sName               );
412         static sal_Bool implcp_addFilter                            (   const   ::rtl::OUString&                                    sName               ,
413                                                                         const   css::uno::Sequence< css::beans::PropertyValue >&    lProperties         );
414         static sal_Bool implcp_replaceFilter                        (   const   ::rtl::OUString&                                    sName               ,
415                                                                         const   css::uno::Sequence< css::beans::PropertyValue >&    lProperties         );
416         static sal_Bool implcp_removeFilter                         (   const   ::rtl::OUString&                                    sName               );
417         static sal_Bool implcp_queryFilters                         (   const   ::rtl::OUString&                                    sQuery              );
418 
419     #endif  //  #ifdef ENABLE_ASSERTIONS
420 
421     #ifdef ENABLE_COMPONENT_SELF_CHECK
422 
423     private:
424 
425         void impldbg_dumpCache();
426 
427     #endif // ENABLE_COMPONENT_SELF_CHECK
428 
429     //-------------------------------------------------------------------------------------------------------------
430     //  private variables
431     //-------------------------------------------------------------------------------------------------------------
432     private:
433 
434         static sal_Int32        m_nRefCount         ;
435         static DataContainer*   m_pData             ;
436         static sal_Int32        m_nVersion          ;
437         static sal_Int16        m_nMode             ;
438 
439 };      //  class FilterCache
440 
441 }       //  namespace framework
442 
443 #endif  //  #ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_
444