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 __FRAMEWORK_SERVICES_CONTENTHANDLERFACTORY_HXX_
25 #define __FRAMEWORK_SERVICES_CONTENTHANDLERFACTORY_HXX_
26 
27 //_________________________________________________________________________________________________________________
28 //	my own includes
29 //_________________________________________________________________________________________________________________
30 
31 #include <classes/filtercache.hxx>
32 #include <macros/generic.hxx>
33 #include <macros/debug.hxx>
34 #include <macros/xinterface.hxx>
35 #include <macros/xtypeprovider.hxx>
36 #include <macros/xserviceinfo.hxx>
37 #include <threadhelp/threadhelpbase.hxx>
38 
39 #ifndef __FRAMEWORK_THREADHELP_TRANSACTIONBASE_HXX_
40 #include <threadhelp/transactionbase.hxx>
41 #endif
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/lang/IllegalArgumentException.hpp>
51 #include <com/sun/star/container/ElementExistException.hpp>
52 #include <com/sun/star/container/NoSuchElementException.hpp>
53 #include <com/sun/star/container/XNameContainer.hpp>
54 #include <com/sun/star/container/NoSuchElementException.hpp>
55 #include <com/sun/star/io/XInputStream.hpp>
56 #include <com/sun/star/util/XFlushable.hpp>
57 
58 //_________________________________________________________________________________________________________________
59 //	other includes
60 //_________________________________________________________________________________________________________________
61 #include <cppuhelper/interfacecontainer.hxx>
62 #include <cppuhelper/weak.hxx>
63 
64 //_________________________________________________________________________________________________________________
65 //	namespace
66 //_________________________________________________________________________________________________________________
67 
68 namespace framework{
69 
70 //_________________________________________________________________________________________________________________
71 //	exported const
72 //_________________________________________________________________________________________________________________
73 
74 //_________________________________________________________________________________________________________________
75 //	exported definitions
76 //_________________________________________________________________________________________________________________
77 
78 /*-************************************************************************************************************//**
79     @short      factory to create handler-objects
80     @descr      These class can be used to create new handler for specified contents.
81                 We use cached values of our configuration to lay down, which handler match
82                 a given URL or handlername. (use service TypeDetection to do that)
83                 With a detected type name you can search a registered handler and create it with these factory.
84 
85 	@implements	XInterface
86 				XTypeProvider
87 				XServiceInfo
88 				XMultiServiceFactory
89 				XNameContainer
90 				XNameReplace
91 				XNameAccess
92 				XElementAccess
93 				XFlushable
94 
95     @base       ThreadHelpBase
96 				OWeakObject
97 
98 	@devstatus	ready to use
99 	@threadsafe	yes
100 *//*-*************************************************************************************************************/
101 
102 class ContentHandlerFactory :   // interfaces
103 						public	css::lang::XTypeProvider			,
104 						public	css::lang::XServiceInfo				,
105 						public	css::lang::XMultiServiceFactory		,
106 						public	css::container::XNameContainer		,		// => XNameReplace => XNameAccess => XElementAccess
107 						public	css::util::XFlushable				,
108 						// base classes
109 						// Order is neccessary for right initialization of it!
110                         private ThreadHelpBase                      ,
111                         private TransactionBase                     ,
112 						public	::cppu::OWeakObject
113 {
114 	//-------------------------------------------------------------------------------------------------------------
115 	//	public methods
116 	//-------------------------------------------------------------------------------------------------------------
117 
118 	public:
119 
120 		//---------------------------------------------------------------------------------------------------------
121 		//	constructor / destructor
122 		//---------------------------------------------------------------------------------------------------------
123                  ContentHandlerFactory( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory );
124         virtual ~ContentHandlerFactory(                                                                        );
125 
126 		//---------------------------------------------------------------------------------------------------------
127 		//	XInterface, XTypeProvider, XServiceInfo
128 		//---------------------------------------------------------------------------------------------------------
129 		DECLARE_XINTERFACE
130 		DECLARE_XTYPEPROVIDER
131 		DECLARE_XSERVICEINFO
132 
133 		//---------------------------------------------------------------------------------------------------------
134 		//	XMultiServiceFactory
135 		//---------------------------------------------------------------------------------------------------------
136         virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance             ( const ::rtl::OUString&                        sTypeName   ) throw( css::uno::Exception        ,
137                                                                                                                                                                      css::uno::RuntimeException );
138         virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const ::rtl::OUString&                        sTypeName   ,
139                                                                                                   const css::uno::Sequence< css::uno::Any >&    lArguments  ) throw( css::uno::Exception, css::uno::RuntimeException );
140         virtual css::uno::Sequence< ::rtl::OUString >       SAL_CALL getAvailableServiceNames   (                                                           ) throw( css::uno::RuntimeException );
141 
142 		//---------------------------------------------------------------------------------------------------------
143 		//	XNameContainer
144 		//---------------------------------------------------------------------------------------------------------
145         virtual void SAL_CALL insertByName( const ::rtl::OUString&  sHandlerName        ,
146                                             const css::uno::Any&    aHandlerProperties  ) throw( css::lang::IllegalArgumentException     ,
147                                                                                                  css::container::ElementExistException   ,
148                                                                                                  css::lang::WrappedTargetException       ,
149                                                                                                  css::uno::RuntimeException              );
150         virtual void SAL_CALL removeByName( const ::rtl::OUString&  sHandlerName        ) throw( css::container::NoSuchElementException  ,
151                                                                                                  css::lang::WrappedTargetException       ,
152                                                                                                  css::uno::RuntimeException              );
153 
154 		//---------------------------------------------------------------------------------------------------------
155 		//	XNameReplace
156 		//---------------------------------------------------------------------------------------------------------
157         virtual void SAL_CALL replaceByName( const ::rtl::OUString& sHandlerName       ,
158                                              const css::uno::Any&   aHandlerProperties ) throw( css::lang::IllegalArgumentException    ,
159                                                                                                 css::container::NoSuchElementException ,
160                                                                                                 css::lang::WrappedTargetException      ,
161                                                                                                 css::uno::RuntimeException             );
162 
163 		//---------------------------------------------------------------------------------------------------------
164 		//	XNameAccess
165 		//---------------------------------------------------------------------------------------------------------
166         virtual css::uno::Any                         SAL_CALL getByName      ( const ::rtl::OUString& sName ) throw( css::container::NoSuchElementException ,
167                                                                                                                       css::lang::WrappedTargetException      ,
168                                                                                                                       css::uno::RuntimeException             );
169         virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(                              ) throw( css::uno::RuntimeException             );
170         virtual sal_Bool                              SAL_CALL hasByName      ( const ::rtl::OUString& sName ) throw( css::uno::RuntimeException             );
171 
172 		//---------------------------------------------------------------------------------------------------------
173 		//	XElementAccess
174 		//---------------------------------------------------------------------------------------------------------
175         virtual css::uno::Type SAL_CALL getElementType() throw( css::uno::RuntimeException );
176         virtual sal_Bool       SAL_CALL hasElements   () throw( css::uno::RuntimeException );
177 
178 		//---------------------------------------------------------------------------------------------------------
179 		//	XFlushable
180 		//---------------------------------------------------------------------------------------------------------
181         virtual void SAL_CALL flush              (                                                                   ) throw ( css::uno::RuntimeException );
182         virtual void SAL_CALL addFlushListener   ( const css::uno::Reference< css::util::XFlushListener >& xListener ) throw ( css::uno::RuntimeException );
183     	virtual void SAL_CALL removeFlushListener( const css::uno::Reference< css::util::XFlushListener >& xListener ) throw ( css::uno::RuntimeException );
184 
185 	//-------------------------------------------------------------------------------------------------------------
186 	//	protected methods
187 	//-------------------------------------------------------------------------------------------------------------
188 
189 	protected:
190 
191 	//-------------------------------------------------------------------------------------------------------------
192 	//	debug methods
193 	//	(should be private everyway!)
194 	//-------------------------------------------------------------------------------------------------------------
195 
196 		/*-****************************************************************************************************//**
197 			@short		debug-method to check incoming parameter of some other mehods of this class
198 			@descr		The following methods are used to check parameters for other methods
199 						of this class. The return value is used directly for an ASSERT(...).
200 
201 			@seealso	ASSERTs in implementation!
202 
203 			@param		references to checking variables
204 			@return		sal_False ,on invalid parameter
205 			@return		sal_True  ,otherwise
206 
207 			@onerror	-
208 		*//*-*****************************************************************************************************/
209 
210 	#ifdef ENABLE_ASSERTIONS
211 
212 	private:
213 
214         static sal_Bool implcp_ContentHandlerFactory        (   const   css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory            );
215     	static sal_Bool implcp_createInstanceWithArguments	(	const	::rtl::OUString&										sTypeName			,
216 							  									const	css::uno::Sequence< css::uno::Any >&					lArguments			);
217     	static sal_Bool implcp_getByName					(	const	::rtl::OUString&										sName				);
218     	static sal_Bool implcp_hasByName					(	const	::rtl::OUString&										sName				);
219         static sal_Bool implcp_removeByName                 (   const   ::rtl::OUString&                                        sHandlerName        );
220 
221 	#endif	//	#ifdef ENABLE_ASSERTIONS
222 
223 	//-------------------------------------------------------------------------------------------------------------
224 	//	private variables
225 	//	(should be private everyway!)
226 	//-------------------------------------------------------------------------------------------------------------
227 
228 	private:
229 
230 		css::uno::Reference< css::lang::XMultiServiceFactory >		m_xFactory				;
231         FilterCache                                                 m_aCache                ;
232 //		::cppu::OMultiTypeInterfaceContainerHelper					m_aListenerContainer	;
233 
234 };      //  class ContentHandlerFactory
235 
236 }		//	namespace framework
237 
238 #endif  //  #ifndef __FRAMEWORK_SERVICES_CONTENTHANDLERFACTORY_HXX_
239