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 24 #include "precompiled_configmgr.hxx" 25 #include "sal/config.h" 26 27 #include "com/sun/star/uno/Any.hxx" 28 #include "com/sun/star/uno/Reference.hxx" 29 #include "com/sun/star/uno/RuntimeException.hpp" 30 #include "com/sun/star/uno/Sequence.hxx" 31 #include "com/sun/star/uno/Type.hxx" 32 #include "com/sun/star/uno/TypeClass.hpp" 33 #include "com/sun/star/uno/XInterface.hpp" 34 #include "cppu/unotype.hxx" 35 #include "osl/diagnose.h" 36 #include "rtl/string.h" 37 #include "rtl/ustring.h" 38 #include "rtl/ustring.hxx" 39 #include "sal/types.h" 40 41 #include "type.hxx" 42 43 namespace configmgr { 44 45 namespace { 46 47 namespace css = com::sun::star; 48 49 } 50 isListType(Type type)51bool isListType(Type type) { 52 return type >= TYPE_BOOLEAN_LIST; 53 } 54 elementType(Type type)55Type elementType(Type type) { 56 switch (type) { 57 case TYPE_BOOLEAN_LIST: 58 return TYPE_BOOLEAN; 59 case TYPE_SHORT_LIST: 60 return TYPE_SHORT; 61 case TYPE_INT_LIST: 62 return TYPE_INT; 63 case TYPE_LONG_LIST: 64 return TYPE_LONG; 65 case TYPE_DOUBLE_LIST: 66 return TYPE_DOUBLE; 67 case TYPE_STRING_LIST: 68 return TYPE_STRING; 69 case TYPE_HEXBINARY_LIST: 70 return TYPE_HEXBINARY; 71 default: 72 OSL_ASSERT(false); 73 throw css::uno::RuntimeException( 74 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("this cannot happen")), 75 css::uno::Reference< css::uno::XInterface >()); 76 } 77 } 78 mapType(Type type)79css::uno::Type mapType(Type type) { 80 switch (type) { 81 case TYPE_ANY: 82 return cppu::UnoType< css::uno::Any >::get(); 83 case TYPE_BOOLEAN: 84 return cppu::UnoType< sal_Bool >::get(); 85 case TYPE_SHORT: 86 return cppu::UnoType< sal_Int16 >::get(); 87 case TYPE_INT: 88 return cppu::UnoType< sal_Int32 >::get(); 89 case TYPE_LONG: 90 return cppu::UnoType< sal_Int64 >::get(); 91 case TYPE_DOUBLE: 92 return cppu::UnoType< double >::get(); 93 case TYPE_STRING: 94 return cppu::UnoType< rtl::OUString >::get(); 95 case TYPE_HEXBINARY: 96 return cppu::UnoType< css::uno::Sequence< sal_Int8 > >::get(); 97 case TYPE_BOOLEAN_LIST: 98 return cppu::UnoType< css::uno::Sequence< sal_Bool > >::get(); 99 case TYPE_SHORT_LIST: 100 return cppu::UnoType< css::uno::Sequence< sal_Int16 > >::get(); 101 case TYPE_INT_LIST: 102 return cppu::UnoType< css::uno::Sequence< sal_Int32 > >::get(); 103 case TYPE_LONG_LIST: 104 return cppu::UnoType< css::uno::Sequence< sal_Int64 > >::get(); 105 case TYPE_DOUBLE_LIST: 106 return cppu::UnoType< css::uno::Sequence< double > >::get(); 107 case TYPE_STRING_LIST: 108 return cppu::UnoType< css::uno::Sequence< rtl::OUString > >::get(); 109 case TYPE_HEXBINARY_LIST: 110 return cppu::UnoType< 111 css::uno::Sequence< css::uno::Sequence< sal_Int8 > > >::get(); 112 default: 113 OSL_ASSERT(false); 114 throw css::uno::RuntimeException( 115 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("this cannot happen")), 116 css::uno::Reference< css::uno::XInterface >()); 117 } 118 } 119 getDynamicType(css::uno::Any const & value)120Type getDynamicType(css::uno::Any const & value) { 121 switch (value.getValueType().getTypeClass()) { 122 case css::uno::TypeClass_VOID: 123 return TYPE_NIL; 124 case css::uno::TypeClass_BOOLEAN: 125 return TYPE_BOOLEAN; 126 case css::uno::TypeClass_BYTE: 127 return TYPE_SHORT; 128 case css::uno::TypeClass_SHORT: 129 return TYPE_SHORT; 130 case css::uno::TypeClass_UNSIGNED_SHORT: 131 return value.has< sal_Int16 >() ? TYPE_SHORT : TYPE_INT; 132 case css::uno::TypeClass_LONG: 133 return TYPE_INT; 134 case css::uno::TypeClass_UNSIGNED_LONG: 135 return value.has< sal_Int32 >() ? TYPE_INT : TYPE_LONG; 136 case css::uno::TypeClass_HYPER: 137 return TYPE_LONG; 138 case css::uno::TypeClass_UNSIGNED_HYPER: 139 return value.has< sal_Int64 >() ? TYPE_LONG : TYPE_ERROR; 140 case css::uno::TypeClass_FLOAT: 141 case css::uno::TypeClass_DOUBLE: 142 return TYPE_DOUBLE; 143 case css::uno::TypeClass_STRING: 144 return TYPE_STRING; 145 case css::uno::TypeClass_SEQUENCE: //TODO 146 { 147 rtl::OUString name(value.getValueType().getTypeName()); 148 if (name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("[]byte"))) { 149 return TYPE_HEXBINARY; 150 } else if (name.equalsAsciiL( 151 RTL_CONSTASCII_STRINGPARAM("[]boolean"))) 152 { 153 return TYPE_BOOLEAN_LIST; 154 } else if (name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("[]short"))) 155 { 156 return TYPE_SHORT_LIST; 157 } else if (name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("[]long"))) 158 { 159 return TYPE_INT_LIST; 160 } else if (name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("[]hyper"))) 161 { 162 return TYPE_LONG_LIST; 163 } else if (name.equalsAsciiL( 164 RTL_CONSTASCII_STRINGPARAM("[]double"))) 165 { 166 return TYPE_DOUBLE_LIST; 167 } else if (name.equalsAsciiL( 168 RTL_CONSTASCII_STRINGPARAM("[]string"))) 169 { 170 return TYPE_STRING_LIST; 171 } else if (name.equalsAsciiL( 172 RTL_CONSTASCII_STRINGPARAM("[][]byte"))) 173 { 174 return TYPE_HEXBINARY_LIST; 175 } 176 } 177 // fall through 178 default: 179 return TYPE_ERROR; 180 } 181 } 182 183 } 184