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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_ucbhelper.hxx"
26 /**************************************************************************
27 								TODO
28  **************************************************************************
29 
30  *************************************************************************/
31 #include <com/sun/star/beans/PropertyValue.hpp>
32 #include <com/sun/star/ucb/XPropertySetRegistry.hpp>
33 
34 #include "osl/diagnose.h"
35 #include "osl/mutex.hxx"
36 #include <ucbhelper/contenthelper.hxx>
37 #include <ucbhelper/contentinfo.hxx>
38 
39 using namespace com::sun::star;
40 
41 //=========================================================================
42 //=========================================================================
43 //
44 // PropertySetInfo Implementation.
45 //
46 //=========================================================================
47 //=========================================================================
48 
49 namespace ucbhelper {
50 
PropertySetInfo(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,const uno::Reference<com::sun::star::ucb::XCommandEnvironment> & rxEnv,ContentImplHelper * pContent)51 PropertySetInfo::PropertySetInfo(
52     const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
53     const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv,
54     ContentImplHelper* pContent )
55 : m_xSMgr( rxSMgr ),
56   m_xEnv( rxEnv ),
57   m_pProps( 0 ),
58   m_pContent( pContent )
59 {
60 }
61 
62 //=========================================================================
63 // virtual
~PropertySetInfo()64 PropertySetInfo::~PropertySetInfo()
65 {
66 	delete m_pProps;
67 }
68 
69 //=========================================================================
70 //
71 // XInterface methods.
72 //
73 //=========================================================================
74 
75 XINTERFACE_IMPL_2( PropertySetInfo,
76 				   lang::XTypeProvider,
77 				   beans::XPropertySetInfo );
78 
79 //=========================================================================
80 //
81 // XTypeProvider methods.
82 //
83 //=========================================================================
84 
85 XTYPEPROVIDER_IMPL_2( PropertySetInfo,
86 	 		   		  lang::XTypeProvider,
87 	 		   		  beans::XPropertySetInfo );
88 
89 //=========================================================================
90 //
91 // XPropertySetInfo methods.
92 //
93 //=========================================================================
94 
95 // virtual
getProperties()96 uno::Sequence< beans::Property > SAL_CALL PropertySetInfo::getProperties()
97 	throw( uno::RuntimeException )
98 {
99 	if ( !m_pProps )
100 	{
101 		osl::MutexGuard aGuard( m_aMutex );
102 		if ( !m_pProps )
103 		{
104 			//////////////////////////////////////////////////////////////
105 			// Get info for core ( native) properties.
106 			//////////////////////////////////////////////////////////////
107 
108             try
109             {
110                 uno::Sequence< beans::Property > aProps
111                     = m_pContent->getProperties( m_xEnv );
112                 m_pProps = new uno::Sequence< beans::Property >( aProps );
113             }
114             catch ( uno::RuntimeException const & )
115             {
116                 throw;
117             }
118             catch ( uno::Exception const & )
119             {
120                 m_pProps = new uno::Sequence< beans::Property >( 0 );
121             }
122 
123 			//////////////////////////////////////////////////////////////
124 			// Get info for additional properties.
125 			//////////////////////////////////////////////////////////////
126 
127 			uno::Reference< com::sun::star::ucb::XPersistentPropertySet >
128                 xSet ( m_pContent->getAdditionalPropertySet( sal_False ) );
129 
130 			if ( xSet.is() )
131 			{
132 				// Get property set info.
133 				uno::Reference< beans::XPropertySetInfo > xInfo(
134                     xSet->getPropertySetInfo() );
135 				if ( xInfo.is() )
136 				{
137 					const uno::Sequence< beans::Property >& rAddProps
138 						= xInfo->getProperties();
139 					sal_Int32 nAddProps = rAddProps.getLength();
140 					if ( nAddProps > 0 )
141 					{
142 						sal_Int32 nPos = m_pProps->getLength();
143 						m_pProps->realloc( nPos + nAddProps );
144 
145 						beans::Property* pProps = m_pProps->getArray();
146 						const beans::Property* pAddProps
147                             = rAddProps.getConstArray();
148 
149 						for ( sal_Int32 n = 0; n < nAddProps; ++n, ++nPos )
150 							pProps[ nPos ] = pAddProps[ n ];
151 					}
152 				}
153 			}
154 		}
155 	}
156 	return *m_pProps;
157 }
158 
159 //=========================================================================
160 // virtual
getPropertyByName(const rtl::OUString & aName)161 beans::Property SAL_CALL PropertySetInfo::getPropertyByName(
162         const rtl::OUString& aName )
163 	throw( beans::UnknownPropertyException, uno::RuntimeException )
164 {
165 	beans::Property aProp;
166 	if ( queryProperty( aName, aProp ) )
167 		return aProp;
168 
169 	throw beans::UnknownPropertyException();
170 }
171 
172 //=========================================================================
173 // virtual
hasPropertyByName(const rtl::OUString & Name)174 sal_Bool SAL_CALL PropertySetInfo::hasPropertyByName(
175         const rtl::OUString& Name )
176 	throw( uno::RuntimeException )
177 {
178 	beans::Property aProp;
179 	return queryProperty( Name, aProp );
180 }
181 
182 //=========================================================================
183 //
184 // Non-Interface methods.
185 //
186 //=========================================================================
187 
reset()188 void PropertySetInfo::reset()
189 {
190 	osl::MutexGuard aGuard( m_aMutex );
191 	delete m_pProps;
192 	m_pProps = 0;
193 }
194 
195 //=========================================================================
queryProperty(const rtl::OUString & rName,beans::Property & rProp)196 sal_Bool PropertySetInfo::queryProperty(
197     const rtl::OUString& rName, beans::Property& rProp )
198 {
199 	osl::MutexGuard aGuard( m_aMutex );
200 
201 	getProperties();
202 
203 	const beans::Property* pProps = m_pProps->getConstArray();
204 	sal_Int32 nCount = m_pProps->getLength();
205 	for ( sal_Int32 n = 0; n < nCount; ++n )
206 	{
207 		const beans::Property& rCurrProp = pProps[ n ];
208 		if ( rCurrProp.Name == rName )
209 		{
210 			rProp = rCurrProp;
211 			return sal_True;
212 		}
213 	}
214 
215 	return sal_False;
216 }
217 
218 //=========================================================================
219 //=========================================================================
220 //
221 // CommandProcessorInfo Implementation.
222 //
223 //=========================================================================
224 //=========================================================================
225 
CommandProcessorInfo(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,const uno::Reference<com::sun::star::ucb::XCommandEnvironment> & rxEnv,ContentImplHelper * pContent)226 CommandProcessorInfo::CommandProcessorInfo(
227     const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
228     const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv,
229     ContentImplHelper* pContent )
230 : m_xSMgr( rxSMgr ),
231   m_xEnv( rxEnv ),
232   m_pCommands( 0 ),
233   m_pContent( pContent )
234 {
235 }
236 
237 //=========================================================================
238 // virtual
~CommandProcessorInfo()239 CommandProcessorInfo::~CommandProcessorInfo()
240 {
241 	delete m_pCommands;
242 }
243 
244 //=========================================================================
245 //
246 // XInterface methods.
247 //
248 //=========================================================================
249 
250 XINTERFACE_IMPL_2( CommandProcessorInfo,
251 				   lang::XTypeProvider,
252 				   com::sun::star::ucb::XCommandInfo );
253 
254 //=========================================================================
255 //
256 // XTypeProvider methods.
257 //
258 //=========================================================================
259 
260 XTYPEPROVIDER_IMPL_2( CommandProcessorInfo,
261 			   		  lang::XTypeProvider,
262 			   		  com::sun::star::ucb::XCommandInfo );
263 
264 //=========================================================================
265 //
266 // XCommandInfo methods.
267 //
268 //=========================================================================
269 
270 // virtual
271 uno::Sequence< com::sun::star::ucb::CommandInfo > SAL_CALL
getCommands()272 CommandProcessorInfo::getCommands()
273 	throw( uno::RuntimeException )
274 {
275 	if ( !m_pCommands )
276 	{
277 		osl::MutexGuard aGuard( m_aMutex );
278 		if ( !m_pCommands )
279 		{
280 			//////////////////////////////////////////////////////////////
281 			// Get info for commands.
282 			//////////////////////////////////////////////////////////////
283 
284             try
285             {
286                 uno::Sequence< com::sun::star::ucb::CommandInfo > aCmds
287                     = m_pContent->getCommands( m_xEnv );
288                 m_pCommands
289                     = new uno::Sequence< com::sun::star::ucb::CommandInfo >(
290                         aCmds );
291             }
292             catch ( uno::RuntimeException const & )
293             {
294                 throw;
295             }
296             catch ( uno::Exception const & )
297             {
298                 m_pCommands
299                     = new uno::Sequence< com::sun::star::ucb::CommandInfo >(
300                         0 );
301             }
302 		}
303 	}
304 	return *m_pCommands;
305 }
306 
307 //=========================================================================
308 // virtual
309 com::sun::star::ucb::CommandInfo SAL_CALL
getCommandInfoByName(const rtl::OUString & Name)310 CommandProcessorInfo::getCommandInfoByName(
311         const rtl::OUString& Name )
312 	throw( com::sun::star::ucb::UnsupportedCommandException,
313            uno::RuntimeException )
314 {
315 	com::sun::star::ucb::CommandInfo aInfo;
316 	if ( queryCommand( Name, aInfo ) )
317 		return aInfo;
318 
319 	throw com::sun::star::ucb::UnsupportedCommandException();
320 }
321 
322 //=========================================================================
323 // virtual
324 com::sun::star::ucb::CommandInfo SAL_CALL
getCommandInfoByHandle(sal_Int32 Handle)325 CommandProcessorInfo::getCommandInfoByHandle( sal_Int32 Handle )
326 	throw( com::sun::star::ucb::UnsupportedCommandException,
327            uno::RuntimeException )
328 {
329 	com::sun::star::ucb::CommandInfo aInfo;
330 	if ( queryCommand( Handle, aInfo ) )
331 		return aInfo;
332 
333 	throw com::sun::star::ucb::UnsupportedCommandException();
334 }
335 
336 //=========================================================================
337 // virtual
hasCommandByName(const rtl::OUString & Name)338 sal_Bool SAL_CALL CommandProcessorInfo::hasCommandByName(
339        const rtl::OUString& Name )
340 	throw( uno::RuntimeException )
341 {
342 	com::sun::star::ucb::CommandInfo aInfo;
343 	return queryCommand( Name, aInfo );
344 }
345 
346 //=========================================================================
347 // virtual
hasCommandByHandle(sal_Int32 Handle)348 sal_Bool SAL_CALL CommandProcessorInfo::hasCommandByHandle( sal_Int32 Handle )
349 	throw( uno::RuntimeException )
350 {
351 	com::sun::star::ucb::CommandInfo aInfo;
352 	return queryCommand( Handle, aInfo );
353 }
354 
355 //=========================================================================
356 //
357 // Non-Interface methods.
358 //
359 //=========================================================================
360 
reset()361 void CommandProcessorInfo::reset()
362 {
363 	osl::MutexGuard aGuard( m_aMutex );
364 	delete m_pCommands;
365 	m_pCommands = 0;
366 }
367 
368 
369 //=========================================================================
queryCommand(const rtl::OUString & rName,com::sun::star::ucb::CommandInfo & rCommand)370 sal_Bool CommandProcessorInfo::queryCommand(
371     const rtl::OUString& rName,
372     com::sun::star::ucb::CommandInfo& rCommand )
373 {
374 	osl::MutexGuard aGuard( m_aMutex );
375 
376 	getCommands();
377 
378 	const com::sun::star::ucb::CommandInfo* pCommands
379         = m_pCommands->getConstArray();
380 	sal_Int32 nCount = m_pCommands->getLength();
381 	for ( sal_Int32 n = 0; n < nCount; ++n )
382 	{
383 		const com::sun::star::ucb::CommandInfo& rCurrCommand = pCommands[ n ];
384 		if ( rCurrCommand.Name == rName )
385 		{
386 			rCommand = rCurrCommand;
387 			return sal_True;
388 		}
389 	}
390 
391 	return sal_False;
392 }
393 
394 //=========================================================================
queryCommand(sal_Int32 nHandle,com::sun::star::ucb::CommandInfo & rCommand)395 sal_Bool CommandProcessorInfo::queryCommand(
396     sal_Int32 nHandle,
397     com::sun::star::ucb::CommandInfo& rCommand )
398 {
399 	osl::MutexGuard aGuard( m_aMutex );
400 
401 	getCommands();
402 
403 	const com::sun::star::ucb::CommandInfo* pCommands
404         = m_pCommands->getConstArray();
405 	sal_Int32 nCount = m_pCommands->getLength();
406 	for ( sal_Int32 n = 0; n < nCount; ++n )
407 	{
408 		const com::sun::star::ucb::CommandInfo& rCurrCommand = pCommands[ n ];
409 		if ( rCurrCommand.Handle == nHandle )
410 		{
411 			rCommand = rCurrCommand;
412 			return sal_True;
413 		}
414 	}
415 
416 	return sal_False;
417 }
418 
419 } // namespace ucbhelper
420