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 : /**************************************************************************
22 : TODO
23 : **************************************************************************
24 :
25 : *************************************************************************/
26 :
27 : #ifndef __VECTOR__
28 : #include <vector>
29 : #endif
30 : #include <com/sun/star/beans/Property.hpp>
31 : #include <com/sun/star/beans/XPropertyAccess.hpp>
32 : #include <com/sun/star/beans/XPropertySet.hpp>
33 : #include <com/sun/star/beans/XPropertySetInfo.hpp>
34 : #include <com/sun/star/script/Converter.hpp>
35 :
36 : #include "osl/diagnose.h"
37 : #include "osl/mutex.hxx"
38 : #include <ucbhelper/propertyvalueset.hxx>
39 :
40 : using namespace com::sun::star::beans;
41 : using namespace com::sun::star::container;
42 : using namespace com::sun::star::io;
43 : using namespace com::sun::star::lang;
44 : using namespace com::sun::star::script;
45 : using namespace com::sun::star::sdbc;
46 : using namespace com::sun::star::uno;
47 : using namespace com::sun::star::util;
48 : using ::rtl::OUString;
49 :
50 : namespace ucbhelper_impl
51 : {
52 :
53 : //=========================================================================
54 : //
55 : // PropertyValue.
56 : //
57 : //=========================================================================
58 :
59 : const sal_uInt32 NO_VALUE_SET = 0x00000000;
60 : const sal_uInt32 STRING_VALUE_SET = 0x00000001;
61 : const sal_uInt32 BOOLEAN_VALUE_SET = 0x00000002;
62 : const sal_uInt32 BYTE_VALUE_SET = 0x00000004;
63 : const sal_uInt32 SHORT_VALUE_SET = 0x00000008;
64 : const sal_uInt32 INT_VALUE_SET = 0x00000010;
65 : const sal_uInt32 LONG_VALUE_SET = 0x00000020;
66 : const sal_uInt32 FLOAT_VALUE_SET = 0x00000040;
67 : const sal_uInt32 DOUBLE_VALUE_SET = 0x00000080;
68 : const sal_uInt32 BYTES_VALUE_SET = 0x00000100;
69 : const sal_uInt32 DATE_VALUE_SET = 0x00000200;
70 : const sal_uInt32 TIME_VALUE_SET = 0x00000400;
71 : const sal_uInt32 TIMESTAMP_VALUE_SET = 0x00000800;
72 : const sal_uInt32 BINARYSTREAM_VALUE_SET = 0x00001000;
73 : const sal_uInt32 CHARACTERSTREAM_VALUE_SET = 0x00002000;
74 : const sal_uInt32 REF_VALUE_SET = 0x00004000;
75 : const sal_uInt32 BLOB_VALUE_SET = 0x00008000;
76 : const sal_uInt32 CLOB_VALUE_SET = 0x00010000;
77 : const sal_uInt32 ARRAY_VALUE_SET = 0x00020000;
78 : const sal_uInt32 OBJECT_VALUE_SET = 0x00040000;
79 :
80 9 : struct PropertyValue
81 : {
82 : ::rtl::OUString
83 : sPropertyName;
84 :
85 : sal_uInt32 nPropsSet;
86 : sal_uInt32 nOrigValue;
87 :
88 : OUString aString; // getString
89 : sal_Bool bBoolean; // getBoolean
90 : sal_Int8 nByte; // getByte
91 : sal_Int16 nShort; // getShort
92 : sal_Int32 nInt; // getInt
93 : sal_Int64 nLong; // getLong
94 : float nFloat; // getFloat
95 : double nDouble; // getDouble
96 :
97 : Sequence< sal_Int8 > aBytes; // getBytes
98 : Date aDate; // getDate
99 : Time aTime; // getTime
100 : DateTime aTimestamp; // getTimestamp
101 : Reference< XInputStream > xBinaryStream; // getBinaryStream
102 : Reference< XInputStream > xCharacterStream; // getCharacterStream
103 : Reference< XRef > xRef; // getRef
104 : Reference< XBlob > xBlob; // getBlob
105 : Reference< XClob > xClob; // getClob
106 : Reference< XArray > xArray; // getArray
107 : Any aObject; // getObject
108 :
109 3 : inline PropertyValue()
110 : : nPropsSet( NO_VALUE_SET ), nOrigValue( NO_VALUE_SET ),
111 : bBoolean(false),
112 : nByte(0),
113 : nShort(0),
114 : nInt(0),
115 : nLong(0),
116 : nFloat(0.0),
117 3 : nDouble(0.0)
118 3 : {}
119 : };
120 : } // namespace ucbhelper_impl
121 :
122 : using namespace ucbhelper_impl;
123 :
124 : namespace ucbhelper
125 : {
126 :
127 : //=========================================================================
128 : //
129 : // class PropertyValues.
130 : //
131 : //=========================================================================
132 :
133 : typedef std::vector< ucbhelper_impl::PropertyValue > PropertyValuesVector;
134 :
135 6 : class PropertyValues : public PropertyValuesVector {};
136 :
137 : } // namespace ucbhelper
138 :
139 : //=========================================================================
140 : //
141 : // Welcome to the macro hell...
142 : //
143 : //=========================================================================
144 :
145 : #define GETVALUE_IMPL_TYPE( _type_, _type_name_, _member_name_, _cppu_type_ ) \
146 : \
147 : osl::MutexGuard aGuard( m_aMutex ); \
148 : \
149 : _type_ aValue = _type_(); /* default ctor */ \
150 : \
151 : m_bWasNull = sal_True; \
152 : \
153 : if ( ( columnIndex < 1 ) \
154 : || ( columnIndex > sal_Int32( m_pValues->size() ) ) ) \
155 : { \
156 : OSL_FAIL( "PropertyValueSet - index out of range!" ); \
157 : } \
158 : else \
159 : { \
160 : ucbhelper_impl::PropertyValue& rValue \
161 : = (*m_pValues)[ columnIndex - 1 ]; \
162 : \
163 : if ( rValue.nOrigValue != NO_VALUE_SET ) \
164 : { \
165 : if ( rValue.nPropsSet & _type_name_ ) \
166 : { \
167 : /* Values is present natively... */ \
168 : aValue = rValue._member_name_; \
169 : m_bWasNull = sal_False; \
170 : } \
171 : else \
172 : { \
173 : if ( !(rValue.nPropsSet & OBJECT_VALUE_SET) ) \
174 : { \
175 : /* Value is not (yet) available as Any. Create it. */ \
176 : getObject( columnIndex, Reference< XNameAccess >() ); \
177 : } \
178 : \
179 : if ( rValue.nPropsSet & OBJECT_VALUE_SET ) \
180 : { \
181 : /* Value is available as Any. */ \
182 : \
183 : if ( rValue.aObject.hasValue() ) \
184 : { \
185 : /* Try to convert into native value. */ \
186 : if ( rValue.aObject >>= aValue ) \
187 : { \
188 : rValue._member_name_ = aValue; \
189 : rValue.nPropsSet |= _type_name_; \
190 : m_bWasNull = sal_False; \
191 : } \
192 : else \
193 : { \
194 : /* Last chance. Try type converter service... */ \
195 : \
196 : Reference< XTypeConverter > xConverter \
197 : = getTypeConverter(); \
198 : if ( xConverter.is() ) \
199 : { \
200 : try \
201 : { \
202 : Any aConvAny = xConverter->convertTo( \
203 : rValue.aObject, \
204 : _cppu_type_ ); \
205 : \
206 : if ( aConvAny >>= aValue ) \
207 : { \
208 : rValue._member_name_ = aValue; \
209 : rValue.nPropsSet |= _type_name_; \
210 : m_bWasNull = sal_False; \
211 : } \
212 : } \
213 : catch (const IllegalArgumentException&) \
214 : { \
215 : } \
216 : catch (const CannotConvertException&) \
217 : { \
218 : } \
219 : } \
220 : } \
221 : } \
222 : } \
223 : } \
224 : } \
225 : } \
226 : return aValue;
227 :
228 : #define GETVALUE_IMPL( _type_, _type_name_, _member_name_ ) \
229 : GETVALUE_IMPL_TYPE( _type_, \
230 : _type_name_, \
231 : _member_name_, \
232 : getCppuType( static_cast< const _type_ * >( 0 ) ) )
233 :
234 : #define SETVALUE_IMPL( _prop_name_, _type_name_, _member_name_, _value_ ) \
235 : \
236 : osl::MutexGuard aGuard( m_aMutex ); \
237 : \
238 : ucbhelper_impl::PropertyValue aNewValue; \
239 : aNewValue.sPropertyName = _prop_name_; \
240 : aNewValue.nPropsSet = _type_name_; \
241 : aNewValue.nOrigValue = _type_name_; \
242 : aNewValue._member_name_ = _value_; \
243 : \
244 : m_pValues->push_back( aNewValue );
245 :
246 : namespace ucbhelper {
247 :
248 : //=========================================================================
249 : //=========================================================================
250 : //
251 : // PropertyValueSet Implementation.
252 : //
253 : //=========================================================================
254 : //=========================================================================
255 :
256 : //=========================================================================
257 3 : PropertyValueSet::PropertyValueSet(
258 : const Reference< XComponentContext >& rxContext )
259 : : m_xContext( rxContext ),
260 3 : m_pValues( new PropertyValues ),
261 : m_bWasNull( sal_False ),
262 6 : m_bTriedToGetTypeConverter( sal_False )
263 :
264 : {
265 3 : }
266 :
267 : //=========================================================================
268 : // virtual
269 9 : PropertyValueSet::~PropertyValueSet()
270 : {
271 3 : delete m_pValues;
272 6 : }
273 :
274 : //=========================================================================
275 : //
276 : // XInterface methods.
277 : //
278 : //=========================================================================
279 :
280 24 : XINTERFACE_IMPL_3( PropertyValueSet,
281 : XTypeProvider,
282 : XRow,
283 : XColumnLocate );
284 :
285 : //=========================================================================
286 : //
287 : // XTypeProvider methods.
288 : //
289 : //=========================================================================
290 :
291 0 : XTYPEPROVIDER_IMPL_3( PropertyValueSet,
292 : XTypeProvider,
293 : XRow,
294 : XColumnLocate );
295 :
296 : //=========================================================================
297 : //
298 : // XRow methods.
299 : //
300 : //=========================================================================
301 :
302 : // virtual
303 0 : sal_Bool SAL_CALL PropertyValueSet::wasNull()
304 : throw( SQLException, RuntimeException )
305 : {
306 : // This method can not be implemented correctly!!! Imagine different
307 : // threads doing a getXYZ - wasNull calling sequence on the same
308 : // implementation object...
309 0 : return m_bWasNull;
310 : }
311 :
312 : //=========================================================================
313 : // virtual
314 0 : OUString SAL_CALL PropertyValueSet::getString( sal_Int32 columnIndex )
315 : throw( SQLException, RuntimeException )
316 : {
317 0 : GETVALUE_IMPL( OUString, STRING_VALUE_SET, aString );
318 : }
319 :
320 : //=========================================================================
321 : // virtual
322 0 : sal_Bool SAL_CALL PropertyValueSet::getBoolean( sal_Int32 columnIndex )
323 : throw( SQLException, RuntimeException )
324 : {
325 0 : GETVALUE_IMPL_TYPE(
326 0 : sal_Bool, BOOLEAN_VALUE_SET, bBoolean, getCppuBooleanType() );
327 : }
328 :
329 : //=========================================================================
330 : // virtual
331 0 : sal_Int8 SAL_CALL PropertyValueSet::getByte( sal_Int32 columnIndex )
332 : throw( SQLException, RuntimeException )
333 : {
334 0 : GETVALUE_IMPL( sal_Int8, BYTE_VALUE_SET, nByte );
335 : }
336 :
337 : //=========================================================================
338 : // virtual
339 0 : sal_Int16 SAL_CALL PropertyValueSet::getShort( sal_Int32 columnIndex )
340 : throw( SQLException, RuntimeException )
341 : {
342 0 : GETVALUE_IMPL( sal_Int16, SHORT_VALUE_SET, nShort );
343 : }
344 :
345 : //=========================================================================
346 : // virtual
347 0 : sal_Int32 SAL_CALL PropertyValueSet::getInt( sal_Int32 columnIndex )
348 : throw( SQLException, RuntimeException )
349 : {
350 0 : GETVALUE_IMPL( sal_Int32, INT_VALUE_SET, nInt );
351 : }
352 :
353 : //=========================================================================
354 : // virtual
355 0 : sal_Int64 SAL_CALL PropertyValueSet::getLong( sal_Int32 columnIndex )
356 : throw( SQLException, RuntimeException )
357 : {
358 0 : GETVALUE_IMPL( sal_Int64, LONG_VALUE_SET, nLong );
359 : }
360 :
361 : //=========================================================================
362 : // virtual
363 0 : float SAL_CALL PropertyValueSet::getFloat( sal_Int32 columnIndex )
364 : throw( SQLException, RuntimeException )
365 : {
366 0 : GETVALUE_IMPL( float, FLOAT_VALUE_SET, nFloat );
367 : }
368 :
369 : //=========================================================================
370 : // virtual
371 0 : double SAL_CALL PropertyValueSet::getDouble( sal_Int32 columnIndex )
372 : throw( SQLException, RuntimeException )
373 : {
374 0 : GETVALUE_IMPL( double, DOUBLE_VALUE_SET, nDouble );
375 : }
376 :
377 : //=========================================================================
378 : // virtual
379 : Sequence< sal_Int8 > SAL_CALL
380 0 : PropertyValueSet::getBytes( sal_Int32 columnIndex )
381 : throw( SQLException, RuntimeException )
382 : {
383 0 : GETVALUE_IMPL( Sequence< sal_Int8 >, BYTES_VALUE_SET, aBytes );
384 : }
385 :
386 : //=========================================================================
387 : // virtual
388 0 : Date SAL_CALL PropertyValueSet::getDate( sal_Int32 columnIndex )
389 : throw( SQLException, RuntimeException )
390 : {
391 0 : GETVALUE_IMPL( Date, DATE_VALUE_SET, aDate );
392 : }
393 :
394 : //=========================================================================
395 : // virtual
396 0 : Time SAL_CALL PropertyValueSet::getTime( sal_Int32 columnIndex )
397 : throw( SQLException, RuntimeException )
398 : {
399 0 : GETVALUE_IMPL( Time, TIME_VALUE_SET, aTime );
400 : }
401 :
402 : //=========================================================================
403 : // virtual
404 0 : DateTime SAL_CALL PropertyValueSet::getTimestamp( sal_Int32 columnIndex )
405 : throw( SQLException, RuntimeException )
406 : {
407 0 : GETVALUE_IMPL( DateTime, TIMESTAMP_VALUE_SET, aTimestamp );
408 : }
409 :
410 : //=========================================================================
411 : // virtual
412 : Reference< XInputStream > SAL_CALL
413 0 : PropertyValueSet::getBinaryStream( sal_Int32 columnIndex )
414 : throw( SQLException, RuntimeException )
415 : {
416 0 : GETVALUE_IMPL(
417 0 : Reference< XInputStream >, BINARYSTREAM_VALUE_SET, xBinaryStream );
418 : }
419 :
420 : //=========================================================================
421 : // virtual
422 : Reference< XInputStream > SAL_CALL
423 0 : PropertyValueSet::getCharacterStream( sal_Int32 columnIndex )
424 : throw( SQLException, RuntimeException )
425 : {
426 0 : GETVALUE_IMPL(
427 0 : Reference< XInputStream >, CHARACTERSTREAM_VALUE_SET, xCharacterStream );
428 : }
429 :
430 : //=========================================================================
431 : // virtual
432 3 : Any SAL_CALL PropertyValueSet::getObject(
433 : sal_Int32 columnIndex,
434 : const Reference< XNameAccess >& )
435 : throw( SQLException, RuntimeException )
436 : {
437 3 : osl::MutexGuard aGuard( m_aMutex );
438 :
439 3 : Any aValue;
440 :
441 3 : m_bWasNull = sal_True;
442 :
443 6 : if ( ( columnIndex < 1 )
444 3 : || ( columnIndex > sal_Int32( m_pValues->size() ) ) )
445 : {
446 : OSL_FAIL( "PropertyValueSet - index out of range!" );
447 : }
448 : else
449 : {
450 : ucbhelper_impl::PropertyValue& rValue
451 3 : = (*m_pValues)[ columnIndex - 1 ];
452 :
453 3 : if ( rValue.nPropsSet & OBJECT_VALUE_SET )
454 : {
455 : // Values is present natively...
456 3 : aValue = rValue.aObject;
457 3 : m_bWasNull = sal_False;
458 : }
459 : else
460 : {
461 : // Make Any from original value.
462 :
463 0 : switch ( rValue.nOrigValue )
464 : {
465 : case NO_VALUE_SET:
466 0 : break;
467 :
468 : case STRING_VALUE_SET:
469 0 : aValue <<= rValue.aString;
470 0 : break;
471 :
472 : case BOOLEAN_VALUE_SET:
473 0 : aValue <<= rValue.bBoolean;
474 0 : break;
475 :
476 : case BYTE_VALUE_SET:
477 0 : aValue <<= rValue.nByte;
478 0 : break;
479 :
480 : case SHORT_VALUE_SET:
481 0 : aValue <<= rValue.nShort;
482 0 : break;
483 :
484 : case INT_VALUE_SET:
485 0 : aValue <<= rValue.nInt;
486 0 : break;
487 :
488 : case LONG_VALUE_SET:
489 0 : aValue <<= rValue.nLong;
490 0 : break;
491 :
492 : case FLOAT_VALUE_SET:
493 0 : aValue <<= rValue.nFloat;
494 0 : break;
495 :
496 : case DOUBLE_VALUE_SET:
497 0 : aValue <<= rValue.nDouble;
498 0 : break;
499 :
500 : case BYTES_VALUE_SET:
501 0 : aValue <<= rValue.aBytes;
502 0 : break;
503 :
504 : case DATE_VALUE_SET:
505 0 : aValue <<= rValue.aDate;
506 0 : break;
507 :
508 : case TIME_VALUE_SET:
509 0 : aValue <<= rValue.aTime;
510 0 : break;
511 :
512 : case TIMESTAMP_VALUE_SET:
513 0 : aValue <<= rValue.aTimestamp;
514 0 : break;
515 :
516 : case BINARYSTREAM_VALUE_SET:
517 0 : aValue <<= rValue.xBinaryStream;
518 0 : break;
519 :
520 : case CHARACTERSTREAM_VALUE_SET:
521 0 : aValue <<= rValue.xCharacterStream;
522 0 : break;
523 :
524 : case REF_VALUE_SET:
525 0 : aValue <<= rValue.xRef;
526 0 : break;
527 :
528 : case BLOB_VALUE_SET:
529 0 : aValue <<= rValue.xBlob;
530 0 : break;
531 :
532 : case CLOB_VALUE_SET:
533 0 : aValue <<= rValue.xClob;
534 0 : break;
535 :
536 : case ARRAY_VALUE_SET:
537 0 : aValue <<= rValue.xArray;
538 0 : break;
539 :
540 : case OBJECT_VALUE_SET:
541 : // Fall-through is intended!
542 : default:
543 : OSL_FAIL( "PropertyValueSet::getObject - "
544 : "Wrong original type" );
545 0 : break;
546 : }
547 :
548 0 : if ( aValue.hasValue() )
549 : {
550 0 : rValue.aObject = aValue;
551 0 : rValue.nPropsSet |= OBJECT_VALUE_SET;
552 0 : m_bWasNull = sal_False;
553 : }
554 : }
555 : }
556 :
557 3 : return aValue;
558 : }
559 :
560 : //=========================================================================
561 : // virtual
562 0 : Reference< XRef > SAL_CALL PropertyValueSet::getRef( sal_Int32 columnIndex )
563 : throw( SQLException, RuntimeException )
564 : {
565 0 : GETVALUE_IMPL( Reference< XRef >, REF_VALUE_SET, xRef );
566 : }
567 :
568 : //=========================================================================
569 : // virtual
570 0 : Reference< XBlob > SAL_CALL PropertyValueSet::getBlob( sal_Int32 columnIndex )
571 : throw( SQLException, RuntimeException )
572 : {
573 0 : GETVALUE_IMPL( Reference< XBlob >, BLOB_VALUE_SET, xBlob );
574 : }
575 :
576 : //=========================================================================
577 : // virtual
578 0 : Reference< XClob > SAL_CALL PropertyValueSet::getClob( sal_Int32 columnIndex )
579 : throw( SQLException, RuntimeException )
580 : {
581 0 : GETVALUE_IMPL( Reference< XClob >, CLOB_VALUE_SET, xClob );
582 : }
583 :
584 : //=========================================================================
585 : // virtual
586 0 : Reference< XArray > SAL_CALL PropertyValueSet::getArray( sal_Int32 columnIndex )
587 : throw( SQLException, RuntimeException )
588 : {
589 0 : GETVALUE_IMPL( Reference< XArray >, ARRAY_VALUE_SET, xArray );
590 : }
591 :
592 : //=========================================================================
593 : //
594 : // XColumnLocate methods.
595 : //
596 : //=========================================================================
597 :
598 : // virtual
599 0 : sal_Int32 SAL_CALL PropertyValueSet::findColumn( const OUString& columnName )
600 : throw( SQLException, RuntimeException )
601 : {
602 0 : osl::MutexGuard aGuard( m_aMutex );
603 :
604 0 : if ( !columnName.isEmpty() )
605 : {
606 0 : sal_Int32 nCount = m_pValues->size();
607 0 : for ( sal_Int32 n = 0; n < nCount; ++n )
608 : {
609 0 : if ( (*m_pValues)[ n ].sPropertyName.equals( columnName ) )
610 0 : return sal_Int32( n + 1 ); // Index is 1-based.
611 : }
612 : }
613 0 : return 0;
614 : }
615 :
616 : //=========================================================================
617 : //
618 : // Non-interface methods.
619 : //
620 : //=========================================================================
621 :
622 0 : const Reference< XTypeConverter >& PropertyValueSet::getTypeConverter()
623 : {
624 0 : osl::MutexGuard aGuard( m_aMutex );
625 :
626 0 : if ( !m_bTriedToGetTypeConverter && !m_xTypeConverter.is() )
627 : {
628 0 : m_bTriedToGetTypeConverter = sal_True;
629 0 : m_xTypeConverter = Converter::create(m_xContext);
630 :
631 : OSL_ENSURE( m_xTypeConverter.is(),
632 : "PropertyValueSet::getTypeConverter() - "
633 : "Service 'com.sun.star.script.Converter' n/a!" );
634 : }
635 0 : return m_xTypeConverter;
636 : }
637 :
638 : //=========================================================================
639 0 : void PropertyValueSet::appendString( const ::rtl::OUString& rPropName,
640 : const OUString& rValue )
641 : {
642 0 : SETVALUE_IMPL( rPropName, STRING_VALUE_SET, aString, rValue );
643 0 : }
644 :
645 : //=========================================================================
646 0 : void PropertyValueSet::appendBoolean( const ::rtl::OUString& rPropName,
647 : sal_Bool bValue )
648 : {
649 0 : SETVALUE_IMPL( rPropName, BOOLEAN_VALUE_SET, bBoolean, bValue );
650 0 : }
651 :
652 : //=========================================================================
653 0 : void PropertyValueSet::appendLong( const ::rtl::OUString& rPropName,
654 : sal_Int64 nValue )
655 : {
656 0 : SETVALUE_IMPL( rPropName, LONG_VALUE_SET, nLong, nValue );
657 0 : }
658 :
659 : //=========================================================================
660 0 : void PropertyValueSet::appendTimestamp( const ::rtl::OUString& rPropName,
661 : const DateTime& rValue )
662 : {
663 0 : SETVALUE_IMPL( rPropName, TIMESTAMP_VALUE_SET, aTimestamp, rValue );
664 0 : }
665 :
666 : //=========================================================================
667 3 : void PropertyValueSet::appendObject( const ::rtl::OUString& rPropName,
668 : const Any& rValue )
669 : {
670 3 : SETVALUE_IMPL( rPropName, OBJECT_VALUE_SET, aObject, rValue );
671 3 : }
672 :
673 : //=========================================================================
674 0 : void PropertyValueSet::appendVoid( const ::rtl::OUString& rPropName )
675 : {
676 0 : SETVALUE_IMPL( rPropName, NO_VALUE_SET, aObject, Any() );
677 0 : }
678 :
679 : //=========================================================================
680 0 : void PropertyValueSet::appendPropertySet(
681 : const Reference< XPropertySet >& rxSet )
682 : {
683 0 : if ( rxSet.is() )
684 : {
685 0 : Reference< XPropertySetInfo > xInfo = rxSet->getPropertySetInfo();
686 0 : if ( xInfo.is() )
687 : {
688 0 : Sequence< Property > aProps = xInfo->getProperties();
689 0 : const Property* pProps = aProps.getConstArray();
690 0 : sal_Int32 nPropsCount = aProps.getLength();
691 :
692 0 : Reference< XPropertyAccess > xPropertyAccess( rxSet, UNO_QUERY );
693 0 : if ( xPropertyAccess.is() )
694 : {
695 : // Efficient: Get all prop values with one ( remote) call.
696 :
697 : Sequence< ::com::sun::star::beans::PropertyValue > aPropValues
698 0 : = xPropertyAccess->getPropertyValues();
699 :
700 : const ::com::sun::star::beans::PropertyValue* pPropValues
701 0 : = aPropValues.getConstArray();
702 :
703 0 : sal_Int32 nValuesCount = aPropValues.getLength();
704 0 : for ( sal_Int32 n = 0; n < nValuesCount; ++n )
705 : {
706 : const ::com::sun::star::beans::PropertyValue& rPropValue
707 0 : = pPropValues[ n ];
708 :
709 : // Find info for current property value.
710 0 : for ( sal_Int32 m = 0; m < nPropsCount; ++m )
711 : {
712 0 : const Property& rProp = pProps[ m ];
713 0 : if ( rProp.Name == rPropValue.Name )
714 : {
715 : // Found!
716 0 : appendObject( rProp, rPropValue.Value );
717 0 : break;
718 : }
719 : }
720 0 : }
721 : }
722 : else
723 : {
724 : // Get every single prop value with one ( remote) call.
725 :
726 0 : for ( sal_Int32 n = 0; n < nPropsCount; ++n )
727 : {
728 0 : const Property& rProp = pProps[ n ];
729 :
730 : try
731 : {
732 0 : Any aValue = rxSet->getPropertyValue( rProp.Name );
733 :
734 0 : if ( aValue.hasValue() )
735 0 : appendObject( rProp, aValue );
736 : }
737 0 : catch (const UnknownPropertyException&)
738 : {
739 : }
740 0 : catch (const WrappedTargetException&)
741 : {
742 : }
743 : }
744 0 : }
745 0 : }
746 : }
747 0 : }
748 :
749 : //=========================================================================
750 0 : sal_Bool PropertyValueSet::appendPropertySetValue(
751 : const Reference< XPropertySet >& rxSet,
752 : const Property& rProperty )
753 : {
754 0 : if ( rxSet.is() )
755 : {
756 : try
757 : {
758 0 : Any aValue = rxSet->getPropertyValue( rProperty.Name );
759 0 : if ( aValue.hasValue() )
760 : {
761 0 : appendObject( rProperty, aValue );
762 0 : return sal_True;
763 0 : }
764 : }
765 0 : catch (const UnknownPropertyException&)
766 : {
767 : }
768 0 : catch (const WrappedTargetException&)
769 : {
770 : }
771 : }
772 :
773 : // Error.
774 0 : return sal_False;
775 : }
776 :
777 : } // namespace ucbhelper
778 :
779 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|