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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_comphelper.hxx" 26 27 //_______________________________________________ 28 // includes 29 #include <comphelper/sequenceashashmap.hxx> 30 31 //_______________________________________________ 32 // namespace 33 34 namespace comphelper{ 35 36 namespace css = ::com::sun::star; 37 38 //_______________________________________________ 39 // definitions 40 41 /*----------------------------------------------- 42 04.11.2003 09:29 43 -----------------------------------------------*/ 44 SequenceAsHashMap::SequenceAsHashMap() 45 : SequenceAsHashMapBase() 46 { 47 } 48 49 /*----------------------------------------------- 50 04.11.2003 08:30 51 -----------------------------------------------*/ 52 SequenceAsHashMap::SequenceAsHashMap(const css::uno::Any& aSource) 53 { 54 (*this) << aSource; 55 } 56 57 //----------------------------------------------- 58 SequenceAsHashMap::SequenceAsHashMap(const css::uno::Sequence< css::uno::Any >& lSource) 59 { 60 (*this) << lSource; 61 } 62 63 /*----------------------------------------------- 64 04.11.2003 08:30 65 -----------------------------------------------*/ 66 SequenceAsHashMap::SequenceAsHashMap(const css::uno::Sequence< css::beans::PropertyValue >& lSource) 67 { 68 (*this) << lSource; 69 } 70 71 /*----------------------------------------------- 72 04.11.2003 08:30 73 -----------------------------------------------*/ 74 SequenceAsHashMap::SequenceAsHashMap(const css::uno::Sequence< css::beans::NamedValue >& lSource) 75 { 76 (*this) << lSource; 77 } 78 79 /*----------------------------------------------- 80 04.11.2003 09:04 81 -----------------------------------------------*/ 82 SequenceAsHashMap::~SequenceAsHashMap() 83 { 84 } 85 86 /*----------------------------------------------- 87 04.11.2003 10:21 88 -----------------------------------------------*/ 89 void SequenceAsHashMap::operator<<(const css::uno::Any& aSource) 90 { 91 // An empty Any reset this instance! 92 if (!aSource.hasValue()) 93 { 94 clear(); 95 return; 96 } 97 98 css::uno::Sequence< css::beans::NamedValue > lN; 99 if (aSource >>= lN) 100 { 101 (*this) << lN; 102 return; 103 } 104 105 css::uno::Sequence< css::beans::PropertyValue > lP; 106 if (aSource >>= lP) 107 { 108 (*this) << lP; 109 return; 110 } 111 112 throw css::beans::IllegalTypeException( 113 ::rtl::OUString::createFromAscii("Any contains wrong type."), 114 css::uno::Reference< css::uno::XInterface >()); 115 } 116 117 //----------------------------------------------- 118 void SequenceAsHashMap::operator<<(const css::uno::Sequence< css::uno::Any >& lSource) 119 { 120 sal_Int32 c = lSource.getLength(); 121 sal_Int32 i = 0; 122 123 for (i=0; i<c; ++i) 124 { 125 css::beans::PropertyValue lP; 126 if (lSource[i] >>= lP) 127 { 128 if ( 129 (lP.Name.isEmpty()) || 130 (!lP.Value.hasValue()) 131 ) 132 throw css::beans::IllegalTypeException( 133 ::rtl::OUString::createFromAscii("PropertyValue struct contains no usefull informations."), 134 css::uno::Reference< css::uno::XInterface >()); 135 (*this)[lP.Name] = lP.Value; 136 continue; 137 } 138 139 css::beans::NamedValue lN; 140 if (lSource[i] >>= lN) 141 { 142 if ( 143 (lN.Name.isEmpty()) || 144 (!lN.Value.hasValue()) 145 ) 146 throw css::beans::IllegalTypeException( 147 ::rtl::OUString::createFromAscii("NamedValue struct contains no usefull informations."), 148 css::uno::Reference< css::uno::XInterface >()); 149 (*this)[lN.Name] = lN.Value; 150 continue; 151 } 152 153 // ignore VOID Any ... but reject wrong filled ones! 154 if (lSource[i].hasValue()) 155 throw css::beans::IllegalTypeException( 156 ::rtl::OUString::createFromAscii("Any contains wrong type."), 157 css::uno::Reference< css::uno::XInterface >()); 158 } 159 } 160 161 /*----------------------------------------------- 162 04.11.2003 08:30 163 -----------------------------------------------*/ 164 void SequenceAsHashMap::operator<<(const css::uno::Sequence< css::beans::PropertyValue >& lSource) 165 { 166 clear(); 167 168 sal_Int32 c = lSource.getLength(); 169 const css::beans::PropertyValue* pSource = lSource.getConstArray(); 170 171 for (sal_Int32 i=0; i<c; ++i) 172 (*this)[pSource[i].Name] = pSource[i].Value; 173 } 174 175 /*----------------------------------------------- 176 04.11.2003 08:30 177 -----------------------------------------------*/ 178 void SequenceAsHashMap::operator<<(const css::uno::Sequence< css::beans::NamedValue >& lSource) 179 { 180 clear(); 181 182 sal_Int32 c = lSource.getLength(); 183 const css::beans::NamedValue* pSource = lSource.getConstArray(); 184 185 for (sal_Int32 i=0; i<c; ++i) 186 (*this)[pSource[i].Name] = pSource[i].Value; 187 } 188 189 /*----------------------------------------------- 190 04.11.2003 08:30 191 -----------------------------------------------*/ 192 void SequenceAsHashMap::operator>>(css::uno::Sequence< css::beans::PropertyValue >& lDestination) const 193 { 194 sal_Int32 c = (sal_Int32)size(); 195 lDestination.realloc(c); 196 css::beans::PropertyValue* pDestination = lDestination.getArray(); 197 198 sal_Int32 i = 0; 199 for (const_iterator pThis = begin(); 200 pThis != end() ; 201 ++pThis ) 202 { 203 pDestination[i].Name = pThis->first ; 204 pDestination[i].Value = pThis->second; 205 ++i; 206 } 207 } 208 209 /*----------------------------------------------- 210 04.11.2003 08:30 211 -----------------------------------------------*/ 212 void SequenceAsHashMap::operator>>(css::uno::Sequence< css::beans::NamedValue >& lDestination) const 213 { 214 sal_Int32 c = (sal_Int32)size(); 215 lDestination.realloc(c); 216 css::beans::NamedValue* pDestination = lDestination.getArray(); 217 218 sal_Int32 i = 0; 219 for (const_iterator pThis = begin(); 220 pThis != end() ; 221 ++pThis ) 222 { 223 pDestination[i].Name = pThis->first ; 224 pDestination[i].Value = pThis->second; 225 ++i; 226 } 227 } 228 229 /*----------------------------------------------- 230 30.07.2007 14:10 231 -----------------------------------------------*/ 232 const css::uno::Any SequenceAsHashMap::getAsConstAny(::sal_Bool bAsPropertyValueList) const 233 { 234 css::uno::Any aDestination; 235 if (bAsPropertyValueList) 236 aDestination = css::uno::makeAny(getAsConstPropertyValueList()); 237 else 238 aDestination = css::uno::makeAny(getAsConstNamedValueList()); 239 return aDestination; 240 } 241 242 /*----------------------------------------------- 243 30.07.2007 14:10 244 -----------------------------------------------*/ 245 const css::uno::Sequence< css::uno::Any > SequenceAsHashMap::getAsConstAnyList(::sal_Bool bAsPropertyValueList) const 246 { 247 ::sal_Int32 i = 0; 248 ::sal_Int32 c = (::sal_Int32)size(); 249 css::uno::Sequence< css::uno::Any > lDestination(c); 250 css::uno::Any* pDestination = lDestination.getArray(); 251 252 for (const_iterator pThis = begin(); 253 pThis != end() ; 254 ++pThis ) 255 { 256 if (bAsPropertyValueList) 257 { 258 css::beans::PropertyValue aProp; 259 aProp.Name = pThis->first; 260 aProp.Value = pThis->second; 261 pDestination[i] = css::uno::makeAny(aProp); 262 } 263 else 264 { 265 css::beans::NamedValue aProp; 266 aProp.Name = pThis->first; 267 aProp.Value = pThis->second; 268 pDestination[i] = css::uno::makeAny(aProp); 269 } 270 271 ++i; 272 } 273 274 return lDestination; 275 } 276 277 /*----------------------------------------------- 278 04.11.2003 08:30 279 -----------------------------------------------*/ 280 const css::uno::Sequence< css::beans::NamedValue > SequenceAsHashMap::getAsConstNamedValueList() const 281 { 282 css::uno::Sequence< css::beans::NamedValue > lReturn; 283 (*this) >> lReturn; 284 return lReturn; 285 } 286 287 /*----------------------------------------------- 288 04.11.2003 08:30 289 -----------------------------------------------*/ 290 const css::uno::Sequence< css::beans::PropertyValue > SequenceAsHashMap::getAsConstPropertyValueList() const 291 { 292 css::uno::Sequence< css::beans::PropertyValue > lReturn; 293 (*this) >> lReturn; 294 return lReturn; 295 } 296 297 /*----------------------------------------------- 298 07.03.2007 12:45 299 -----------------------------------------------*/ 300 sal_Bool SequenceAsHashMap::match(const SequenceAsHashMap& rCheck) const 301 { 302 const_iterator pCheck; 303 for ( pCheck = rCheck.begin(); 304 pCheck != rCheck.end() ; 305 ++pCheck ) 306 { 307 const ::rtl::OUString& sCheckName = pCheck->first; 308 const css::uno::Any& aCheckValue = pCheck->second; 309 const_iterator pFound = find(sCheckName); 310 311 if (pFound == end()) 312 return sal_False; 313 314 const css::uno::Any& aFoundValue = pFound->second; 315 if (aFoundValue != aCheckValue) 316 return sal_False; 317 } 318 319 return sal_True; 320 } 321 322 /*----------------------------------------------- 323 30.07.2007 14:30 324 -----------------------------------------------*/ 325 void SequenceAsHashMap::update(const SequenceAsHashMap& rUpdate) 326 { 327 const_iterator pUpdate; 328 for ( pUpdate = rUpdate.begin(); 329 pUpdate != rUpdate.end() ; 330 ++pUpdate ) 331 { 332 const ::rtl::OUString& sName = pUpdate->first; 333 const css::uno::Any& aValue = pUpdate->second; 334 335 (*this)[sName] = aValue; 336 } 337 } 338 339 /*----------------------------------------------- 340 04.11.2003 08:30 341 -----------------------------------------------*/ 342 #if OSL_DEBUG_LEVEL > 1 343 void SequenceAsHashMap::dbg_dumpToFile(const char* pFileName, 344 const char* pComment ) const 345 { 346 if (!pFileName || !pComment) 347 return; 348 349 FILE* pFile = fopen(pFileName, "a"); 350 if (!pFile) 351 return; 352 353 ::rtl::OUStringBuffer sBuffer(1000); 354 sBuffer.appendAscii("\n----------------------------------------\n"); 355 sBuffer.appendAscii(pComment ); 356 sBuffer.appendAscii("\n----------------------------------------\n"); 357 sal_Int32 i = 0; 358 for (const_iterator pIt = begin(); 359 pIt != end() ; 360 ++pIt ) 361 { 362 sBuffer.appendAscii("[" ); 363 sBuffer.append (i++ ); 364 sBuffer.appendAscii("] " ); 365 sBuffer.appendAscii("\"" ); 366 sBuffer.append (pIt->first); 367 sBuffer.appendAscii("\" = \"" ); 368 369 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xv; 370 ::rtl::OUString sv; 371 sal_Int32 nv; 372 sal_Bool bv; 373 374 if (pIt->second >>= sv) 375 sBuffer.append(sv); 376 else 377 if (pIt->second >>= nv) 378 sBuffer.append(nv); 379 else 380 if (pIt->second >>= bv) 381 sBuffer.appendAscii(bv ? "true" : "false"); 382 else 383 if (pIt->second >>= xv) 384 sBuffer.appendAscii(xv.is() ? "object" : "null"); 385 else 386 sBuffer.appendAscii("???"); 387 388 sBuffer.appendAscii("\"\n"); 389 } 390 391 fprintf(pFile, ::rtl::OUStringToOString(sBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8).getStr()); 392 fclose(pFile); 393 } 394 #endif // OSL_DEBUG_LEVEL > 1 395 396 } // namespace comphelper 397