xref: /trunk/main/framework/inc/classes/filtercache.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 /*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 necessary 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  );
306         sal_Bool replaceFilter( const ::rtl::OUString&                                 sName       ,
307                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
308                                       sal_Bool                                         bException  );
309         sal_Bool removeFilter ( const ::rtl::OUString&                                 sName       ,
310                                       sal_Bool                                         bException  );
311 
312         sal_Bool addType      ( const ::rtl::OUString&                                 sName       ,
313                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
314                                       sal_Bool                                         bException  );
315         sal_Bool replaceType  ( const ::rtl::OUString&                                 sName       ,
316                                 const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
317                                       sal_Bool                                         bException  );
318         sal_Bool removeType   ( const ::rtl::OUString&                                 sName       ,
319                                       sal_Bool                                         bException  );
320 
321         sal_Bool addDetector    ( const ::rtl::OUString&                                 sName       ,
322                                   const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
323                                         sal_Bool                                         bException  );
324         sal_Bool replaceDetector( const ::rtl::OUString&                                 sName       ,
325                                   const css::uno::Sequence< css::beans::PropertyValue >& lProperties ,
326                                         sal_Bool                                         bException  );
327         sal_Bool removeDetector ( const ::rtl::OUString&                                 sName       ,
328                                         sal_Bool                                         bException  );
329 
330         sal_Bool validateAndRepair();
331         sal_Bool validateAndRepairTypes();
332         sal_Bool validateAndRepairFilter();
333         sal_Bool validateAndRepairDetectors();
334         sal_Bool validateAndRepairLoader();
335         sal_Bool validateAndRepairHandler();
336 
337     //-------------------------------------------------------------------------------------------------------------
338     //  protected methods
339     //-------------------------------------------------------------------------------------------------------------
340 
341     protected:
342 
343     //-------------------------------------------------------------------------------------------------------------
344     //  private methods
345     //-------------------------------------------------------------------------------------------------------------
346 
347     private:
348 
349     //-------------------------------------------------------------------------------------------------------------
350     //  debug methods
351     //-------------------------------------------------------------------------------------------------------------
352 
353         /*-****************************************************************************************************//**
354             @short      debug-method to check incoming parameter of some other methods of this class
355             @descr      The following methods are used to check parameters for other methods
356                         of this class. The return value is used directly for an ASSERT(...).
357 
358             @seealso    ASSERT in implementation!
359 
360             @param      references to checking variables
361             @return     sal_False ,on invalid parameter
362             @return     sal_True  ,otherwise
363 
364             @onerror    -
365         *//*-*****************************************************************************************************/
366 
367     #ifdef ENABLE_ASSERTIONS
368 
369     private:
370 
371         static sal_Bool implcp_searchType                           (   const   ::rtl::OUString&                                    sURL                ,
372                                                                         const   ::rtl::OUString*                                    pMediaType          ,
373                                                                         const   ::rtl::OUString*                                    pClipboardFormat    ,
374                                                                         const   CheckedTypeIterator&                                aStartEntry         ,
375                                                                         const   ::rtl::OUString&                                    sResult             );
376         static sal_Bool implcp_searchFilterForType                  (   const   ::rtl::OUString&                                    sInternalTypeName   ,
377                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
378                                                                         const   ::rtl::OUString&                                    sResult             );
379         static sal_Bool implcp_searchDetectorForType                (   const   ::rtl::OUString&                                    sInternalTypeName   ,
380                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
381                                                                         const   ::rtl::OUString&                                    sResult             );
382         static sal_Bool implcp_searchLoaderForType                  (   const   ::rtl::OUString&                                    sInternalTypeName   ,
383                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
384                                                                         const   ::rtl::OUString&                                    sResult             );
385         static sal_Bool implcp_searchContentHandlerForType          (   const   ::rtl::OUString&                                    sInternalTypeName   ,
386                                                                         const   CheckedStringListIterator&                          aStartEntry         ,
387                                                                         const   ::rtl::OUString&                                    sResult             );
388         static sal_Bool implcp_getTypeProperties                    (   const   ::rtl::OUString&                                    sName               );
389         static sal_Bool implcp_getFilterProperties                  (   const   ::rtl::OUString&                                    sName               );
390         static sal_Bool implcp_getDetectorProperties                (   const   ::rtl::OUString&                                    sName               );
391         static sal_Bool implcp_getLoaderProperties                  (   const   ::rtl::OUString&                                    sName               );
392         static sal_Bool implcp_getContentHandlerProperties          (   const   ::rtl::OUString&                                    sName               );
393         static sal_Bool implcp_getType                              (   const   ::rtl::OUString&                                    sName               );
394         static sal_Bool implcp_getFilter                            (   const   ::rtl::OUString&                                    sName               );
395         static sal_Bool implcp_getDetector                          (   const   ::rtl::OUString&                                    sName               );
396         static sal_Bool implcp_getLoader                            (   const   ::rtl::OUString&                                    sName               );
397         static sal_Bool implcp_getContentHandler                    (   const   ::rtl::OUString&                                    sName               );
398         static sal_Bool implcp_existsType                           (   const   ::rtl::OUString&                                    sName               );
399         static sal_Bool implcp_existsFilter                         (   const   ::rtl::OUString&                                    sName               );
400         static sal_Bool implcp_existsDetector                       (   const   ::rtl::OUString&                                    sName               );
401         static sal_Bool implcp_existsLoader                         (   const   ::rtl::OUString&                                    sName               );
402         static sal_Bool implcp_existsContentHandler                 (   const   ::rtl::OUString&                                    sName               );
403         static sal_Bool implcp_addFilter                            (   const   ::rtl::OUString&                                    sName               ,
404                                                                         const   css::uno::Sequence< css::beans::PropertyValue >&    lProperties         );
405         static sal_Bool implcp_replaceFilter                        (   const   ::rtl::OUString&                                    sName               ,
406                                                                         const   css::uno::Sequence< css::beans::PropertyValue >&    lProperties         );
407         static sal_Bool implcp_removeFilter                         (   const   ::rtl::OUString&                                    sName               );
408         static sal_Bool implcp_queryFilters                         (   const   ::rtl::OUString&                                    sQuery              );
409 
410     #endif  //  #ifdef ENABLE_ASSERTIONS
411 
412     #ifdef ENABLE_COMPONENT_SELF_CHECK
413 
414     private:
415 
416         void impldbg_dumpCache();
417 
418     #endif // ENABLE_COMPONENT_SELF_CHECK
419 
420     //-------------------------------------------------------------------------------------------------------------
421     //  private variables
422     //-------------------------------------------------------------------------------------------------------------
423     private:
424 
425         static sal_Int32        m_nRefCount         ;
426         static DataContainer*   m_pData             ;
427         static sal_Int32        m_nVersion          ;
428         static sal_Int16        m_nMode             ;
429 
430 };      //  class FilterCache
431 
432 }       //  namespace framework
433 
434 #endif  //  #ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_
435