xref: /AOO41X/main/cppuhelper/inc/cppuhelper/proptypehlp.hxx (revision 6da5f31158a7dd09f46f041b4f15bb7ae3eb92a4)
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 #ifndef _CPPUHELPER_PROPTYPEHLP_HXX
24 #define _CPPUHELPER_PROPTYPEHLP_HXX
25 
26 #include <cppuhelper/proptypehlp.h>
27 
28 namespace cppu
29 {
30 
31 /** Converts the value stored in an any to a concrete C++ type.
32     The function does the same as the operator >>= () at the
33     Any class, except that it throws an IllegalArgumentException in case of
34     failures (the value cannot be extracted without data loss )
35 
36    @exception com::sun::star::lang::IllegalArgumentException when the type could not be converted.
37  */
38 template < class target >
convertPropertyValue(target & value,const::com::sun::star::uno::Any & a)39 inline void SAL_CALL convertPropertyValue( target &value , const  ::com::sun::star::uno::Any & a)
40 {
41 
42     if( !( a >>= value ) ) {
43         throw ::com::sun::star::lang::IllegalArgumentException();
44     }
45 }
46 
47 
48 // This template is needed at least for msci4 compiler
49 template < class target >
convertPropertyValue(target & value,::com::sun::star::uno::Any & a)50 inline void SAL_CALL convertPropertyValue( target &value ,  ::com::sun::star::uno::Any & a)
51 {
52     convertPropertyValue( value ,  (const ::com::sun::star::uno::Any & )  a );
53 }
54 
55 /**
56   conversion of basic types
57 */
convertPropertyValue(sal_Bool & b,const::com::sun::star::uno::Any & a)58 inline void SAL_CALL convertPropertyValue( sal_Bool & b   , const ::com::sun::star::uno::Any & a )
59     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
60 {
61     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
62 
63     if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
64         sal_Int32 i32 = 0;
65         a >>= i32;
66         b = ( sal_Bool )i32;
67     }
68     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
69         sal_Unicode c = *(sal_Unicode*) a.getValue();
70         b = ( sal_Bool ) c;
71     }
72     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
73         sal_Int16 i16 = 0;
74         a >>= i16;
75         b = ( sal_Bool ) i16;
76     }
77     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
78         b = *((sal_Bool*)a.getValue());
79     }
80     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
81         sal_Int8 i8 = 0;
82         a >>= i8;
83         b = ( sal_Bool ) i8;
84     }
85     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
86         sal_uInt16 i16 = 0;
87         a >>= i16;
88         b = ( sal_Bool  ) i16;
89     }
90     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
91         sal_uInt32 i32 = 0;
92         a >>= i32;
93         b = ( sal_Bool ) i32;
94     }
95     else {
96         throw ::com::sun::star::lang::IllegalArgumentException();
97     }
98 }
99 
convertPropertyValue(sal_Int64 & i,const::com::sun::star::uno::Any & a)100 inline void SAL_CALL convertPropertyValue( sal_Int64 & i  , const ::com::sun::star::uno::Any & a )
101     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
102 {
103     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
104 
105     if( ::com::sun::star::uno::TypeClass_HYPER == tc ) {
106         a >>= i;
107     }
108     else if( ::com::sun::star::uno::TypeClass_UNSIGNED_HYPER == tc ) {
109         sal_uInt64 i64 = 0;
110         a >>= i64;
111         i = ( sal_Int64 ) i64;
112     }
113     else if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
114         sal_Int32 i32 = 0;
115         a >>= i32;
116         i = ( sal_Int64 )i32;
117     }
118     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
119         sal_Unicode c;
120         c = *(sal_Unicode *)a.getValue();
121         i = ( sal_Int64 ) c;
122     }
123     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
124         sal_Int16 i16 = 0;
125         a >>= i16;
126         i = ( sal_Int64 ) i16;
127     }
128     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
129         sal_Bool b;
130         b =  *((sal_Bool * )a.getValue());
131         i = ( sal_Int64 ) b;
132     }
133     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
134         sal_Int8 i8 = 0;
135         a >>= i8;
136         i = ( sal_Int64 ) i8;
137     }
138     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
139         sal_uInt16 i16 = 0;
140         a >>= i16;
141         i = ( sal_Int64 ) i16;
142     }
143     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
144         sal_uInt32 i32 = 0;
145         a >>= i32;
146         i = ( sal_Int64 ) i32;
147     }
148     else {
149         throw ::com::sun::star::lang::IllegalArgumentException();
150     }
151 }
152 
153 
convertPropertyValue(sal_uInt64 & i,const::com::sun::star::uno::Any & a)154 inline void SAL_CALL convertPropertyValue( sal_uInt64 & i  , const ::com::sun::star::uno::Any & a )
155     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
156 {
157     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
158 
159     if( ::com::sun::star::uno::TypeClass_UNSIGNED_HYPER == tc ) {
160         a >>= i;
161     }
162     if( ::com::sun::star::uno::TypeClass_HYPER == tc ) {
163         sal_Int64 i64;
164         a >>= i64;
165         i = ( sal_uInt64 ) i64;
166     }
167     else if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
168         sal_Int32 i32;
169         a >>= i32;
170         i = ( sal_uInt64 )i32;
171     }
172     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
173         sal_Unicode c;
174         c = *( sal_Unicode * ) a.getValue() ;
175         i = ( sal_uInt64 ) c;
176     }
177     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
178         sal_Int16 i16;
179         a >>= i16;
180         i = ( sal_uInt64 ) i16;
181     }
182     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
183         sal_Bool b;
184         b =  *((sal_Bool * )a.getValue());
185         i = ( sal_uInt64 ) b;
186     }
187     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
188         sal_Int8 i8;
189         a >>= i8;
190         i = ( sal_uInt64 ) i8;
191     }
192     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
193         sal_uInt16 i16;
194         a >>= i16;
195         i = ( sal_uInt64    ) i16;
196     }
197     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
198         sal_uInt32 i32;
199         a >>= i32;
200         i = ( sal_uInt64 ) i32;
201     }
202     else {
203         throw ::com::sun::star::lang::IllegalArgumentException();
204     }
205 }
206 
207 // the basic types
208 // sal_Int32
convertPropertyValue(sal_Int32 & i,const::com::sun::star::uno::Any & a)209 inline void SAL_CALL convertPropertyValue( sal_Int32 & i  , const ::com::sun::star::uno::Any & a )
210     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
211 {
212     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
213 
214     if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
215         a >>= i;
216     }
217     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
218         sal_Unicode c;
219         c = *(sal_Unicode*) a.getValue();
220         i = ( sal_Int32 ) c;
221     }
222     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
223         sal_Int16 i16 = 0;
224         a >>= i16;
225         i = ( sal_Int32 ) i16;
226     }
227     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
228         sal_Bool b;
229         b =  *((sal_Bool * )a.getValue());
230         i = ( sal_Int32 ) b;
231     }
232     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
233         sal_Int8 i8 = 0;
234         a >>= i8;
235         i = ( sal_Int32 ) i8;
236     }
237     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
238         sal_uInt16 i16 = 0;
239         a >>= i16;
240         i = ( sal_Int32 ) i16;
241     }
242     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
243         sal_uInt32 i32 = 0;
244         a >>= i32;
245         i = ( sal_Int32 ) i32;
246     }
247     else {
248         throw ::com::sun::star::lang::IllegalArgumentException();
249     }
250 }
251 
convertPropertyValue(sal_uInt32 & i,const::com::sun::star::uno::Any & a)252 inline void SAL_CALL convertPropertyValue( sal_uInt32 & i  , const ::com::sun::star::uno::Any & a )
253     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
254 {
255     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
256 
257     if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
258         a >>= i;
259     }
260     else if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
261         sal_Int32 i32;
262         a >>= i32;
263         i = (sal_uInt32 ) i32;
264     }
265     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
266         sal_Unicode c;
267         c = *(sal_Unicode*) a.getValue();
268         i = ( sal_uInt32 ) c;
269     }
270     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
271         sal_Int16 i16;
272         a >>= i16;
273         i = ( sal_uInt32 ) i16;
274     }
275     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
276         sal_Bool b;
277         b =  *((sal_Bool * )a.getValue());
278         i = ( sal_uInt32 ) b;
279     }
280     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
281         sal_Int8 i8;
282         a >>= i8;
283         i = ( sal_uInt32 ) i8;
284     }
285     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
286         sal_uInt16 i16;
287         a >>= i16;
288         i = ( sal_uInt32    ) i16;
289     }
290     else {
291         throw ::com::sun::star::lang::IllegalArgumentException();
292     }
293 }
294 
295 
convertPropertyValue(sal_Int16 & i,const::com::sun::star::uno::Any & a)296 inline void SAL_CALL convertPropertyValue( sal_Int16 & i  , const ::com::sun::star::uno::Any & a )
297     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
298 {
299     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
300 
301     if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
302         a >>= i;
303     }
304     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
305         sal_Unicode c;
306         c = *(sal_Unicode*) a.getValue();
307         i = ( sal_Int16 ) c;
308     }
309     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
310         sal_Bool b;
311         b =  *((sal_Bool * )a.getValue());
312         i = ( sal_Int16 ) b;
313     }
314     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
315         sal_Int8 i8 = 0;
316         a >>= i8;
317         i = ( sal_Int16 ) i8;
318     }
319     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
320         sal_uInt16 i16 = 0;
321         a >>= i16;
322         i = ( sal_Int16 ) i16;
323     }
324     else {
325         throw ::com::sun::star::lang::IllegalArgumentException();
326     }
327 }
328 
convertPropertyValue(sal_uInt16 & i,const::com::sun::star::uno::Any & a)329 inline void SAL_CALL convertPropertyValue( sal_uInt16 & i  , const ::com::sun::star::uno::Any & a )
330     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
331 {
332     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
333 
334     if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
335         a >>= i;
336     }
337     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
338         sal_Unicode c;
339         c = *(sal_Unicode *) a.getValue();
340         i = ( sal_Int16 ) c;
341     }
342     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
343         sal_Bool b;
344         b =  *((sal_Bool * )a.getValue());
345         i = ( sal_Int16 ) b;
346     }
347     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
348         sal_Int8 i8 = 0;
349         a >>= i8;
350         i = ( sal_Int16 ) i8;
351     }
352     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
353         sal_Int16 i16 = 0;
354         a >>= i16;
355         i = ( sal_Int16 ) i16;
356     }
357     else {
358         throw ::com::sun::star::lang::IllegalArgumentException();
359     }
360 }
361 
convertPropertyValue(sal_Int8 & i,const::com::sun::star::uno::Any & a)362 inline void SAL_CALL convertPropertyValue( sal_Int8 & i  , const ::com::sun::star::uno::Any & a )
363     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
364 {
365     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
366 
367     if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
368         a >>= i;
369     }
370     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
371         sal_Bool b;
372         b =  *((sal_Bool * )a.getValue());
373         i = ( sal_Int8 ) b;
374     }
375     else {
376         throw ::com::sun::star::lang::IllegalArgumentException();
377     }
378 }
379 
convertPropertyValue(float & f,const::com::sun::star::uno::Any & a)380 inline void SAL_CALL convertPropertyValue( float &f , const ::com::sun::star::uno::Any &a )
381     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
382 {
383     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
384 
385     if ( ::com::sun::star::uno::TypeClass_FLOAT == tc ) {
386         a >>= f;
387     }
388     else if( ::com::sun::star::uno::TypeClass_DOUBLE == tc ) {
389         double d = 0;
390         a >>= d;
391         f = ( float ) d;
392     }
393     else if( ::com::sun::star::uno::TypeClass_HYPER == tc ) {
394         sal_Int64 i64 = 0;
395         a >>= i64;
396         f = ( float ) i64;
397     }
398     // msci 4 does not support this conversion
399 /*  else if( ::com::sun::star::uno::TypeClass_UNSIGNED_HYPER == tc ) {
400         sal_uInt64 i64;
401         a >>= i64;
402         f = ( float ) i64;
403     }
404 */  else if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
405         sal_Int32 i32 = 0;
406         a >>= i32;
407         f = ( float )i32;
408     }
409     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
410         sal_Unicode c;
411         c = *(sal_Unicode*) a.getValue();
412         f = ( float ) c;
413     }
414     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
415         sal_Int16 i16 = 0;
416         a >>= i16;
417         f = ( float ) i16;
418     }
419     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
420         sal_Bool b;
421         b =  *((sal_Bool * )a.getValue());
422         f = ( float ) b;
423     }
424     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
425         sal_Int8 i8 = 0;
426         a >>= i8;
427         f = ( float ) i8;
428     }
429     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
430         sal_uInt16 i16 = 0;
431         a >>= i16;
432         f = ( float ) i16;
433     }
434     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
435         sal_uInt32 i32 = 0;
436         a >>= i32;
437         f = ( float ) i32;
438     }
439     else {
440         throw ::com::sun::star::lang::IllegalArgumentException();
441     }
442 }
443 
444 
convertPropertyValue(double & d,const::com::sun::star::uno::Any & a)445 inline void SAL_CALL convertPropertyValue( double &d , const ::com::sun::star::uno::Any &a )
446     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
447 {
448     const enum ::com::sun::star::uno::TypeClass tc = a.getValueType().getTypeClass();
449 
450     if( ::com::sun::star::uno::TypeClass_DOUBLE == tc ) {
451         float f;
452         a >>= f;
453         d = ( double ) f;
454     }
455     else if ( ::com::sun::star::uno::TypeClass_FLOAT == tc ) {
456         float f;
457         a >>= f;
458         d = (double) f;
459     }
460     else if( ::com::sun::star::uno::TypeClass_HYPER == tc ) {
461         sal_Int64 i64;
462         a >>= i64;
463         d = (double) i64;
464     }
465     // msci 4 does not support this
466 /*  else if( ::com::sun::star::uno::TypeClass_UNSIGNED_HYPER == tc ) {
467         sal_uInt64 i64;
468         a >>= i64;
469         d = (double) i64;
470     }
471 */  else if( ::com::sun::star::uno::TypeClass_LONG == tc ) {
472         sal_Int32 i32;
473         a >>= i32;
474         d = (double)i32;
475     }
476     else if ( ::com::sun::star::uno::TypeClass_CHAR  == tc ) {
477         sal_Unicode c;
478         c = *(sal_Unicode*) a.getValue();
479         d = (double) c;
480     }
481     else if ( ::com::sun::star::uno::TypeClass_SHORT == tc ) {
482         sal_Int16 i16;
483         a >>= i16;
484         d = (double) i16;
485     }
486     else if ( ::com::sun::star::uno::TypeClass_BOOLEAN == tc ) {
487         sal_Bool b;
488         b =  *((sal_Bool * )a.getValue());
489         d = (double) b;
490     }
491     else if ( ::com::sun::star::uno::TypeClass_BYTE == tc ) {
492         sal_Int8 i8;
493         a >>= i8;
494         d = (double) i8;
495     }
496     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT == tc ) {
497         sal_uInt16 i16;
498         a >>= i16;
499         d = (double) i16;
500     }
501     else if ( ::com::sun::star::uno::TypeClass_UNSIGNED_LONG == tc ) {
502         sal_uInt32 i32;
503         a >>= i32;
504         d = (double) i32;
505     }
506     else {
507         throw ::com::sun::star::lang::IllegalArgumentException();
508     }
509 }
510 
convertPropertyValue(::rtl::OUString & ow,const::com::sun::star::uno::Any & a)511 inline void SAL_CALL convertPropertyValue( ::rtl::OUString &ow , const ::com::sun::star::uno::Any &a )
512     SAL_THROW( (::com::sun::star::lang::IllegalArgumentException) )
513 {
514     if( ::com::sun::star::uno::TypeClass_STRING == a.getValueType().getTypeClass() ) {
515         a >>= ow;
516     }
517     else {
518         throw ::com::sun::star::lang::IllegalArgumentException();
519     }
520 }
521 
522 }     // end namespace cppu
523 
524 #endif
525 
526 
527