xref: /AOO41X/main/ucbhelper/inc/ucbhelper/providerhelper.hxx (revision b3b486c3fa1b38c2de306d076387b46c94e4246f)
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 _UCBHELPER_PROVIDERHELPER_HXX
25 #define _UCBHELPER_PROVIDERHELPER_HXX
26 
27 #ifndef __LIST__
28 #include <list>
29 #endif
30 #include <com/sun/star/ucb/XContentProvider.hpp>
31 #include <com/sun/star/lang/XServiceInfo.hpp>
32 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
33 #include <com/sun/star/lang/XTypeProvider.hpp>
34 #include <cppuhelper/weak.hxx>
35 
36 #include "osl/mutex.hxx"
37 #include "rtl/ref.hxx"
38 #include <ucbhelper/macros.hxx>
39 #include "ucbhelper/ucbhelperdllapi.h"
40 
41 //=========================================================================
42 
43 namespace com { namespace sun { namespace star { namespace ucb {
44     class XPropertySetRegistry;
45     class XPersistentPropertySet;
46 } } } }
47 
48 namespace ucbhelper_impl { struct ContentProviderImplHelper_Impl; }
49 
50 namespace ucbhelper {
51 
52 //=========================================================================
53 
54 class ContentImplHelper;
55 typedef rtl::Reference< ContentImplHelper > ContentImplHelperRef;
56 typedef std::list< ContentImplHelperRef > ContentRefList;
57 
58 /**
59   * This is an abstract base class for implementations of the service
60   * com.sun.star.ucb.ContentProvider. It provides contents derived from
61   * class ucb::ContentImplHelper.
62   *
63   * Features of the base class implementation:
64   * - standard interfaces ( XInterface, XTypeProvider, XServiceInfo )
65   * - maintains a set of ContentImplHelper objects, which were created by
66   *   the provider implementation. So there will be exactly one object for
67   *   one Content Identifier.
68   * - Provides access to the Additional Core PropertySet of a content.
69   *   ( These set contains the properties added to a content using its
70   *   XPropertyContainer interface )
71   */
72 class UCBHELPER_DLLPUBLIC ContentProviderImplHelper : public cppu::OWeakObject,
73                                   public com::sun::star::lang::XTypeProvider,
74                                   public com::sun::star::lang::XServiceInfo,
75                                   public com::sun::star::ucb::XContentProvider
76 {
77     friend class ContentImplHelper;
78 
79     ucbhelper_impl::ContentProviderImplHelper_Impl* m_pImpl;
80 
81 protected:
82     osl::Mutex m_aMutex;
83     ::com::sun::star::uno::Reference<
84             ::com::sun::star::lang::XMultiServiceFactory >  m_xSMgr;
85 
86 private:
87     UCBHELPER_DLLPRIVATE void removeContent( ContentImplHelper* pContent );
88 
89     UCBHELPER_DLLPRIVATE ::com::sun::star::uno::Reference<
90         ::com::sun::star::ucb::XPropertySetRegistry >
91     getAdditionalPropertySetRegistry();
92 
93     UCBHELPER_DLLPRIVATE void cleanupRegisteredContents();
94 
95 protected:
96     /**
97       * This method returns a content with the given id, if it already exists.
98       * Use this method in your "queryContent" implementation to ensure unique
99       * objects.
100       *
101       * @param  Identifier is the content identifier, for that an existing
102       *         content object is requested.
103       * @return the content with the given identifier, if it exists or 0, if it
104       *         does not exist.
105       */
106     rtl::Reference< ContentImplHelper >
107     queryExistingContent( const ::com::sun::star::uno::Reference<
108                 ::com::sun::star::ucb::XContentIdentifier >& Identifier );
109 
110     /**
111       * This method returns a content with the given URL, if it already exists.
112       *
113       * @param  rURL is the URL ( content identifier string ), for that an
114       *         existing content object is requested.
115       * @return the content with the given URL, if it exists or 0, if it
116       *         does not exist.
117       */
118     rtl::Reference< ContentImplHelper >
119     queryExistingContent( const ::rtl::OUString& rURL );
120 
121     /**
122       * This method registers a newly created content instance with the
123       * content provider. It should be called directly after creating a new
124       * content instance. The provider can reuse a registered instance upon
125       * subsedent requests for content instances with an idententifier
126       * of a registered instance.
127       * Note that the provider does not hold a hard reference on the
128       * registered instance. If last external reference is gone, the provider
129       * will remove the instance from its inventory of known instances.
130       * Nothing will happen in case an already registered instance shall
131       * be registered more than once.
132       *
133       * @param  the content instance that is to be registered.
134      */
135     void registerNewContent(
136         const com::sun::star::uno::Reference<
137             ::com::sun::star::ucb::XContent > & xContent );
138 
139 public:
140 
141     //////////////////////////////////////////////////////////////////////
142     // Contsruction/Destruction
143     //////////////////////////////////////////////////////////////////////
144 
145     ContentProviderImplHelper(
146                 const ::com::sun::star::uno::Reference<
147                     ::com::sun::star::lang::XMultiServiceFactory >& rXSMgr );
148     virtual ~ContentProviderImplHelper();
149 
150     //////////////////////////////////////////////////////////////////////
151     // XInterface
152     //////////////////////////////////////////////////////////////////////
153 
154     XINTERFACE_DECL()
155 
156     //////////////////////////////////////////////////////////////////////
157     // XTypeProvider
158     //////////////////////////////////////////////////////////////////////
159 
160     XTYPEPROVIDER_DECL()
161 
162     //////////////////////////////////////////////////////////////////////
163     // XServiceInfo
164     //////////////////////////////////////////////////////////////////////
165 
166     virtual ::rtl::OUString SAL_CALL
167     getImplementationName()
168         throw( ::com::sun::star::uno::RuntimeException ) = 0;
169     virtual sal_Bool SAL_CALL
170     supportsService( const ::rtl::OUString& ServiceName )
171         throw( ::com::sun::star::uno::RuntimeException );
172     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL
173     getSupportedServiceNames()
174         throw( ::com::sun::star::uno::RuntimeException ) = 0;
175 
176     //////////////////////////////////////////////////////////////////////
177     // XContentProvider
178     //////////////////////////////////////////////////////////////////////
179 
180     /**
181       * This method returns a content with the requested id.
182       *
183       * The implementation should:
184       *
185       * - Check, whether the Identifier is valid ( URL syntax ).
186       * - Use queryExistingContent(...) to determine, whether there exists
187       *   already a content with the given id.
188       * - Return the possibly existing content.Create and return a new
189       *   content, otherwise
190       */
191     virtual ::com::sun::star::uno::Reference<
192                 ::com::sun::star::ucb::XContent > SAL_CALL
193     queryContent( const ::com::sun::star::uno::Reference<
194                     ::com::sun::star::ucb::XContentIdentifier >& Identifier )
195         throw( ::com::sun::star::ucb::IllegalIdentifierException,
196                ::com::sun::star::uno::RuntimeException ) = 0;
197     virtual sal_Int32 SAL_CALL
198     compareContentIds( const ::com::sun::star::uno::Reference<
199                             ::com::sun::star::ucb::XContentIdentifier >& Id1,
200                        const ::com::sun::star::uno::Reference<
201                             ::com::sun::star::ucb::XContentIdentifier >& Id2 )
202         throw( ::com::sun::star::uno::RuntimeException );
203 
204     //////////////////////////////////////////////////////////////////////
205     // Non-interface methods.
206     //////////////////////////////////////////////////////////////////////
207 
208     /**
209       * This method returns a mutex, which protects the content list of the
210       * provider. So you can prevent modifications of that list easyly.
211       *
212       * @return the mutex.
213       */
getContentListMutex()214     osl::Mutex& getContentListMutex() { return m_aMutex; }
215 
216     /**
217       * This method fills a list with all contents existing at calling time.
218       * Note: You may prevent modifications of the content list at any time
219       * by acquiring the content list mutex of the provider.
220       *
221       * @param  rContents is the list to fill with the children.
222       */
223     void queryExistingContents( ContentRefList& rContents );
224 
225     /**
226       * This method returns the propertyset containing the Additional Core
227       * Properties of a content.
228       *
229       * @param  rKey is the key for the propertyset.
230       * @param  bCreate is a flag indicating whether the propertyset shall
231       *         be created in case it does not exist.
232       * @return the propertyset containing the Additional Core Properties.
233       */
234     ::com::sun::star::uno::Reference<
235         com::sun::star::ucb::XPersistentPropertySet >
236     getAdditionalPropertySet( const ::rtl::OUString& rKey, sal_Bool bCreate );
237 
238     /**
239       * This method renames the propertyset containing the Additional Core
240       * Properties of a content.
241       *
242       * @param  rOldKey is the old key of the propertyset.
243       * @param  rNewKey is the new key for the propertyset.
244       * @param  bRecursive is a flag indicating whether propertysets for
245       *         children described by rOldKey shall be renamed, too.
246       * @return True, if the operation succeeded - False, otherwise.
247       */
248     sal_Bool renameAdditionalPropertySet( const ::rtl::OUString& rOldKey,
249                                           const ::rtl::OUString& rNewKey,
250                                           sal_Bool bRecursive );
251 
252     /**
253       * This method copies the propertyset containing the Additional Core
254       * Properties of a content.
255       *
256       * @param  rSourceKey is the key of the source propertyset.
257       * @param  rTargetKey is the key of the target propertyset.
258       * @param  bRecursive is a flag indicating whether propertysets for
259       *         children described by rSourceKey shall be copied, too.
260       * @return True, if the operation succeeded - False, otherwise.
261       */
262     sal_Bool copyAdditionalPropertySet( const ::rtl::OUString& rSourceKey,
263                                         const ::rtl::OUString& rTargetKey,
264                                         sal_Bool bRecursive );
265 
266     /**
267       * This method removes the propertyset containing the Additional Core
268       * Properties of a content.
269       *
270       * @param  rKey is the key of the propertyset.
271       * @param  bRecursive is a flag indicating whether propertysets for
272       *         children described by rOldKey shall be removed, too.
273       * @return True, if the operation succeeded - False, otherwise.
274       */
275     sal_Bool removeAdditionalPropertySet( const ::rtl::OUString& rKey,
276                                           sal_Bool bRecursive );
277 };
278 
279 } // namespace ucbhelper
280 
281 #endif /* !_UCBHELPER_PROVIDERHELPER_HXX */
282