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