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