1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski package com.sun.star.uno;
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski /** This class provides static methods which aim at exploring the contents of an
25*b1cdbd2cSJim Jagielski  * Any and extracting its value. All public methods take an Object argument that
26*b1cdbd2cSJim Jagielski  * either is the immediate object, such as Boolean, Type, interface implementation,
27*b1cdbd2cSJim Jagielski  * or an Any that contains an object. <br>The methods which extract the value do a
28*b1cdbd2cSJim Jagielski  * widening conversion. See the method comments for the respective conversions.
29*b1cdbd2cSJim Jagielski  */
30*b1cdbd2cSJim Jagielski public class AnyConverter
31*b1cdbd2cSJim Jagielski {
32*b1cdbd2cSJim Jagielski     /** Determines the type of an any object.
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski         @param object any object
35*b1cdbd2cSJim Jagielski         @return type object
36*b1cdbd2cSJim Jagielski     */
getType( Object object )37*b1cdbd2cSJim Jagielski     static public Type getType( Object object )
38*b1cdbd2cSJim Jagielski     {
39*b1cdbd2cSJim Jagielski         Type t;
40*b1cdbd2cSJim Jagielski         if (null == object)
41*b1cdbd2cSJim Jagielski         {
42*b1cdbd2cSJim Jagielski             t = m_XInterface_type;
43*b1cdbd2cSJim Jagielski         }
44*b1cdbd2cSJim Jagielski         else if (object instanceof Any)
45*b1cdbd2cSJim Jagielski         {
46*b1cdbd2cSJim Jagielski             t = ((Any)object).getType();
47*b1cdbd2cSJim Jagielski             // nested any
48*b1cdbd2cSJim Jagielski             if (TypeClass.ANY_value == t.getTypeClass().getValue())
49*b1cdbd2cSJim Jagielski                 return getType( ((Any)object).getObject() );
50*b1cdbd2cSJim Jagielski         }
51*b1cdbd2cSJim Jagielski         else
52*b1cdbd2cSJim Jagielski         {
53*b1cdbd2cSJim Jagielski             t = new Type( object.getClass() );
54*b1cdbd2cSJim Jagielski         }
55*b1cdbd2cSJim Jagielski         return t;
56*b1cdbd2cSJim Jagielski     }
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski     /** checks if the any contains the idl type <code>void</code>.
59*b1cdbd2cSJim Jagielski         @param object the object to check
60*b1cdbd2cSJim Jagielski         @return true when the any is void, false otherwise
61*b1cdbd2cSJim Jagielski      */
isVoid(Object object)62*b1cdbd2cSJim Jagielski 	static public boolean isVoid(Object object){
63*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.VOID, object);
64*b1cdbd2cSJim Jagielski 	}
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>char</code>.
67*b1cdbd2cSJim Jagielski         @param object the object to check
68*b1cdbd2cSJim Jagielski         @return true when the any contains a char, false otherwise.
69*b1cdbd2cSJim Jagielski      */
isChar(Object object)70*b1cdbd2cSJim Jagielski 	static public boolean isChar(Object object){
71*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.CHAR, object);
72*b1cdbd2cSJim Jagielski 	}
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>boolean</code>.
75*b1cdbd2cSJim Jagielski         @param object the object to check
76*b1cdbd2cSJim Jagielski         @return true when the any contains a boolean, false otherwise.
77*b1cdbd2cSJim Jagielski      */
isBoolean(Object object)78*b1cdbd2cSJim Jagielski 	static public boolean isBoolean(Object object){
79*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.BOOLEAN, object);
80*b1cdbd2cSJim Jagielski 	}
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>byte</code>.
83*b1cdbd2cSJim Jagielski         @param object the object to check
84*b1cdbd2cSJim Jagielski         @return true when the any contains a byte, false otherwise.
85*b1cdbd2cSJim Jagielski      */
isByte(Object object)86*b1cdbd2cSJim Jagielski 	static public boolean isByte(Object object){
87*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.BYTE, object);
88*b1cdbd2cSJim Jagielski 	}
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>short</code>.
91*b1cdbd2cSJim Jagielski         @param object the object to check
92*b1cdbd2cSJim Jagielski         @return true when the any contains a short, false otherwise.
93*b1cdbd2cSJim Jagielski      */
isShort(Object object)94*b1cdbd2cSJim Jagielski 	static public boolean isShort(Object object){
95*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.SHORT, object);
96*b1cdbd2cSJim Jagielski 	}
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>long</code> (which maps to a java-int).
99*b1cdbd2cSJim Jagielski         @param object the object to check
100*b1cdbd2cSJim Jagielski         @return true when the any contains a int, false otherwise.
101*b1cdbd2cSJim Jagielski      */
isInt(Object object)102*b1cdbd2cSJim Jagielski 	static public boolean isInt(Object object){
103*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.LONG, object);
104*b1cdbd2cSJim Jagielski 	}
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>hyper</code> (which maps to a java-long).
107*b1cdbd2cSJim Jagielski         @param object the object to check
108*b1cdbd2cSJim Jagielski         @return true when the any contains a long, false otherwise.
109*b1cdbd2cSJim Jagielski      */
isLong(Object object)110*b1cdbd2cSJim Jagielski 	static public boolean isLong(Object object){
111*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.HYPER, object);
112*b1cdbd2cSJim Jagielski 	}
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>float</code>.
115*b1cdbd2cSJim Jagielski         @param object the object to check
116*b1cdbd2cSJim Jagielski         @return true when the any contains a float, false otherwise.
117*b1cdbd2cSJim Jagielski      */
isFloat(Object object)118*b1cdbd2cSJim Jagielski 	static public boolean isFloat(Object object){
119*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.FLOAT, object);
120*b1cdbd2cSJim Jagielski 	}
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>double</code>.
123*b1cdbd2cSJim Jagielski         @param object the object to check
124*b1cdbd2cSJim Jagielski         @return true when the any contains a double, false otherwise.
125*b1cdbd2cSJim Jagielski      */
isDouble(Object object)126*b1cdbd2cSJim Jagielski 	static public boolean isDouble(Object object){
127*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.DOUBLE, object);
128*b1cdbd2cSJim Jagielski 	}
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>string</code>.
131*b1cdbd2cSJim Jagielski         @param object the object to check
132*b1cdbd2cSJim Jagielski         @return true when the any contains a string, false otherwise.
133*b1cdbd2cSJim Jagielski      */
isString(Object object)134*b1cdbd2cSJim Jagielski 	static public boolean isString(Object object){
135*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.STRING, object);
136*b1cdbd2cSJim Jagielski 	}
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>enum</code>.
139*b1cdbd2cSJim Jagielski         @param object the object to check
140*b1cdbd2cSJim Jagielski         @return true if the any contains an enum, false otherwise
141*b1cdbd2cSJim Jagielski      */
isEnum(Object object)142*b1cdbd2cSJim Jagielski 	static public boolean isEnum(Object object)
143*b1cdbd2cSJim Jagielski     {
144*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.ENUM, object);
145*b1cdbd2cSJim Jagielski 	}
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski     /** checks if the any contains a value of the idl type <code>type</code>.
148*b1cdbd2cSJim Jagielski         @param object the object to check
149*b1cdbd2cSJim Jagielski         @return true when the any contains a type, false otherwise.
150*b1cdbd2cSJim Jagielski      */
isType(Object object)151*b1cdbd2cSJim Jagielski 	static public boolean isType(Object object){
152*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.TYPE, object);
153*b1cdbd2cSJim Jagielski 	}
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski     /** checks if the any contains an interface, struct, exception, sequence or enum.
156*b1cdbd2cSJim Jagielski         If <em>object</em> is an any with an interface type, then true is also returned if
157*b1cdbd2cSJim Jagielski         the any contains a null reference. This is because interfaces are allowed to have
158*b1cdbd2cSJim Jagielski         a null value contrary to other UNO types.
159*b1cdbd2cSJim Jagielski         @param object the object to check
160*b1cdbd2cSJim Jagielski         @return true if the any contains an object
161*b1cdbd2cSJim Jagielski      */
isObject(Object object)162*b1cdbd2cSJim Jagielski 	static public boolean isObject(Object object)
163*b1cdbd2cSJim Jagielski     {
164*b1cdbd2cSJim Jagielski         int tc = getType(object).getTypeClass().getValue();
165*b1cdbd2cSJim Jagielski         return (TypeClass.INTERFACE_value == tc ||
166*b1cdbd2cSJim Jagielski                 TypeClass.STRUCT_value == tc ||
167*b1cdbd2cSJim Jagielski                 TypeClass.EXCEPTION_value == tc ||
168*b1cdbd2cSJim Jagielski                 TypeClass.SEQUENCE_value == tc ||
169*b1cdbd2cSJim Jagielski                 TypeClass.ENUM_value == tc);
170*b1cdbd2cSJim Jagielski 	}
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski     /** checks if the any contains UNO idl sequence value (meaning a java array
173*b1cdbd2cSJim Jagielski         containing elements which are values of UNO idl types).
174*b1cdbd2cSJim Jagielski         @param object the object to check
175*b1cdbd2cSJim Jagielski         @return true when the any contains an object which implements interfaces, false otherwise.
176*b1cdbd2cSJim Jagielski      */
isArray(Object object)177*b1cdbd2cSJim Jagielski 	static public boolean isArray(Object object){
178*b1cdbd2cSJim Jagielski 		return containsType(TypeClass.SEQUENCE, object);
179*b1cdbd2cSJim Jagielski 	}
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	/** converts an Char object or an Any object containing a Char object into a simple char.
182*b1cdbd2cSJim Jagielski         @param object the object to convert
183*b1cdbd2cSJim Jagielski         @return the char contained within the object
184*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no char is contained within object
185*b1cdbd2cSJim Jagielski         @see #isChar
186*b1cdbd2cSJim Jagielski     */
toChar(Object object)187*b1cdbd2cSJim Jagielski 	static public char toChar(Object object) throws  com.sun.star.lang.IllegalArgumentException{
188*b1cdbd2cSJim Jagielski 		Character ret= (Character)convertSimple(TypeClass.CHAR, null, object);
189*b1cdbd2cSJim Jagielski 		return ret.charValue();
190*b1cdbd2cSJim Jagielski 	}
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	/** converts an Boolean object or an Any object containing a Boolean object into a simple boolean.
193*b1cdbd2cSJim Jagielski         @param object the object to convert
194*b1cdbd2cSJim Jagielski         @return the boolean contained within the object
195*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no boolean is contained within object
196*b1cdbd2cSJim Jagielski         @see #isBoolean
197*b1cdbd2cSJim Jagielski     */
toBoolean(Object object)198*b1cdbd2cSJim Jagielski 	static public boolean toBoolean(Object object) throws  com.sun.star.lang.IllegalArgumentException{
199*b1cdbd2cSJim Jagielski 		Boolean ret= (Boolean)convertSimple(TypeClass.BOOLEAN, null, object);
200*b1cdbd2cSJim Jagielski 		return ret.booleanValue();
201*b1cdbd2cSJim Jagielski 	}
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 	/** converts an Byte object or an Any object containing a Byte object into a simple byte.
204*b1cdbd2cSJim Jagielski         @param object the object to convert
205*b1cdbd2cSJim Jagielski         @return the boolean contained within the object
206*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no byte is contained within object
207*b1cdbd2cSJim Jagielski         @see #isBoolean
208*b1cdbd2cSJim Jagielski     */
toByte(Object object)209*b1cdbd2cSJim Jagielski 	static public byte toByte(Object object) throws   com.sun.star.lang.IllegalArgumentException{
210*b1cdbd2cSJim Jagielski 		Byte ret= (Byte)convertSimple(TypeClass.BYTE, null, object);
211*b1cdbd2cSJim Jagielski 		return ret.byteValue();
212*b1cdbd2cSJim Jagielski 	}
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     /** converts a number object into a simple short and allows widening conversions.
215*b1cdbd2cSJim Jagielski         Allowed argument types are Byte, Short or Any containing these types.
216*b1cdbd2cSJim Jagielski         @param object the object to convert
217*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no short or byte is contained within object
218*b1cdbd2cSJim Jagielski         @return the short contained within the object
219*b1cdbd2cSJim Jagielski      */
toShort(Object object)220*b1cdbd2cSJim Jagielski 	static public short toShort(Object object) throws   com.sun.star.lang.IllegalArgumentException{
221*b1cdbd2cSJim Jagielski 		Short ret= (Short)convertSimple(TypeClass.SHORT, null, object);
222*b1cdbd2cSJim Jagielski 		return ret.shortValue();
223*b1cdbd2cSJim Jagielski 	}
224*b1cdbd2cSJim Jagielski     /** converts a number object into an idl unsigned short and allows widening conversions.
225*b1cdbd2cSJim Jagielski         Allowed argument types are Anies containing idl unsigned short values.
226*b1cdbd2cSJim Jagielski         @param object the object to convert
227*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException
228*b1cdbd2cSJim Jagielski                 in case no idl unsigned short is contained within Any
229*b1cdbd2cSJim Jagielski         @return an (unsigned) short
230*b1cdbd2cSJim Jagielski      */
toUnsignedShort(Object object)231*b1cdbd2cSJim Jagielski 	static public short toUnsignedShort(Object object)
232*b1cdbd2cSJim Jagielski         throws com.sun.star.lang.IllegalArgumentException
233*b1cdbd2cSJim Jagielski     {
234*b1cdbd2cSJim Jagielski 		Short ret= (Short)convertSimple(TypeClass.UNSIGNED_SHORT, null, object);
235*b1cdbd2cSJim Jagielski 		return ret.shortValue();
236*b1cdbd2cSJim Jagielski 	}
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski     /** converts a number object into a simple int and allows widening conversions.
239*b1cdbd2cSJim Jagielski         Allowed argument types are Byte, Short, Integer or Any containing these types.
240*b1cdbd2cSJim Jagielski         @param object the object to convert
241*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no short, byte or int is contained within object.
242*b1cdbd2cSJim Jagielski         @return the int contained within the object
243*b1cdbd2cSJim Jagielski      */
toInt(Object object)244*b1cdbd2cSJim Jagielski 	static public int toInt(Object object) throws  com.sun.star.lang.IllegalArgumentException{
245*b1cdbd2cSJim Jagielski 		Integer ret= (Integer) convertSimple( TypeClass.LONG, null, object);
246*b1cdbd2cSJim Jagielski 		return ret.intValue();
247*b1cdbd2cSJim Jagielski 	}
248*b1cdbd2cSJim Jagielski     /** converts a number object into an idl unsigned long and allows widening conversions.
249*b1cdbd2cSJim Jagielski         Allowed argument types are Anies containing idl unsigned short or unsigned long values.
250*b1cdbd2cSJim Jagielski         @param object the object to convert
251*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException
252*b1cdbd2cSJim Jagielski                 in case no idl unsigned short nor unsigned long is contained within Any
253*b1cdbd2cSJim Jagielski         @return an (unsigned) int
254*b1cdbd2cSJim Jagielski      */
toUnsignedInt(Object object)255*b1cdbd2cSJim Jagielski 	static public int toUnsignedInt(Object object)
256*b1cdbd2cSJim Jagielski         throws  com.sun.star.lang.IllegalArgumentException
257*b1cdbd2cSJim Jagielski     {
258*b1cdbd2cSJim Jagielski 		Integer ret = (Integer)convertSimple(TypeClass.UNSIGNED_LONG, null, object);
259*b1cdbd2cSJim Jagielski 		return ret.intValue();
260*b1cdbd2cSJim Jagielski 	}
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski     /** converts a number object into a simple long and allows widening conversions.
263*b1cdbd2cSJim Jagielski         Allowed argument types are Byte, Short, Integer, Long or Any containing these types.
264*b1cdbd2cSJim Jagielski         @param object the object to convert
265*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no short, byte, int or long
266*b1cdbd2cSJim Jagielski                 is contained within object.
267*b1cdbd2cSJim Jagielski         @return the long contained within the object
268*b1cdbd2cSJim Jagielski      */
toLong(Object object)269*b1cdbd2cSJim Jagielski 	static public long toLong(Object object) throws   com.sun.star.lang.IllegalArgumentException{
270*b1cdbd2cSJim Jagielski 		Long ret= (Long) convertSimple( TypeClass.HYPER, null, object);
271*b1cdbd2cSJim Jagielski 		return ret.longValue();
272*b1cdbd2cSJim Jagielski 	}
273*b1cdbd2cSJim Jagielski     /** converts a number object into an idl unsigned hyper and allows widening conversions.
274*b1cdbd2cSJim Jagielski         Allowed argument types are Anies containing idl unsigned short, unsigned long or
275*b1cdbd2cSJim Jagielski         unsigned hyper values.
276*b1cdbd2cSJim Jagielski         @param object the object to convert
277*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException
278*b1cdbd2cSJim Jagielski                 in case no idl unsigned short, nor unsigned long nor unsigned hyper
279*b1cdbd2cSJim Jagielski                 is contained within object.
280*b1cdbd2cSJim Jagielski         @return an (unsigned) long
281*b1cdbd2cSJim Jagielski      */
toUnsignedLong(Object object)282*b1cdbd2cSJim Jagielski 	static public long toUnsignedLong(Object object)
283*b1cdbd2cSJim Jagielski         throws com.sun.star.lang.IllegalArgumentException
284*b1cdbd2cSJim Jagielski     {
285*b1cdbd2cSJim Jagielski 		Long ret = (Long)convertSimple(TypeClass.UNSIGNED_HYPER, null, object);
286*b1cdbd2cSJim Jagielski 		return ret.longValue();
287*b1cdbd2cSJim Jagielski 	}
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski     /** converts a number object into a simple float and allows widening conversions.
290*b1cdbd2cSJim Jagielski         Allowed argument types are Byte, Short, Float or Any containing these types.
291*b1cdbd2cSJim Jagielski         @param object the object to convert
292*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no byte, short or float
293*b1cdbd2cSJim Jagielski                 is contained within object.
294*b1cdbd2cSJim Jagielski         @return the float contained within the object
295*b1cdbd2cSJim Jagielski      */
toFloat(Object object)296*b1cdbd2cSJim Jagielski 	static public float toFloat(Object object) throws com.sun.star.lang.IllegalArgumentException{
297*b1cdbd2cSJim Jagielski 		Float ret= (Float) convertSimple( TypeClass.FLOAT,null, object);
298*b1cdbd2cSJim Jagielski 		return ret.floatValue();
299*b1cdbd2cSJim Jagielski 	}
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski     /** converts a number object into a simple double and allows widening conversions.
302*b1cdbd2cSJim Jagielski         Allowed argument types are Byte, Short, Int, Float, Double or Any containing these types.
303*b1cdbd2cSJim Jagielski         @param object the object to convert
304*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no byte, short, int, float
305*b1cdbd2cSJim Jagielski                 or double is contained within object.
306*b1cdbd2cSJim Jagielski         @return the double contained within the object
307*b1cdbd2cSJim Jagielski      */
toDouble(Object object)308*b1cdbd2cSJim Jagielski 	static public double toDouble(Object object) throws com.sun.star.lang.IllegalArgumentException {
309*b1cdbd2cSJim Jagielski 		Double ret= (Double) convertSimple( TypeClass.DOUBLE, null, object);
310*b1cdbd2cSJim Jagielski 		return ret.doubleValue();
311*b1cdbd2cSJim Jagielski 	}
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     /** converts a string or an any containing a string into a string.
314*b1cdbd2cSJim Jagielski         @param object the object to convert
315*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no string is contained within object.
316*b1cdbd2cSJim Jagielski         @return the string contained within the object
317*b1cdbd2cSJim Jagielski      */
toString(Object object)318*b1cdbd2cSJim Jagielski 	static public String toString(Object object) throws com.sun.star.lang.IllegalArgumentException {
319*b1cdbd2cSJim Jagielski 		return (String) convertSimple( TypeClass.STRING, null, object);
320*b1cdbd2cSJim Jagielski 	}
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski     /** converts a Type or an any containing a Type into a Type.
323*b1cdbd2cSJim Jagielski         @param object the object to convert
324*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no type is contained within object.
325*b1cdbd2cSJim Jagielski         @return the type contained within the object
326*b1cdbd2cSJim Jagielski      */
toType(Object object)327*b1cdbd2cSJim Jagielski 	static public Type toType(Object object) throws com.sun.star.lang.IllegalArgumentException {
328*b1cdbd2cSJim Jagielski 		return (Type) convertSimple( TypeClass.TYPE, null, object);
329*b1cdbd2cSJim Jagielski 	}
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski     /** converts a UNO object (struct, exception, sequence, enum or interface) or an Any containing
332*b1cdbd2cSJim Jagielski      *  these types into an UNO object of a specified destination type.
333*b1cdbd2cSJim Jagielski      *  For interfaces, the argument <em>object</em> is queried for the interface specified
334*b1cdbd2cSJim Jagielski      *  by the <em>type</em> argument. That query (UnoRuntime.queryInterface) might return null,
335*b1cdbd2cSJim Jagielski      *  if the interface is not implemented or a null-ref or a VOID any is given.
336*b1cdbd2cSJim Jagielski      *
337*b1cdbd2cSJim Jagielski      *  @param type type of the returned value
338*b1cdbd2cSJim Jagielski      *  @param object the object that is to be converted
339*b1cdbd2cSJim Jagielski      *  @return destination object
340*b1cdbd2cSJim Jagielski      *  @throws com.sun.star.lang.IllegalArgumentException
341*b1cdbd2cSJim Jagielski      *          in case conversion is not possible
342*b1cdbd2cSJim Jagielski      */
toObject(Type type, Object object)343*b1cdbd2cSJim Jagielski 	static public Object toObject(Type type, Object object)
344*b1cdbd2cSJim Jagielski 		throws com.sun.star.lang.IllegalArgumentException
345*b1cdbd2cSJim Jagielski     {
346*b1cdbd2cSJim Jagielski 		return convertSimple( type.getTypeClass(), type, object );
347*b1cdbd2cSJim Jagielski 	}
348*b1cdbd2cSJim Jagielski     /** converts a UNO object (struct, exception, sequence, enum or interface) or an Any containing
349*b1cdbd2cSJim Jagielski      *  these types into an UNO object of a specified destination type.
350*b1cdbd2cSJim Jagielski      *  For interfaces, the argument <em>object</em> is queried for the interface specified
351*b1cdbd2cSJim Jagielski      *  by the <em>type</em> argument. That query (UnoRuntime.queryInterface) might return null,
352*b1cdbd2cSJim Jagielski      *  if the interface is not implemented or a null-ref or a VOID any is given.
353*b1cdbd2cSJim Jagielski      *
354*b1cdbd2cSJim Jagielski      *  @param clazz class of the returned value
355*b1cdbd2cSJim Jagielski      *  @param object the object that is to be converted
356*b1cdbd2cSJim Jagielski      *  @return destination object
357*b1cdbd2cSJim Jagielski      *  @throws com.sun.star.lang.IllegalArgumentException
358*b1cdbd2cSJim Jagielski      *          in case conversion is not possible
359*b1cdbd2cSJim Jagielski      */
toObject(Class clazz, Object object)360*b1cdbd2cSJim Jagielski 	static public Object toObject(Class clazz, Object object)
361*b1cdbd2cSJim Jagielski 		throws com.sun.star.lang.IllegalArgumentException
362*b1cdbd2cSJim Jagielski     {
363*b1cdbd2cSJim Jagielski         return toObject( new Type( clazz ), object );
364*b1cdbd2cSJim Jagielski 	}
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski     /** converts an array or an any containing an array into an array.
367*b1cdbd2cSJim Jagielski         @param object the object to convert
368*b1cdbd2cSJim Jagielski         @throws com.sun.star.lang.IllegalArgumentException in case no array is contained within object.
369*b1cdbd2cSJim Jagielski         @return the array contained within the object
370*b1cdbd2cSJim Jagielski      */
toArray( Object object)371*b1cdbd2cSJim Jagielski 	static public Object toArray( Object object) throws com.sun.star.lang.IllegalArgumentException {
372*b1cdbd2cSJim Jagielski 		return convertSimple( TypeClass.SEQUENCE, null, object);
373*b1cdbd2cSJim Jagielski 	}
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 	/**
376*b1cdbd2cSJim Jagielski 	   Examines the argument <em>object</em> if is correspond to the type in argument <em>what</em>.
377*b1cdbd2cSJim Jagielski 	   <em>object</em> is either matched directly against the type or if it is an any then the
378*b1cdbd2cSJim Jagielski 	   contained object is matched against the type.
379*b1cdbd2cSJim Jagielski 	*/
containsType( TypeClass what, Object object)380*b1cdbd2cSJim Jagielski 	static private boolean containsType( TypeClass what, Object object){
381*b1cdbd2cSJim Jagielski         return (getType(object).getTypeClass().getValue() == what.getValue());
382*b1cdbd2cSJim Jagielski 	}
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     static private final Type m_XInterface_type = new Type( XInterface.class );
385*b1cdbd2cSJim Jagielski 
convertSimple( TypeClass destTClass, Type destType, Object object_ )386*b1cdbd2cSJim Jagielski 	static private Object convertSimple( TypeClass destTClass, Type destType, Object object_ )
387*b1cdbd2cSJim Jagielski 		throws com.sun.star.lang.IllegalArgumentException
388*b1cdbd2cSJim Jagielski     {
389*b1cdbd2cSJim Jagielski 		Object object;
390*b1cdbd2cSJim Jagielski         Type type;
391*b1cdbd2cSJim Jagielski         if (object_ instanceof Any)
392*b1cdbd2cSJim Jagielski         {
393*b1cdbd2cSJim Jagielski             // unbox
394*b1cdbd2cSJim Jagielski             Any a = (Any)object_;
395*b1cdbd2cSJim Jagielski             object = a.getObject();
396*b1cdbd2cSJim Jagielski             type = a.getType();
397*b1cdbd2cSJim Jagielski             // nested any
398*b1cdbd2cSJim Jagielski             if (TypeClass.ANY_value == type.getTypeClass().getValue())
399*b1cdbd2cSJim Jagielski                 return convertSimple( destTClass, destType, object );
400*b1cdbd2cSJim Jagielski         }
401*b1cdbd2cSJim Jagielski         else
402*b1cdbd2cSJim Jagielski         {
403*b1cdbd2cSJim Jagielski             object = object_;
404*b1cdbd2cSJim Jagielski             type = (null == object ? m_XInterface_type : new Type( object.getClass() ));
405*b1cdbd2cSJim Jagielski         }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski         int tc = type.getTypeClass().getValue();
408*b1cdbd2cSJim Jagielski         int dest_tc = destTClass.getValue();
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski         if (null == object)
411*b1cdbd2cSJim Jagielski         {
412*b1cdbd2cSJim Jagielski             // special for interfaces
413*b1cdbd2cSJim Jagielski             if (TypeClass.INTERFACE_value == tc && dest_tc == tc)
414*b1cdbd2cSJim Jagielski                 return null;
415*b1cdbd2cSJim Jagielski         }
416*b1cdbd2cSJim Jagielski         else
417*b1cdbd2cSJim Jagielski         {
418*b1cdbd2cSJim Jagielski             switch (dest_tc)
419*b1cdbd2cSJim Jagielski             {
420*b1cdbd2cSJim Jagielski             case TypeClass.CHAR_value:
421*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.CHAR_value)
422*b1cdbd2cSJim Jagielski                     return object;
423*b1cdbd2cSJim Jagielski                 break;
424*b1cdbd2cSJim Jagielski             case TypeClass.BOOLEAN_value:
425*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.BOOLEAN_value)
426*b1cdbd2cSJim Jagielski                     return object;
427*b1cdbd2cSJim Jagielski                 break;
428*b1cdbd2cSJim Jagielski             case TypeClass.BYTE_value:
429*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.BYTE_value)
430*b1cdbd2cSJim Jagielski                     return object;
431*b1cdbd2cSJim Jagielski                 break;
432*b1cdbd2cSJim Jagielski             case TypeClass.SHORT_value:
433*b1cdbd2cSJim Jagielski                 switch (tc)
434*b1cdbd2cSJim Jagielski                 {
435*b1cdbd2cSJim Jagielski                 case TypeClass.BYTE_value:
436*b1cdbd2cSJim Jagielski                     return new Short( ((Byte)object).byteValue() );
437*b1cdbd2cSJim Jagielski                 case TypeClass.SHORT_value:
438*b1cdbd2cSJim Jagielski                     return object;
439*b1cdbd2cSJim Jagielski                 }
440*b1cdbd2cSJim Jagielski                 break;
441*b1cdbd2cSJim Jagielski             case TypeClass.UNSIGNED_SHORT_value:
442*b1cdbd2cSJim Jagielski                 switch (tc)
443*b1cdbd2cSJim Jagielski                 {
444*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_SHORT_value:
445*b1cdbd2cSJim Jagielski                     return object;
446*b1cdbd2cSJim Jagielski                 }
447*b1cdbd2cSJim Jagielski                 break;
448*b1cdbd2cSJim Jagielski             case TypeClass.LONG_value:
449*b1cdbd2cSJim Jagielski                 switch (tc)
450*b1cdbd2cSJim Jagielski                 {
451*b1cdbd2cSJim Jagielski                 case TypeClass.BYTE_value:
452*b1cdbd2cSJim Jagielski                     return new Integer( ((Byte)object).byteValue() );
453*b1cdbd2cSJim Jagielski                 case TypeClass.SHORT_value:
454*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_SHORT_value:
455*b1cdbd2cSJim Jagielski                     return new Integer( ((Short)object).shortValue() );
456*b1cdbd2cSJim Jagielski                 case TypeClass.LONG_value:
457*b1cdbd2cSJim Jagielski                     return object;
458*b1cdbd2cSJim Jagielski                 }
459*b1cdbd2cSJim Jagielski                 break;
460*b1cdbd2cSJim Jagielski             case TypeClass.UNSIGNED_LONG_value:
461*b1cdbd2cSJim Jagielski                 switch (tc)
462*b1cdbd2cSJim Jagielski                 {
463*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_SHORT_value:
464*b1cdbd2cSJim Jagielski                     return new Integer( ((Short)object).shortValue() );
465*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_LONG_value:
466*b1cdbd2cSJim Jagielski                     return object;
467*b1cdbd2cSJim Jagielski                 }
468*b1cdbd2cSJim Jagielski                 break;
469*b1cdbd2cSJim Jagielski             case TypeClass.HYPER_value:
470*b1cdbd2cSJim Jagielski                 switch (tc)
471*b1cdbd2cSJim Jagielski                 {
472*b1cdbd2cSJim Jagielski                 case TypeClass.BYTE_value:
473*b1cdbd2cSJim Jagielski                     return new Long( ((Byte)object).byteValue() );
474*b1cdbd2cSJim Jagielski                 case TypeClass.SHORT_value:
475*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_SHORT_value:
476*b1cdbd2cSJim Jagielski                     return new Long( ((Short)object).shortValue() );
477*b1cdbd2cSJim Jagielski                 case TypeClass.LONG_value:
478*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_LONG_value:
479*b1cdbd2cSJim Jagielski                     return new Long( ((Integer)object).intValue() );
480*b1cdbd2cSJim Jagielski                 case TypeClass.HYPER_value:
481*b1cdbd2cSJim Jagielski                     return object;
482*b1cdbd2cSJim Jagielski                 }
483*b1cdbd2cSJim Jagielski                 break;
484*b1cdbd2cSJim Jagielski             case TypeClass.UNSIGNED_HYPER_value:
485*b1cdbd2cSJim Jagielski                 switch (tc)
486*b1cdbd2cSJim Jagielski                 {
487*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_SHORT_value:
488*b1cdbd2cSJim Jagielski                     return new Long( ((Short)object).shortValue() );
489*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_LONG_value:
490*b1cdbd2cSJim Jagielski                     return new Long( ((Integer)object).intValue() );
491*b1cdbd2cSJim Jagielski                 case TypeClass.UNSIGNED_HYPER_value:
492*b1cdbd2cSJim Jagielski                     return object;
493*b1cdbd2cSJim Jagielski                 }
494*b1cdbd2cSJim Jagielski                 break;
495*b1cdbd2cSJim Jagielski             case TypeClass.FLOAT_value:
496*b1cdbd2cSJim Jagielski                 switch (tc)
497*b1cdbd2cSJim Jagielski                 {
498*b1cdbd2cSJim Jagielski                 case TypeClass.BYTE_value:
499*b1cdbd2cSJim Jagielski                     return new Float( ((Byte)object).byteValue() );
500*b1cdbd2cSJim Jagielski                 case TypeClass.SHORT_value:
501*b1cdbd2cSJim Jagielski                     return new Float( ((Short)object).shortValue() );
502*b1cdbd2cSJim Jagielski                 case TypeClass.FLOAT_value:
503*b1cdbd2cSJim Jagielski                     return object;
504*b1cdbd2cSJim Jagielski                 }
505*b1cdbd2cSJim Jagielski                 break;
506*b1cdbd2cSJim Jagielski             case TypeClass.DOUBLE_value:
507*b1cdbd2cSJim Jagielski                 switch (tc)
508*b1cdbd2cSJim Jagielski                 {
509*b1cdbd2cSJim Jagielski                 case TypeClass.BYTE_value:
510*b1cdbd2cSJim Jagielski                     return new Double( ((Byte)object).byteValue() );
511*b1cdbd2cSJim Jagielski                 case TypeClass.SHORT_value:
512*b1cdbd2cSJim Jagielski                     return new Double( ((Short)object).shortValue() );
513*b1cdbd2cSJim Jagielski                 case TypeClass.LONG_value:
514*b1cdbd2cSJim Jagielski                     return new Double( ((Integer)object).intValue() );
515*b1cdbd2cSJim Jagielski                 case TypeClass.FLOAT_value:
516*b1cdbd2cSJim Jagielski                     return new Double( ((Float)object).floatValue() );
517*b1cdbd2cSJim Jagielski                 case TypeClass.DOUBLE_value:
518*b1cdbd2cSJim Jagielski                     return object;
519*b1cdbd2cSJim Jagielski                 }
520*b1cdbd2cSJim Jagielski                 break;
521*b1cdbd2cSJim Jagielski             case TypeClass.ENUM_value:
522*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.ENUM_value &&
523*b1cdbd2cSJim Jagielski                     (null == destTClass || destType.equals( type ) /* optional destType */))
524*b1cdbd2cSJim Jagielski                 {
525*b1cdbd2cSJim Jagielski                     return object;
526*b1cdbd2cSJim Jagielski                 }
527*b1cdbd2cSJim Jagielski                 break;
528*b1cdbd2cSJim Jagielski             case TypeClass.STRING_value:
529*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.STRING_value)
530*b1cdbd2cSJim Jagielski                     return object;
531*b1cdbd2cSJim Jagielski                 break;
532*b1cdbd2cSJim Jagielski             case TypeClass.TYPE_value:
533*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.TYPE_value)
534*b1cdbd2cSJim Jagielski                     return object;
535*b1cdbd2cSJim Jagielski                 break;
536*b1cdbd2cSJim Jagielski             case TypeClass.INTERFACE_value:
537*b1cdbd2cSJim Jagielski                 // Because object is a class, not an interface, it is
538*b1cdbd2cSJim Jagielski                 // controversial what kind of Type "new Type(object.class)"
539*b1cdbd2cSJim Jagielski                 // above should return (UNKNOWN or INTERFACE), so that we should
540*b1cdbd2cSJim Jagielski                 // not check here for "tc == TypeClass.INTERFACE_value".
541*b1cdbd2cSJim Jagielski                 // Instead, we check whether object (indirectly) derives from
542*b1cdbd2cSJim Jagielski                 // XInterface:
543*b1cdbd2cSJim Jagielski                 if (object instanceof XInterface)
544*b1cdbd2cSJim Jagielski                     return UnoRuntime.queryInterface( destType, object );
545*b1cdbd2cSJim Jagielski                 break;
546*b1cdbd2cSJim Jagielski             case TypeClass.STRUCT_value:
547*b1cdbd2cSJim Jagielski             case TypeClass.EXCEPTION_value:
548*b1cdbd2cSJim Jagielski                 if (destType.isSupertypeOf(type)) {
549*b1cdbd2cSJim Jagielski                     return object;
550*b1cdbd2cSJim Jagielski                 }
551*b1cdbd2cSJim Jagielski                 break;
552*b1cdbd2cSJim Jagielski             case TypeClass.SEQUENCE_value:
553*b1cdbd2cSJim Jagielski                 if (tc == TypeClass.SEQUENCE_value &&
554*b1cdbd2cSJim Jagielski                     (null == destType || destType.equals( type ) /* optional destType */))
555*b1cdbd2cSJim Jagielski                 {
556*b1cdbd2cSJim Jagielski                     return object;
557*b1cdbd2cSJim Jagielski                 }
558*b1cdbd2cSJim Jagielski                 break;
559*b1cdbd2cSJim Jagielski             }
560*b1cdbd2cSJim Jagielski         }
561*b1cdbd2cSJim Jagielski 		throw new com.sun.star.lang.IllegalArgumentException(
562*b1cdbd2cSJim Jagielski 			"The Argument did not hold the proper type");
563*b1cdbd2cSJim Jagielski 	}
564*b1cdbd2cSJim Jagielski }
565