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