| File: | stoc/source/tdmanager/tdmgr.cxx |
| Location: | line 456, column 43 |
| Description: | Called C++ object pointer is null |
| 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 | ||||
| 20 | #include <osl/diagnose.h> | |||
| 21 | #include <osl/mutex.hxx> | |||
| 22 | #include "rtl/ustrbuf.hxx" | |||
| 23 | #include <cppuhelper/factory.hxx> | |||
| 24 | #include <cppuhelper/compbase5.hxx> | |||
| 25 | #include <cppuhelper/implbase1.hxx> | |||
| 26 | #include <cppuhelper/implementationentry.hxx> | |||
| 27 | #include "tdmgr_common.hxx" | |||
| 28 | #include "tdmgr_tdenumeration.hxx" | |||
| 29 | #include "lrucache.hxx" | |||
| 30 | ||||
| 31 | #include <com/sun/star/lang/XServiceInfo.hpp> | |||
| 32 | #include <com/sun/star/lang/XSingleServiceFactory.hpp> | |||
| 33 | #include <com/sun/star/lang/XEventListener.hpp> | |||
| 34 | #include <com/sun/star/lang/XTypeProvider.hpp> | |||
| 35 | #include <com/sun/star/lang/XComponent.hpp> | |||
| 36 | #include <com/sun/star/lang/XInitialization.hpp> | |||
| 37 | #include <com/sun/star/container/XHierarchicalNameAccess.hpp> | |||
| 38 | #include <com/sun/star/container/XSet.hpp> | |||
| 39 | #include <com/sun/star/container/XContentEnumerationAccess.hpp> | |||
| 40 | #include <com/sun/star/reflection/XTypeDescription.hpp> | |||
| 41 | #include <com/sun/star/reflection/XArrayTypeDescription.hpp> | |||
| 42 | #include <com/sun/star/reflection/XIndirectTypeDescription.hpp> | |||
| 43 | #include <com/sun/star/reflection/XInterfaceTypeDescription.hpp> | |||
| 44 | #include "com/sun/star/reflection/XStructTypeDescription.hpp" | |||
| 45 | #include <com/sun/star/reflection/XTypeDescriptionEnumerationAccess.hpp> | |||
| 46 | #include <com/sun/star/registry/XRegistryKey.hpp> | |||
| 47 | #include "com/sun/star/uno/RuntimeException.hpp" | |||
| 48 | ||||
| 49 | #include <algorithm> | |||
| 50 | #include <vector> | |||
| 51 | ||||
| 52 | using namespace std; | |||
| 53 | using namespace cppu; | |||
| 54 | using namespace osl; | |||
| 55 | using namespace com::sun::star; | |||
| 56 | using namespace com::sun::star::uno; | |||
| 57 | using namespace com::sun::star::lang; | |||
| 58 | using namespace com::sun::star::reflection; | |||
| 59 | using namespace com::sun::star::container; | |||
| 60 | using namespace com::sun::star::registry; | |||
| 61 | ||||
| 62 | using ::rtl::OUString; | |||
| 63 | using ::rtl::OUStringBuffer; | |||
| 64 | ||||
| 65 | static const sal_Int32 CACHE_SIZE = 512; | |||
| 66 | ||||
| 67 | #define SERVICENAME"com.sun.star.reflection.TypeDescriptionManager" "com.sun.star.reflection.TypeDescriptionManager" | |||
| 68 | #define IMPLNAME"com.sun.star.comp.stoc.TypeDescriptionManager" "com.sun.star.comp.stoc.TypeDescriptionManager" | |||
| 69 | ||||
| 70 | //-------------------------------------------------------------------------------------------------- | |||
| 71 | // exported via tdmgr_common.hxx | |||
| 72 | extern rtl_StandardModuleCount g_moduleCount; | |||
| 73 | ||||
| 74 | namespace stoc_bootstrap | |||
| 75 | { | |||
| 76 | Sequence< OUString > SAL_CALL tdmgr_getSupportedServiceNames() | |||
| 77 | { | |||
| 78 | Sequence< OUString > seqNames(1); | |||
| 79 | seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME)(&("com.sun.star.reflection.TypeDescriptionManager")[0]), ((sal_Int32)((sizeof ("com.sun.star.reflection.TypeDescriptionManager" ) / sizeof (("com.sun.star.reflection.TypeDescriptionManager" )[0]))-1)), (((rtl_TextEncoding) 11))); | |||
| 80 | return seqNames; | |||
| 81 | } | |||
| 82 | ||||
| 83 | OUString SAL_CALL tdmgr_getImplementationName() | |||
| 84 | { | |||
| 85 | return OUString(RTL_CONSTASCII_USTRINGPARAM(IMPLNAME)(&("com.sun.star.comp.stoc.TypeDescriptionManager")[0]), ( (sal_Int32)((sizeof ("com.sun.star.comp.stoc.TypeDescriptionManager" ) / sizeof (("com.sun.star.comp.stoc.TypeDescriptionManager") [0]))-1)), (((rtl_TextEncoding) 11))); | |||
| 86 | } | |||
| 87 | } | |||
| 88 | ||||
| 89 | namespace stoc_tdmgr | |||
| 90 | { | |||
| 91 | typedef vector< Reference< XHierarchicalNameAccess > > ProviderVector; | |||
| 92 | ||||
| 93 | class EnumerationImpl; | |||
| 94 | class ManagerImpl; | |||
| 95 | ||||
| 96 | //================================================================================================== | |||
| 97 | class EventListenerImpl : public ImplHelper1< XEventListener > | |||
| 98 | { | |||
| 99 | ManagerImpl * _pMgr; | |||
| 100 | ||||
| 101 | public: | |||
| 102 | EventListenerImpl( ManagerImpl * pMgr ) | |||
| 103 | : _pMgr( pMgr ) | |||
| 104 | { | |||
| 105 | ::g_moduleCount.modCnt.acquire( &::g_moduleCount.modCnt ); | |||
| 106 | } | |||
| 107 | virtual ~EventListenerImpl(); | |||
| 108 | ||||
| 109 | // lifetime delegated to manager | |||
| 110 | virtual void SAL_CALL acquire() throw(); | |||
| 111 | virtual void SAL_CALL release() throw(); | |||
| 112 | ||||
| 113 | // XEventListener | |||
| 114 | virtual void SAL_CALL disposing( const EventObject & rEvt ) throw(::com::sun::star::uno::RuntimeException); | |||
| 115 | }; | |||
| 116 | ||||
| 117 | EventListenerImpl::~EventListenerImpl() | |||
| 118 | { | |||
| 119 | ::g_moduleCount.modCnt.release( &::g_moduleCount.modCnt ); | |||
| 120 | } | |||
| 121 | ||||
| 122 | //================================================================================================== | |||
| 123 | class ManagerImpl | |||
| 124 | : public WeakComponentImplHelper5< XServiceInfo, | |||
| 125 | XSet, | |||
| 126 | XHierarchicalNameAccess, | |||
| 127 | XTypeDescriptionEnumerationAccess, | |||
| 128 | XInitialization > | |||
| 129 | { | |||
| 130 | friend class EnumerationImpl; | |||
| 131 | friend class EventListenerImpl; | |||
| 132 | ||||
| 133 | Mutex _aComponentMutex; | |||
| 134 | Reference< XComponentContext > _xContext; | |||
| 135 | EventListenerImpl _aEventListener; | |||
| 136 | ||||
| 137 | // elements | |||
| 138 | sal_Bool _bCaching; | |||
| 139 | LRU_CacheAnyByOUString _aElements; | |||
| 140 | // provider chain | |||
| 141 | ProviderVector _aProviders; | |||
| 142 | ||||
| 143 | inline Any getSimpleType( const OUString & rName ); | |||
| 144 | ||||
| 145 | Reference< XTypeDescription > getInstantiatedStruct(OUString const & name); | |||
| 146 | ||||
| 147 | protected: | |||
| 148 | virtual void SAL_CALL disposing(); | |||
| 149 | ||||
| 150 | public: | |||
| 151 | ManagerImpl( Reference< XComponentContext > const & xContext, sal_Int32 nCacheSize ); | |||
| 152 | virtual ~ManagerImpl(); | |||
| 153 | ||||
| 154 | // XInitialization | |||
| 155 | virtual void SAL_CALL initialize( const Sequence< Any > & args ) throw (Exception, RuntimeException); | |||
| 156 | ||||
| 157 | // XServiceInfo | |||
| 158 | virtual OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException); | |||
| 159 | virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName ) throw(::com::sun::star::uno::RuntimeException); | |||
| 160 | virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException); | |||
| 161 | ||||
| 162 | // XElementAccess | |||
| 163 | virtual Type SAL_CALL getElementType() throw(::com::sun::star::uno::RuntimeException); | |||
| 164 | virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException); | |||
| 165 | ||||
| 166 | // XEnumerationAccess | |||
| 167 | virtual Reference< XEnumeration > SAL_CALL createEnumeration() throw(::com::sun::star::uno::RuntimeException); | |||
| 168 | ||||
| 169 | // XSet | |||
| 170 | virtual sal_Bool SAL_CALL has( const Any & rElement ) throw(::com::sun::star::uno::RuntimeException); | |||
| 171 | virtual void SAL_CALL insert( const Any & rElement ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); | |||
| 172 | virtual void SAL_CALL remove( const Any & rElement ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); | |||
| 173 | ||||
| 174 | // XHierarchicalNameAccess | |||
| 175 | virtual Any SAL_CALL getByHierarchicalName( const OUString & rName ) throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); | |||
| 176 | virtual sal_Bool SAL_CALL hasByHierarchicalName( const OUString & rName ) throw(::com::sun::star::uno::RuntimeException); | |||
| 177 | ||||
| 178 | // XTypeDescriptionEnumerationAccess | |||
| 179 | virtual ::com::sun::star::uno::Reference< | |||
| 180 | ::com::sun::star::reflection::XTypeDescriptionEnumeration > SAL_CALL | |||
| 181 | createTypeDescriptionEnumeration( | |||
| 182 | const ::rtl::OUString& moduleName, | |||
| 183 | const ::com::sun::star::uno::Sequence< | |||
| 184 | ::com::sun::star::uno::TypeClass >& types, | |||
| 185 | ::com::sun::star::reflection::TypeDescriptionSearchDepth depth ) | |||
| 186 | throw ( ::com::sun::star::reflection::NoSuchTypeNameException, | |||
| 187 | ::com::sun::star::reflection::InvalidTypeNameException, | |||
| 188 | ::com::sun::star::uno::RuntimeException ); | |||
| 189 | }; | |||
| 190 | ||||
| 191 | //================================================================================================== | |||
| 192 | class EnumerationImpl | |||
| 193 | : public WeakImplHelper1< XEnumeration > | |||
| 194 | { | |||
| 195 | ManagerImpl * _pMgr; | |||
| 196 | size_t _nPos; | |||
| 197 | ||||
| 198 | public: | |||
| 199 | EnumerationImpl( ManagerImpl * pManager ); | |||
| 200 | virtual ~EnumerationImpl(); | |||
| 201 | ||||
| 202 | // XEnumeration | |||
| 203 | virtual sal_Bool SAL_CALL hasMoreElements() throw(::com::sun::star::uno::RuntimeException); | |||
| 204 | virtual Any SAL_CALL nextElement() throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); | |||
| 205 | }; | |||
| 206 | ||||
| 207 | //################################################################################################## | |||
| 208 | ||||
| 209 | // lifetime delegated to manager | |||
| 210 | //__________________________________________________________________________________________________ | |||
| 211 | void EventListenerImpl::acquire() throw() | |||
| 212 | { | |||
| 213 | _pMgr->acquire(); | |||
| 214 | } | |||
| 215 | //__________________________________________________________________________________________________ | |||
| 216 | void EventListenerImpl::release() throw() | |||
| 217 | { | |||
| 218 | _pMgr->release(); | |||
| 219 | } | |||
| 220 | ||||
| 221 | // XEventListener | |||
| 222 | //__________________________________________________________________________________________________ | |||
| 223 | void EventListenerImpl::disposing( const EventObject & rEvt ) | |||
| 224 | throw(::com::sun::star::uno::RuntimeException) | |||
| 225 | { | |||
| 226 | _pMgr->remove( makeAny( rEvt.Source ) ); | |||
| 227 | } | |||
| 228 | ||||
| 229 | //################################################################################################## | |||
| 230 | ||||
| 231 | //__________________________________________________________________________________________________ | |||
| 232 | EnumerationImpl::EnumerationImpl( ManagerImpl * pManager ) | |||
| 233 | : _pMgr( pManager ) | |||
| 234 | , _nPos( 0 ) | |||
| 235 | { | |||
| 236 | _pMgr->acquire(); | |||
| 237 | } | |||
| 238 | //__________________________________________________________________________________________________ | |||
| 239 | EnumerationImpl::~EnumerationImpl() | |||
| 240 | { | |||
| 241 | _pMgr->release(); | |||
| 242 | } | |||
| 243 | ||||
| 244 | // XEnumeration | |||
| 245 | //__________________________________________________________________________________________________ | |||
| 246 | sal_Bool EnumerationImpl::hasMoreElements() | |||
| 247 | throw(::com::sun::star::uno::RuntimeException) | |||
| 248 | { | |||
| 249 | MutexGuard aGuard( _pMgr->_aComponentMutex ); | |||
| 250 | return (_nPos < _pMgr->_aProviders.size()); | |||
| 251 | } | |||
| 252 | //__________________________________________________________________________________________________ | |||
| 253 | Any EnumerationImpl::nextElement() | |||
| 254 | throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) | |||
| 255 | { | |||
| 256 | MutexGuard aGuard( _pMgr->_aComponentMutex ); | |||
| 257 | if (_nPos >= _pMgr->_aProviders.size()) | |||
| 258 | { | |||
| 259 | throw NoSuchElementException( | |||
| 260 | OUString( RTL_CONSTASCII_USTRINGPARAM("there is no further element!")(&("there is no further element!")[0]), ((sal_Int32)((sizeof ("there is no further element!") / sizeof (("there is no further element!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||
| 261 | (XWeak *)(OWeakObject *)this ); | |||
| 262 | } | |||
| 263 | return makeAny( _pMgr->_aProviders[_nPos++] ); | |||
| 264 | } | |||
| 265 | ||||
| 266 | //################################################################################################## | |||
| 267 | ||||
| 268 | //__________________________________________________________________________________________________ | |||
| 269 | ManagerImpl::ManagerImpl( | |||
| 270 | Reference< XComponentContext > const & xContext, sal_Int32 nCacheSize ) | |||
| 271 | : WeakComponentImplHelper5< | |||
| 272 | XServiceInfo, XSet, XHierarchicalNameAccess, | |||
| 273 | XTypeDescriptionEnumerationAccess, XInitialization >( _aComponentMutex ) | |||
| 274 | , _xContext( xContext ) | |||
| 275 | , _aEventListener( this ) | |||
| 276 | , _bCaching( sal_True((sal_Bool)1) ) | |||
| 277 | , _aElements( nCacheSize ) | |||
| 278 | { | |||
| 279 | ::g_moduleCount.modCnt.acquire( &::g_moduleCount.modCnt ); | |||
| 280 | } | |||
| 281 | //__________________________________________________________________________________________________ | |||
| 282 | ManagerImpl::~ManagerImpl() | |||
| 283 | { | |||
| 284 | OSL_ENSURE( _aProviders.empty(), "### still providers left!" )do { if (true && (!(_aProviders.empty()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "284" ": "), "%s", "### still providers left!"); } } while (false); | |||
| 285 | OSL_TRACE( "> TypeDescriptionManager shut down. <" )do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "285" ": "), "> TypeDescriptionManager shut down. <" ); } } while (false); | |||
| 286 | ::g_moduleCount.modCnt.release( &::g_moduleCount.modCnt ); | |||
| 287 | } | |||
| 288 | //__________________________________________________________________________________________________ | |||
| 289 | void ManagerImpl::disposing() | |||
| 290 | { | |||
| 291 | // called on disposing the tdmgr instance (supposedly from context) | |||
| 292 | _bCaching = sal_False((sal_Bool)0); | |||
| 293 | _aElements.clear(); | |||
| 294 | _xContext.clear(); | |||
| 295 | _aProviders.clear(); | |||
| 296 | } | |||
| 297 | ||||
| 298 | // XInitialization | |||
| 299 | //__________________________________________________________________________________________________ | |||
| 300 | void ManagerImpl::initialize( | |||
| 301 | const Sequence< Any > & args ) | |||
| 302 | throw (Exception, RuntimeException) | |||
| 303 | { | |||
| 304 | // additional providers | |||
| 305 | Any const * pProviders = args.getConstArray(); | |||
| 306 | for ( sal_Int32 nPos = 0; nPos < args.getLength(); ++nPos ) | |||
| 307 | { | |||
| 308 | Reference< XHierarchicalNameAccess > xHA( pProviders[ nPos ], UNO_QUERY ); | |||
| 309 | OSL_ENSURE( xHA.is(), "### no td provider!" )do { if (true && (!(xHA.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "309" ": "), "%s", "### no td provider!"); } } while (false ); | |||
| 310 | ||||
| 311 | if (xHA.is()) | |||
| 312 | { | |||
| 313 | try | |||
| 314 | { | |||
| 315 | insert( makeAny( xHA ) ); | |||
| 316 | } | |||
| 317 | catch (IllegalArgumentException &) | |||
| 318 | { | |||
| 319 | } | |||
| 320 | catch (ElementExistException &) | |||
| 321 | { | |||
| 322 | } | |||
| 323 | } | |||
| 324 | } | |||
| 325 | } | |||
| 326 | ||||
| 327 | // XServiceInfo | |||
| 328 | //__________________________________________________________________________________________________ | |||
| 329 | OUString ManagerImpl::getImplementationName() | |||
| 330 | throw(::com::sun::star::uno::RuntimeException) | |||
| 331 | { | |||
| 332 | return stoc_bootstrap::tdmgr_getImplementationName(); | |||
| 333 | } | |||
| 334 | //__________________________________________________________________________________________________ | |||
| 335 | sal_Bool ManagerImpl::supportsService( const OUString & rServiceName ) | |||
| 336 | throw(::com::sun::star::uno::RuntimeException) | |||
| 337 | { | |||
| 338 | const Sequence< OUString > & rSNL = getSupportedServiceNames(); | |||
| 339 | const OUString * pArray = rSNL.getConstArray(); | |||
| 340 | for ( sal_Int32 nPos = rSNL.getLength(); nPos--; ) | |||
| 341 | { | |||
| 342 | if (pArray[nPos] == rServiceName) | |||
| 343 | return sal_True((sal_Bool)1); | |||
| 344 | } | |||
| 345 | return sal_False((sal_Bool)0); | |||
| 346 | } | |||
| 347 | //__________________________________________________________________________________________________ | |||
| 348 | Sequence< OUString > ManagerImpl::getSupportedServiceNames() | |||
| 349 | throw(::com::sun::star::uno::RuntimeException) | |||
| 350 | { | |||
| 351 | return stoc_bootstrap::tdmgr_getSupportedServiceNames(); | |||
| 352 | } | |||
| 353 | ||||
| 354 | // XElementAccess | |||
| 355 | //__________________________________________________________________________________________________ | |||
| 356 | Type ManagerImpl::getElementType() | |||
| 357 | throw(::com::sun::star::uno::RuntimeException) | |||
| 358 | { | |||
| 359 | return ::getCppuType( (const Reference< XHierarchicalNameAccess > *)0 ); | |||
| 360 | } | |||
| 361 | //__________________________________________________________________________________________________ | |||
| 362 | sal_Bool ManagerImpl::hasElements() | |||
| 363 | throw(::com::sun::star::uno::RuntimeException) | |||
| 364 | { | |||
| 365 | MutexGuard aGuard( _aComponentMutex ); | |||
| 366 | return (!_aProviders.empty()); | |||
| 367 | } | |||
| 368 | ||||
| 369 | // XEnumerationAccess | |||
| 370 | //__________________________________________________________________________________________________ | |||
| 371 | Reference< XEnumeration > ManagerImpl::createEnumeration() | |||
| 372 | throw(::com::sun::star::uno::RuntimeException) | |||
| 373 | { | |||
| 374 | return new EnumerationImpl( this ); | |||
| 375 | } | |||
| 376 | ||||
| 377 | // XSet | |||
| 378 | //__________________________________________________________________________________________________ | |||
| 379 | sal_Bool SAL_CALL ManagerImpl::has( const Any & rElement ) | |||
| 380 | throw(::com::sun::star::uno::RuntimeException) | |||
| 381 | { | |||
| 382 | Reference< XHierarchicalNameAccess > xElem; | |||
| 383 | if (rElement >>= xElem) | |||
| 384 | { | |||
| 385 | MutexGuard aGuard( _aComponentMutex ); | |||
| 386 | return (find( _aProviders.begin(), _aProviders.end(), xElem ) != _aProviders.end()); | |||
| 387 | } | |||
| 388 | return sal_False((sal_Bool)0); | |||
| 389 | } | |||
| 390 | ||||
| 391 | //__________________________________________________________________________________________________ | |||
| 392 | void SAL_CALL ManagerImpl::insert( const Any & rElement ) | |||
| 393 | throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException) | |||
| 394 | { | |||
| 395 | Reference< XHierarchicalNameAccess > xElem; | |||
| 396 | if (! (rElement >>= xElem) || !xElem.is()) | |||
| ||||
| 397 | { | |||
| 398 | throw IllegalArgumentException( | |||
| 399 | OUString( RTL_CONSTASCII_USTRINGPARAM("no valid type description provider given!")(&("no valid type description provider given!")[0]), ((sal_Int32 )((sizeof ("no valid type description provider given!") / sizeof (("no valid type description provider given!")[0]))-1)), ((( rtl_TextEncoding) 11)) ), | |||
| 400 | (XWeak *)(OWeakObject *)this, 0 ); | |||
| 401 | } | |||
| 402 | ||||
| 403 | MutexGuard aGuard( _aComponentMutex ); | |||
| 404 | if (find( _aProviders.begin(), _aProviders.end(), xElem ) != _aProviders.end()) | |||
| 405 | { | |||
| 406 | throw ElementExistException( | |||
| 407 | OUString( RTL_CONSTASCII_USTRINGPARAM("provider already inserted!")(&("provider already inserted!")[0]), ((sal_Int32)((sizeof ("provider already inserted!") / sizeof (("provider already inserted!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||
| 408 | (XWeak *)(OWeakObject *)this ); | |||
| 409 | } | |||
| 410 | ||||
| 411 | if (! _aProviders.empty()) | |||
| 412 | { | |||
| 413 | // check whether all types are compatible, if possible: | |||
| 414 | Reference<reflection::XTypeDescriptionEnumerationAccess> xTDEnumAccess( | |||
| 415 | xElem, UNO_QUERY ); | |||
| 416 | OSL_ENSURE( xTDEnumAccess.is(),do { if (true && (!(xTDEnumAccess.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "418" ": "), "%s", "### providers ought to implement " "reflection::XTypeDescriptionEnumerationAccess!" ); } } while (false) | |||
| 417 | "### providers ought to implement "do { if (true && (!(xTDEnumAccess.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "418" ": "), "%s", "### providers ought to implement " "reflection::XTypeDescriptionEnumerationAccess!" ); } } while (false) | |||
| 418 | "reflection::XTypeDescriptionEnumerationAccess!" )do { if (true && (!(xTDEnumAccess.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "418" ": "), "%s", "### providers ought to implement " "reflection::XTypeDescriptionEnumerationAccess!" ); } } while (false); | |||
| 419 | if (xTDEnumAccess.is()) | |||
| 420 | { | |||
| 421 | try | |||
| 422 | { | |||
| 423 | TypeClass ar [] = { | |||
| 424 | TypeClass_ENUM, TypeClass_TYPEDEF, TypeClass_SEQUENCE, | |||
| 425 | TypeClass_STRUCT, TypeClass_EXCEPTION, | |||
| 426 | /* TypeClass_UNION, TypeClass_ARRAY not supported */ | |||
| 427 | TypeClass_INTERFACE, | |||
| 428 | TypeClass_SERVICE, | |||
| 429 | TypeClass_INTERFACE_METHOD, TypeClass_INTERFACE_ATTRIBUTE, | |||
| 430 | TypeClass_PROPERTY, TypeClass_CONSTANT, TypeClass_CONSTANTS, | |||
| 431 | TypeClass_SINGLETON | |||
| 432 | }; | |||
| 433 | Reference<reflection::XTypeDescriptionEnumeration> xTDEnum( | |||
| 434 | xTDEnumAccess->createTypeDescriptionEnumeration( | |||
| 435 | OUString() /* all modules */, | |||
| 436 | Sequence<TypeClass>( ar, ARLEN(ar)(sizeof (ar) / sizeof *(ar)) ), | |||
| 437 | reflection::TypeDescriptionSearchDepth_INFINITE ) ); | |||
| 438 | ||||
| 439 | while (xTDEnum->hasMoreElements()) | |||
| 440 | { | |||
| 441 | Reference<reflection::XTypeDescription> xNewTD; | |||
| 442 | try | |||
| 443 | { | |||
| 444 | xNewTD = xTDEnum->nextTypeDescription(); | |||
| 445 | } | |||
| 446 | catch (const container::NoSuchElementException & exc) | |||
| 447 | { | |||
| 448 | throw lang::IllegalArgumentException( | |||
| 449 | OUSTR("NoSuchElementException occurred: ")::rtl::OUString( (&("NoSuchElementException occurred: ")[ 0]), ((sal_Int32)((sizeof ("NoSuchElementException occurred: " ) / sizeof (("NoSuchElementException occurred: ")[0]))-1)), ( ((rtl_TextEncoding) 11)) ) + | |||
| 450 | exc.Message, static_cast<OWeakObject *>(this), | |||
| 451 | -1 /* unknown */ ); | |||
| 452 | } | |||
| 453 | ||||
| 454 | try | |||
| 455 | { | |||
| 456 | OUString newName( xNewTD->getName() ); | |||
| ||||
| 457 | Reference<reflection::XTypeDescription> xExistingTD( | |||
| 458 | getByHierarchicalName( newName ), UNO_QUERY ); | |||
| 459 | OSL_ASSERT( xExistingTD.is() )do { if (true && (!(xExistingTD.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "459" ": "), "OSL_ASSERT: %s", "xExistingTD.is()"); } } while (false); | |||
| 460 | // existing, check whether compatible: | |||
| 461 | if (xExistingTD.is()) | |||
| 462 | { | |||
| 463 | try | |||
| 464 | { | |||
| 465 | check( xNewTD, xExistingTD ); | |||
| 466 | } | |||
| 467 | catch (const IncompatibleTypeException & exc) | |||
| 468 | { | |||
| 469 | throw lang::IllegalArgumentException( | |||
| 470 | OUSTR("Rejecting types due to "::rtl::OUString( (&("Rejecting types due to " "incompatibility! " )[0]), ((sal_Int32)((sizeof ("Rejecting types due to " "incompatibility! " ) / sizeof (("Rejecting types due to " "incompatibility! ")[ 0]))-1)), (((rtl_TextEncoding) 11)) ) | |||
| 471 | "incompatibility! ")::rtl::OUString( (&("Rejecting types due to " "incompatibility! " )[0]), ((sal_Int32)((sizeof ("Rejecting types due to " "incompatibility! " ) / sizeof (("Rejecting types due to " "incompatibility! ")[ 0]))-1)), (((rtl_TextEncoding) 11)) ) + exc.m_cause, | |||
| 472 | static_cast<OWeakObject *>(this), 0 ); | |||
| 473 | } | |||
| 474 | } | |||
| 475 | } | |||
| 476 | catch (container::NoSuchElementException &) | |||
| 477 | { | |||
| 478 | // type not in: ok | |||
| 479 | } | |||
| 480 | } | |||
| 481 | } | |||
| 482 | catch (const reflection::NoSuchTypeNameException & exc) | |||
| 483 | { | |||
| 484 | throw lang::IllegalArgumentException( | |||
| 485 | OUSTR("NoSuchTypeNameException occurred: ")::rtl::OUString( (&("NoSuchTypeNameException occurred: ") [0]), ((sal_Int32)((sizeof ("NoSuchTypeNameException occurred: " ) / sizeof (("NoSuchTypeNameException occurred: ")[0]))-1)), ( ((rtl_TextEncoding) 11)) ) + exc.Message, | |||
| 486 | static_cast<OWeakObject *>(this), -1 /* unknown */ ); | |||
| 487 | } | |||
| 488 | catch (const reflection::InvalidTypeNameException & exc) | |||
| 489 | { | |||
| 490 | throw lang::IllegalArgumentException( | |||
| 491 | OUSTR("InvalidTypeNameException occurred: ")::rtl::OUString( (&("InvalidTypeNameException occurred: " )[0]), ((sal_Int32)((sizeof ("InvalidTypeNameException occurred: " ) / sizeof (("InvalidTypeNameException occurred: ")[0]))-1)), (((rtl_TextEncoding) 11)) ) + exc.Message, | |||
| 492 | static_cast<OWeakObject *>(this), -1 /* unknown */ ); | |||
| 493 | } | |||
| 494 | } | |||
| 495 | } | |||
| 496 | ||||
| 497 | _aProviders.push_back( xElem ); | |||
| 498 | Reference< XComponent > xComp( xElem, UNO_QUERY ); | |||
| 499 | if (xComp.is()) | |||
| 500 | xComp->addEventListener( &_aEventListener ); | |||
| 501 | } | |||
| 502 | //__________________________________________________________________________________________________ | |||
| 503 | void SAL_CALL ManagerImpl::remove( const Any & rElement ) | |||
| 504 | throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException) | |||
| 505 | { | |||
| 506 | if (!rBHelper.bDisposed && !rBHelper.bInDispose) | |||
| 507 | { | |||
| 508 | Reference< XHierarchicalNameAccess > xElem; | |||
| 509 | if (! (rElement >>= xElem)) | |||
| 510 | { | |||
| 511 | throw IllegalArgumentException( | |||
| 512 | OUString( RTL_CONSTASCII_USTRINGPARAM("no type description provider given!")(&("no type description provider given!")[0]), ((sal_Int32 )((sizeof ("no type description provider given!") / sizeof (( "no type description provider given!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||
| 513 | (XWeak *)(OWeakObject *)this, 0 ); | |||
| 514 | } | |||
| 515 | ||||
| 516 | MutexGuard aGuard( _aComponentMutex ); | |||
| 517 | ProviderVector::iterator iFind( find( _aProviders.begin(), _aProviders.end(), xElem ) ); | |||
| 518 | if (iFind == _aProviders.end()) | |||
| 519 | { | |||
| 520 | throw NoSuchElementException( | |||
| 521 | OUString( RTL_CONSTASCII_USTRINGPARAM("provider not found!")(&("provider not found!")[0]), ((sal_Int32)((sizeof ("provider not found!" ) / sizeof (("provider not found!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||
| 522 | (XWeak *)(OWeakObject *)this ); | |||
| 523 | } | |||
| 524 | _aProviders.erase( iFind ); | |||
| 525 | } | |||
| 526 | ||||
| 527 | Reference< XComponent > xComp; | |||
| 528 | if (rElement >>= xComp) | |||
| 529 | xComp->removeEventListener( &_aEventListener ); | |||
| 530 | } | |||
| 531 | ||||
| 532 | // XTypeDescriptionEnumerationAccess | |||
| 533 | //__________________________________________________________________________________________________ | |||
| 534 | // virtual | |||
| 535 | Reference< XTypeDescriptionEnumeration > SAL_CALL | |||
| 536 | ManagerImpl::createTypeDescriptionEnumeration( | |||
| 537 | const OUString & moduleName, | |||
| 538 | const Sequence< TypeClass > & types, | |||
| 539 | TypeDescriptionSearchDepth depth ) | |||
| 540 | throw ( NoSuchTypeNameException, | |||
| 541 | InvalidTypeNameException, | |||
| 542 | RuntimeException ) | |||
| 543 | { | |||
| 544 | MutexGuard aGuard( _aComponentMutex ); | |||
| 545 | ||||
| 546 | TDEnumerationAccessStack aStack; | |||
| 547 | ProviderVector::const_iterator it = _aProviders.begin(); | |||
| 548 | const ProviderVector::const_iterator end = _aProviders.end(); | |||
| 549 | while ( it != end ) | |||
| 550 | { | |||
| 551 | Reference< XTypeDescriptionEnumerationAccess >xEnumAccess( | |||
| 552 | (*it), UNO_QUERY ); | |||
| 553 | OSL_ENSURE( xEnumAccess.is(),do { if (true && (!(xEnumAccess.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "554" ": "), "%s", "### no XTypeDescriptionEnumerationAccess!" ); } } while (false) | |||
| 554 | "### no XTypeDescriptionEnumerationAccess!" )do { if (true && (!(xEnumAccess.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "554" ": "), "%s", "### no XTypeDescriptionEnumerationAccess!" ); } } while (false); | |||
| 555 | if ( xEnumAccess.is() ) | |||
| 556 | aStack.push( xEnumAccess ); | |||
| 557 | ||||
| 558 | ++it; | |||
| 559 | } | |||
| 560 | ||||
| 561 | return Reference< XTypeDescriptionEnumeration >( | |||
| 562 | new TypeDescriptionEnumerationImpl( moduleName, | |||
| 563 | types, | |||
| 564 | depth, | |||
| 565 | aStack ) ); | |||
| 566 | } | |||
| 567 | ||||
| 568 | ||||
| 569 | //################################################################################################## | |||
| 570 | //################################################################################################## | |||
| 571 | //################################################################################################## | |||
| 572 | ||||
| 573 | ||||
| 574 | //================================================================================================== | |||
| 575 | class SimpleTypeDescriptionImpl | |||
| 576 | : public WeakImplHelper1< XTypeDescription > | |||
| 577 | { | |||
| 578 | TypeClass _eTC; | |||
| 579 | OUString _aName; | |||
| 580 | ||||
| 581 | public: | |||
| 582 | SimpleTypeDescriptionImpl( TypeClass eTC, const OUString & rName ) | |||
| 583 | : _eTC( eTC ) | |||
| 584 | , _aName( rName ) | |||
| 585 | {} | |||
| 586 | ||||
| 587 | // XTypeDescription | |||
| 588 | virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException); | |||
| 589 | virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); | |||
| 590 | }; | |||
| 591 | ||||
| 592 | // XTypeDescription | |||
| 593 | //__________________________________________________________________________________________________ | |||
| 594 | TypeClass SimpleTypeDescriptionImpl::getTypeClass() | |||
| 595 | throw(::com::sun::star::uno::RuntimeException) | |||
| 596 | { | |||
| 597 | return _eTC; | |||
| 598 | } | |||
| 599 | //__________________________________________________________________________________________________ | |||
| 600 | OUString SimpleTypeDescriptionImpl::getName() | |||
| 601 | throw(::com::sun::star::uno::RuntimeException) | |||
| 602 | { | |||
| 603 | return _aName; | |||
| 604 | } | |||
| 605 | ||||
| 606 | //================================================================================================== | |||
| 607 | class SequenceTypeDescriptionImpl | |||
| 608 | : public WeakImplHelper1< XIndirectTypeDescription > | |||
| 609 | { | |||
| 610 | Reference< XTypeDescription > _xElementTD; | |||
| 611 | ||||
| 612 | public: | |||
| 613 | SequenceTypeDescriptionImpl( const Reference< XTypeDescription > & xElementTD ) | |||
| 614 | : _xElementTD( xElementTD ) | |||
| 615 | {} | |||
| 616 | ||||
| 617 | // XTypeDescription | |||
| 618 | virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException); | |||
| 619 | virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); | |||
| 620 | ||||
| 621 | // XIndirectTypeDescription | |||
| 622 | virtual Reference< XTypeDescription > SAL_CALL getReferencedType() throw(::com::sun::star::uno::RuntimeException); | |||
| 623 | }; | |||
| 624 | ||||
| 625 | // XTypeDescription | |||
| 626 | //__________________________________________________________________________________________________ | |||
| 627 | TypeClass SequenceTypeDescriptionImpl::getTypeClass() | |||
| 628 | throw(::com::sun::star::uno::RuntimeException) | |||
| 629 | { | |||
| 630 | return TypeClass_SEQUENCE; | |||
| 631 | } | |||
| 632 | //__________________________________________________________________________________________________ | |||
| 633 | OUString SequenceTypeDescriptionImpl::getName() | |||
| 634 | throw(::com::sun::star::uno::RuntimeException) | |||
| 635 | { | |||
| 636 | return (OUString( RTL_CONSTASCII_USTRINGPARAM("[]")(&("[]")[0]), ((sal_Int32)((sizeof ("[]") / sizeof (("[]" )[0]))-1)), (((rtl_TextEncoding) 11)) ) + _xElementTD->getName()); | |||
| 637 | } | |||
| 638 | ||||
| 639 | // XIndirectTypeDescription | |||
| 640 | //__________________________________________________________________________________________________ | |||
| 641 | Reference< XTypeDescription > SequenceTypeDescriptionImpl::getReferencedType() | |||
| 642 | throw(::com::sun::star::uno::RuntimeException) | |||
| 643 | { | |||
| 644 | return _xElementTD; | |||
| 645 | } | |||
| 646 | ||||
| 647 | //================================================================================================== | |||
| 648 | class ArrayTypeDescriptionImpl | |||
| 649 | : public WeakImplHelper1< XArrayTypeDescription > | |||
| 650 | { | |||
| 651 | Reference< XTypeDescription > _xElementTD; | |||
| 652 | Mutex _aDimensionMutex; | |||
| 653 | sal_Int32 _nDimensions; | |||
| 654 | Sequence< sal_Int32 > _seqDimensions; | |||
| 655 | OUString _sDimensions; | |||
| 656 | ||||
| 657 | void initDimensions(const OUString& rSDimensions); | |||
| 658 | public: | |||
| 659 | ArrayTypeDescriptionImpl( const Reference< XTypeDescription > & xElementTD, | |||
| 660 | sal_Int32 nDimensions, const OUString& rSDimensions ) | |||
| 661 | : _xElementTD( xElementTD ) | |||
| 662 | , _nDimensions( nDimensions ) | |||
| 663 | , _seqDimensions( Sequence< sal_Int32 >(nDimensions) ) | |||
| 664 | , _sDimensions( rSDimensions ) | |||
| 665 | { | |||
| 666 | initDimensions( rSDimensions ); | |||
| 667 | } | |||
| 668 | virtual ~ArrayTypeDescriptionImpl() {} | |||
| 669 | ||||
| 670 | // XTypeDescription | |||
| 671 | virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException); | |||
| 672 | virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); | |||
| 673 | ||||
| 674 | // XArrayTypeDescription | |||
| 675 | virtual Reference< XTypeDescription > SAL_CALL getType() throw(::com::sun::star::uno::RuntimeException); | |||
| 676 | virtual sal_Int32 SAL_CALL getNumberOfDimensions() throw(::com::sun::star::uno::RuntimeException); | |||
| 677 | virtual Sequence< sal_Int32 > SAL_CALL getDimensions() throw(::com::sun::star::uno::RuntimeException); | |||
| 678 | }; | |||
| 679 | //__________________________________________________________________________________________________ | |||
| 680 | static sal_Int32 unicodeToInteger( sal_Int8 base, const sal_Unicode *s ) | |||
| 681 | { | |||
| 682 | sal_Int32 r = 0; | |||
| 683 | sal_Int32 negative = 0; | |||
| 684 | ||||
| 685 | if (*s == '-') | |||
| 686 | { | |||
| 687 | negative = 1; | |||
| 688 | s++; | |||
| 689 | } | |||
| 690 | if (base == 8 && *s == '0') | |||
| 691 | s++; | |||
| 692 | else if (base == 16 && *s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) | |||
| 693 | s += 2; | |||
| 694 | ||||
| 695 | for (; *s; s++) | |||
| 696 | { | |||
| 697 | if (*s <= '9' && *s >= '0') | |||
| 698 | r = (r * base) + (*s - '0'); | |||
| 699 | else if (base > 10 && *s <= 'f' && *s >= 'a') | |||
| 700 | r = (r * base) + (*s - 'a' + 10); | |||
| 701 | else if (base > 10 && *s <= 'F' && *s >= 'A') | |||
| 702 | r = (r * base) + (*s - 'A' + 10); | |||
| 703 | else | |||
| 704 | break; | |||
| 705 | } | |||
| 706 | if (negative) r *= -1; | |||
| 707 | return r; | |||
| 708 | } | |||
| 709 | //__________________________________________________________________________________________________ | |||
| 710 | void ArrayTypeDescriptionImpl::initDimensions(const OUString& rSDimensions) | |||
| 711 | { | |||
| 712 | MutexGuard aGuard( _aDimensionMutex ); | |||
| 713 | ||||
| 714 | sal_Int32 * pDimensions = _seqDimensions.getArray(); | |||
| 715 | OUString tmp(rSDimensions); | |||
| 716 | sal_Unicode* p = (sal_Unicode*)tmp.getStr()+1; | |||
| 717 | sal_Unicode* pOffset = p; | |||
| 718 | sal_Int32 len = tmp.getLength() - 1 ; | |||
| 719 | sal_Int32 i = 0; | |||
| 720 | ||||
| 721 | while ( len > 0) | |||
| 722 | { | |||
| 723 | pOffset++; | |||
| 724 | if (*pOffset == ']') | |||
| 725 | { | |||
| 726 | *pOffset = '\0'; | |||
| 727 | pOffset += 2; | |||
| 728 | len -= 3; | |||
| 729 | pDimensions[i++] = unicodeToInteger(10, p); | |||
| 730 | p = pOffset; | |||
| 731 | } else | |||
| 732 | len--; | |||
| 733 | } | |||
| 734 | } | |||
| 735 | ||||
| 736 | // XTypeDescription | |||
| 737 | //__________________________________________________________________________________________________ | |||
| 738 | TypeClass ArrayTypeDescriptionImpl::getTypeClass() | |||
| 739 | throw(::com::sun::star::uno::RuntimeException) | |||
| 740 | { | |||
| 741 | return TypeClass_ARRAY; | |||
| 742 | } | |||
| 743 | //__________________________________________________________________________________________________ | |||
| 744 | OUString ArrayTypeDescriptionImpl::getName() | |||
| 745 | throw(::com::sun::star::uno::RuntimeException) | |||
| 746 | { | |||
| 747 | return (_xElementTD->getName() + _sDimensions); | |||
| 748 | } | |||
| 749 | ||||
| 750 | // XArrayTypeDescription | |||
| 751 | //__________________________________________________________________________________________________ | |||
| 752 | Reference< XTypeDescription > ArrayTypeDescriptionImpl::getType() | |||
| 753 | throw(::com::sun::star::uno::RuntimeException) | |||
| 754 | { | |||
| 755 | return _xElementTD; | |||
| 756 | } | |||
| 757 | ||||
| 758 | //__________________________________________________________________________________________________ | |||
| 759 | sal_Int32 ArrayTypeDescriptionImpl::getNumberOfDimensions() | |||
| 760 | throw(::com::sun::star::uno::RuntimeException) | |||
| 761 | { | |||
| 762 | return _nDimensions; | |||
| 763 | } | |||
| 764 | ||||
| 765 | //__________________________________________________________________________________________________ | |||
| 766 | Sequence< sal_Int32 > ArrayTypeDescriptionImpl::getDimensions() | |||
| 767 | throw(::com::sun::star::uno::RuntimeException) | |||
| 768 | { | |||
| 769 | return _seqDimensions; | |||
| 770 | } | |||
| 771 | ||||
| 772 | //################################################################################################## | |||
| 773 | //################################################################################################## | |||
| 774 | //################################################################################################## | |||
| 775 | ||||
| 776 | ||||
| 777 | //__________________________________________________________________________________________________ | |||
| 778 | inline Any ManagerImpl::getSimpleType( const OUString & rName ) | |||
| 779 | { | |||
| 780 | Any aRet; | |||
| 781 | ||||
| 782 | if ( rName == "string" ) | |||
| 783 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_STRING, rName ) ); | |||
| 784 | else if ( rName == "long" ) | |||
| 785 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_LONG, rName ) ); | |||
| 786 | else if ( rName == "unsigned long" ) | |||
| 787 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_UNSIGNED_LONG, rName ) ); | |||
| 788 | else if ( rName == "boolean" ) | |||
| 789 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_BOOLEAN, rName ) ); | |||
| 790 | else if ( rName == "char" ) | |||
| 791 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_CHAR, rName ) ); | |||
| 792 | else if ( rName == "byte" ) | |||
| 793 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_BYTE, rName ) ); | |||
| 794 | else if ( rName == "short" ) | |||
| 795 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_SHORT, rName ) ); | |||
| 796 | else if ( rName == "unsigned short" ) | |||
| 797 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_UNSIGNED_SHORT, rName ) ); | |||
| 798 | else if ( rName == "hyper" ) | |||
| 799 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_HYPER, rName ) ); | |||
| 800 | else if ( rName == "unsigned hyper" ) | |||
| 801 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_UNSIGNED_HYPER, rName ) ); | |||
| 802 | else if ( rName == "float" ) | |||
| 803 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_FLOAT, rName ) ); | |||
| 804 | else if ( rName == "double" ) | |||
| 805 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_DOUBLE, rName ) ); | |||
| 806 | else if ( rName == "any" ) | |||
| 807 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_ANY, rName ) ); | |||
| 808 | else if ( rName == "void" ) | |||
| 809 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_VOID, rName ) ); | |||
| 810 | else if ( rName == "type" ) | |||
| 811 | aRet <<= Reference< XTypeDescription >( new SimpleTypeDescriptionImpl( TypeClass_TYPE, rName ) ); | |||
| 812 | ||||
| 813 | return aRet; | |||
| 814 | } | |||
| 815 | ||||
| 816 | namespace { | |||
| 817 | ||||
| 818 | Reference< XTypeDescription > resolveTypedefs( | |||
| 819 | Reference< XTypeDescription > const & type) | |||
| 820 | { | |||
| 821 | Reference< XTypeDescription > resolved(type); | |||
| 822 | while (resolved->getTypeClass() == TypeClass_TYPEDEF) { | |||
| 823 | resolved = Reference< XIndirectTypeDescription >( | |||
| 824 | type, UNO_QUERY_THROW)->getReferencedType(); | |||
| 825 | } | |||
| 826 | return resolved; | |||
| 827 | } | |||
| 828 | ||||
| 829 | bool isNonVoidNonExceptionType(Reference< XTypeDescription > const & type) { | |||
| 830 | switch (type->getTypeClass()) { | |||
| 831 | case TypeClass_BOOLEAN: | |||
| 832 | case TypeClass_BYTE: | |||
| 833 | case TypeClass_SHORT: | |||
| 834 | case TypeClass_UNSIGNED_SHORT: | |||
| 835 | case TypeClass_LONG: | |||
| 836 | case TypeClass_UNSIGNED_LONG: | |||
| 837 | case TypeClass_HYPER: | |||
| 838 | case TypeClass_UNSIGNED_HYPER: | |||
| 839 | case TypeClass_FLOAT: | |||
| 840 | case TypeClass_DOUBLE: | |||
| 841 | case TypeClass_CHAR: | |||
| 842 | case TypeClass_STRING: | |||
| 843 | case TypeClass_TYPE: | |||
| 844 | case TypeClass_ANY: | |||
| 845 | case TypeClass_SEQUENCE: | |||
| 846 | case TypeClass_ENUM: | |||
| 847 | case TypeClass_STRUCT: | |||
| 848 | case TypeClass_INTERFACE: | |||
| 849 | return true; | |||
| 850 | ||||
| 851 | default: | |||
| 852 | return false; | |||
| 853 | } | |||
| 854 | } | |||
| 855 | ||||
| 856 | class InstantiatedStruct: public WeakImplHelper1< XStructTypeDescription > { | |||
| 857 | public: | |||
| 858 | InstantiatedStruct( | |||
| 859 | Reference< XStructTypeDescription > const & structType, | |||
| 860 | std::vector< Reference< XTypeDescription > > const & arguments); | |||
| 861 | ||||
| 862 | virtual TypeClass SAL_CALL getTypeClass() throw (RuntimeException) | |||
| 863 | { return TypeClass_STRUCT; } | |||
| 864 | ||||
| 865 | virtual OUString SAL_CALL getName() throw (RuntimeException); | |||
| 866 | ||||
| 867 | virtual Reference< XTypeDescription > SAL_CALL getBaseType() | |||
| 868 | throw (RuntimeException) | |||
| 869 | { return m_struct->getBaseType(); } | |||
| 870 | ||||
| 871 | virtual Sequence< Reference< XTypeDescription > > SAL_CALL getMemberTypes() | |||
| 872 | throw (RuntimeException); | |||
| 873 | ||||
| 874 | virtual Sequence< OUString > SAL_CALL getMemberNames() | |||
| 875 | throw (RuntimeException) | |||
| 876 | { return m_struct->getMemberNames(); } | |||
| 877 | ||||
| 878 | virtual Sequence< OUString > SAL_CALL getTypeParameters() | |||
| 879 | throw (RuntimeException) | |||
| 880 | { return Sequence< OUString >(); } | |||
| 881 | ||||
| 882 | virtual Sequence< Reference< XTypeDescription > > SAL_CALL | |||
| 883 | getTypeArguments() throw (RuntimeException) | |||
| 884 | { return m_arguments; } | |||
| 885 | ||||
| 886 | private: | |||
| 887 | Reference< XStructTypeDescription > m_struct; | |||
| 888 | Sequence< Reference< XTypeDescription > > m_arguments; | |||
| 889 | }; | |||
| 890 | ||||
| 891 | InstantiatedStruct::InstantiatedStruct( | |||
| 892 | Reference< XStructTypeDescription > const & structType, | |||
| 893 | std::vector< Reference< XTypeDescription > > const & arguments): | |||
| 894 | m_struct(structType), | |||
| 895 | m_arguments(static_cast< sal_Int32 >(arguments.size())) | |||
| 896 | { | |||
| 897 | for (std::vector< Reference< XTypeDescription > >::size_type i = 0; | |||
| 898 | i < arguments.size(); ++i) | |||
| 899 | { | |||
| 900 | m_arguments[static_cast< sal_Int32 >(i)] = arguments[i]; | |||
| 901 | } | |||
| 902 | } | |||
| 903 | ||||
| 904 | OUString InstantiatedStruct::getName() throw (RuntimeException) { | |||
| 905 | OUStringBuffer buf(m_struct->getName()); | |||
| 906 | buf.append(static_cast< sal_Unicode >('<')); | |||
| 907 | for (sal_Int32 i = 0; i < m_arguments.getLength(); ++i) { | |||
| 908 | if (i != 0) { | |||
| 909 | buf.append(static_cast< sal_Unicode >(',')); | |||
| 910 | } | |||
| 911 | buf.append(m_arguments[i]->getName()); | |||
| 912 | } | |||
| 913 | buf.append(static_cast< sal_Unicode >('>')); | |||
| 914 | return buf.makeStringAndClear(); | |||
| 915 | } | |||
| 916 | ||||
| 917 | Sequence< Reference< XTypeDescription > > InstantiatedStruct::getMemberTypes() | |||
| 918 | throw (RuntimeException) | |||
| 919 | { | |||
| 920 | Sequence< Reference< XTypeDescription > > types(m_struct->getMemberTypes()); | |||
| 921 | for (sal_Int32 i = 0; i < types.getLength(); ++i) { | |||
| 922 | if (types[i]->getTypeClass() == TypeClass_UNKNOWN) { | |||
| 923 | Sequence< OUString > parameters(m_struct->getTypeParameters()); | |||
| 924 | OSL_ASSERT(parameters.getLength() == m_arguments.getLength())do { if (true && (!(parameters.getLength() == m_arguments .getLength()))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "924" ": "), "OSL_ASSERT: %s", "parameters.getLength() == m_arguments.getLength()" ); } } while (false); | |||
| 925 | for (sal_Int32 j = 0; j < parameters.getLength(); ++j) { | |||
| 926 | if (parameters[j] == types[i]->getName()) { | |||
| 927 | types[i] = m_arguments[j]; | |||
| 928 | break; | |||
| 929 | } | |||
| 930 | } | |||
| 931 | } | |||
| 932 | } | |||
| 933 | return types; | |||
| 934 | } | |||
| 935 | ||||
| 936 | } | |||
| 937 | ||||
| 938 | Reference< XTypeDescription > ManagerImpl::getInstantiatedStruct( | |||
| 939 | OUString const & name) | |||
| 940 | { | |||
| 941 | sal_Int32 i = name.indexOf('<'); | |||
| 942 | OSL_ASSERT(i >= 0)do { if (true && (!(i >= 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/tdmanager/tdmgr.cxx" ":" "942" ": "), "OSL_ASSERT: %s", "i >= 0"); } } while ( false); | |||
| 943 | Reference< XStructTypeDescription > structType( | |||
| 944 | getByHierarchicalName(name.copy(0, i)), UNO_QUERY); | |||
| 945 | std::vector< Reference< XTypeDescription > > args; | |||
| 946 | bool good = structType.is(); | |||
| 947 | if (good) { | |||
| 948 | do { | |||
| 949 | ++i; // skip '<' or ',' | |||
| 950 | sal_Int32 j = i; | |||
| 951 | for (sal_Int32 level = 0; j != name.getLength(); ++j) { | |||
| 952 | sal_Unicode c = name[j]; | |||
| 953 | if (c == ',') { | |||
| 954 | if (level == 0) { | |||
| 955 | break; | |||
| 956 | } | |||
| 957 | } else if (c == '<') { | |||
| 958 | ++level; | |||
| 959 | } else if (c == '>') { | |||
| 960 | if (level == 0) { | |||
| 961 | break; | |||
| 962 | } | |||
| 963 | --level; | |||
| 964 | } | |||
| 965 | } | |||
| 966 | if (j != name.getLength()) { | |||
| 967 | Reference< XTypeDescription > type( | |||
| 968 | getByHierarchicalName(name.copy(i, j - i)), UNO_QUERY); | |||
| 969 | if (isNonVoidNonExceptionType(resolveTypedefs(type))) { | |||
| 970 | args.push_back(type); | |||
| 971 | } else { | |||
| 972 | good = false; | |||
| 973 | break; | |||
| 974 | } | |||
| 975 | } | |||
| 976 | i = j; | |||
| 977 | } while (i != name.getLength() && name[i] != '>'); | |||
| 978 | good = good && i == name.getLength() - 1 | |||
| 979 | && name[i] == '>' && !args.empty(); | |||
| 980 | } | |||
| 981 | // args.size() cannot exceed SAL_MAX_INT32, as each argument consumes at | |||
| 982 | // least one position within an rtl::OUString (which is no longer than | |||
| 983 | // SAL_MAX_INT32): | |||
| 984 | if (!good | |||
| 985 | || (args.size() | |||
| 986 | != sal::static_int_cast< sal_uInt32 >( | |||
| 987 | structType->getTypeParameters().getLength()))) | |||
| 988 | { | |||
| 989 | throw NoSuchElementException(name, static_cast< OWeakObject * >(this)); | |||
| 990 | } | |||
| 991 | return new InstantiatedStruct(structType, args); | |||
| 992 | } | |||
| 993 | ||||
| 994 | // XHierarchicalNameAccess | |||
| 995 | //__________________________________________________________________________________________________ | |||
| 996 | Any ManagerImpl::getByHierarchicalName( const OUString & rName ) | |||
| 997 | throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException) | |||
| 998 | { | |||
| 999 | Any aRet; | |||
| 1000 | if (_bCaching) | |||
| 1001 | aRet = _aElements.getValue( rName ); | |||
| 1002 | if (!rName.isEmpty() && !aRet.hasValue()) | |||
| 1003 | { | |||
| 1004 | sal_Int32 nIndex; | |||
| 1005 | if (rName[0] == '[') // test for sequence | |||
| 1006 | { | |||
| 1007 | Reference< XTypeDescription > xElemType( | |||
| 1008 | getByHierarchicalName( rName.copy( 2 ) ), | |||
| 1009 | UNO_QUERY_THROW ); | |||
| 1010 | aRet <<= Reference< XTypeDescription >( | |||
| 1011 | new SequenceTypeDescriptionImpl( xElemType ) ); | |||
| 1012 | } | |||
| 1013 | else if (rName[rName.getLength()-1] == ']') // test for array | |||
| 1014 | { | |||
| 1015 | sal_Int32 nIndex2 = 0, nTokens = 0; | |||
| 1016 | do { rName.getToken( 0, '[', nIndex2 ); nTokens++; } while( nIndex2 != -1 ); | |||
| 1017 | sal_Int32 nDims = nTokens - 1; | |||
| 1018 | sal_Int32 dimOffset = rName.indexOf('['); | |||
| 1019 | Reference< XTypeDescription > xElemType( | |||
| 1020 | getByHierarchicalName( rName.copy( 0, dimOffset ) ), | |||
| 1021 | UNO_QUERY_THROW ); | |||
| 1022 | aRet <<= Reference< XTypeDescription >( | |||
| 1023 | new ArrayTypeDescriptionImpl( | |||
| 1024 | xElemType, nDims, rName.copy(dimOffset) ) ); | |||
| 1025 | } | |||
| 1026 | // test for interface member names: | |||
| 1027 | else if ((nIndex = rName.indexOf( ':' )) >= 0) | |||
| 1028 | { | |||
| 1029 | Reference< XInterfaceTypeDescription > xIfaceTD( | |||
| 1030 | getByHierarchicalName( rName.copy( 0, nIndex ) ), | |||
| 1031 | UNO_QUERY_THROW ); | |||
| 1032 | const Sequence< Reference< XInterfaceMemberTypeDescription > > & | |||
| 1033 | rMembers = xIfaceTD->getMembers(); | |||
| 1034 | const Reference< XInterfaceMemberTypeDescription > * pMembers = | |||
| 1035 | rMembers.getConstArray(); | |||
| 1036 | ||||
| 1037 | for ( sal_Int32 nPos = rMembers.getLength(); nPos--; ) | |||
| 1038 | { | |||
| 1039 | if (rName == pMembers[nPos]->getName()) | |||
| 1040 | { | |||
| 1041 | aRet <<= Reference< XTypeDescription >( | |||
| 1042 | pMembers[nPos], UNO_QUERY_THROW ); | |||
| 1043 | break; | |||
| 1044 | } | |||
| 1045 | } | |||
| 1046 | if (! aRet.hasValue()) | |||
| 1047 | { | |||
| 1048 | // member not found: | |||
| 1049 | throw NoSuchElementException( | |||
| 1050 | rName, static_cast< OWeakObject * >(this) ); | |||
| 1051 | } | |||
| 1052 | } | |||
| 1053 | // test for instantiated polymorphic struct types: | |||
| 1054 | else if (rName.indexOf('<') >= 0) | |||
| 1055 | { | |||
| 1056 | aRet <<= getInstantiatedStruct(rName); | |||
| 1057 | } | |||
| 1058 | else if (rName.indexOf( '.' ) < 0) // test for simple/ build in types | |||
| 1059 | { | |||
| 1060 | aRet = getSimpleType( rName ); | |||
| 1061 | } | |||
| 1062 | ||||
| 1063 | if (! aRet.hasValue()) | |||
| 1064 | { | |||
| 1065 | // last, try callback chain | |||
| 1066 | for ( ProviderVector::const_iterator iPos( _aProviders.begin() ); | |||
| 1067 | iPos != _aProviders.end(); ++iPos ) | |||
| 1068 | { | |||
| 1069 | try | |||
| 1070 | { | |||
| 1071 | if ((aRet = (*iPos)->getByHierarchicalName( | |||
| 1072 | rName )).hasValue()) | |||
| 1073 | { | |||
| 1074 | break; | |||
| 1075 | } | |||
| 1076 | } | |||
| 1077 | catch (NoSuchElementException &) | |||
| 1078 | { | |||
| 1079 | } | |||
| 1080 | } | |||
| 1081 | } | |||
| 1082 | ||||
| 1083 | // update cache | |||
| 1084 | if (_bCaching && aRet.hasValue()) | |||
| 1085 | _aElements.setValue( rName, aRet ); | |||
| 1086 | } | |||
| 1087 | ||||
| 1088 | if (! aRet.hasValue()) | |||
| 1089 | { | |||
| 1090 | throw NoSuchElementException( | |||
| 1091 | rName, static_cast< OWeakObject * >(this) ); | |||
| 1092 | } | |||
| 1093 | return aRet; | |||
| 1094 | } | |||
| 1095 | //__________________________________________________________________________________________________ | |||
| 1096 | sal_Bool ManagerImpl::hasByHierarchicalName( const OUString & rName ) | |||
| 1097 | throw(::com::sun::star::uno::RuntimeException) | |||
| 1098 | { | |||
| 1099 | try | |||
| 1100 | { | |||
| 1101 | return getByHierarchicalName( rName ).hasValue(); | |||
| 1102 | } | |||
| 1103 | catch (NoSuchElementException &) | |||
| 1104 | { | |||
| 1105 | } | |||
| 1106 | return sal_False((sal_Bool)0); | |||
| 1107 | } | |||
| 1108 | } | |||
| 1109 | ||||
| 1110 | namespace stoc_bootstrap | |||
| 1111 | { | |||
| 1112 | //================================================================================================== | |||
| 1113 | Reference< XInterface > SAL_CALL ManagerImpl_create( | |||
| 1114 | Reference< XComponentContext > const & xContext ) | |||
| 1115 | SAL_THROW( (::com::sun::star::uno::Exception) ) | |||
| 1116 | { | |||
| 1117 | sal_Int32 nCacheSize = CACHE_SIZE; | |||
| 1118 | if (xContext.is()) { | |||
| 1119 | xContext->getValueByName( | |||
| 1120 | OUString( | |||
| 1121 | RTL_CONSTASCII_USTRINGPARAM((&("/implementations/" "com.sun.star.comp.stoc.TypeDescriptionManager" "/CacheSize")[0]), ((sal_Int32)((sizeof ("/implementations/" "com.sun.star.comp.stoc.TypeDescriptionManager" "/CacheSize" ) / sizeof (("/implementations/" "com.sun.star.comp.stoc.TypeDescriptionManager" "/CacheSize")[0]))-1)), (((rtl_TextEncoding) 11)) | |||
| 1122 | "/implementations/" IMPLNAME "/CacheSize")(&("/implementations/" "com.sun.star.comp.stoc.TypeDescriptionManager" "/CacheSize")[0]), ((sal_Int32)((sizeof ("/implementations/" "com.sun.star.comp.stoc.TypeDescriptionManager" "/CacheSize" ) / sizeof (("/implementations/" "com.sun.star.comp.stoc.TypeDescriptionManager" "/CacheSize")[0]))-1)), (((rtl_TextEncoding) 11)))) >>= | |||
| 1123 | nCacheSize; | |||
| 1124 | } | |||
| 1125 | ||||
| 1126 | return Reference< XInterface >( *new stoc_tdmgr::ManagerImpl( xContext, nCacheSize ) ); | |||
| 1127 | } | |||
| 1128 | ||||
| 1129 | } | |||
| 1130 | ||||
| 1131 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |