1*647a425cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*647a425cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*647a425cSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*647a425cSAndrew Rist * distributed with this work for additional information 6*647a425cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*647a425cSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*647a425cSAndrew Rist * "License"); you may not use this file except in compliance 9*647a425cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*647a425cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*647a425cSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*647a425cSAndrew Rist * software distributed under the License is distributed on an 15*647a425cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*647a425cSAndrew Rist * KIND, either express or implied. See the License for the 17*647a425cSAndrew Rist * specific language governing permissions and limitations 18*647a425cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*647a425cSAndrew Rist *************************************************************/ 21*647a425cSAndrew Rist 22*647a425cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_stoc.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <string.h> 28cdf0e10cSrcweir 29cdf0e10cSrcweir // Schalter fuer Introspection-Caching 30cdf0e10cSrcweir #ifndef OS2 31cdf0e10cSrcweir #define USE_INTROSPECTION_CACHE 32cdf0e10cSrcweir #endif 33cdf0e10cSrcweir 34cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 35cdf0e10cSrcweir #define INTROSPECTION_CACHE_MAX_SIZE 100 36cdf0e10cSrcweir #endif 37cdf0e10cSrcweir #include <osl/diagnose.h> 38cdf0e10cSrcweir #include <osl/mutex.hxx> 39cdf0e10cSrcweir #include <osl/thread.h> 40cdf0e10cSrcweir #include <cppuhelper/queryinterface.hxx> 41cdf0e10cSrcweir #include <cppuhelper/weak.hxx> 42cdf0e10cSrcweir #include <cppuhelper/component.hxx> 43cdf0e10cSrcweir #include <cppuhelper/factory.hxx> 44cdf0e10cSrcweir #include <cppuhelper/implbase3.hxx> 45cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx> 46cdf0e10cSrcweir 47cdf0e10cSrcweir #include <com/sun/star/uno/DeploymentException.hpp> 48cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp> 49cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 50cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp> 51cdf0e10cSrcweir #include <com/sun/star/lang/XEventListener.hpp> 52cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlReflection.hpp> 53cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlClassProvider.hpp> 54cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlClass.hpp> 55cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlField2.hpp> 56cdf0e10cSrcweir #include <com/sun/star/beans/UnknownPropertyException.hpp> 57cdf0e10cSrcweir #include <com/sun/star/beans/Property.hpp> 58cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 59cdf0e10cSrcweir #include <com/sun/star/beans/XFastPropertySet.hpp> 60cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospection.hpp> 61cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospectionAccess.hpp> 62cdf0e10cSrcweir #include <com/sun/star/beans/XMaterialHolder.hpp> 63cdf0e10cSrcweir #include <com/sun/star/beans/XExactName.hpp> 64cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp> 65cdf0e10cSrcweir #include <com/sun/star/beans/PropertyConcept.hpp> 66cdf0e10cSrcweir #include <com/sun/star/beans/MethodConcept.hpp> 67cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp> 68cdf0e10cSrcweir #include <com/sun/star/container/XIndexContainer.hpp> 69cdf0e10cSrcweir #include <com/sun/star/container/XEnumerationAccess.hpp> 70cdf0e10cSrcweir 71cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 72cdf0e10cSrcweir #include <rtl/ref.hxx> 73cdf0e10cSrcweir #include <rtl/strbuf.hxx> 74cdf0e10cSrcweir #include <hash_map> 75cdf0e10cSrcweir 76cdf0e10cSrcweir using namespace com::sun::star::uno; 77cdf0e10cSrcweir using namespace com::sun::star::lang; 78cdf0e10cSrcweir using namespace com::sun::star::reflection; 79cdf0e10cSrcweir using namespace com::sun::star::container; 80cdf0e10cSrcweir using namespace com::sun::star::registry; 81cdf0e10cSrcweir using namespace com::sun::star::beans; 82cdf0e10cSrcweir using namespace com::sun::star::beans::PropertyAttribute; 83cdf0e10cSrcweir using namespace com::sun::star::beans::PropertyConcept; 84cdf0e10cSrcweir using namespace com::sun::star::beans::MethodConcept; 85cdf0e10cSrcweir using namespace cppu; 86cdf0e10cSrcweir using namespace osl; 87cdf0e10cSrcweir 88cdf0e10cSrcweir #define IMPLEMENTATION_NAME "com.sun.star.comp.stoc.Introspection" 89cdf0e10cSrcweir #define SERVICE_NAME "com.sun.star.beans.Introspection" 90cdf0e10cSrcweir 91cdf0e10cSrcweir namespace stoc_inspect 92cdf0e10cSrcweir { 93cdf0e10cSrcweir 94cdf0e10cSrcweir typedef WeakImplHelper3< XIntrospectionAccess, XMaterialHolder, XExactName > IntrospectionAccessHelper; 95cdf0e10cSrcweir 96cdf0e10cSrcweir 97cdf0e10cSrcweir //================================================================================================== 98cdf0e10cSrcweir 99cdf0e10cSrcweir // Spezial-Wert fuer Method-Concept, um "normale" Funktionen kennzeichnen zu koennen 100cdf0e10cSrcweir #define MethodConcept_NORMAL_IMPL 0x80000000 101cdf0e10cSrcweir 102cdf0e10cSrcweir 103cdf0e10cSrcweir // Methode zur Feststellung, ob eine Klasse von einer anderen abgeleitet ist 104cdf0e10cSrcweir sal_Bool isDerivedFrom( Reference<XIdlClass> xToTestClass, Reference<XIdlClass> xDerivedFromClass ) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir Sequence< Reference<XIdlClass> > aClassesSeq = xToTestClass->getSuperclasses(); 107cdf0e10cSrcweir const Reference<XIdlClass>* pClassesArray = aClassesSeq.getConstArray(); 108cdf0e10cSrcweir sal_Int32 nSuperClassCount = aClassesSeq.getLength(); 109cdf0e10cSrcweir sal_Int32 i; 110cdf0e10cSrcweir for( i = 0 ; i < nSuperClassCount ; i++ ) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir const Reference<XIdlClass>& rxClass = pClassesArray[i]; 113cdf0e10cSrcweir if( xDerivedFromClass->equals( rxClass ) ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir // Treffer 116cdf0e10cSrcweir return sal_True; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir else 119cdf0e10cSrcweir { 120cdf0e10cSrcweir // Rekursiv weitersuchen 121cdf0e10cSrcweir return isDerivedFrom( rxClass, xDerivedFromClass ); 122cdf0e10cSrcweir } 123cdf0e10cSrcweir } 124cdf0e10cSrcweir return sal_False; 125cdf0e10cSrcweir } 126cdf0e10cSrcweir 127cdf0e10cSrcweir //======================================================================== 128cdf0e10cSrcweir 129cdf0e10cSrcweir // *** Klassifizierung der Properties (kein enum, um Sequence verwenden zu koennen) *** 130cdf0e10cSrcweir // Properties aus einem PropertySet-Interface 131cdf0e10cSrcweir #define MAP_PROPERTY_SET 0 132cdf0e10cSrcweir // Properties aus Fields 133cdf0e10cSrcweir #define MAP_FIELD 1 134cdf0e10cSrcweir // Properties, die durch get/set-Methoden beschrieben werden 135cdf0e10cSrcweir #define MAP_GETSET 2 136cdf0e10cSrcweir // Properties, die nur eine set-Methode haben 137cdf0e10cSrcweir #define MAP_SETONLY 3 138cdf0e10cSrcweir 139cdf0e10cSrcweir 140cdf0e10cSrcweir // Schrittweite, in der die Groesse der Sequences angepasst wird 141cdf0e10cSrcweir #define ARRAY_SIZE_STEP 20 142cdf0e10cSrcweir 143cdf0e10cSrcweir 144cdf0e10cSrcweir 145cdf0e10cSrcweir //************************************** 146cdf0e10cSrcweir //*** IntrospectionAccessStatic_Impl *** 147cdf0e10cSrcweir //************************************** 148cdf0e10cSrcweir // Entspricht dem alten IntrospectionAccessImpl, bildet jetzt den statischen 149cdf0e10cSrcweir // Anteil des neuen Instanz-bezogenen ImplIntrospectionAccess 150cdf0e10cSrcweir 151cdf0e10cSrcweir // ACHTUNG !!! Von Hand refcounten !!! 152cdf0e10cSrcweir 153cdf0e10cSrcweir 154cdf0e10cSrcweir // Hashtable fuer die Suche nach Namen 155cdf0e10cSrcweir struct hashName_Impl 156cdf0e10cSrcweir { 157cdf0e10cSrcweir size_t operator()(const ::rtl::OUString Str) const 158cdf0e10cSrcweir { 159cdf0e10cSrcweir return (size_t)Str.hashCode(); 160cdf0e10cSrcweir } 161cdf0e10cSrcweir }; 162cdf0e10cSrcweir 163cdf0e10cSrcweir struct eqName_Impl 164cdf0e10cSrcweir { 165cdf0e10cSrcweir sal_Bool operator()(const ::rtl::OUString Str1, const ::rtl::OUString Str2) const 166cdf0e10cSrcweir { 167cdf0e10cSrcweir return ( Str1 == Str2 ); 168cdf0e10cSrcweir } 169cdf0e10cSrcweir }; 170cdf0e10cSrcweir 171cdf0e10cSrcweir typedef std::hash_map 172cdf0e10cSrcweir < 173cdf0e10cSrcweir ::rtl::OUString, 174cdf0e10cSrcweir sal_Int32, 175cdf0e10cSrcweir hashName_Impl, 176cdf0e10cSrcweir eqName_Impl 177cdf0e10cSrcweir > 178cdf0e10cSrcweir IntrospectionNameMap; 179cdf0e10cSrcweir 180cdf0e10cSrcweir 181cdf0e10cSrcweir // Hashtable zur Zuordnung der exakten Namen zu den zu Lower-Case 182cdf0e10cSrcweir // konvertierten Namen, dient zur Unterst�tzung von XExactName 183cdf0e10cSrcweir typedef std::hash_map 184cdf0e10cSrcweir < 185cdf0e10cSrcweir ::rtl::OUString, 186cdf0e10cSrcweir ::rtl::OUString, 187cdf0e10cSrcweir hashName_Impl, 188cdf0e10cSrcweir eqName_Impl 189cdf0e10cSrcweir > 190cdf0e10cSrcweir LowerToExactNameMap; 191cdf0e10cSrcweir 192cdf0e10cSrcweir 193cdf0e10cSrcweir class ImplIntrospectionAccess; 194cdf0e10cSrcweir class IntrospectionAccessStatic_Impl 195cdf0e10cSrcweir { 196cdf0e10cSrcweir friend class ImplIntrospection; 197cdf0e10cSrcweir friend class ImplIntrospectionAccess; 198cdf0e10cSrcweir 199cdf0e10cSrcweir // CoreReflection halten 200cdf0e10cSrcweir Reference< XIdlReflection > mxCoreReflection; 201cdf0e10cSrcweir 202cdf0e10cSrcweir // InterfaceSequences, um Zusatz-Infos zu einer Property speichern zu koennen. 203cdf0e10cSrcweir // z.B. das Field bei MAP_FIELD, die get/set-Methoden bei MAP_GETSET usw. 204cdf0e10cSrcweir Sequence< Reference<XInterface> > aInterfaceSeq1; 205cdf0e10cSrcweir Sequence< Reference<XInterface> > aInterfaceSeq2; 206cdf0e10cSrcweir 207cdf0e10cSrcweir // Hashtables fuer die Namen 208cdf0e10cSrcweir IntrospectionNameMap maPropertyNameMap; 209cdf0e10cSrcweir IntrospectionNameMap maMethodNameMap; 210cdf0e10cSrcweir LowerToExactNameMap maLowerToExactNameMap; 211cdf0e10cSrcweir 212cdf0e10cSrcweir // Sequence aller Properties, auch zum Liefern aus getProperties() 213cdf0e10cSrcweir Sequence<Property> maAllPropertySeq; 214cdf0e10cSrcweir 215cdf0e10cSrcweir // Mapping der Properties auf Zugriffs-Arten 216cdf0e10cSrcweir Sequence<sal_Int16> maMapTypeSeq; 217cdf0e10cSrcweir 218cdf0e10cSrcweir // Klassifizierung der gefundenen Methoden 219cdf0e10cSrcweir Sequence<sal_Int32> maPropertyConceptSeq; 220cdf0e10cSrcweir 221cdf0e10cSrcweir // Anzahl der Properties 222cdf0e10cSrcweir sal_Int32 mnPropCount; 223cdf0e10cSrcweir 224cdf0e10cSrcweir // Anzahl der Properties, die den jeweiligen Konzepten zugeordnet sind 225cdf0e10cSrcweir //sal_Int32 mnDangerousPropCount; 226cdf0e10cSrcweir sal_Int32 mnPropertySetPropCount; 227cdf0e10cSrcweir sal_Int32 mnAttributePropCount; 228cdf0e10cSrcweir sal_Int32 mnMethodPropCount; 229cdf0e10cSrcweir 230cdf0e10cSrcweir // Flag, ob ein FastPropertySet unterstuetzt wird 231cdf0e10cSrcweir sal_Bool mbFastPropSet; 232cdf0e10cSrcweir 233cdf0e10cSrcweir // Original-Handles eines FastPropertySets 234cdf0e10cSrcweir sal_Int32* mpOrgPropertyHandleArray; 235cdf0e10cSrcweir 236cdf0e10cSrcweir // MethodSequence, die alle Methoden aufnimmt 237cdf0e10cSrcweir Sequence< Reference<XIdlMethod> > maAllMethodSeq; 238cdf0e10cSrcweir 239cdf0e10cSrcweir // Klassifizierung der gefundenen Methoden 240cdf0e10cSrcweir Sequence<sal_Int32> maMethodConceptSeq; 241cdf0e10cSrcweir 242cdf0e10cSrcweir // Anzahl der Methoden 243cdf0e10cSrcweir sal_Int32 mnMethCount; 244cdf0e10cSrcweir 245cdf0e10cSrcweir // Sequence der Listener, die angemeldet werden koennen 246cdf0e10cSrcweir Sequence< Type > maSupportedListenerSeq; 247cdf0e10cSrcweir 248cdf0e10cSrcweir // BaseInit (soll spaeter in der Applikation erfolgen!) 249cdf0e10cSrcweir void BaseInit( void ); 250cdf0e10cSrcweir 251cdf0e10cSrcweir // Hilfs-Methoden zur Groessen-Anpassung der Sequences 252cdf0e10cSrcweir void checkPropertyArraysSize 253cdf0e10cSrcweir ( 254cdf0e10cSrcweir Property*& rpAllPropArray, 255cdf0e10cSrcweir sal_Int16*& rpMapTypeArray, 256cdf0e10cSrcweir sal_Int32*& rpPropertyConceptArray, 257cdf0e10cSrcweir sal_Int32 iNextIndex 258cdf0e10cSrcweir ); 259cdf0e10cSrcweir void checkInterfaceArraySize( Sequence< Reference<XInterface> >& rSeq, Reference<XInterface>*& rpInterfaceArray, 260cdf0e10cSrcweir sal_Int32 iNextIndex ); 261cdf0e10cSrcweir 262cdf0e10cSrcweir // RefCount 263cdf0e10cSrcweir sal_Int32 nRefCount; 264cdf0e10cSrcweir 265cdf0e10cSrcweir 266cdf0e10cSrcweir public: 267cdf0e10cSrcweir IntrospectionAccessStatic_Impl( Reference< XIdlReflection > xCoreReflection_ ); 268cdf0e10cSrcweir ~IntrospectionAccessStatic_Impl() 269cdf0e10cSrcweir { 270cdf0e10cSrcweir delete[] mpOrgPropertyHandleArray; 271cdf0e10cSrcweir } 272cdf0e10cSrcweir sal_Int32 getPropertyIndex( const ::rtl::OUString& aPropertyName ) const; 273cdf0e10cSrcweir sal_Int32 getMethodIndex( const ::rtl::OUString& aMethodName ) const; 274cdf0e10cSrcweir 275cdf0e10cSrcweir void acquire() { nRefCount++; } 276cdf0e10cSrcweir void release() 277cdf0e10cSrcweir { 278cdf0e10cSrcweir nRefCount--; 279cdf0e10cSrcweir if( nRefCount <= 0 ) 280cdf0e10cSrcweir delete this; 281cdf0e10cSrcweir } 282cdf0e10cSrcweir 283cdf0e10cSrcweir // Methoden von XIntrospectionAccess (ALT, jetzt nur Impl) 284cdf0e10cSrcweir void setPropertyValue(const Any& obj, const ::rtl::OUString& aPropertyName, const Any& aValue) const; 285cdf0e10cSrcweir // void setPropertyValue(Any& obj, const ::rtl::OUString& aPropertyName, const Any& aValue) const; 286cdf0e10cSrcweir Any getPropertyValue(const Any& obj, const ::rtl::OUString& aPropertyName) const; 287cdf0e10cSrcweir void setPropertyValueByIndex(const Any& obj, sal_Int32 nIndex, const Any& aValue) const; 288cdf0e10cSrcweir // void setPropertyValueByIndex(Any& obj, sal_Int32 nIndex, const Any& aValue) const; 289cdf0e10cSrcweir Any getPropertyValueByIndex(const Any& obj, sal_Int32 nIndex) const; 290cdf0e10cSrcweir 291cdf0e10cSrcweir Sequence<Property> getProperties(void) const { return maAllPropertySeq; } 292cdf0e10cSrcweir Sequence< Reference<XIdlMethod> > getMethods(void) const { return maAllMethodSeq; } 293cdf0e10cSrcweir Sequence< Type > getSupportedListeners(void) const { return maSupportedListenerSeq; } 294cdf0e10cSrcweir Sequence<sal_Int32> getPropertyConcepts(void) const { return maPropertyConceptSeq; } 295cdf0e10cSrcweir Sequence<sal_Int32> getMethodConcepts(void) const { return maMethodConceptSeq; } 296cdf0e10cSrcweir }; 297cdf0e10cSrcweir 298cdf0e10cSrcweir 299cdf0e10cSrcweir // Ctor 300cdf0e10cSrcweir IntrospectionAccessStatic_Impl::IntrospectionAccessStatic_Impl( Reference< XIdlReflection > xCoreReflection_ ) 301cdf0e10cSrcweir : mxCoreReflection( xCoreReflection_ ) 302cdf0e10cSrcweir { 303cdf0e10cSrcweir aInterfaceSeq1.realloc( ARRAY_SIZE_STEP ); 304cdf0e10cSrcweir aInterfaceSeq2.realloc( ARRAY_SIZE_STEP ); 305cdf0e10cSrcweir 306cdf0e10cSrcweir // Property-Daten 307cdf0e10cSrcweir maAllPropertySeq.realloc( ARRAY_SIZE_STEP ); 308cdf0e10cSrcweir maMapTypeSeq.realloc( ARRAY_SIZE_STEP ); 309cdf0e10cSrcweir maPropertyConceptSeq.realloc( ARRAY_SIZE_STEP ); 310cdf0e10cSrcweir 311cdf0e10cSrcweir mbFastPropSet = sal_False; 312cdf0e10cSrcweir mpOrgPropertyHandleArray = NULL; 313cdf0e10cSrcweir 314cdf0e10cSrcweir mnPropCount = 0; 315cdf0e10cSrcweir //mnDangerousPropCount = 0; 316cdf0e10cSrcweir mnPropertySetPropCount = 0; 317cdf0e10cSrcweir mnAttributePropCount = 0; 318cdf0e10cSrcweir mnMethodPropCount = 0; 319cdf0e10cSrcweir 320cdf0e10cSrcweir // Method-Daten 321cdf0e10cSrcweir mnMethCount = 0; 322cdf0e10cSrcweir 323cdf0e10cSrcweir // Eigenens RefCounting 324cdf0e10cSrcweir nRefCount = 0; 325cdf0e10cSrcweir } 326cdf0e10cSrcweir 327cdf0e10cSrcweir // Von Hand refcounten !!! 328cdf0e10cSrcweir 329cdf0e10cSrcweir 330cdf0e10cSrcweir sal_Int32 IntrospectionAccessStatic_Impl::getPropertyIndex( const ::rtl::OUString& aPropertyName ) const 331cdf0e10cSrcweir { 332cdf0e10cSrcweir sal_Int32 iHashResult = -1; 333cdf0e10cSrcweir IntrospectionAccessStatic_Impl* pThis = (IntrospectionAccessStatic_Impl*)this; 334cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = pThis->maPropertyNameMap.find( aPropertyName ); 335cdf0e10cSrcweir if( !( aIt == pThis->maPropertyNameMap.end() ) ) 336cdf0e10cSrcweir iHashResult = (*aIt).second; 337cdf0e10cSrcweir return iHashResult; 338cdf0e10cSrcweir } 339cdf0e10cSrcweir 340cdf0e10cSrcweir sal_Int32 IntrospectionAccessStatic_Impl::getMethodIndex( const ::rtl::OUString& aMethodName ) const 341cdf0e10cSrcweir { 342cdf0e10cSrcweir sal_Int32 iHashResult = -1; 343cdf0e10cSrcweir IntrospectionAccessStatic_Impl* pThis = (IntrospectionAccessStatic_Impl*)this; 344cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = pThis->maMethodNameMap.find( aMethodName ); 345cdf0e10cSrcweir if( !( aIt == pThis->maMethodNameMap.end() ) ) 346cdf0e10cSrcweir { 347cdf0e10cSrcweir iHashResult = (*aIt).second; 348cdf0e10cSrcweir } 349cdf0e10cSrcweir // #95159 Check if full qualified name matches 350cdf0e10cSrcweir else 351cdf0e10cSrcweir { 352cdf0e10cSrcweir sal_Int32 nSearchFrom = aMethodName.getLength(); 353cdf0e10cSrcweir nSearchFrom = aMethodName.getLength(); 354cdf0e10cSrcweir while( true ) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir // Strategy: Search back until the first '_' is found 357cdf0e10cSrcweir sal_Int32 nFound = aMethodName.lastIndexOf( '_', nSearchFrom ); 358cdf0e10cSrcweir if( nFound == -1 ) 359cdf0e10cSrcweir break; 360cdf0e10cSrcweir 361cdf0e10cSrcweir ::rtl::OUString aPureMethodName = aMethodName.copy( nFound + 1 ); 362cdf0e10cSrcweir 363cdf0e10cSrcweir aIt = pThis->maMethodNameMap.find( aPureMethodName ); 364cdf0e10cSrcweir if( !( aIt == pThis->maMethodNameMap.end() ) ) 365cdf0e10cSrcweir { 366cdf0e10cSrcweir // Check if it can be a type? 367cdf0e10cSrcweir // Problem: Does not work if package names contain _ ?! 368cdf0e10cSrcweir ::rtl::OUString aStr = aMethodName.copy( 0, nFound ); 369cdf0e10cSrcweir ::rtl::OUString aTypeName = aStr.replace( '_', '.' ); 370cdf0e10cSrcweir Reference< XIdlClass > xClass = mxCoreReflection->forName( aTypeName ); 371cdf0e10cSrcweir if( xClass.is() ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir // If this is a valid class it could be the right method 374cdf0e10cSrcweir 375cdf0e10cSrcweir // Could be the right method, type has to be checked 376cdf0e10cSrcweir iHashResult = (*aIt).second; 377cdf0e10cSrcweir 378cdf0e10cSrcweir const Reference<XIdlMethod>* pMethods = maAllMethodSeq.getConstArray(); 379cdf0e10cSrcweir const Reference<XIdlMethod> xMethod = pMethods[ iHashResult ]; 380cdf0e10cSrcweir 381cdf0e10cSrcweir Reference< XIdlClass > xMethClass = xMethod->getDeclaringClass(); 382cdf0e10cSrcweir if( xClass->equals( xMethClass ) ) 383cdf0e10cSrcweir { 384cdf0e10cSrcweir break; 385cdf0e10cSrcweir } 386cdf0e10cSrcweir else 387cdf0e10cSrcweir { 388cdf0e10cSrcweir iHashResult = -1; 389cdf0e10cSrcweir 390cdf0e10cSrcweir // Could also be another method with the same name 391cdf0e10cSrcweir // Iterate over all methods 392cdf0e10cSrcweir sal_Int32 nLen = maAllMethodSeq.getLength(); 393cdf0e10cSrcweir for( int i = 0 ; i < nLen ; ++i ) 394cdf0e10cSrcweir { 395cdf0e10cSrcweir const Reference<XIdlMethod> xMethod2 = pMethods[ i ]; 396cdf0e10cSrcweir 397cdf0e10cSrcweir ::rtl::OUString aTestClassName = xMethod2->getDeclaringClass()->getName(); 398cdf0e10cSrcweir ::rtl::OUString aTestMethodName = xMethod2->getName(); 399cdf0e10cSrcweir 400cdf0e10cSrcweir if( xMethod2->getName() == aPureMethodName ) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir Reference< XIdlClass > xMethClass2 = xMethod2->getDeclaringClass(); 403cdf0e10cSrcweir 404cdf0e10cSrcweir if( xClass->equals( xMethClass2 ) ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir iHashResult = i; 407cdf0e10cSrcweir break; 408cdf0e10cSrcweir } 409cdf0e10cSrcweir } 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir if( iHashResult != -1 ) 413cdf0e10cSrcweir break; 414cdf0e10cSrcweir } 415cdf0e10cSrcweir } 416cdf0e10cSrcweir } 417cdf0e10cSrcweir 418cdf0e10cSrcweir nSearchFrom = nFound - 1; 419cdf0e10cSrcweir if( nSearchFrom < 0 ) 420cdf0e10cSrcweir break; 421cdf0e10cSrcweir } 422cdf0e10cSrcweir } 423cdf0e10cSrcweir return iHashResult; 424cdf0e10cSrcweir } 425cdf0e10cSrcweir 426cdf0e10cSrcweir void IntrospectionAccessStatic_Impl::setPropertyValue( const Any& obj, const ::rtl::OUString& aPropertyName, const Any& aValue ) const 427cdf0e10cSrcweir //void IntrospectionAccessStatic_Impl::setPropertyValue( Any& obj, const ::rtl::OUString& aPropertyName, const Any& aValue ) const 428cdf0e10cSrcweir { 429cdf0e10cSrcweir sal_Int32 i = getPropertyIndex( aPropertyName ); 430cdf0e10cSrcweir if( i != -1 ) 431cdf0e10cSrcweir setPropertyValueByIndex( obj, (sal_Int32)i, aValue ); 432cdf0e10cSrcweir else 433cdf0e10cSrcweir throw UnknownPropertyException(); 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir void IntrospectionAccessStatic_Impl::setPropertyValueByIndex(const Any& obj, sal_Int32 nSequenceIndex, const Any& aValue) const 437cdf0e10cSrcweir //void IntrospectionAccessStatic_Impl::setPropertyValueByIndex( Any& obj, sal_Int32 nSequenceIndex, const Any& aValue) const 438cdf0e10cSrcweir { 439cdf0e10cSrcweir // Handelt es sich bei dem uebergebenen Objekt ueberhaupt um was passendes? 440cdf0e10cSrcweir TypeClass eObjType = obj.getValueType().getTypeClass(); 441cdf0e10cSrcweir 442cdf0e10cSrcweir Reference<XInterface> xInterface; 443cdf0e10cSrcweir if( eObjType == TypeClass_INTERFACE ) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir xInterface = *( Reference<XInterface>*)obj.getValue(); 446cdf0e10cSrcweir } 447cdf0e10cSrcweir else if( nSequenceIndex >= mnPropCount || ( eObjType != TypeClass_STRUCT && eObjType != TypeClass_EXCEPTION ) ) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir throw IllegalArgumentException(); 450cdf0e10cSrcweir } 451cdf0e10cSrcweir 452cdf0e10cSrcweir // Flags pruefen 453cdf0e10cSrcweir const Property* pProps = maAllPropertySeq.getConstArray(); 454cdf0e10cSrcweir if( (pProps[ nSequenceIndex ].Attributes & READONLY) != 0 ) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir throw UnknownPropertyException(); 457cdf0e10cSrcweir } 458cdf0e10cSrcweir 459cdf0e10cSrcweir const sal_Int16* pMapTypeArray = maMapTypeSeq.getConstArray(); 460cdf0e10cSrcweir switch( pMapTypeArray[ nSequenceIndex ] ) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir case MAP_PROPERTY_SET: 463cdf0e10cSrcweir { 464cdf0e10cSrcweir // Property besorgen 465cdf0e10cSrcweir const Property& rProp = maAllPropertySeq.getConstArray()[ nSequenceIndex ]; 466cdf0e10cSrcweir 467cdf0e10cSrcweir // Interface-Parameter auf den richtigen Typ bringen 468cdf0e10cSrcweir sal_Bool bUseCopy = sal_False; 469cdf0e10cSrcweir Any aRealValue; 470cdf0e10cSrcweir 471cdf0e10cSrcweir TypeClass eValType = aValue.getValueType().getTypeClass(); 472cdf0e10cSrcweir if( eValType == TypeClass_INTERFACE ) 473cdf0e10cSrcweir { 474cdf0e10cSrcweir Type aPropType = rProp.Type; 475cdf0e10cSrcweir ::rtl::OUString aTypeName( aPropType.getTypeName() ); 476cdf0e10cSrcweir Reference< XIdlClass > xPropClass = mxCoreReflection->forName( aTypeName ); 477cdf0e10cSrcweir //Reference<XIdlClass> xPropClass = rProp.Type; 478cdf0e10cSrcweir if( xPropClass.is() && xPropClass->getTypeClass() == TypeClass_INTERFACE ) 479cdf0e10cSrcweir { 480cdf0e10cSrcweir Reference<XInterface> valInterface = *(Reference<XInterface>*)aValue.getValue(); 481cdf0e10cSrcweir if( valInterface.is() ) 482cdf0e10cSrcweir { 483cdf0e10cSrcweir //Any queryInterface( const Type& rType ); 484cdf0e10cSrcweir aRealValue = valInterface->queryInterface( aPropType ); 485cdf0e10cSrcweir if( aRealValue.hasValue() ) 486cdf0e10cSrcweir bUseCopy = sal_True; 487cdf0e10cSrcweir } 488cdf0e10cSrcweir } 489cdf0e10cSrcweir } 490cdf0e10cSrcweir 491cdf0e10cSrcweir // Haben wir ein FastPropertySet und ein gueltiges Handle? 492cdf0e10cSrcweir // ACHTUNG: An dieser Stelle wird ausgenutzt, dass das PropertySet 493cdf0e10cSrcweir // zu Beginn des Introspection-Vorgangs abgefragt wird. 494cdf0e10cSrcweir sal_Int32 nOrgHandle; 495cdf0e10cSrcweir if( mbFastPropSet && ( nOrgHandle = mpOrgPropertyHandleArray[ nSequenceIndex ] ) != -1 ) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir // PropertySet-Interface holen 498cdf0e10cSrcweir Reference<XFastPropertySet> xFastPropSet = 499cdf0e10cSrcweir Reference<XFastPropertySet>::query( xInterface ); 500cdf0e10cSrcweir if( xFastPropSet.is() ) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir xFastPropSet->setFastPropertyValue( nOrgHandle, bUseCopy ? aRealValue : aValue ); 503cdf0e10cSrcweir } 504cdf0e10cSrcweir else 505cdf0e10cSrcweir { 506cdf0e10cSrcweir // throw UnknownPropertyException 507cdf0e10cSrcweir } 508cdf0e10cSrcweir } 509cdf0e10cSrcweir // sonst eben das normale nehmen 510cdf0e10cSrcweir else 511cdf0e10cSrcweir { 512cdf0e10cSrcweir // PropertySet-Interface holen 513cdf0e10cSrcweir Reference<XPropertySet> xPropSet = 514cdf0e10cSrcweir Reference<XPropertySet>::query( xInterface ); 515cdf0e10cSrcweir if( xPropSet.is() ) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir xPropSet->setPropertyValue( rProp.Name, bUseCopy ? aRealValue : aValue ); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir else 520cdf0e10cSrcweir { 521cdf0e10cSrcweir // throw UnknownPropertyException 522cdf0e10cSrcweir } 523cdf0e10cSrcweir } 524cdf0e10cSrcweir } 525cdf0e10cSrcweir break; 526cdf0e10cSrcweir 527cdf0e10cSrcweir case MAP_FIELD: 528cdf0e10cSrcweir { 529cdf0e10cSrcweir Reference<XIdlField> xField = (XIdlField*)(aInterfaceSeq1.getConstArray()[ nSequenceIndex ].get()); 530cdf0e10cSrcweir Reference<XIdlField2> xField2(xField, UNO_QUERY); 531cdf0e10cSrcweir if( xField2.is() ) 532cdf0e10cSrcweir { 533cdf0e10cSrcweir xField2->set( (Any&)obj, aValue ); 534cdf0e10cSrcweir // IllegalArgumentException 535cdf0e10cSrcweir // NullPointerException 536cdf0e10cSrcweir } else 537cdf0e10cSrcweir if( xField.is() ) 538cdf0e10cSrcweir { 539cdf0e10cSrcweir xField->set( obj, aValue ); 540cdf0e10cSrcweir // IllegalArgumentException 541cdf0e10cSrcweir // NullPointerException 542cdf0e10cSrcweir } 543cdf0e10cSrcweir else 544cdf0e10cSrcweir { 545cdf0e10cSrcweir // throw IllegalArgumentException(); 546cdf0e10cSrcweir } 547cdf0e10cSrcweir } 548cdf0e10cSrcweir break; 549cdf0e10cSrcweir 550cdf0e10cSrcweir case MAP_GETSET: 551cdf0e10cSrcweir case MAP_SETONLY: 552cdf0e10cSrcweir { 553cdf0e10cSrcweir // set-Methode holen 554cdf0e10cSrcweir Reference<XIdlMethod> xMethod = (XIdlMethod*)(aInterfaceSeq2.getConstArray()[ nSequenceIndex ].get()); 555cdf0e10cSrcweir if( xMethod.is() ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir Sequence<Any> args( 1 ); 558cdf0e10cSrcweir args.getArray()[0] = aValue; 559cdf0e10cSrcweir xMethod->invoke( obj, args ); 560cdf0e10cSrcweir } 561cdf0e10cSrcweir else 562cdf0e10cSrcweir { 563cdf0e10cSrcweir // throw IllegalArgumentException(); 564cdf0e10cSrcweir } 565cdf0e10cSrcweir } 566cdf0e10cSrcweir break; 567cdf0e10cSrcweir } 568cdf0e10cSrcweir } 569cdf0e10cSrcweir 570cdf0e10cSrcweir Any IntrospectionAccessStatic_Impl::getPropertyValue( const Any& obj, const ::rtl::OUString& aPropertyName ) const 571cdf0e10cSrcweir { 572cdf0e10cSrcweir sal_Int32 i = getPropertyIndex( aPropertyName ); 573cdf0e10cSrcweir if( i != -1 ) 574cdf0e10cSrcweir return getPropertyValueByIndex( obj, i ); 575cdf0e10cSrcweir 576cdf0e10cSrcweir throw UnknownPropertyException(); 577cdf0e10cSrcweir } 578cdf0e10cSrcweir 579cdf0e10cSrcweir Any IntrospectionAccessStatic_Impl::getPropertyValueByIndex(const Any& obj, sal_Int32 nSequenceIndex) const 580cdf0e10cSrcweir { 581cdf0e10cSrcweir Any aRet; 582cdf0e10cSrcweir 583cdf0e10cSrcweir // Handelt es sich bei dem uebergebenen Objekt ueberhaupt um was passendes? 584cdf0e10cSrcweir TypeClass eObjType = obj.getValueType().getTypeClass(); 585cdf0e10cSrcweir 586cdf0e10cSrcweir Reference<XInterface> xInterface; 587cdf0e10cSrcweir if( eObjType == TypeClass_INTERFACE ) 588cdf0e10cSrcweir { 589cdf0e10cSrcweir xInterface = *(Reference<XInterface>*)obj.getValue(); 590cdf0e10cSrcweir } 591cdf0e10cSrcweir else if( nSequenceIndex >= mnPropCount || ( eObjType != TypeClass_STRUCT && eObjType != TypeClass_EXCEPTION ) ) 592cdf0e10cSrcweir { 593cdf0e10cSrcweir // throw IllegalArgumentException(); 594cdf0e10cSrcweir return aRet; 595cdf0e10cSrcweir } 596cdf0e10cSrcweir 597cdf0e10cSrcweir const sal_Int16* pMapTypeArray = maMapTypeSeq.getConstArray(); 598cdf0e10cSrcweir switch( pMapTypeArray[ nSequenceIndex ] ) 599cdf0e10cSrcweir { 600cdf0e10cSrcweir case MAP_PROPERTY_SET: 601cdf0e10cSrcweir { 602cdf0e10cSrcweir // Property besorgen 603cdf0e10cSrcweir const Property& rProp = maAllPropertySeq.getConstArray()[ nSequenceIndex ]; 604cdf0e10cSrcweir 605cdf0e10cSrcweir // Haben wir ein FastPropertySet und ein gueltiges Handle? 606cdf0e10cSrcweir // ACHTUNG: An dieser Stelle wird ausgenutzt, dass das PropertySet 607cdf0e10cSrcweir // zu Beginn des Introspection-Vorgangs abgefragt wird. 608cdf0e10cSrcweir sal_Int32 nOrgHandle; 609cdf0e10cSrcweir if( mbFastPropSet && ( nOrgHandle = mpOrgPropertyHandleArray[ nSequenceIndex ] ) != -1 ) 610cdf0e10cSrcweir { 611cdf0e10cSrcweir // PropertySet-Interface holen 612cdf0e10cSrcweir Reference<XFastPropertySet> xFastPropSet = 613cdf0e10cSrcweir Reference<XFastPropertySet>::query( xInterface ); 614cdf0e10cSrcweir if( xFastPropSet.is() ) 615cdf0e10cSrcweir { 616cdf0e10cSrcweir aRet = xFastPropSet->getFastPropertyValue( nOrgHandle); 617cdf0e10cSrcweir } 618cdf0e10cSrcweir else 619cdf0e10cSrcweir { 620cdf0e10cSrcweir // throw UnknownPropertyException 621cdf0e10cSrcweir return aRet; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir } 624cdf0e10cSrcweir // sonst eben das normale nehmen 625cdf0e10cSrcweir else 626cdf0e10cSrcweir { 627cdf0e10cSrcweir // PropertySet-Interface holen 628cdf0e10cSrcweir Reference<XPropertySet> xPropSet = 629cdf0e10cSrcweir Reference<XPropertySet>::query( xInterface ); 630cdf0e10cSrcweir if( xPropSet.is() ) 631cdf0e10cSrcweir { 632cdf0e10cSrcweir aRet = xPropSet->getPropertyValue( rProp.Name ); 633cdf0e10cSrcweir } 634cdf0e10cSrcweir else 635cdf0e10cSrcweir { 636cdf0e10cSrcweir // throw UnknownPropertyException 637cdf0e10cSrcweir return aRet; 638cdf0e10cSrcweir } 639cdf0e10cSrcweir } 640cdf0e10cSrcweir } 641cdf0e10cSrcweir break; 642cdf0e10cSrcweir 643cdf0e10cSrcweir case MAP_FIELD: 644cdf0e10cSrcweir { 645cdf0e10cSrcweir Reference<XIdlField> xField = (XIdlField*)(aInterfaceSeq1.getConstArray()[ nSequenceIndex ].get()); 646cdf0e10cSrcweir if( xField.is() ) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir aRet = xField->get( obj ); 649cdf0e10cSrcweir // IllegalArgumentException 650cdf0e10cSrcweir // NullPointerException 651cdf0e10cSrcweir } 652cdf0e10cSrcweir else 653cdf0e10cSrcweir { 654cdf0e10cSrcweir // throw IllegalArgumentException(); 655cdf0e10cSrcweir return aRet; 656cdf0e10cSrcweir } 657cdf0e10cSrcweir } 658cdf0e10cSrcweir break; 659cdf0e10cSrcweir 660cdf0e10cSrcweir case MAP_GETSET: 661cdf0e10cSrcweir { 662cdf0e10cSrcweir // get-Methode holen 663cdf0e10cSrcweir Reference<XIdlMethod> xMethod = (XIdlMethod*)(aInterfaceSeq1.getConstArray()[ nSequenceIndex ].get()); 664cdf0e10cSrcweir if( xMethod.is() ) 665cdf0e10cSrcweir { 666cdf0e10cSrcweir Sequence<Any> args; 667cdf0e10cSrcweir aRet = xMethod->invoke( obj, args ); 668cdf0e10cSrcweir } 669cdf0e10cSrcweir else 670cdf0e10cSrcweir { 671cdf0e10cSrcweir // throw IllegalArgumentException(); 672cdf0e10cSrcweir return aRet; 673cdf0e10cSrcweir } 674cdf0e10cSrcweir } 675cdf0e10cSrcweir break; 676cdf0e10cSrcweir 677cdf0e10cSrcweir case MAP_SETONLY: 678cdf0e10cSrcweir // get-Methode gibt es nicht 679cdf0e10cSrcweir // throw WriteOnlyPropertyException(); 680cdf0e10cSrcweir return aRet; 681cdf0e10cSrcweir } 682cdf0e10cSrcweir return aRet; 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir 686cdf0e10cSrcweir // Hilfs-Methoden zur Groessen-Anpassung der Sequences 687cdf0e10cSrcweir void IntrospectionAccessStatic_Impl::checkPropertyArraysSize 688cdf0e10cSrcweir ( 689cdf0e10cSrcweir Property*& rpAllPropArray, 690cdf0e10cSrcweir sal_Int16*& rpMapTypeArray, 691cdf0e10cSrcweir sal_Int32*& rpPropertyConceptArray, 692cdf0e10cSrcweir sal_Int32 iNextIndex 693cdf0e10cSrcweir ) 694cdf0e10cSrcweir { 695cdf0e10cSrcweir sal_Int32 nLen = maAllPropertySeq.getLength(); 696cdf0e10cSrcweir if( iNextIndex >= nLen ) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir maAllPropertySeq.realloc( nLen + ARRAY_SIZE_STEP ); 699cdf0e10cSrcweir rpAllPropArray = maAllPropertySeq.getArray(); 700cdf0e10cSrcweir 701cdf0e10cSrcweir maMapTypeSeq.realloc( nLen + ARRAY_SIZE_STEP ); 702cdf0e10cSrcweir rpMapTypeArray = maMapTypeSeq.getArray(); 703cdf0e10cSrcweir 704cdf0e10cSrcweir maPropertyConceptSeq.realloc( nLen + ARRAY_SIZE_STEP ); 705cdf0e10cSrcweir rpPropertyConceptArray = maPropertyConceptSeq.getArray(); 706cdf0e10cSrcweir } 707cdf0e10cSrcweir } 708cdf0e10cSrcweir 709cdf0e10cSrcweir void IntrospectionAccessStatic_Impl::checkInterfaceArraySize( Sequence< Reference<XInterface> >& rSeq, 710cdf0e10cSrcweir Reference<XInterface>*& rpInterfaceArray, sal_Int32 iNextIndex ) 711cdf0e10cSrcweir { 712cdf0e10cSrcweir sal_Int32 nLen = rSeq.getLength(); 713cdf0e10cSrcweir if( iNextIndex >= nLen ) 714cdf0e10cSrcweir { 715cdf0e10cSrcweir // Neue Groesse mit ARRAY_SIZE_STEP abgleichen 716cdf0e10cSrcweir sal_Int32 nMissingSize = iNextIndex - nLen + 1; 717cdf0e10cSrcweir sal_Int32 nSteps = nMissingSize / ARRAY_SIZE_STEP + 1; 718cdf0e10cSrcweir sal_Int32 nNewSize = nLen + nSteps * ARRAY_SIZE_STEP; 719cdf0e10cSrcweir 720cdf0e10cSrcweir rSeq.realloc( nNewSize ); 721cdf0e10cSrcweir rpInterfaceArray = rSeq.getArray(); 722cdf0e10cSrcweir } 723cdf0e10cSrcweir } 724cdf0e10cSrcweir 725cdf0e10cSrcweir 726cdf0e10cSrcweir //******************************* 727cdf0e10cSrcweir //*** ImplIntrospectionAccess *** 728cdf0e10cSrcweir //******************************* 729cdf0e10cSrcweir 730cdf0e10cSrcweir // Neue Impl-Klasse im Rahmen der Introspection-Umstellung auf Instanz-gebundene 731cdf0e10cSrcweir // Introspection mit Property-Zugriff ueber XPropertySet. Die alte Klasse 732cdf0e10cSrcweir // ImplIntrospectionAccess lebt als IntrospectionAccessStatic_Impl 733cdf0e10cSrcweir class ImplIntrospectionAccess : public IntrospectionAccessHelper 734cdf0e10cSrcweir { 735cdf0e10cSrcweir friend class ImplIntrospection; 736cdf0e10cSrcweir 737cdf0e10cSrcweir // Untersuchtes Objekt 738cdf0e10cSrcweir Any maInspectedObject; 739cdf0e10cSrcweir 740cdf0e10cSrcweir // Als Interface 741cdf0e10cSrcweir Reference<XInterface> mxIface; 742cdf0e10cSrcweir 743cdf0e10cSrcweir // Statische Daten der Introspection 744cdf0e10cSrcweir IntrospectionAccessStatic_Impl* mpStaticImpl; 745cdf0e10cSrcweir 746cdf0e10cSrcweir // Adapter-Implementation 747cdf0e10cSrcweir WeakReference< XInterface > maAdapter; 748cdf0e10cSrcweir 749cdf0e10cSrcweir // Letzte Sequence, die bei getProperties geliefert wurde (Optimierung) 750cdf0e10cSrcweir Sequence<Property> maLastPropertySeq; 751cdf0e10cSrcweir sal_Int32 mnLastPropertyConcept; 752cdf0e10cSrcweir 753cdf0e10cSrcweir // Letzte Sequence, die bei getMethods geliefert wurde (Optimierung) 754cdf0e10cSrcweir Sequence<Reference<XIdlMethod> > maLastMethodSeq; 755cdf0e10cSrcweir sal_Int32 mnLastMethodConcept; 756cdf0e10cSrcweir 757cdf0e10cSrcweir public: 758cdf0e10cSrcweir ImplIntrospectionAccess( const Any& obj, IntrospectionAccessStatic_Impl* pStaticImpl_ ); 759cdf0e10cSrcweir ~ImplIntrospectionAccess(); 760cdf0e10cSrcweir 761cdf0e10cSrcweir // Methoden von XIntrospectionAccess 762cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getSuppliedMethodConcepts(void) 763cdf0e10cSrcweir throw( RuntimeException ); 764cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getSuppliedPropertyConcepts(void) 765cdf0e10cSrcweir throw( RuntimeException ); 766cdf0e10cSrcweir virtual Property SAL_CALL getProperty(const ::rtl::OUString& Name, sal_Int32 PropertyConcepts) 767cdf0e10cSrcweir throw( NoSuchElementException, RuntimeException ); 768cdf0e10cSrcweir virtual sal_Bool SAL_CALL hasProperty(const ::rtl::OUString& Name, sal_Int32 PropertyConcepts) 769cdf0e10cSrcweir throw( RuntimeException ); 770cdf0e10cSrcweir virtual Sequence< Property > SAL_CALL getProperties(sal_Int32 PropertyConcepts) 771cdf0e10cSrcweir throw( RuntimeException ); 772cdf0e10cSrcweir virtual Reference<XIdlMethod> SAL_CALL getMethod(const ::rtl::OUString& Name, sal_Int32 MethodConcepts) 773cdf0e10cSrcweir throw( NoSuchMethodException, RuntimeException ); 774cdf0e10cSrcweir virtual sal_Bool SAL_CALL hasMethod(const ::rtl::OUString& Name, sal_Int32 MethodConcepts) 775cdf0e10cSrcweir throw( RuntimeException ); 776cdf0e10cSrcweir virtual Sequence< Reference<XIdlMethod> > SAL_CALL getMethods(sal_Int32 MethodConcepts) 777cdf0e10cSrcweir throw( RuntimeException ); 778cdf0e10cSrcweir virtual Sequence< Type > SAL_CALL getSupportedListeners(void) 779cdf0e10cSrcweir throw( RuntimeException ); 780cdf0e10cSrcweir using OWeakObject::queryAdapter; 781cdf0e10cSrcweir virtual Reference<XInterface> SAL_CALL queryAdapter( const Type& rType ) 782cdf0e10cSrcweir throw( IllegalTypeException, RuntimeException ); 783cdf0e10cSrcweir 784cdf0e10cSrcweir // Methoden von XMaterialHolder 785cdf0e10cSrcweir virtual Any SAL_CALL getMaterial(void) throw(RuntimeException); 786cdf0e10cSrcweir 787cdf0e10cSrcweir // Methoden von XExactName 788cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getExactName( const ::rtl::OUString& rApproximateName ) throw( RuntimeException ); 789cdf0e10cSrcweir }; 790cdf0e10cSrcweir 791cdf0e10cSrcweir ImplIntrospectionAccess::ImplIntrospectionAccess 792cdf0e10cSrcweir ( const Any& obj, IntrospectionAccessStatic_Impl* pStaticImpl_ ) 793cdf0e10cSrcweir : maInspectedObject( obj ), mpStaticImpl( pStaticImpl_ ), maAdapter() 794cdf0e10cSrcweir { 795cdf0e10cSrcweir mpStaticImpl->acquire(); 796cdf0e10cSrcweir 797cdf0e10cSrcweir // Objekt als Interface merken, wenn moeglich 798cdf0e10cSrcweir TypeClass eType = maInspectedObject.getValueType().getTypeClass(); 799cdf0e10cSrcweir if( eType == TypeClass_INTERFACE ) 800cdf0e10cSrcweir mxIface = *(Reference<XInterface>*)maInspectedObject.getValue(); 801cdf0e10cSrcweir 802cdf0e10cSrcweir mnLastPropertyConcept = -1; 803cdf0e10cSrcweir mnLastMethodConcept = -1; 804cdf0e10cSrcweir } 805cdf0e10cSrcweir 806cdf0e10cSrcweir ImplIntrospectionAccess::~ImplIntrospectionAccess() 807cdf0e10cSrcweir { 808cdf0e10cSrcweir mpStaticImpl->release(); 809cdf0e10cSrcweir } 810cdf0e10cSrcweir 811cdf0e10cSrcweir 812cdf0e10cSrcweir //******************************* 813cdf0e10cSrcweir //*** ImplIntrospectionAdapter *** 814cdf0e10cSrcweir //******************************* 815cdf0e10cSrcweir 816cdf0e10cSrcweir // Neue Impl-Klasse im Rahmen der Introspection-Umstellung auf Instanz-gebundene 817cdf0e10cSrcweir // Introspection mit Property-Zugriff ueber XPropertySet. Die alte Klasse 818cdf0e10cSrcweir // ImplIntrospectionAccess lebt als IntrospectionAccessStatic_Impl 819cdf0e10cSrcweir class ImplIntrospectionAdapter : 820cdf0e10cSrcweir public XPropertySet, public XFastPropertySet, public XPropertySetInfo, 821cdf0e10cSrcweir public XNameContainer, public XIndexContainer, 822cdf0e10cSrcweir public XEnumerationAccess, public XIdlArray, 823cdf0e10cSrcweir public OWeakObject 824cdf0e10cSrcweir { 825cdf0e10cSrcweir // Parent-Objekt 826cdf0e10cSrcweir ::rtl::Reference< ImplIntrospectionAccess > mpAccess; 827cdf0e10cSrcweir 828cdf0e10cSrcweir // Untersuchtes Objekt 829cdf0e10cSrcweir const Any& mrInspectedObject; 830cdf0e10cSrcweir 831cdf0e10cSrcweir // Statische Daten der Introspection 832cdf0e10cSrcweir IntrospectionAccessStatic_Impl* mpStaticImpl; 833cdf0e10cSrcweir 834cdf0e10cSrcweir // Objekt als Interface 835cdf0e10cSrcweir Reference<XInterface> mxIface; 836cdf0e10cSrcweir 837cdf0e10cSrcweir // Original-Interfaces des Objekts 838cdf0e10cSrcweir Reference<XElementAccess> mxObjElementAccess; 839cdf0e10cSrcweir Reference<XNameContainer> mxObjNameContainer; 840cdf0e10cSrcweir Reference<XNameAccess> mxObjNameAccess; 841cdf0e10cSrcweir Reference<XIndexAccess> mxObjIndexAccess; 842cdf0e10cSrcweir Reference<XIndexContainer> mxObjIndexContainer; 843cdf0e10cSrcweir Reference<XEnumerationAccess> mxObjEnumerationAccess; 844cdf0e10cSrcweir Reference<XIdlArray> mxObjIdlArray; 845cdf0e10cSrcweir 846cdf0e10cSrcweir public: 847cdf0e10cSrcweir ImplIntrospectionAdapter( ImplIntrospectionAccess* pAccess_, 848cdf0e10cSrcweir const Any& obj, IntrospectionAccessStatic_Impl* pStaticImpl_ ); 849cdf0e10cSrcweir ~ImplIntrospectionAdapter(); 850cdf0e10cSrcweir 851cdf0e10cSrcweir // Methoden von XInterface 852cdf0e10cSrcweir virtual Any SAL_CALL queryInterface( const Type& rType ) throw( RuntimeException ); 853cdf0e10cSrcweir virtual void SAL_CALL acquire() throw() { OWeakObject::acquire(); } 854cdf0e10cSrcweir virtual void SAL_CALL release() throw() { OWeakObject::release(); } 855cdf0e10cSrcweir 856cdf0e10cSrcweir // Methoden von XPropertySet 857cdf0e10cSrcweir virtual Reference<XPropertySetInfo> SAL_CALL getPropertySetInfo() throw( RuntimeException ); 858cdf0e10cSrcweir virtual void SAL_CALL setPropertyValue(const ::rtl::OUString& aPropertyName, const Any& aValue) 859cdf0e10cSrcweir throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException ); 860cdf0e10cSrcweir virtual Any SAL_CALL getPropertyValue(const ::rtl::OUString& aPropertyName) 861cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ); 862cdf0e10cSrcweir virtual void SAL_CALL addPropertyChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XPropertyChangeListener>& aListener) 863cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ); 864cdf0e10cSrcweir virtual void SAL_CALL removePropertyChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XPropertyChangeListener>& aListener) 865cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ); 866cdf0e10cSrcweir virtual void SAL_CALL addVetoableChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XVetoableChangeListener>& aListener) 867cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ); 868cdf0e10cSrcweir virtual void SAL_CALL removeVetoableChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XVetoableChangeListener>& aListener) 869cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ); 870cdf0e10cSrcweir 871cdf0e10cSrcweir // Methoden von XFastPropertySet 872cdf0e10cSrcweir virtual void SAL_CALL setFastPropertyValue(sal_Int32 nHandle, const Any& aValue) 873cdf0e10cSrcweir throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException ); 874cdf0e10cSrcweir virtual Any SAL_CALL getFastPropertyValue(sal_Int32 nHandle) 875cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ); 876cdf0e10cSrcweir 877cdf0e10cSrcweir // Methoden von XPropertySetInfo 878cdf0e10cSrcweir virtual Sequence< Property > SAL_CALL getProperties(void) throw( RuntimeException ); 879cdf0e10cSrcweir virtual Property SAL_CALL getPropertyByName(const ::rtl::OUString& Name) throw( RuntimeException ); 880cdf0e10cSrcweir virtual sal_Bool SAL_CALL hasPropertyByName(const ::rtl::OUString& Name) throw( RuntimeException ); 881cdf0e10cSrcweir 882cdf0e10cSrcweir // Methoden von XElementAccess 883cdf0e10cSrcweir virtual Type SAL_CALL getElementType(void) throw( RuntimeException ); 884cdf0e10cSrcweir virtual sal_Bool SAL_CALL hasElements(void) throw( RuntimeException ); 885cdf0e10cSrcweir 886cdf0e10cSrcweir // Methoden von XNameAccess 887cdf0e10cSrcweir virtual Any SAL_CALL getByName(const ::rtl::OUString& Name) 888cdf0e10cSrcweir throw( NoSuchElementException, WrappedTargetException, RuntimeException ); 889cdf0e10cSrcweir virtual Sequence< ::rtl::OUString > SAL_CALL getElementNames(void) throw( RuntimeException ); 890cdf0e10cSrcweir virtual sal_Bool SAL_CALL hasByName(const ::rtl::OUString& Name) throw( RuntimeException ); 891cdf0e10cSrcweir 892cdf0e10cSrcweir // Methoden von XNameContainer 893cdf0e10cSrcweir virtual void SAL_CALL insertByName(const ::rtl::OUString& Name, const Any& Element) 894cdf0e10cSrcweir throw( IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException ); 895cdf0e10cSrcweir virtual void SAL_CALL replaceByName(const ::rtl::OUString& Name, const Any& Element) 896cdf0e10cSrcweir throw( IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException ); 897cdf0e10cSrcweir virtual void SAL_CALL removeByName(const ::rtl::OUString& Name) 898cdf0e10cSrcweir throw( NoSuchElementException, WrappedTargetException, RuntimeException ); 899cdf0e10cSrcweir 900cdf0e10cSrcweir // Methoden von XIndexAccess 901cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getCount(void) throw( RuntimeException ); 902cdf0e10cSrcweir virtual Any SAL_CALL getByIndex(sal_Int32 Index) 903cdf0e10cSrcweir throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ); 904cdf0e10cSrcweir 905cdf0e10cSrcweir // Methoden von XIndexContainer 906cdf0e10cSrcweir virtual void SAL_CALL insertByIndex(sal_Int32 Index, const Any& Element) 907cdf0e10cSrcweir throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ); 908cdf0e10cSrcweir virtual void SAL_CALL replaceByIndex(sal_Int32 Index, const Any& Element) 909cdf0e10cSrcweir throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ); 910cdf0e10cSrcweir virtual void SAL_CALL removeByIndex(sal_Int32 Index) 911cdf0e10cSrcweir throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ); 912cdf0e10cSrcweir 913cdf0e10cSrcweir // Methoden von XEnumerationAccess 914cdf0e10cSrcweir virtual Reference<XEnumeration> SAL_CALL createEnumeration(void) throw( RuntimeException ); 915cdf0e10cSrcweir 916cdf0e10cSrcweir // Methoden von XIdlArray 917cdf0e10cSrcweir virtual void SAL_CALL realloc(Any& array, sal_Int32 length) 918cdf0e10cSrcweir throw( IllegalArgumentException, RuntimeException ); 919cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getLen(const Any& array) throw( IllegalArgumentException, RuntimeException ); 920cdf0e10cSrcweir virtual Any SAL_CALL get(const Any& array, sal_Int32 index) 921cdf0e10cSrcweir throw( IllegalArgumentException, ArrayIndexOutOfBoundsException, RuntimeException ); 922cdf0e10cSrcweir virtual void SAL_CALL set(Any& array, sal_Int32 index, const Any& value) 923cdf0e10cSrcweir throw( IllegalArgumentException, ArrayIndexOutOfBoundsException, RuntimeException ); 924cdf0e10cSrcweir }; 925cdf0e10cSrcweir 926cdf0e10cSrcweir ImplIntrospectionAdapter::ImplIntrospectionAdapter( ImplIntrospectionAccess* pAccess_, 927cdf0e10cSrcweir const Any& obj, IntrospectionAccessStatic_Impl* pStaticImpl_ ) 928cdf0e10cSrcweir : mpAccess( pAccess_), mrInspectedObject( obj ), mpStaticImpl( pStaticImpl_ ) 929cdf0e10cSrcweir { 930cdf0e10cSrcweir mpStaticImpl->acquire(); 931cdf0e10cSrcweir 932cdf0e10cSrcweir // Objekt als Interfaceholen 933cdf0e10cSrcweir TypeClass eType = mrInspectedObject.getValueType().getTypeClass(); 934cdf0e10cSrcweir if( eType == TypeClass_INTERFACE ) 935cdf0e10cSrcweir { 936cdf0e10cSrcweir mxIface = *( Reference< XInterface >*)mrInspectedObject.getValue(); 937cdf0e10cSrcweir 938cdf0e10cSrcweir mxObjElementAccess = Reference<XElementAccess>::query( mxIface ); 939cdf0e10cSrcweir mxObjNameAccess = Reference<XNameAccess>::query( mxIface ); 940cdf0e10cSrcweir mxObjNameContainer = Reference<XNameContainer>::query( mxIface ); 941cdf0e10cSrcweir mxObjIndexAccess = Reference<XIndexAccess>::query( mxIface ); 942cdf0e10cSrcweir mxObjIndexContainer = Reference<XIndexContainer>::query( mxIface ); 943cdf0e10cSrcweir mxObjEnumerationAccess = Reference<XEnumerationAccess>::query( mxIface ); 944cdf0e10cSrcweir mxObjIdlArray = Reference<XIdlArray>::query( mxIface ); 945cdf0e10cSrcweir } 946cdf0e10cSrcweir } 947cdf0e10cSrcweir 948cdf0e10cSrcweir ImplIntrospectionAdapter::~ImplIntrospectionAdapter() 949cdf0e10cSrcweir { 950cdf0e10cSrcweir mpStaticImpl->release(); 951cdf0e10cSrcweir } 952cdf0e10cSrcweir 953cdf0e10cSrcweir // Methoden von XInterface 954cdf0e10cSrcweir Any SAL_CALL ImplIntrospectionAdapter::queryInterface( const Type& rType ) 955cdf0e10cSrcweir throw( RuntimeException ) 956cdf0e10cSrcweir { 957cdf0e10cSrcweir Any aRet( ::cppu::queryInterface( 958cdf0e10cSrcweir rType, 959cdf0e10cSrcweir static_cast< XPropertySet * >( this ), 960cdf0e10cSrcweir static_cast< XFastPropertySet * >( this ), 961cdf0e10cSrcweir static_cast< XPropertySetInfo * >( this ) ) ); 962cdf0e10cSrcweir if( !aRet.hasValue() ) 963cdf0e10cSrcweir aRet = OWeakObject::queryInterface( rType ); 964cdf0e10cSrcweir 965cdf0e10cSrcweir if( !aRet.hasValue() ) 966cdf0e10cSrcweir { 967cdf0e10cSrcweir // Wrapper fuer die Objekt-Interfaces 968cdf0e10cSrcweir if( ( mxObjElementAccess.is() && (aRet = ::cppu::queryInterface 969cdf0e10cSrcweir ( rType, static_cast< XElementAccess* >( static_cast< XNameAccess* >( this ) ) ) ).hasValue() ) 970cdf0e10cSrcweir || ( mxObjNameAccess.is() && (aRet = ::cppu::queryInterface( rType, static_cast< XNameAccess* >( this ) ) ).hasValue() ) 971cdf0e10cSrcweir || ( mxObjNameContainer.is() && (aRet = ::cppu::queryInterface( rType, static_cast< XNameContainer* >( this ) ) ).hasValue() ) 972cdf0e10cSrcweir || ( mxObjIndexAccess.is() && (aRet = ::cppu::queryInterface( rType, static_cast< XIndexAccess* >( this ) ) ).hasValue() ) 973cdf0e10cSrcweir || ( mxObjIndexContainer.is() && (aRet = ::cppu::queryInterface( rType, static_cast< XIndexContainer* >( this ) ) ).hasValue() ) 974cdf0e10cSrcweir || ( mxObjEnumerationAccess .is() && (aRet = ::cppu::queryInterface( rType, static_cast< XEnumerationAccess* >( this ) ) ).hasValue() ) 975cdf0e10cSrcweir || ( mxObjIdlArray.is() && (aRet = ::cppu::queryInterface( rType, static_cast< XIdlArray* >( this ) ) ).hasValue() ) 976cdf0e10cSrcweir ) 977cdf0e10cSrcweir { 978cdf0e10cSrcweir } 979cdf0e10cSrcweir } 980cdf0e10cSrcweir return aRet; 981cdf0e10cSrcweir } 982cdf0e10cSrcweir 983cdf0e10cSrcweir 984cdf0e10cSrcweir //*************************************************** 985cdf0e10cSrcweir //*** Implementation von ImplIntrospectionAdapter *** 986cdf0e10cSrcweir //*************************************************** 987cdf0e10cSrcweir 988cdf0e10cSrcweir // Methoden von XPropertySet 989cdf0e10cSrcweir Reference<XPropertySetInfo> ImplIntrospectionAdapter::getPropertySetInfo(void) 990cdf0e10cSrcweir throw( RuntimeException ) 991cdf0e10cSrcweir { 992cdf0e10cSrcweir return (XPropertySetInfo *)this; 993cdf0e10cSrcweir } 994cdf0e10cSrcweir 995cdf0e10cSrcweir void ImplIntrospectionAdapter::setPropertyValue(const ::rtl::OUString& aPropertyName, const Any& aValue) 996cdf0e10cSrcweir throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException ) 997cdf0e10cSrcweir { 998cdf0e10cSrcweir mpStaticImpl->setPropertyValue( mrInspectedObject, aPropertyName, aValue ); 999cdf0e10cSrcweir } 1000cdf0e10cSrcweir 1001cdf0e10cSrcweir Any ImplIntrospectionAdapter::getPropertyValue(const ::rtl::OUString& aPropertyName) 1002cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ) 1003cdf0e10cSrcweir { 1004cdf0e10cSrcweir return mpStaticImpl->getPropertyValue( mrInspectedObject, aPropertyName ); 1005cdf0e10cSrcweir } 1006cdf0e10cSrcweir 1007cdf0e10cSrcweir void ImplIntrospectionAdapter::addPropertyChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XPropertyChangeListener>& aListener) 1008cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ) 1009cdf0e10cSrcweir { 1010cdf0e10cSrcweir if( mxIface.is() ) 1011cdf0e10cSrcweir { 1012cdf0e10cSrcweir Reference<XPropertySet> xPropSet = 1013cdf0e10cSrcweir Reference<XPropertySet>::query( mxIface ); 1014cdf0e10cSrcweir //Reference<XPropertySet> xPropSet( mxIface, USR_QUERY ); 1015cdf0e10cSrcweir if( xPropSet.is() ) 1016cdf0e10cSrcweir xPropSet->addPropertyChangeListener(aPropertyName, aListener); 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir } 1019cdf0e10cSrcweir 1020cdf0e10cSrcweir void ImplIntrospectionAdapter::removePropertyChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XPropertyChangeListener>& aListener) 1021cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ) 1022cdf0e10cSrcweir { 1023cdf0e10cSrcweir if( mxIface.is() ) 1024cdf0e10cSrcweir { 1025cdf0e10cSrcweir Reference<XPropertySet> xPropSet = 1026cdf0e10cSrcweir Reference<XPropertySet>::query( mxIface ); 1027cdf0e10cSrcweir //Reference<XPropertySet> xPropSet( mxIface, USR_QUERY ); 1028cdf0e10cSrcweir if( xPropSet.is() ) 1029cdf0e10cSrcweir xPropSet->removePropertyChangeListener(aPropertyName, aListener); 1030cdf0e10cSrcweir } 1031cdf0e10cSrcweir } 1032cdf0e10cSrcweir 1033cdf0e10cSrcweir void ImplIntrospectionAdapter::addVetoableChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XVetoableChangeListener>& aListener) 1034cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ) 1035cdf0e10cSrcweir { 1036cdf0e10cSrcweir if( mxIface.is() ) 1037cdf0e10cSrcweir { 1038cdf0e10cSrcweir Reference<XPropertySet> xPropSet = 1039cdf0e10cSrcweir Reference<XPropertySet>::query( mxIface ); 1040cdf0e10cSrcweir //Reference<XPropertySet> xPropSet( mxIface, USR_QUERY ); 1041cdf0e10cSrcweir if( xPropSet.is() ) 1042cdf0e10cSrcweir xPropSet->addVetoableChangeListener(aPropertyName, aListener); 1043cdf0e10cSrcweir } 1044cdf0e10cSrcweir } 1045cdf0e10cSrcweir 1046cdf0e10cSrcweir void ImplIntrospectionAdapter::removeVetoableChangeListener(const ::rtl::OUString& aPropertyName, const Reference<XVetoableChangeListener>& aListener) 1047cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ) 1048cdf0e10cSrcweir { 1049cdf0e10cSrcweir if( mxIface.is() ) 1050cdf0e10cSrcweir { 1051cdf0e10cSrcweir Reference<XPropertySet> xPropSet = 1052cdf0e10cSrcweir Reference<XPropertySet>::query( mxIface ); 1053cdf0e10cSrcweir if( xPropSet.is() ) 1054cdf0e10cSrcweir xPropSet->removeVetoableChangeListener(aPropertyName, aListener); 1055cdf0e10cSrcweir } 1056cdf0e10cSrcweir } 1057cdf0e10cSrcweir 1058cdf0e10cSrcweir 1059cdf0e10cSrcweir // Methoden von XFastPropertySet 1060cdf0e10cSrcweir void ImplIntrospectionAdapter::setFastPropertyValue(sal_Int32, const Any&) 1061cdf0e10cSrcweir throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException ) 1062cdf0e10cSrcweir { 1063cdf0e10cSrcweir } 1064cdf0e10cSrcweir 1065cdf0e10cSrcweir Any ImplIntrospectionAdapter::getFastPropertyValue(sal_Int32) 1066cdf0e10cSrcweir throw( UnknownPropertyException, WrappedTargetException, RuntimeException ) 1067cdf0e10cSrcweir { 1068cdf0e10cSrcweir return Any(); 1069cdf0e10cSrcweir } 1070cdf0e10cSrcweir 1071cdf0e10cSrcweir // Methoden von XPropertySetInfo 1072cdf0e10cSrcweir Sequence< Property > ImplIntrospectionAdapter::getProperties(void) throw( RuntimeException ) 1073cdf0e10cSrcweir { 1074cdf0e10cSrcweir return mpStaticImpl->getProperties(); 1075cdf0e10cSrcweir } 1076cdf0e10cSrcweir 1077cdf0e10cSrcweir Property ImplIntrospectionAdapter::getPropertyByName(const ::rtl::OUString& Name) 1078cdf0e10cSrcweir throw( RuntimeException ) 1079cdf0e10cSrcweir { 1080cdf0e10cSrcweir return mpAccess->getProperty( Name, PropertyConcept::ALL ); 1081cdf0e10cSrcweir } 1082cdf0e10cSrcweir 1083cdf0e10cSrcweir sal_Bool ImplIntrospectionAdapter::hasPropertyByName(const ::rtl::OUString& Name) 1084cdf0e10cSrcweir throw( RuntimeException ) 1085cdf0e10cSrcweir { 1086cdf0e10cSrcweir return mpAccess->hasProperty( Name, PropertyConcept::ALL ); 1087cdf0e10cSrcweir } 1088cdf0e10cSrcweir 1089cdf0e10cSrcweir // Methoden von XElementAccess 1090cdf0e10cSrcweir Type ImplIntrospectionAdapter::getElementType(void) throw( RuntimeException ) 1091cdf0e10cSrcweir { 1092cdf0e10cSrcweir return mxObjElementAccess->getElementType(); 1093cdf0e10cSrcweir } 1094cdf0e10cSrcweir 1095cdf0e10cSrcweir sal_Bool ImplIntrospectionAdapter::hasElements(void) throw( RuntimeException ) 1096cdf0e10cSrcweir { 1097cdf0e10cSrcweir return mxObjElementAccess->hasElements(); 1098cdf0e10cSrcweir } 1099cdf0e10cSrcweir 1100cdf0e10cSrcweir // Methoden von XNameAccess 1101cdf0e10cSrcweir Any ImplIntrospectionAdapter::getByName(const ::rtl::OUString& Name) 1102cdf0e10cSrcweir throw( NoSuchElementException, WrappedTargetException, RuntimeException ) 1103cdf0e10cSrcweir { 1104cdf0e10cSrcweir return mxObjNameAccess->getByName( Name ); 1105cdf0e10cSrcweir } 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir Sequence< ::rtl::OUString > ImplIntrospectionAdapter::getElementNames(void) 1108cdf0e10cSrcweir throw( RuntimeException ) 1109cdf0e10cSrcweir { 1110cdf0e10cSrcweir return mxObjNameAccess->getElementNames(); 1111cdf0e10cSrcweir } 1112cdf0e10cSrcweir 1113cdf0e10cSrcweir sal_Bool ImplIntrospectionAdapter::hasByName(const ::rtl::OUString& Name) 1114cdf0e10cSrcweir throw( RuntimeException ) 1115cdf0e10cSrcweir { 1116cdf0e10cSrcweir return mxObjNameAccess->hasByName( Name ); 1117cdf0e10cSrcweir } 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir // Methoden von XNameContainer 1120cdf0e10cSrcweir void ImplIntrospectionAdapter::insertByName(const ::rtl::OUString& Name, const Any& Element) 1121cdf0e10cSrcweir throw( IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException ) 1122cdf0e10cSrcweir { 1123cdf0e10cSrcweir mxObjNameContainer->insertByName( Name, Element ); 1124cdf0e10cSrcweir } 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir void ImplIntrospectionAdapter::replaceByName(const ::rtl::OUString& Name, const Any& Element) 1127cdf0e10cSrcweir throw( IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException ) 1128cdf0e10cSrcweir { 1129cdf0e10cSrcweir mxObjNameContainer->replaceByName( Name, Element ); 1130cdf0e10cSrcweir } 1131cdf0e10cSrcweir 1132cdf0e10cSrcweir void ImplIntrospectionAdapter::removeByName(const ::rtl::OUString& Name) 1133cdf0e10cSrcweir throw( NoSuchElementException, WrappedTargetException, RuntimeException ) 1134cdf0e10cSrcweir { 1135cdf0e10cSrcweir mxObjNameContainer->removeByName( Name ); 1136cdf0e10cSrcweir } 1137cdf0e10cSrcweir 1138cdf0e10cSrcweir // Methoden von XIndexAccess 1139cdf0e10cSrcweir // Schon in XNameAccess: virtual Reference<XIdlClass> getElementType(void) const 1140cdf0e10cSrcweir sal_Int32 ImplIntrospectionAdapter::getCount(void) throw( RuntimeException ) 1141cdf0e10cSrcweir { 1142cdf0e10cSrcweir return mxObjIndexAccess->getCount(); 1143cdf0e10cSrcweir } 1144cdf0e10cSrcweir 1145cdf0e10cSrcweir Any ImplIntrospectionAdapter::getByIndex(sal_Int32 Index) 1146cdf0e10cSrcweir throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 1147cdf0e10cSrcweir { 1148cdf0e10cSrcweir return mxObjIndexAccess->getByIndex( Index ); 1149cdf0e10cSrcweir } 1150cdf0e10cSrcweir 1151cdf0e10cSrcweir // Methoden von XIndexContainer 1152cdf0e10cSrcweir void ImplIntrospectionAdapter::insertByIndex(sal_Int32 Index, const Any& Element) 1153cdf0e10cSrcweir throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 1154cdf0e10cSrcweir { 1155cdf0e10cSrcweir mxObjIndexContainer->insertByIndex( Index, Element ); 1156cdf0e10cSrcweir } 1157cdf0e10cSrcweir 1158cdf0e10cSrcweir void ImplIntrospectionAdapter::replaceByIndex(sal_Int32 Index, const Any& Element) 1159cdf0e10cSrcweir throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 1160cdf0e10cSrcweir { 1161cdf0e10cSrcweir mxObjIndexContainer->replaceByIndex( Index, Element ); 1162cdf0e10cSrcweir } 1163cdf0e10cSrcweir 1164cdf0e10cSrcweir void ImplIntrospectionAdapter::removeByIndex(sal_Int32 Index) 1165cdf0e10cSrcweir throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 1166cdf0e10cSrcweir { 1167cdf0e10cSrcweir mxObjIndexContainer->removeByIndex( Index ); 1168cdf0e10cSrcweir } 1169cdf0e10cSrcweir 1170cdf0e10cSrcweir // Methoden von XEnumerationAccess 1171cdf0e10cSrcweir // Schon in XNameAccess: virtual Reference<XIdlClass> getElementType(void) const; 1172cdf0e10cSrcweir Reference<XEnumeration> ImplIntrospectionAdapter::createEnumeration(void) throw( RuntimeException ) 1173cdf0e10cSrcweir { 1174cdf0e10cSrcweir return mxObjEnumerationAccess->createEnumeration(); 1175cdf0e10cSrcweir } 1176cdf0e10cSrcweir 1177cdf0e10cSrcweir // Methoden von XIdlArray 1178cdf0e10cSrcweir void ImplIntrospectionAdapter::realloc(Any& array, sal_Int32 length) 1179cdf0e10cSrcweir throw( IllegalArgumentException, RuntimeException ) 1180cdf0e10cSrcweir { 1181cdf0e10cSrcweir mxObjIdlArray->realloc( array, length ); 1182cdf0e10cSrcweir } 1183cdf0e10cSrcweir 1184cdf0e10cSrcweir sal_Int32 ImplIntrospectionAdapter::getLen(const Any& array) 1185cdf0e10cSrcweir throw( IllegalArgumentException, RuntimeException ) 1186cdf0e10cSrcweir { 1187cdf0e10cSrcweir return mxObjIdlArray->getLen( array ); 1188cdf0e10cSrcweir } 1189cdf0e10cSrcweir 1190cdf0e10cSrcweir Any ImplIntrospectionAdapter::get(const Any& array, sal_Int32 index) 1191cdf0e10cSrcweir throw( IllegalArgumentException, ArrayIndexOutOfBoundsException, RuntimeException ) 1192cdf0e10cSrcweir { 1193cdf0e10cSrcweir return mxObjIdlArray->get( array, index ); 1194cdf0e10cSrcweir } 1195cdf0e10cSrcweir 1196cdf0e10cSrcweir void ImplIntrospectionAdapter::set(Any& array, sal_Int32 index, const Any& value) 1197cdf0e10cSrcweir throw( IllegalArgumentException, ArrayIndexOutOfBoundsException, RuntimeException ) 1198cdf0e10cSrcweir { 1199cdf0e10cSrcweir mxObjIdlArray->set( array, index, value ); 1200cdf0e10cSrcweir } 1201cdf0e10cSrcweir 1202cdf0e10cSrcweir 1203cdf0e10cSrcweir //************************************************** 1204cdf0e10cSrcweir //*** Implementation von ImplIntrospectionAccess *** 1205cdf0e10cSrcweir //************************************************** 1206cdf0e10cSrcweir 1207cdf0e10cSrcweir // Methoden von XIntrospectionAccess 1208cdf0e10cSrcweir sal_Int32 ImplIntrospectionAccess::getSuppliedMethodConcepts(void) 1209cdf0e10cSrcweir throw( RuntimeException ) 1210cdf0e10cSrcweir { 1211cdf0e10cSrcweir return MethodConcept::DANGEROUS | 1212cdf0e10cSrcweir PROPERTY | 1213cdf0e10cSrcweir LISTENER | 1214cdf0e10cSrcweir ENUMERATION | 1215cdf0e10cSrcweir NAMECONTAINER | 1216cdf0e10cSrcweir INDEXCONTAINER; 1217cdf0e10cSrcweir } 1218cdf0e10cSrcweir 1219cdf0e10cSrcweir sal_Int32 ImplIntrospectionAccess::getSuppliedPropertyConcepts(void) 1220cdf0e10cSrcweir throw( RuntimeException ) 1221cdf0e10cSrcweir { 1222cdf0e10cSrcweir return PropertyConcept::DANGEROUS | 1223cdf0e10cSrcweir PROPERTYSET | 1224cdf0e10cSrcweir ATTRIBUTES | 1225cdf0e10cSrcweir METHODS; 1226cdf0e10cSrcweir } 1227cdf0e10cSrcweir 1228cdf0e10cSrcweir Property ImplIntrospectionAccess::getProperty(const ::rtl::OUString& Name, sal_Int32 PropertyConcepts) 1229cdf0e10cSrcweir throw( NoSuchElementException, RuntimeException ) 1230cdf0e10cSrcweir { 1231cdf0e10cSrcweir Property aRet; 1232cdf0e10cSrcweir sal_Int32 i = mpStaticImpl->getPropertyIndex( Name ); 1233cdf0e10cSrcweir sal_Bool bFound = sal_False; 1234cdf0e10cSrcweir if( i != -1 ) 1235cdf0e10cSrcweir { 1236cdf0e10cSrcweir sal_Int32 nConcept = mpStaticImpl->getPropertyConcepts().getConstArray()[ i ]; 1237cdf0e10cSrcweir if( (PropertyConcepts & nConcept) != 0 ) 1238cdf0e10cSrcweir { 1239cdf0e10cSrcweir const Property* pProps = mpStaticImpl->getProperties().getConstArray(); 1240cdf0e10cSrcweir aRet = pProps[ i ]; 1241cdf0e10cSrcweir bFound = sal_True; 1242cdf0e10cSrcweir } 1243cdf0e10cSrcweir } 1244cdf0e10cSrcweir if( !bFound ) 1245cdf0e10cSrcweir throw NoSuchElementException() ; 1246cdf0e10cSrcweir return aRet; 1247cdf0e10cSrcweir } 1248cdf0e10cSrcweir 1249cdf0e10cSrcweir sal_Bool ImplIntrospectionAccess::hasProperty(const ::rtl::OUString& Name, sal_Int32 PropertyConcepts) 1250cdf0e10cSrcweir throw( RuntimeException ) 1251cdf0e10cSrcweir { 1252cdf0e10cSrcweir sal_Int32 i = mpStaticImpl->getPropertyIndex( Name ); 1253cdf0e10cSrcweir sal_Bool bRet = sal_False; 1254cdf0e10cSrcweir if( i != -1 ) 1255cdf0e10cSrcweir { 1256cdf0e10cSrcweir sal_Int32 nConcept = mpStaticImpl->getPropertyConcepts().getConstArray()[ i ]; 1257cdf0e10cSrcweir if( (PropertyConcepts & nConcept) != 0 ) 1258cdf0e10cSrcweir bRet = sal_True; 1259cdf0e10cSrcweir } 1260cdf0e10cSrcweir return bRet; 1261cdf0e10cSrcweir } 1262cdf0e10cSrcweir 1263cdf0e10cSrcweir Sequence< Property > ImplIntrospectionAccess::getProperties(sal_Int32 PropertyConcepts) 1264cdf0e10cSrcweir throw( RuntimeException ) 1265cdf0e10cSrcweir { 1266cdf0e10cSrcweir // Wenn alle unterstuetzten Konzepte gefordert werden, Sequence einfach durchreichen 1267cdf0e10cSrcweir sal_Int32 nAllSupportedMask = PROPERTYSET | 1268cdf0e10cSrcweir ATTRIBUTES | 1269cdf0e10cSrcweir METHODS; 1270cdf0e10cSrcweir if( ( PropertyConcepts & nAllSupportedMask ) == nAllSupportedMask ) 1271cdf0e10cSrcweir { 1272cdf0e10cSrcweir return mpStaticImpl->getProperties(); 1273cdf0e10cSrcweir } 1274cdf0e10cSrcweir 1275cdf0e10cSrcweir // Gleiche Sequence wie beim vorigen mal? 1276cdf0e10cSrcweir if( mnLastPropertyConcept == PropertyConcepts ) 1277cdf0e10cSrcweir { 1278cdf0e10cSrcweir return maLastPropertySeq; 1279cdf0e10cSrcweir } 1280cdf0e10cSrcweir 1281cdf0e10cSrcweir // Anzahl der zu liefernden Properties 1282cdf0e10cSrcweir sal_Int32 nCount = 0; 1283cdf0e10cSrcweir 1284cdf0e10cSrcweir // Es gibt zur Zeit keine DANGEROUS-Properties 1285cdf0e10cSrcweir // if( PropertyConcepts & DANGEROUS ) 1286cdf0e10cSrcweir // nCount += mpStaticImpl->mnDangerousPropCount; 1287cdf0e10cSrcweir if( PropertyConcepts & PROPERTYSET ) 1288cdf0e10cSrcweir nCount += mpStaticImpl->mnPropertySetPropCount; 1289cdf0e10cSrcweir if( PropertyConcepts & ATTRIBUTES ) 1290cdf0e10cSrcweir nCount += mpStaticImpl->mnAttributePropCount; 1291cdf0e10cSrcweir if( PropertyConcepts & METHODS ) 1292cdf0e10cSrcweir nCount += mpStaticImpl->mnMethodPropCount; 1293cdf0e10cSrcweir 1294cdf0e10cSrcweir // Sequence entsprechend der geforderten Anzahl reallocieren 1295cdf0e10cSrcweir ImplIntrospectionAccess* pThis = (ImplIntrospectionAccess*)this; // const umgehen 1296cdf0e10cSrcweir pThis->maLastPropertySeq.realloc( nCount ); 1297cdf0e10cSrcweir Property* pDestProps = pThis->maLastPropertySeq.getArray(); 1298cdf0e10cSrcweir 1299cdf0e10cSrcweir // Alle Properties durchgehen und entsprechend der Concepte uebernehmen 1300cdf0e10cSrcweir Sequence<Property> aPropSeq = mpStaticImpl->getProperties(); 1301cdf0e10cSrcweir const Property* pSourceProps = aPropSeq.getConstArray(); 1302cdf0e10cSrcweir const sal_Int32* pConcepts = mpStaticImpl->getPropertyConcepts().getConstArray(); 1303cdf0e10cSrcweir sal_Int32 nLen = aPropSeq.getLength(); 1304cdf0e10cSrcweir 1305cdf0e10cSrcweir sal_Int32 iDest = 0; 1306cdf0e10cSrcweir for( sal_Int32 i = 0 ; i < nLen ; i++ ) 1307cdf0e10cSrcweir { 1308cdf0e10cSrcweir sal_Int32 nConcept = pConcepts[ i ]; 1309cdf0e10cSrcweir if( nConcept & PropertyConcepts ) 1310cdf0e10cSrcweir pDestProps[ iDest++ ] = pSourceProps[ i ]; 1311cdf0e10cSrcweir 1312cdf0e10cSrcweir /* 1313cdf0e10cSrcweir // Property mit Concepts ausgeben 1314cdf0e10cSrcweir ::rtl::OUString aPropName = pSourceProps[ i ].Name; 1315cdf0e10cSrcweir String aNameStr = OOUStringToString(aPropName, CHARSET_SYSTEM); 1316cdf0e10cSrcweir String ConceptStr; 1317cdf0e10cSrcweir if( nConcept & PROPERTYSET ) 1318cdf0e10cSrcweir ConceptStr += "PROPERTYSET"; 1319cdf0e10cSrcweir if( nConcept & ATTRIBUTES ) 1320cdf0e10cSrcweir ConceptStr += "ATTRIBUTES"; 1321cdf0e10cSrcweir if( nConcept & METHODS ) 1322cdf0e10cSrcweir ConceptStr += "METHODS"; 1323cdf0e10cSrcweir printf( "Property %ld: %s, Concept = %s\n", i, aNameStr.GetStr(), ConceptStr.GetStr() ); 1324cdf0e10cSrcweir */ 1325cdf0e10cSrcweir } 1326cdf0e10cSrcweir 1327cdf0e10cSrcweir // PropertyConcept merken, dies entspricht maLastPropertySeq 1328cdf0e10cSrcweir pThis->mnLastPropertyConcept = PropertyConcepts; 1329cdf0e10cSrcweir 1330cdf0e10cSrcweir // Zusammengebastelte Sequence liefern 1331cdf0e10cSrcweir return maLastPropertySeq; 1332cdf0e10cSrcweir } 1333cdf0e10cSrcweir 1334cdf0e10cSrcweir Reference<XIdlMethod> ImplIntrospectionAccess::getMethod(const ::rtl::OUString& Name, sal_Int32 MethodConcepts) 1335cdf0e10cSrcweir throw( NoSuchMethodException, RuntimeException ) 1336cdf0e10cSrcweir { 1337cdf0e10cSrcweir Reference<XIdlMethod> xRet; 1338cdf0e10cSrcweir sal_Int32 i = mpStaticImpl->getMethodIndex( Name ); 1339cdf0e10cSrcweir if( i != -1 ) 1340cdf0e10cSrcweir { 1341cdf0e10cSrcweir 1342cdf0e10cSrcweir sal_Int32 nConcept = mpStaticImpl->getMethodConcepts().getConstArray()[ i ]; 1343cdf0e10cSrcweir if( (MethodConcepts & nConcept) != 0 ) 1344cdf0e10cSrcweir { 1345cdf0e10cSrcweir const Reference<XIdlMethod>* pMethods = mpStaticImpl->getMethods().getConstArray(); 1346cdf0e10cSrcweir xRet = pMethods[i]; 1347cdf0e10cSrcweir } 1348cdf0e10cSrcweir } 1349cdf0e10cSrcweir if( !xRet.is() ) 1350cdf0e10cSrcweir throw NoSuchMethodException(); 1351cdf0e10cSrcweir return xRet; 1352cdf0e10cSrcweir } 1353cdf0e10cSrcweir 1354cdf0e10cSrcweir sal_Bool ImplIntrospectionAccess::hasMethod(const ::rtl::OUString& Name, sal_Int32 MethodConcepts) 1355cdf0e10cSrcweir throw( RuntimeException ) 1356cdf0e10cSrcweir { 1357cdf0e10cSrcweir sal_Int32 i = mpStaticImpl->getMethodIndex( Name ); 1358cdf0e10cSrcweir sal_Bool bRet = sal_False; 1359cdf0e10cSrcweir if( i != -1 ) 1360cdf0e10cSrcweir { 1361cdf0e10cSrcweir sal_Int32 nConcept = mpStaticImpl->getMethodConcepts().getConstArray()[ i ]; 1362cdf0e10cSrcweir if( (MethodConcepts & nConcept) != 0 ) 1363cdf0e10cSrcweir bRet = sal_True; 1364cdf0e10cSrcweir } 1365cdf0e10cSrcweir return bRet; 1366cdf0e10cSrcweir } 1367cdf0e10cSrcweir 1368cdf0e10cSrcweir Sequence< Reference<XIdlMethod> > ImplIntrospectionAccess::getMethods(sal_Int32 MethodConcepts) 1369cdf0e10cSrcweir throw( RuntimeException ) 1370cdf0e10cSrcweir { 1371cdf0e10cSrcweir ImplIntrospectionAccess* pThis = (ImplIntrospectionAccess*)this; // const umgehen 1372cdf0e10cSrcweir 1373cdf0e10cSrcweir // Wenn alle unterstuetzten Konzepte gefordert werden, Sequence einfach durchreichen 1374cdf0e10cSrcweir sal_Int32 nAllSupportedMask = MethodConcept::DANGEROUS | 1375cdf0e10cSrcweir PROPERTY | 1376cdf0e10cSrcweir LISTENER | 1377cdf0e10cSrcweir ENUMERATION | 1378cdf0e10cSrcweir NAMECONTAINER | 1379cdf0e10cSrcweir INDEXCONTAINER | 1380cdf0e10cSrcweir MethodConcept_NORMAL_IMPL; 1381cdf0e10cSrcweir if( ( MethodConcepts & nAllSupportedMask ) == nAllSupportedMask ) 1382cdf0e10cSrcweir { 1383cdf0e10cSrcweir return mpStaticImpl->getMethods(); 1384cdf0e10cSrcweir } 1385cdf0e10cSrcweir 1386cdf0e10cSrcweir // Gleiche Sequence wie beim vorigen mal? 1387cdf0e10cSrcweir if( mnLastMethodConcept == MethodConcepts ) 1388cdf0e10cSrcweir { 1389cdf0e10cSrcweir return maLastMethodSeq; 1390cdf0e10cSrcweir } 1391cdf0e10cSrcweir 1392cdf0e10cSrcweir // Methoden-Sequences besorgen 1393cdf0e10cSrcweir Sequence< Reference<XIdlMethod> > aMethodSeq = mpStaticImpl->getMethods(); 1394cdf0e10cSrcweir const Reference<XIdlMethod>* pSourceMethods = aMethodSeq.getConstArray(); 1395cdf0e10cSrcweir const sal_Int32* pConcepts = mpStaticImpl->getMethodConcepts().getConstArray(); 1396cdf0e10cSrcweir sal_Int32 nLen = aMethodSeq.getLength(); 1397cdf0e10cSrcweir 1398cdf0e10cSrcweir // Sequence entsprechend der geforderten Anzahl reallocieren 1399cdf0e10cSrcweir // Anders als bei den Properties kann die Anzahl nicht durch 1400cdf0e10cSrcweir // Zaehler in inspect() vorher ermittelt werden, da Methoden 1401cdf0e10cSrcweir // mehreren Konzepten angehoeren koennen 1402cdf0e10cSrcweir pThis->maLastMethodSeq.realloc( nLen ); 1403cdf0e10cSrcweir Reference<XIdlMethod>* pDestMethods = pThis->maLastMethodSeq.getArray(); 1404cdf0e10cSrcweir 1405cdf0e10cSrcweir // Alle Methods durchgehen und entsprechend der Concepte uebernehmen 1406cdf0e10cSrcweir sal_Int32 iDest = 0; 1407cdf0e10cSrcweir for( sal_Int32 i = 0 ; i < nLen ; i++ ) 1408cdf0e10cSrcweir { 1409cdf0e10cSrcweir sal_Int32 nConcept = pConcepts[ i ]; 1410cdf0e10cSrcweir if( nConcept & MethodConcepts ) 1411cdf0e10cSrcweir pDestMethods[ iDest++ ] = pSourceMethods[ i ]; 1412cdf0e10cSrcweir 1413cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 1414cdf0e10cSrcweir static bool debug = false; 1415cdf0e10cSrcweir if ( debug ) 1416cdf0e10cSrcweir { 1417cdf0e10cSrcweir // Methode mit Concepts ausgeben 1418cdf0e10cSrcweir const Reference< XIdlMethod >& rxMethod = pSourceMethods[ i ]; 1419cdf0e10cSrcweir ::rtl::OString aNameStr = ::rtl::OUStringToOString( rxMethod->getName(), osl_getThreadTextEncoding() ); 1420cdf0e10cSrcweir ::rtl::OString ConceptStr; 1421cdf0e10cSrcweir if( nConcept & MethodConcept::DANGEROUS ) 1422cdf0e10cSrcweir ConceptStr += "DANGEROUS |"; 1423cdf0e10cSrcweir if( nConcept & MethodConcept::PROPERTY ) 1424cdf0e10cSrcweir ConceptStr += "PROPERTY |"; 1425cdf0e10cSrcweir if( nConcept & MethodConcept::LISTENER ) 1426cdf0e10cSrcweir ConceptStr += "LISTENER |"; 1427cdf0e10cSrcweir if( nConcept & MethodConcept::ENUMERATION ) 1428cdf0e10cSrcweir ConceptStr += "ENUMERATION |"; 1429cdf0e10cSrcweir if( nConcept & MethodConcept::NAMECONTAINER ) 1430cdf0e10cSrcweir ConceptStr += "NAMECONTAINER |"; 1431cdf0e10cSrcweir if( nConcept & MethodConcept::INDEXCONTAINER ) 1432cdf0e10cSrcweir ConceptStr += "INDEXCONTAINER |"; 1433cdf0e10cSrcweir OSL_TRACE( "Method %ld: %s, Concepts = %s", i, aNameStr.getStr(), ConceptStr.getStr() ); 1434cdf0e10cSrcweir } 1435cdf0e10cSrcweir #endif 1436cdf0e10cSrcweir } 1437cdf0e10cSrcweir 1438cdf0e10cSrcweir // Auf die richtige Laenge bringen 1439cdf0e10cSrcweir pThis->maLastMethodSeq.realloc( iDest ); 1440cdf0e10cSrcweir 1441cdf0e10cSrcweir // MethodConcept merken, dies entspricht maLastMethodSeq 1442cdf0e10cSrcweir pThis->mnLastMethodConcept = MethodConcepts; 1443cdf0e10cSrcweir 1444cdf0e10cSrcweir // Zusammengebastelte Sequence liefern 1445cdf0e10cSrcweir return maLastMethodSeq; 1446cdf0e10cSrcweir } 1447cdf0e10cSrcweir 1448cdf0e10cSrcweir Sequence< Type > ImplIntrospectionAccess::getSupportedListeners(void) 1449cdf0e10cSrcweir throw( RuntimeException ) 1450cdf0e10cSrcweir { 1451cdf0e10cSrcweir return mpStaticImpl->getSupportedListeners(); 1452cdf0e10cSrcweir } 1453cdf0e10cSrcweir 1454cdf0e10cSrcweir Reference<XInterface> SAL_CALL ImplIntrospectionAccess::queryAdapter( const Type& rType ) 1455cdf0e10cSrcweir throw( IllegalTypeException, RuntimeException ) 1456cdf0e10cSrcweir { 1457cdf0e10cSrcweir // Gibt es schon einen Adapter? 1458cdf0e10cSrcweir Reference< XInterface > xAdapter( maAdapter ); 1459cdf0e10cSrcweir if( !xAdapter.is() ) 1460cdf0e10cSrcweir { 1461cdf0e10cSrcweir xAdapter = *( new ImplIntrospectionAdapter( this, maInspectedObject, mpStaticImpl ) ); 1462cdf0e10cSrcweir maAdapter = xAdapter; 1463cdf0e10cSrcweir } 1464cdf0e10cSrcweir 1465cdf0e10cSrcweir Reference<XInterface> xRet; 1466cdf0e10cSrcweir xAdapter->queryInterface( rType ) >>= xRet; 1467cdf0e10cSrcweir return xRet; 1468cdf0e10cSrcweir } 1469cdf0e10cSrcweir 1470cdf0e10cSrcweir // Methoden von XMaterialHolder 1471cdf0e10cSrcweir Any ImplIntrospectionAccess::getMaterial(void) throw(RuntimeException) 1472cdf0e10cSrcweir { 1473cdf0e10cSrcweir return maInspectedObject; 1474cdf0e10cSrcweir } 1475cdf0e10cSrcweir 1476cdf0e10cSrcweir // Hilfs-Funktion zur LowerCase-Wandlung eines ::rtl::OUString 1477cdf0e10cSrcweir ::rtl::OUString toLower( ::rtl::OUString aUStr ) 1478cdf0e10cSrcweir { 1479cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 1480cdf0e10cSrcweir ::rtl::OUString aOWStr( aUStr.getStr() ); 1481cdf0e10cSrcweir ::rtl::OUString aOWLowerStr = aOWStr.toAsciiLowerCase(); 1482cdf0e10cSrcweir ::rtl::OUString aLowerUStr( aOWLowerStr.getStr() ); 1483cdf0e10cSrcweir return aLowerUStr; 1484cdf0e10cSrcweir } 1485cdf0e10cSrcweir 1486cdf0e10cSrcweir // Methoden von XExactName 1487cdf0e10cSrcweir ::rtl::OUString ImplIntrospectionAccess::getExactName( const ::rtl::OUString& rApproximateName ) throw( RuntimeException ) 1488cdf0e10cSrcweir { 1489cdf0e10cSrcweir ::rtl::OUString aRetStr; 1490cdf0e10cSrcweir LowerToExactNameMap::iterator aIt = 1491cdf0e10cSrcweir mpStaticImpl->maLowerToExactNameMap.find( toLower( rApproximateName ) ); 1492cdf0e10cSrcweir if( !( aIt == mpStaticImpl->maLowerToExactNameMap.end() ) ) 1493cdf0e10cSrcweir aRetStr = (*aIt).second; 1494cdf0e10cSrcweir return aRetStr; 1495cdf0e10cSrcweir } 1496cdf0e10cSrcweir 1497cdf0e10cSrcweir 1498cdf0e10cSrcweir //----------------------------------------------------------------------------- 1499cdf0e10cSrcweir 1500cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 1501cdf0e10cSrcweir 1502cdf0e10cSrcweir struct hashIntrospectionKey_Impl 1503cdf0e10cSrcweir { 1504cdf0e10cSrcweir Sequence< Reference<XIdlClass> > aIdlClasses; 1505cdf0e10cSrcweir Reference<XPropertySetInfo> xPropInfo; 1506cdf0e10cSrcweir Reference<XIdlClass> xImplClass; 1507cdf0e10cSrcweir sal_Int32 nHitCount; 1508cdf0e10cSrcweir 1509cdf0e10cSrcweir void IncHitCount() const { ((hashIntrospectionKey_Impl*)this)->nHitCount++; } 1510cdf0e10cSrcweir hashIntrospectionKey_Impl() : nHitCount( 0 ) {} 1511cdf0e10cSrcweir hashIntrospectionKey_Impl( const Sequence< Reference<XIdlClass> > & rIdlClasses, 1512cdf0e10cSrcweir const Reference<XPropertySetInfo> & rxPropInfo, 1513cdf0e10cSrcweir const Reference<XIdlClass> & rxImplClass ); 1514cdf0e10cSrcweir }; 1515cdf0e10cSrcweir 1516cdf0e10cSrcweir hashIntrospectionKey_Impl::hashIntrospectionKey_Impl 1517cdf0e10cSrcweir ( 1518cdf0e10cSrcweir const Sequence< Reference<XIdlClass> > & rIdlClasses, 1519cdf0e10cSrcweir const Reference<XPropertySetInfo> & rxPropInfo, 1520cdf0e10cSrcweir const Reference<XIdlClass> & rxImplClass 1521cdf0e10cSrcweir ) 1522cdf0e10cSrcweir : aIdlClasses( rIdlClasses ) 1523cdf0e10cSrcweir , xPropInfo( rxPropInfo ) 1524cdf0e10cSrcweir , xImplClass( rxImplClass ) 1525cdf0e10cSrcweir , nHitCount( 0 ) 1526cdf0e10cSrcweir {} 1527cdf0e10cSrcweir 1528cdf0e10cSrcweir 1529cdf0e10cSrcweir struct hashIntrospectionAccessCache_Impl 1530cdf0e10cSrcweir { 1531cdf0e10cSrcweir size_t operator()(const hashIntrospectionKey_Impl & rObj ) const 1532cdf0e10cSrcweir { 1533cdf0e10cSrcweir return (size_t)rObj.xImplClass.get() ^ (size_t)rObj.xPropInfo.get(); 1534cdf0e10cSrcweir } 1535cdf0e10cSrcweir 1536cdf0e10cSrcweir bool operator()( const hashIntrospectionKey_Impl & rObj1, 1537cdf0e10cSrcweir const hashIntrospectionKey_Impl & rObj2 ) const 1538cdf0e10cSrcweir { 1539cdf0e10cSrcweir if( rObj1.xPropInfo != rObj2.xPropInfo 1540cdf0e10cSrcweir || rObj1.xImplClass != rObj2.xImplClass ) 1541cdf0e10cSrcweir return sal_False; 1542cdf0e10cSrcweir 1543cdf0e10cSrcweir sal_Int32 nCount1 = rObj1.aIdlClasses.getLength(); 1544cdf0e10cSrcweir sal_Int32 nCount2 = rObj2.aIdlClasses.getLength(); 1545cdf0e10cSrcweir if( nCount1 != nCount2 ) 1546cdf0e10cSrcweir return sal_False; 1547cdf0e10cSrcweir 1548cdf0e10cSrcweir const Reference<XIdlClass>* pRefs1 = rObj1.aIdlClasses.getConstArray(); 1549cdf0e10cSrcweir const Reference<XIdlClass>* pRefs2 = rObj2.aIdlClasses.getConstArray(); 1550cdf0e10cSrcweir return memcmp( pRefs1, pRefs2, nCount1 * sizeof( Reference<XIdlClass> ) ) == 0; 1551cdf0e10cSrcweir } 1552cdf0e10cSrcweir 1553cdf0e10cSrcweir }; 1554cdf0e10cSrcweir 1555cdf0e10cSrcweir typedef std::hash_map 1556cdf0e10cSrcweir < 1557cdf0e10cSrcweir hashIntrospectionKey_Impl, 1558cdf0e10cSrcweir IntrospectionAccessStatic_Impl*, 1559cdf0e10cSrcweir hashIntrospectionAccessCache_Impl, 1560cdf0e10cSrcweir hashIntrospectionAccessCache_Impl 1561cdf0e10cSrcweir > 1562cdf0e10cSrcweir IntrospectionAccessCacheMap_Impl; 1563cdf0e10cSrcweir 1564cdf0e10cSrcweir class IntrospectionAccessCacheMap : public IntrospectionAccessCacheMap_Impl 1565cdf0e10cSrcweir { 1566cdf0e10cSrcweir public: 1567cdf0e10cSrcweir ~IntrospectionAccessCacheMap() 1568cdf0e10cSrcweir { 1569cdf0e10cSrcweir IntrospectionAccessCacheMap::iterator iter = begin(); 1570cdf0e10cSrcweir IntrospectionAccessCacheMap::iterator stop = this->end(); 1571cdf0e10cSrcweir while( iter != stop ) 1572cdf0e10cSrcweir { 1573cdf0e10cSrcweir 1574cdf0e10cSrcweir (*iter).second->release(); 1575cdf0e10cSrcweir (*iter).second = NULL; 1576cdf0e10cSrcweir iter++; 1577cdf0e10cSrcweir } 1578cdf0e10cSrcweir } 1579cdf0e10cSrcweir }; 1580cdf0e10cSrcweir 1581cdf0e10cSrcweir 1582cdf0e10cSrcweir // For XTypeProvider 1583cdf0e10cSrcweir struct hashTypeProviderKey_Impl 1584cdf0e10cSrcweir { 1585cdf0e10cSrcweir Reference<XPropertySetInfo> xPropInfo; 1586cdf0e10cSrcweir Sequence< sal_Int8 > maImpIdSeq; 1587cdf0e10cSrcweir sal_Int32 nHitCount; 1588cdf0e10cSrcweir 1589cdf0e10cSrcweir void IncHitCount() const { ((hashTypeProviderKey_Impl*)this)->nHitCount++; } 1590cdf0e10cSrcweir hashTypeProviderKey_Impl() : nHitCount( 0 ) {} 1591cdf0e10cSrcweir hashTypeProviderKey_Impl( const Reference<XPropertySetInfo> & rxPropInfo, const Sequence< sal_Int8 > & aImpIdSeq_ ); 1592cdf0e10cSrcweir }; 1593cdf0e10cSrcweir 1594cdf0e10cSrcweir hashTypeProviderKey_Impl::hashTypeProviderKey_Impl 1595cdf0e10cSrcweir ( 1596cdf0e10cSrcweir const Reference<XPropertySetInfo> & rxPropInfo, 1597cdf0e10cSrcweir const Sequence< sal_Int8 > & aImpIdSeq_ 1598cdf0e10cSrcweir ) 1599cdf0e10cSrcweir : xPropInfo( rxPropInfo ) 1600cdf0e10cSrcweir , maImpIdSeq( aImpIdSeq_ ) 1601cdf0e10cSrcweir , nHitCount( 0 ) 1602cdf0e10cSrcweir {} 1603cdf0e10cSrcweir 1604cdf0e10cSrcweir 1605cdf0e10cSrcweir struct TypeProviderAccessCache_Impl 1606cdf0e10cSrcweir { 1607cdf0e10cSrcweir size_t operator()(const hashTypeProviderKey_Impl & rObj ) const; 1608cdf0e10cSrcweir 1609cdf0e10cSrcweir bool operator()( const hashTypeProviderKey_Impl & rObj1, 1610cdf0e10cSrcweir const hashTypeProviderKey_Impl & rObj2 ) const 1611cdf0e10cSrcweir { 1612cdf0e10cSrcweir if( rObj1.xPropInfo != rObj2.xPropInfo ) 1613cdf0e10cSrcweir return sal_False; 1614cdf0e10cSrcweir 1615cdf0e10cSrcweir bool bEqual = false; 1616cdf0e10cSrcweir sal_Int32 nLen1 = rObj1.maImpIdSeq.getLength(); 1617cdf0e10cSrcweir sal_Int32 nLen2 = rObj2.maImpIdSeq.getLength(); 1618cdf0e10cSrcweir if( nLen1 == nLen2 && nLen1 > 0 ) 1619cdf0e10cSrcweir { 1620cdf0e10cSrcweir const sal_Int8* pId1 = rObj1.maImpIdSeq.getConstArray(); 1621cdf0e10cSrcweir const sal_Int8* pId2 = rObj2.maImpIdSeq.getConstArray(); 1622cdf0e10cSrcweir bEqual = (memcmp( pId1, pId2, nLen1 * sizeof( sal_Int8 ) ) == 0 ); 1623cdf0e10cSrcweir } 1624cdf0e10cSrcweir return bEqual; 1625cdf0e10cSrcweir } 1626cdf0e10cSrcweir }; 1627cdf0e10cSrcweir 1628cdf0e10cSrcweir size_t TypeProviderAccessCache_Impl::operator()(const hashTypeProviderKey_Impl & rObj ) const 1629cdf0e10cSrcweir { 1630cdf0e10cSrcweir const sal_Int32* pBytesAsInt32Array = (const sal_Int32*)rObj.maImpIdSeq.getConstArray(); 1631cdf0e10cSrcweir sal_Int32 nLen = rObj.maImpIdSeq.getLength(); 1632cdf0e10cSrcweir sal_Int32 nCount32 = nLen / 4; 1633cdf0e10cSrcweir sal_Int32 nMod32 = nLen % 4; 1634cdf0e10cSrcweir 1635cdf0e10cSrcweir // XOR with full 32 bit values 1636cdf0e10cSrcweir sal_Int32 nId32 = 0; 1637cdf0e10cSrcweir sal_Int32 i; 1638cdf0e10cSrcweir for( i = 0 ; i < nCount32 ; i++ ) 1639cdf0e10cSrcweir nId32 ^= *(pBytesAsInt32Array++); 1640cdf0e10cSrcweir 1641cdf0e10cSrcweir // XOR with remaining byte values 1642cdf0e10cSrcweir if( nMod32 ) 1643cdf0e10cSrcweir { 1644cdf0e10cSrcweir const sal_Int8* pBytes = (const sal_Int8*)pBytesAsInt32Array; 1645cdf0e10cSrcweir sal_Int8* pInt8_Id32 = (sal_Int8*)&nId32; 1646cdf0e10cSrcweir for( i = 0 ; i < nMod32 ; i++ ) 1647cdf0e10cSrcweir *(pInt8_Id32++) ^= *(pBytes++); 1648cdf0e10cSrcweir } 1649cdf0e10cSrcweir 1650cdf0e10cSrcweir return (size_t)nId32; 1651cdf0e10cSrcweir } 1652cdf0e10cSrcweir 1653cdf0e10cSrcweir 1654cdf0e10cSrcweir typedef std::hash_map 1655cdf0e10cSrcweir < 1656cdf0e10cSrcweir hashTypeProviderKey_Impl, 1657cdf0e10cSrcweir IntrospectionAccessStatic_Impl*, 1658cdf0e10cSrcweir TypeProviderAccessCache_Impl, 1659cdf0e10cSrcweir TypeProviderAccessCache_Impl 1660cdf0e10cSrcweir > 1661cdf0e10cSrcweir TypeProviderAccessCacheMap_Impl; 1662cdf0e10cSrcweir 1663cdf0e10cSrcweir class TypeProviderAccessCacheMap : public TypeProviderAccessCacheMap_Impl 1664cdf0e10cSrcweir { 1665cdf0e10cSrcweir public: 1666cdf0e10cSrcweir ~TypeProviderAccessCacheMap() 1667cdf0e10cSrcweir { 1668cdf0e10cSrcweir TypeProviderAccessCacheMap::iterator iter = begin(); 1669cdf0e10cSrcweir TypeProviderAccessCacheMap::iterator stop = this->end(); 1670cdf0e10cSrcweir while( iter != stop ) 1671cdf0e10cSrcweir { 1672cdf0e10cSrcweir (*iter).second->release(); 1673cdf0e10cSrcweir (*iter).second = NULL; 1674cdf0e10cSrcweir iter++; 1675cdf0e10cSrcweir } 1676cdf0e10cSrcweir } 1677cdf0e10cSrcweir }; 1678cdf0e10cSrcweir 1679cdf0e10cSrcweir #endif 1680cdf0e10cSrcweir 1681cdf0e10cSrcweir 1682cdf0e10cSrcweir //************************* 1683cdf0e10cSrcweir //*** ImplIntrospection *** 1684cdf0e10cSrcweir //************************* 1685cdf0e10cSrcweir 1686cdf0e10cSrcweir struct OIntrospectionMutex 1687cdf0e10cSrcweir { 1688cdf0e10cSrcweir Mutex m_mutex; 1689cdf0e10cSrcweir }; 1690cdf0e10cSrcweir 1691cdf0e10cSrcweir class ImplIntrospection : public XIntrospection 1692cdf0e10cSrcweir , public XServiceInfo 1693cdf0e10cSrcweir , public OIntrospectionMutex 1694cdf0e10cSrcweir , public OComponentHelper 1695cdf0e10cSrcweir { 1696cdf0e10cSrcweir friend class ImplMergeIntrospection; 1697cdf0e10cSrcweir friend class ImplMVCIntrospection; 1698cdf0e10cSrcweir 1699cdf0e10cSrcweir // Implementation der Introspection. 1700cdf0e10cSrcweir // ACHTUNG: RefCounting von Hand !!! 1701cdf0e10cSrcweir IntrospectionAccessStatic_Impl* implInspect(const Any& aToInspectObj); 1702cdf0e10cSrcweir 1703cdf0e10cSrcweir // Save XMultiServiceFactory from createComponent 1704cdf0e10cSrcweir Reference<XMultiServiceFactory> m_xSMgr; 1705cdf0e10cSrcweir 1706cdf0e10cSrcweir // CoreReflection halten 1707cdf0e10cSrcweir Reference< XIdlReflection > mxCoreReflection; 1708cdf0e10cSrcweir 1709cdf0e10cSrcweir // Klassen, deren Methoden eine spezielle Rolle spielen 1710cdf0e10cSrcweir Reference<XIdlClass> mxElementAccessClass; 1711cdf0e10cSrcweir Reference<XIdlClass> mxNameContainerClass; 1712cdf0e10cSrcweir Reference<XIdlClass> mxNameAccessClass; 1713cdf0e10cSrcweir Reference<XIdlClass> mxIndexContainerClass; 1714cdf0e10cSrcweir Reference<XIdlClass> mxIndexAccessClass; 1715cdf0e10cSrcweir Reference<XIdlClass> mxEnumerationAccessClass; 1716cdf0e10cSrcweir Reference<XIdlClass> mxInterfaceClass; 1717cdf0e10cSrcweir Reference<XIdlClass> mxAggregationClass; 1718cdf0e10cSrcweir sal_Bool mbDisposed; 1719cdf0e10cSrcweir 1720cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 1721cdf0e10cSrcweir sal_uInt16 mnCacheEntryCount; 1722cdf0e10cSrcweir sal_uInt16 mnTPCacheEntryCount; 1723cdf0e10cSrcweir IntrospectionAccessCacheMap* mpCache; 1724cdf0e10cSrcweir TypeProviderAccessCacheMap* mpTypeProviderCache; 1725cdf0e10cSrcweir #endif 1726cdf0e10cSrcweir 1727cdf0e10cSrcweir public: 1728cdf0e10cSrcweir ImplIntrospection( const Reference<XMultiServiceFactory> & rXSMgr ); 1729cdf0e10cSrcweir 1730cdf0e10cSrcweir // Methoden von XInterface 1731cdf0e10cSrcweir virtual Any SAL_CALL queryInterface( const Type& rType ) throw( RuntimeException ); 1732cdf0e10cSrcweir virtual void SAL_CALL acquire() throw() { OComponentHelper::acquire(); } 1733cdf0e10cSrcweir virtual void SAL_CALL release() throw() { OComponentHelper::release(); } 1734cdf0e10cSrcweir 1735cdf0e10cSrcweir // XTypeProvider 1736cdf0e10cSrcweir Sequence< Type > SAL_CALL getTypes( ) throw( RuntimeException ); 1737cdf0e10cSrcweir Sequence<sal_Int8> SAL_CALL getImplementationId( ) throw( RuntimeException ); 1738cdf0e10cSrcweir 1739cdf0e10cSrcweir // XServiceInfo 1740cdf0e10cSrcweir ::rtl::OUString SAL_CALL getImplementationName() throw(); 1741cdf0e10cSrcweir sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw(); 1742cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw(); 1743cdf0e10cSrcweir static ::rtl::OUString SAL_CALL getImplementationName_Static( ); 1744cdf0e10cSrcweir static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_Static(void) throw(); 1745cdf0e10cSrcweir 1746cdf0e10cSrcweir // Methoden von XIntrospection 1747cdf0e10cSrcweir virtual Reference<XIntrospectionAccess> SAL_CALL inspect(const Any& aToInspectObj) 1748cdf0e10cSrcweir throw( RuntimeException ); 1749cdf0e10cSrcweir 1750cdf0e10cSrcweir protected: 1751cdf0e10cSrcweir // some XComponent part from OComponentHelper 1752cdf0e10cSrcweir virtual void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException); 1753cdf0e10cSrcweir }; 1754cdf0e10cSrcweir 1755cdf0e10cSrcweir enum MethodType 1756cdf0e10cSrcweir { 1757cdf0e10cSrcweir STANDARD_METHOD, // normale Methode, kein Bezug zu Properties oder Listenern 1758cdf0e10cSrcweir GETSET_METHOD, // gehoert zu einer get/set-Property 1759cdf0e10cSrcweir ADD_LISTENER_METHOD, // add-Methode einer Listener-Schnittstelle 1760cdf0e10cSrcweir REMOVE_LISTENER_METHOD, // remove-Methode einer Listener-Schnittstelle 1761cdf0e10cSrcweir INVALID_METHOD // Methode, deren Klasse nicht beruecksichtigt wird, z.B. XPropertySet 1762cdf0e10cSrcweir }; 1763cdf0e10cSrcweir 1764cdf0e10cSrcweir // Ctor 1765cdf0e10cSrcweir ImplIntrospection::ImplIntrospection( const Reference<XMultiServiceFactory> & rXSMgr ) 1766cdf0e10cSrcweir : OComponentHelper( m_mutex ) 1767cdf0e10cSrcweir , m_xSMgr( rXSMgr ) 1768cdf0e10cSrcweir { 1769cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 1770cdf0e10cSrcweir mnCacheEntryCount = 0; 1771cdf0e10cSrcweir mnTPCacheEntryCount = 0; 1772cdf0e10cSrcweir mpCache = NULL; 1773cdf0e10cSrcweir mpTypeProviderCache = NULL; 1774cdf0e10cSrcweir #endif 1775cdf0e10cSrcweir 1776cdf0e10cSrcweir // Spezielle Klassen holen 1777cdf0e10cSrcweir // Reference< XInterface > xServiceIface = m_xSMgr->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.reflection.CoreReflection")) ); 1778cdf0e10cSrcweir // if( xServiceIface.is() ) 1779cdf0e10cSrcweir // mxCoreReflection = Reference< XIdlReflection >::query( xServiceIface ); 1780cdf0e10cSrcweir Reference< XPropertySet > xProps( rXSMgr, UNO_QUERY ); 1781cdf0e10cSrcweir OSL_ASSERT( xProps.is() ); 1782cdf0e10cSrcweir if (xProps.is()) 1783cdf0e10cSrcweir { 1784cdf0e10cSrcweir Reference< XComponentContext > xContext; 1785cdf0e10cSrcweir xProps->getPropertyValue( 1786cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= xContext; 1787cdf0e10cSrcweir OSL_ASSERT( xContext.is() ); 1788cdf0e10cSrcweir if (xContext.is()) 1789cdf0e10cSrcweir { 1790cdf0e10cSrcweir xContext->getValueByName( 1791cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.reflection.theCoreReflection") ) ) >>= mxCoreReflection; 1792cdf0e10cSrcweir OSL_ENSURE( mxCoreReflection.is(), "### CoreReflection singleton not accessible!?" ); 1793cdf0e10cSrcweir } 1794cdf0e10cSrcweir } 1795cdf0e10cSrcweir if (! mxCoreReflection.is()) 1796cdf0e10cSrcweir { 1797cdf0e10cSrcweir throw DeploymentException( 1798cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.reflection.theCoreReflection singleton not accessible") ), 1799cdf0e10cSrcweir Reference< XInterface >() ); 1800cdf0e10cSrcweir } 1801cdf0e10cSrcweir 1802cdf0e10cSrcweir mxElementAccessClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.container.XElementAccess")) ); 1803cdf0e10cSrcweir mxNameContainerClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.container.XNameContainer")) ); 1804cdf0e10cSrcweir mxNameAccessClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.container.XNameAccess")) ); 1805cdf0e10cSrcweir mxIndexContainerClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.container.XIndexContainer")) ); 1806cdf0e10cSrcweir mxIndexAccessClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.container.XIndexAccess")) ); 1807cdf0e10cSrcweir mxEnumerationAccessClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.container.XEnumerationAccess")) ); 1808cdf0e10cSrcweir mxInterfaceClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XInterface")) ); 1809cdf0e10cSrcweir mxAggregationClass = mxCoreReflection->forName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XAggregation")) ); 1810cdf0e10cSrcweir mbDisposed = sal_False; 1811cdf0e10cSrcweir } 1812cdf0e10cSrcweir 1813cdf0e10cSrcweir // XComponent 1814cdf0e10cSrcweir void ImplIntrospection::dispose() throw(::com::sun::star::uno::RuntimeException) 1815cdf0e10cSrcweir { 1816cdf0e10cSrcweir OComponentHelper::dispose(); 1817cdf0e10cSrcweir 1818cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 1819cdf0e10cSrcweir // Cache loeschen 1820cdf0e10cSrcweir delete mpCache; 1821cdf0e10cSrcweir mpCache = NULL; 1822cdf0e10cSrcweir delete mpTypeProviderCache; 1823cdf0e10cSrcweir mpTypeProviderCache = NULL; 1824cdf0e10cSrcweir #endif 1825cdf0e10cSrcweir 1826cdf0e10cSrcweir mxElementAccessClass = NULL; 1827cdf0e10cSrcweir mxNameContainerClass = NULL; 1828cdf0e10cSrcweir mxNameAccessClass = NULL; 1829cdf0e10cSrcweir mxIndexContainerClass = NULL; 1830cdf0e10cSrcweir mxIndexAccessClass = NULL; 1831cdf0e10cSrcweir mxEnumerationAccessClass = NULL; 1832cdf0e10cSrcweir mxInterfaceClass = NULL; 1833cdf0e10cSrcweir mxAggregationClass = NULL; 1834cdf0e10cSrcweir mbDisposed = sal_True; 1835cdf0e10cSrcweir } 1836cdf0e10cSrcweir 1837cdf0e10cSrcweir 1838cdf0e10cSrcweir //----------------------------------------------------------------------------- 1839cdf0e10cSrcweir 1840cdf0e10cSrcweir // XInterface 1841cdf0e10cSrcweir Any ImplIntrospection::queryInterface( const Type & rType ) 1842cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 1843cdf0e10cSrcweir { 1844cdf0e10cSrcweir Any aRet( ::cppu::queryInterface( 1845cdf0e10cSrcweir rType, 1846cdf0e10cSrcweir static_cast< XIntrospection * >( this ), 1847cdf0e10cSrcweir static_cast< XServiceInfo * >( this ) ) ); 1848cdf0e10cSrcweir 1849cdf0e10cSrcweir return (aRet.hasValue() ? aRet : OComponentHelper::queryInterface( rType )); 1850cdf0e10cSrcweir } 1851cdf0e10cSrcweir 1852cdf0e10cSrcweir // XTypeProvider 1853cdf0e10cSrcweir Sequence< Type > ImplIntrospection::getTypes() 1854cdf0e10cSrcweir throw( RuntimeException ) 1855cdf0e10cSrcweir { 1856cdf0e10cSrcweir static OTypeCollection * s_pTypes = 0; 1857cdf0e10cSrcweir if (! s_pTypes) 1858cdf0e10cSrcweir { 1859cdf0e10cSrcweir MutexGuard aGuard( Mutex::getGlobalMutex() ); 1860cdf0e10cSrcweir if (! s_pTypes) 1861cdf0e10cSrcweir { 1862cdf0e10cSrcweir static OTypeCollection s_aTypes( 1863cdf0e10cSrcweir ::getCppuType( (const Reference< XIntrospection > *)0 ), 1864cdf0e10cSrcweir ::getCppuType( (const Reference< XServiceInfo > *)0 ), 1865cdf0e10cSrcweir OComponentHelper::getTypes() ); 1866cdf0e10cSrcweir s_pTypes = &s_aTypes; 1867cdf0e10cSrcweir } 1868cdf0e10cSrcweir } 1869cdf0e10cSrcweir return s_pTypes->getTypes(); 1870cdf0e10cSrcweir } 1871cdf0e10cSrcweir 1872cdf0e10cSrcweir Sequence< sal_Int8 > ImplIntrospection::getImplementationId() 1873cdf0e10cSrcweir throw( RuntimeException ) 1874cdf0e10cSrcweir { 1875cdf0e10cSrcweir static OImplementationId * s_pId = 0; 1876cdf0e10cSrcweir if (! s_pId) 1877cdf0e10cSrcweir { 1878cdf0e10cSrcweir MutexGuard aGuard( Mutex::getGlobalMutex() ); 1879cdf0e10cSrcweir if (! s_pId) 1880cdf0e10cSrcweir { 1881cdf0e10cSrcweir static OImplementationId s_aId; 1882cdf0e10cSrcweir s_pId = &s_aId; 1883cdf0e10cSrcweir } 1884cdf0e10cSrcweir } 1885cdf0e10cSrcweir return s_pId->getImplementationId(); 1886cdf0e10cSrcweir } 1887cdf0e10cSrcweir 1888cdf0e10cSrcweir 1889cdf0e10cSrcweir // XServiceInfo 1890cdf0e10cSrcweir ::rtl::OUString ImplIntrospection::getImplementationName() throw() 1891cdf0e10cSrcweir { 1892cdf0e10cSrcweir return getImplementationName_Static(); 1893cdf0e10cSrcweir } 1894cdf0e10cSrcweir 1895cdf0e10cSrcweir // XServiceInfo 1896cdf0e10cSrcweir sal_Bool ImplIntrospection::supportsService(const ::rtl::OUString& ServiceName) throw() 1897cdf0e10cSrcweir { 1898cdf0e10cSrcweir Sequence< ::rtl::OUString > aSNL = getSupportedServiceNames(); 1899cdf0e10cSrcweir const ::rtl::OUString * pArray = aSNL.getConstArray(); 1900cdf0e10cSrcweir for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) 1901cdf0e10cSrcweir if( pArray[i] == ServiceName ) 1902cdf0e10cSrcweir return sal_True; 1903cdf0e10cSrcweir return sal_False; 1904cdf0e10cSrcweir } 1905cdf0e10cSrcweir 1906cdf0e10cSrcweir // XServiceInfo 1907cdf0e10cSrcweir Sequence< ::rtl::OUString > ImplIntrospection::getSupportedServiceNames(void) throw() 1908cdf0e10cSrcweir { 1909cdf0e10cSrcweir return getSupportedServiceNames_Static(); 1910cdf0e10cSrcweir } 1911cdf0e10cSrcweir 1912cdf0e10cSrcweir //************************************************************************* 1913cdf0e10cSrcweir // Helper XServiceInfo 1914cdf0e10cSrcweir ::rtl::OUString ImplIntrospection::getImplementationName_Static( ) 1915cdf0e10cSrcweir { 1916cdf0e10cSrcweir return ::rtl::OUString::createFromAscii( IMPLEMENTATION_NAME ); 1917cdf0e10cSrcweir } 1918cdf0e10cSrcweir 1919cdf0e10cSrcweir // ORegistryServiceManager_Static 1920cdf0e10cSrcweir Sequence< ::rtl::OUString > ImplIntrospection::getSupportedServiceNames_Static(void) throw() 1921cdf0e10cSrcweir { 1922cdf0e10cSrcweir Sequence< ::rtl::OUString > aSNS( 1 ); 1923cdf0e10cSrcweir aSNS.getArray()[0] = ::rtl::OUString::createFromAscii( SERVICE_NAME ); 1924cdf0e10cSrcweir return aSNS; 1925cdf0e10cSrcweir } 1926cdf0e10cSrcweir 1927cdf0e10cSrcweir //************************************************************************* 1928cdf0e10cSrcweir 1929cdf0e10cSrcweir // Methoden von XIntrospection 1930cdf0e10cSrcweir Reference<XIntrospectionAccess> ImplIntrospection::inspect(const Any& aToInspectObj) 1931cdf0e10cSrcweir throw( RuntimeException ) 1932cdf0e10cSrcweir { 1933cdf0e10cSrcweir Reference<XIntrospectionAccess> xAccess; 1934cdf0e10cSrcweir 1935cdf0e10cSrcweir if ( aToInspectObj.getValueType().getTypeClass() == TypeClass_TYPE ) 1936cdf0e10cSrcweir { 1937cdf0e10cSrcweir Type aType; 1938cdf0e10cSrcweir aToInspectObj >>= aType; 1939cdf0e10cSrcweir 1940cdf0e10cSrcweir Reference< XIdlClass > xIdlClass = mxCoreReflection->forName(((Type*)(aToInspectObj.getValue()))->getTypeName()); 1941cdf0e10cSrcweir 1942cdf0e10cSrcweir if ( xIdlClass.is() ) 1943cdf0e10cSrcweir { 1944cdf0e10cSrcweir Any aRealInspectObj; 1945cdf0e10cSrcweir aRealInspectObj <<= xIdlClass; 1946cdf0e10cSrcweir 1947cdf0e10cSrcweir IntrospectionAccessStatic_Impl* pStaticImpl = implInspect( aRealInspectObj ); 1948cdf0e10cSrcweir if( pStaticImpl ) 1949cdf0e10cSrcweir xAccess = new ImplIntrospectionAccess( aRealInspectObj, pStaticImpl ); 1950cdf0e10cSrcweir } 1951cdf0e10cSrcweir } 1952cdf0e10cSrcweir else 1953cdf0e10cSrcweir { 1954cdf0e10cSrcweir IntrospectionAccessStatic_Impl* pStaticImpl = implInspect( aToInspectObj ); 1955cdf0e10cSrcweir if( pStaticImpl ) 1956cdf0e10cSrcweir xAccess = new ImplIntrospectionAccess( aToInspectObj, pStaticImpl ); 1957cdf0e10cSrcweir } 1958cdf0e10cSrcweir 1959cdf0e10cSrcweir return xAccess; 1960cdf0e10cSrcweir } 1961cdf0e10cSrcweir 1962cdf0e10cSrcweir //----------------------------------------------------------------------------- 1963cdf0e10cSrcweir 1964cdf0e10cSrcweir // Hashtable fuer Pruefung auf mehrfache Beruecksichtigung von Interfaces 1965cdf0e10cSrcweir struct hashInterface_Impl 1966cdf0e10cSrcweir { 1967cdf0e10cSrcweir size_t operator()(const void* p) const 1968cdf0e10cSrcweir { 1969cdf0e10cSrcweir return (size_t)p; 1970cdf0e10cSrcweir } 1971cdf0e10cSrcweir }; 1972cdf0e10cSrcweir 1973cdf0e10cSrcweir struct eqInterface_Impl 1974cdf0e10cSrcweir { 1975cdf0e10cSrcweir bool operator()(const void* p1, const void* p2) const 1976cdf0e10cSrcweir { 1977cdf0e10cSrcweir return ( p1 == p2 ); 1978cdf0e10cSrcweir } 1979cdf0e10cSrcweir }; 1980cdf0e10cSrcweir 1981cdf0e10cSrcweir typedef std::hash_map 1982cdf0e10cSrcweir < 1983cdf0e10cSrcweir void*, 1984cdf0e10cSrcweir void*, 1985cdf0e10cSrcweir hashInterface_Impl, 1986cdf0e10cSrcweir eqInterface_Impl 1987cdf0e10cSrcweir > 1988cdf0e10cSrcweir CheckedInterfacesMap; 1989cdf0e10cSrcweir 1990cdf0e10cSrcweir 1991cdf0e10cSrcweir 1992cdf0e10cSrcweir // TODO: Spaeter auslagern 1993cdf0e10cSrcweir Reference<XIdlClass> TypeToIdlClass( const Type& rType, const Reference< XMultiServiceFactory > & xMgr ) 1994cdf0e10cSrcweir { 1995cdf0e10cSrcweir static Reference< XIdlReflection > xRefl; 1996cdf0e10cSrcweir 1997cdf0e10cSrcweir // void als Default-Klasse eintragen 1998cdf0e10cSrcweir Reference<XIdlClass> xRetClass; 1999cdf0e10cSrcweir typelib_TypeDescription * pTD = 0; 2000cdf0e10cSrcweir rType.getDescription( &pTD ); 2001cdf0e10cSrcweir if( pTD ) 2002cdf0e10cSrcweir { 2003cdf0e10cSrcweir ::rtl::OUString sOWName( pTD->pTypeName ); 2004cdf0e10cSrcweir if( !xRefl.is() ) 2005cdf0e10cSrcweir { 2006cdf0e10cSrcweir xRefl = Reference< XIdlReflection >( xMgr->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.reflection.CoreReflection")) ), UNO_QUERY ); 2007cdf0e10cSrcweir OSL_ENSURE( xRefl.is(), "### no corereflection!" ); 2008cdf0e10cSrcweir } 2009cdf0e10cSrcweir xRetClass = xRefl->forName( sOWName ); 2010cdf0e10cSrcweir } 2011cdf0e10cSrcweir return xRetClass; 2012cdf0e10cSrcweir } 2013cdf0e10cSrcweir 2014cdf0e10cSrcweir // Implementation der Introspection. 2015cdf0e10cSrcweir IntrospectionAccessStatic_Impl* ImplIntrospection::implInspect(const Any& aToInspectObj) 2016cdf0e10cSrcweir { 2017cdf0e10cSrcweir MutexGuard aGuard( m_mutex ); 2018cdf0e10cSrcweir 2019cdf0e10cSrcweir // Wenn die Introspection schon disposed ist, wird nur ein leeres Ergebnis geliefert 2020cdf0e10cSrcweir if( mbDisposed ) 2021cdf0e10cSrcweir return NULL; 2022cdf0e10cSrcweir 2023cdf0e10cSrcweir // Objekt untersuchen 2024cdf0e10cSrcweir TypeClass eType = aToInspectObj.getValueType().getTypeClass(); 2025cdf0e10cSrcweir if( eType != TypeClass_INTERFACE && eType != TypeClass_STRUCT && eType != TypeClass_EXCEPTION ) 2026cdf0e10cSrcweir return NULL; 2027cdf0e10cSrcweir 2028cdf0e10cSrcweir Reference<XInterface> x; 2029cdf0e10cSrcweir if( eType == TypeClass_INTERFACE ) 2030cdf0e10cSrcweir { 2031cdf0e10cSrcweir // Interface aus dem Any besorgen 2032cdf0e10cSrcweir x = *(Reference<XInterface>*)aToInspectObj.getValue(); 2033cdf0e10cSrcweir if( !x.is() ) 2034cdf0e10cSrcweir return NULL; 2035cdf0e10cSrcweir } 2036cdf0e10cSrcweir 2037cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 2038cdf0e10cSrcweir // Haben wir schon eine Cache-Instanz 2039cdf0e10cSrcweir if( !mpCache ) 2040cdf0e10cSrcweir mpCache = new IntrospectionAccessCacheMap; 2041cdf0e10cSrcweir if( !mpTypeProviderCache ) 2042cdf0e10cSrcweir mpTypeProviderCache = new TypeProviderAccessCacheMap; 2043cdf0e10cSrcweir IntrospectionAccessCacheMap& aCache = *mpCache; 2044cdf0e10cSrcweir TypeProviderAccessCacheMap& aTPCache = *mpTypeProviderCache; 2045cdf0e10cSrcweir 2046cdf0e10cSrcweir // Pointer auf ggf. noetige neue IntrospectionAccess-Instanz 2047cdf0e10cSrcweir IntrospectionAccessStatic_Impl* pAccess = NULL; 2048cdf0e10cSrcweir #else 2049cdf0e10cSrcweir // Pointer auf ggf. noetige neue IntrospectionAccess-Instanz 2050cdf0e10cSrcweir IntrospectionAccessStatic_Impl* pAccess = new IntrospectionAccessStatic_Impl( mxCoreReflection ); 2051cdf0e10cSrcweir #endif 2052cdf0e10cSrcweir 2053cdf0e10cSrcweir // Pruefen: Ist schon ein passendes Access-Objekt gecached? 2054cdf0e10cSrcweir Sequence< Reference<XIdlClass> > SupportedClassSeq; 2055cdf0e10cSrcweir Sequence< Type > SupportedTypesSeq; 2056cdf0e10cSrcweir Reference<XIdlClassProvider> xClassProvider; 2057cdf0e10cSrcweir Reference<XTypeProvider> xTypeProvider; 2058cdf0e10cSrcweir Reference<XIdlClass> xImplClass; 2059cdf0e10cSrcweir Reference<XPropertySetInfo> xPropSetInfo; 2060cdf0e10cSrcweir Reference<XPropertySet> xPropSet; 2061cdf0e10cSrcweir 2062cdf0e10cSrcweir // Bei Interfaces XTypeProvider / XIdlClassProvider- und PropertySet-Interface anfordern 2063cdf0e10cSrcweir if( eType == TypeClass_INTERFACE ) 2064cdf0e10cSrcweir { 2065cdf0e10cSrcweir // XIdlClassProvider 2066cdf0e10cSrcweir xTypeProvider = Reference<XTypeProvider>::query( x ); 2067cdf0e10cSrcweir if( xTypeProvider.is() ) 2068cdf0e10cSrcweir { 2069cdf0e10cSrcweir SupportedTypesSeq = xTypeProvider->getTypes(); 2070cdf0e10cSrcweir sal_Int32 nTypeCount = SupportedTypesSeq.getLength(); 2071cdf0e10cSrcweir if( nTypeCount ) 2072cdf0e10cSrcweir { 2073cdf0e10cSrcweir SupportedClassSeq.realloc( nTypeCount ); 2074cdf0e10cSrcweir Reference<XIdlClass>* pClasses = SupportedClassSeq.getArray(); 2075cdf0e10cSrcweir 2076cdf0e10cSrcweir const Type* pTypes = SupportedTypesSeq.getConstArray(); 2077cdf0e10cSrcweir for( sal_Int32 i = 0 ; i < nTypeCount ; i++ ) 2078cdf0e10cSrcweir { 2079cdf0e10cSrcweir pClasses[ i ] = TypeToIdlClass( pTypes[ i ], m_xSMgr ); 2080cdf0e10cSrcweir } 2081cdf0e10cSrcweir // TODO: Caching! 2082cdf0e10cSrcweir } 2083cdf0e10cSrcweir } 2084cdf0e10cSrcweir else 2085cdf0e10cSrcweir { 2086cdf0e10cSrcweir // XIdlClassProvider 2087cdf0e10cSrcweir xClassProvider = Reference<XIdlClassProvider>::query( x ); 2088cdf0e10cSrcweir if( xClassProvider.is() ) 2089cdf0e10cSrcweir { 2090cdf0e10cSrcweir SupportedClassSeq = xClassProvider->getIdlClasses(); 2091cdf0e10cSrcweir if( SupportedClassSeq.getLength() ) 2092cdf0e10cSrcweir xImplClass = SupportedClassSeq.getConstArray()[0]; 2093cdf0e10cSrcweir } 2094cdf0e10cSrcweir } 2095cdf0e10cSrcweir // #70197, fuer InvocationAdapter: Interface-Typ im Any auch ohne 2096cdf0e10cSrcweir // ClassProvider unterstuetzen 2097cdf0e10cSrcweir if( !xClassProvider.is() && !xTypeProvider.is() ) 2098cdf0e10cSrcweir { 2099cdf0e10cSrcweir xImplClass = TypeToIdlClass( aToInspectObj.getValueType(), m_xSMgr ); 2100cdf0e10cSrcweir SupportedClassSeq.realloc( 1 ); 2101cdf0e10cSrcweir SupportedClassSeq.getArray()[ 0 ] = xImplClass; 2102cdf0e10cSrcweir } 2103cdf0e10cSrcweir 2104cdf0e10cSrcweir xPropSet = Reference<XPropertySet>::query( x ); 2105cdf0e10cSrcweir // Jetzt versuchen, das PropertySetInfo zu bekommen 2106cdf0e10cSrcweir if( xPropSet.is() ) 2107cdf0e10cSrcweir xPropSetInfo = xPropSet->getPropertySetInfo(); 2108cdf0e10cSrcweir } 2109cdf0e10cSrcweir else 2110cdf0e10cSrcweir { 2111cdf0e10cSrcweir xImplClass = TypeToIdlClass( aToInspectObj.getValueType(), m_xSMgr ); 2112cdf0e10cSrcweir } 2113cdf0e10cSrcweir 2114cdf0e10cSrcweir #ifdef USE_INTROSPECTION_CACHE 2115cdf0e10cSrcweir if( xTypeProvider.is() ) 2116cdf0e10cSrcweir { 2117cdf0e10cSrcweir Sequence< sal_Int8 > aImpIdSeq = xTypeProvider->getImplementationId(); 2118cdf0e10cSrcweir sal_Int32 nIdLen = aImpIdSeq.getLength(); 2119cdf0e10cSrcweir 2120cdf0e10cSrcweir if( nIdLen ) 2121cdf0e10cSrcweir { 2122cdf0e10cSrcweir // cache only, if the descriptor class is set 2123cdf0e10cSrcweir hashTypeProviderKey_Impl aKeySeq( xPropSetInfo, aImpIdSeq ); 2124cdf0e10cSrcweir 2125cdf0e10cSrcweir TypeProviderAccessCacheMap::iterator aIt = aTPCache.find( aKeySeq ); 2126cdf0e10cSrcweir if( aIt == aTPCache.end() ) 2127cdf0e10cSrcweir { 2128cdf0e10cSrcweir // not found 2129cdf0e10cSrcweir // Neue Instanz anlegen und unter dem gegebenen Key einfuegen 2130cdf0e10cSrcweir pAccess = new IntrospectionAccessStatic_Impl( mxCoreReflection ); 2131cdf0e10cSrcweir 2132cdf0e10cSrcweir // RefCount von Hand erhoehen, muss beim Entfernen 2133cdf0e10cSrcweir // aus der Hashtable wieder released werden 2134cdf0e10cSrcweir pAccess->acquire(); 2135cdf0e10cSrcweir 2136cdf0e10cSrcweir // Groesse begrenzen, alten Eintrag wieder rausschmeissen 2137cdf0e10cSrcweir if( mnTPCacheEntryCount > INTROSPECTION_CACHE_MAX_SIZE ) 2138cdf0e10cSrcweir { 2139cdf0e10cSrcweir // Access mit dem kleinsten HitCount suchen 2140cdf0e10cSrcweir TypeProviderAccessCacheMap::iterator iter = aTPCache.begin(); 2141cdf0e10cSrcweir TypeProviderAccessCacheMap::iterator end = aTPCache.end(); 2142cdf0e10cSrcweir TypeProviderAccessCacheMap::iterator toDelete = iter; 2143cdf0e10cSrcweir while( iter != end ) 2144cdf0e10cSrcweir { 2145cdf0e10cSrcweir if( (*iter).first.nHitCount < (*toDelete).first.nHitCount ) 2146cdf0e10cSrcweir toDelete = iter; 2147cdf0e10cSrcweir ++iter; 2148cdf0e10cSrcweir } 2149cdf0e10cSrcweir 2150cdf0e10cSrcweir // Gefundenen Eintrag entfernen 2151cdf0e10cSrcweir if( (*toDelete).second ) 2152cdf0e10cSrcweir (*toDelete).second->release(); 2153cdf0e10cSrcweir (*toDelete).second = NULL; 2154cdf0e10cSrcweir aTPCache.erase( toDelete ); 2155cdf0e10cSrcweir } 2156cdf0e10cSrcweir else 2157cdf0e10cSrcweir mnTPCacheEntryCount++; 2158cdf0e10cSrcweir 2159cdf0e10cSrcweir // Neuer Eintrage rein in die Table 2160cdf0e10cSrcweir aKeySeq.nHitCount = 1; 2161cdf0e10cSrcweir aTPCache[ aKeySeq ] = pAccess; 2162cdf0e10cSrcweir 2163cdf0e10cSrcweir } 2164cdf0e10cSrcweir else 2165cdf0e10cSrcweir { 2166cdf0e10cSrcweir // Hit-Count erhoehen 2167cdf0e10cSrcweir (*aIt).first.IncHitCount(); 2168cdf0e10cSrcweir return (*aIt).second; 2169cdf0e10cSrcweir } 2170cdf0e10cSrcweir } 2171cdf0e10cSrcweir } 2172cdf0e10cSrcweir else if( xImplClass.is() ) 2173cdf0e10cSrcweir { 2174cdf0e10cSrcweir // cache only, if the descriptor class is set 2175cdf0e10cSrcweir hashIntrospectionKey_Impl aKeySeq( SupportedClassSeq, xPropSetInfo, xImplClass ); 2176cdf0e10cSrcweir 2177cdf0e10cSrcweir IntrospectionAccessCacheMap::iterator aIt = aCache.find( aKeySeq ); 2178cdf0e10cSrcweir if( aIt == aCache.end() ) 2179cdf0e10cSrcweir { 2180cdf0e10cSrcweir // not found 2181cdf0e10cSrcweir // Neue Instanz anlegen und unter dem gegebenen Key einfuegen 2182cdf0e10cSrcweir pAccess = new IntrospectionAccessStatic_Impl( mxCoreReflection ); 2183cdf0e10cSrcweir 2184cdf0e10cSrcweir // RefCount von Hand erhoehen, muss beim Entfernen 2185cdf0e10cSrcweir // aus der Hashtable wieder released werden 2186cdf0e10cSrcweir pAccess->acquire(); 2187cdf0e10cSrcweir 2188cdf0e10cSrcweir // Groesse begrenzen, alten Eintrag wieder rausschmeissen 2189cdf0e10cSrcweir if( mnCacheEntryCount > INTROSPECTION_CACHE_MAX_SIZE ) 2190cdf0e10cSrcweir { 2191cdf0e10cSrcweir // Access mit dem kleinsten HitCount suchen 2192cdf0e10cSrcweir IntrospectionAccessCacheMap::iterator iter = aCache.begin(); 2193cdf0e10cSrcweir IntrospectionAccessCacheMap::iterator end = aCache.end(); 2194cdf0e10cSrcweir IntrospectionAccessCacheMap::iterator toDelete = iter; 2195cdf0e10cSrcweir while( iter != end ) 2196cdf0e10cSrcweir { 2197cdf0e10cSrcweir if( (*iter).first.nHitCount < (*toDelete).first.nHitCount ) 2198cdf0e10cSrcweir toDelete = iter; 2199cdf0e10cSrcweir ++iter; 2200cdf0e10cSrcweir } 2201cdf0e10cSrcweir 2202cdf0e10cSrcweir // Gefundenen Eintrag entfernen 2203cdf0e10cSrcweir if( (*toDelete).second ) 2204cdf0e10cSrcweir (*toDelete).second->release(); 2205cdf0e10cSrcweir (*toDelete).second = NULL; 2206cdf0e10cSrcweir aCache.erase( toDelete ); 2207cdf0e10cSrcweir } 2208cdf0e10cSrcweir else 2209cdf0e10cSrcweir mnCacheEntryCount++; 2210cdf0e10cSrcweir 2211cdf0e10cSrcweir // Neuer Eintrage rein in die Table 2212cdf0e10cSrcweir aKeySeq.nHitCount = 1; 2213cdf0e10cSrcweir aCache[ aKeySeq ] = pAccess; 2214cdf0e10cSrcweir 2215cdf0e10cSrcweir } 2216cdf0e10cSrcweir else 2217cdf0e10cSrcweir { 2218cdf0e10cSrcweir // Hit-Count erhoehen 2219cdf0e10cSrcweir (*aIt).first.IncHitCount(); 2220cdf0e10cSrcweir return (*aIt).second; 2221cdf0e10cSrcweir } 2222cdf0e10cSrcweir } 2223cdf0e10cSrcweir #endif 2224cdf0e10cSrcweir 2225cdf0e10cSrcweir // Kein Access gecached -> neu anlegen 2226cdf0e10cSrcweir Property* pAllPropArray; 2227cdf0e10cSrcweir Reference<XInterface>* pInterfaces1; 2228cdf0e10cSrcweir Reference<XInterface>* pInterfaces2; 2229cdf0e10cSrcweir sal_Int16* pMapTypeArray; 2230cdf0e10cSrcweir sal_Int32* pPropertyConceptArray; 2231cdf0e10cSrcweir sal_Int32 i; 2232cdf0e10cSrcweir 2233cdf0e10cSrcweir if( !pAccess ) 2234cdf0e10cSrcweir pAccess = new IntrospectionAccessStatic_Impl( mxCoreReflection ); 2235cdf0e10cSrcweir 2236cdf0e10cSrcweir // Referenzen auf wichtige Daten von pAccess 2237cdf0e10cSrcweir sal_Int32& rPropCount = pAccess->mnPropCount; 2238cdf0e10cSrcweir IntrospectionNameMap& rPropNameMap = pAccess->maPropertyNameMap; 2239cdf0e10cSrcweir IntrospectionNameMap& rMethodNameMap = pAccess->maMethodNameMap; 2240cdf0e10cSrcweir LowerToExactNameMap& rLowerToExactNameMap = pAccess->maLowerToExactNameMap; 2241cdf0e10cSrcweir 2242cdf0e10cSrcweir // Schon mal Pointer auf das eigene Property-Feld holen 2243cdf0e10cSrcweir pAllPropArray = pAccess->maAllPropertySeq.getArray(); 2244cdf0e10cSrcweir pInterfaces1 = pAccess->aInterfaceSeq1.getArray(); 2245cdf0e10cSrcweir pInterfaces2 = pAccess->aInterfaceSeq2.getArray(); 2246cdf0e10cSrcweir pMapTypeArray = pAccess->maMapTypeSeq.getArray(); 2247cdf0e10cSrcweir pPropertyConceptArray = pAccess->maPropertyConceptSeq.getArray(); 2248cdf0e10cSrcweir 2249cdf0e10cSrcweir //************************* 2250cdf0e10cSrcweir //*** Analyse vornehmen *** 2251cdf0e10cSrcweir //************************* 2252cdf0e10cSrcweir if( eType == TypeClass_INTERFACE ) 2253cdf0e10cSrcweir { 2254cdf0e10cSrcweir // Zunaechst nach speziellen Interfaces suchen, die fuer 2255cdf0e10cSrcweir // die Introspection von besonderer Bedeutung sind. 2256cdf0e10cSrcweir 2257cdf0e10cSrcweir // XPropertySet vorhanden? 2258cdf0e10cSrcweir if( xPropSet.is() && xPropSetInfo.is() ) 2259cdf0e10cSrcweir { 2260cdf0e10cSrcweir // Gibt es auch ein FastPropertySet? 2261cdf0e10cSrcweir Reference<XFastPropertySet> xDummy = Reference<XFastPropertySet>::query( x ); 2262cdf0e10cSrcweir sal_Bool bFast = pAccess->mbFastPropSet = xDummy.is(); 2263cdf0e10cSrcweir 2264cdf0e10cSrcweir Sequence<Property> aPropSeq = xPropSetInfo->getProperties(); 2265cdf0e10cSrcweir const Property* pProps = aPropSeq.getConstArray(); 2266cdf0e10cSrcweir sal_Int32 nLen = aPropSeq.getLength(); 2267cdf0e10cSrcweir 2268cdf0e10cSrcweir // Bei FastPropertySet muessen wir uns die Original-Handles merken 2269cdf0e10cSrcweir if( bFast ) 2270cdf0e10cSrcweir pAccess->mpOrgPropertyHandleArray = new sal_Int32[ nLen ]; 2271cdf0e10cSrcweir 2272cdf0e10cSrcweir for( i = 0 ; i < nLen ; i++ ) 2273cdf0e10cSrcweir { 2274cdf0e10cSrcweir // Property in eigene Liste uebernehmen 2275cdf0e10cSrcweir pAccess->checkPropertyArraysSize 2276cdf0e10cSrcweir ( pAllPropArray, pMapTypeArray, pPropertyConceptArray, rPropCount ); 2277cdf0e10cSrcweir Property& rProp = pAllPropArray[ rPropCount ]; 2278cdf0e10cSrcweir rProp = pProps[ i ]; 2279cdf0e10cSrcweir 2280cdf0e10cSrcweir if( bFast ) 2281cdf0e10cSrcweir pAccess->mpOrgPropertyHandleArray[ i ] = rProp.Handle; 2282cdf0e10cSrcweir 2283cdf0e10cSrcweir // PropCount als Handle fuer das eigene FastPropertySet eintragen 2284cdf0e10cSrcweir rProp.Handle = rPropCount; 2285cdf0e10cSrcweir 2286cdf0e10cSrcweir // Art der Property merken 2287cdf0e10cSrcweir pMapTypeArray[ rPropCount ] = MAP_PROPERTY_SET; 2288cdf0e10cSrcweir pPropertyConceptArray[ rPropCount ] = PROPERTYSET; 2289cdf0e10cSrcweir pAccess->mnPropertySetPropCount++; 2290cdf0e10cSrcweir 2291cdf0e10cSrcweir // Namen in Hashtable eintragen, wenn nicht schon bekannt 2292cdf0e10cSrcweir ::rtl::OUString aPropName = rProp.Name; 2293cdf0e10cSrcweir 2294cdf0e10cSrcweir // Haben wir den Namen schon? 2295cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = rPropNameMap.find( aPropName ); 2296cdf0e10cSrcweir if( aIt == rPropNameMap.end() ) 2297cdf0e10cSrcweir { 2298cdf0e10cSrcweir // Neuer Eintrag in die Hashtable 2299cdf0e10cSrcweir rPropNameMap[ aPropName ] = rPropCount; 2300cdf0e10cSrcweir 2301cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 2302cdf0e10cSrcweir rLowerToExactNameMap[ toLower( aPropName ) ] = aPropName; 2303cdf0e10cSrcweir } 2304cdf0e10cSrcweir else 2305cdf0e10cSrcweir { 2306cdf0e10cSrcweir OSL_ENSURE( sal_False, 2307cdf0e10cSrcweir ::rtl::OString( "Introspection: Property \"" ) + 2308cdf0e10cSrcweir ::rtl::OUStringToOString( aPropName, RTL_TEXTENCODING_ASCII_US ) + 2309cdf0e10cSrcweir ::rtl::OString( "\" found more than once in PropertySet" ) ); 2310cdf0e10cSrcweir } 2311cdf0e10cSrcweir 2312cdf0e10cSrcweir // Count pflegen 2313cdf0e10cSrcweir rPropCount++; 2314cdf0e10cSrcweir } 2315cdf0e10cSrcweir } 2316cdf0e10cSrcweir 2317cdf0e10cSrcweir 2318cdf0e10cSrcweir // Jetzt alle weiteren implementierten Interfaces durchgehen 2319cdf0e10cSrcweir // Diese muessen durch das XIdlClassProvider-Interface geliefert werden. 2320cdf0e10cSrcweir // #70197, fuer InvocationAdapter: Interface-Typ im Any auch ohne 2321cdf0e10cSrcweir // ClassProvider unterstuetzen 2322cdf0e10cSrcweir //if( xClassProvider.is() ) 2323cdf0e10cSrcweir { 2324cdf0e10cSrcweir // Indizes in die Export-Tabellen 2325cdf0e10cSrcweir sal_Int32 iAllExportedMethod = 0; 2326cdf0e10cSrcweir sal_Int32 iAllSupportedListener = 0; 2327cdf0e10cSrcweir 2328cdf0e10cSrcweir // Hashtable fuer Pruefung auf mehrfache Beruecksichtigung von Interfaces 2329cdf0e10cSrcweir CheckedInterfacesMap aCheckedInterfacesMap; 2330cdf0e10cSrcweir 2331cdf0e10cSrcweir // Flag, ob XInterface-Methoden erfasst werden sollen 2332cdf0e10cSrcweir // (das darf nur einmal erfolgen, initial zulassen) 2333cdf0e10cSrcweir sal_Bool bXInterfaceIsInvalid = sal_False; 2334cdf0e10cSrcweir 2335cdf0e10cSrcweir // Flag, ob die XInterface-Methoden schon erfasst wurden. Wenn sal_True, 2336cdf0e10cSrcweir // wird bXInterfaceIsInvalid am Ende der Iface-Schleife aktiviert und 2337cdf0e10cSrcweir // XInterface-Methoden werden danach abgeklemmt. 2338cdf0e10cSrcweir sal_Bool bFoundXInterface = sal_False; 2339cdf0e10cSrcweir 2340cdf0e10cSrcweir // Schleife ueber alle vom ClassProvider angegebenen Klassen 2341cdf0e10cSrcweir sal_Int32 nClassCount = SupportedClassSeq.getLength(); 2342cdf0e10cSrcweir for( sal_Int32 nIdx = 0 ; nIdx < nClassCount; nIdx++ ) 2343cdf0e10cSrcweir { 2344cdf0e10cSrcweir Reference<XIdlClass> xImplClass2 = SupportedClassSeq.getConstArray()[nIdx]; 2345cdf0e10cSrcweir while( xImplClass2.is() ) 2346cdf0e10cSrcweir { 2347cdf0e10cSrcweir // Interfaces der Implementation holen 2348cdf0e10cSrcweir Sequence< Reference<XIdlClass> > aClassSeq = xImplClass2->getInterfaces(); 2349cdf0e10cSrcweir sal_Int32 nIfaceCount = aClassSeq.getLength(); 2350cdf0e10cSrcweir 2351cdf0e10cSrcweir aClassSeq.realloc( nIfaceCount + 1 ); 2352cdf0e10cSrcweir aClassSeq.getArray()[ nIfaceCount ] = xImplClass2; 2353cdf0e10cSrcweir nIfaceCount++; 2354cdf0e10cSrcweir 2355cdf0e10cSrcweir const Reference<XIdlClass>* pParamArray = aClassSeq.getConstArray(); 2356cdf0e10cSrcweir 2357cdf0e10cSrcweir for( sal_Int32 j = 0 ; j < nIfaceCount ; j++ ) 2358cdf0e10cSrcweir { 2359cdf0e10cSrcweir const Reference<XIdlClass>& rxIfaceClass = pParamArray[j]; 2360cdf0e10cSrcweir 2361cdf0e10cSrcweir // Pruefen, ob das Interface schon beruecksichtigt wurde. 2362cdf0e10cSrcweir XInterface* pIface = SAL_STATIC_CAST( XInterface*, rxIfaceClass.get() ); 2363cdf0e10cSrcweir if( aCheckedInterfacesMap.count( pIface ) > 0 ) 2364cdf0e10cSrcweir { 2365cdf0e10cSrcweir // Kennen wir schon 2366cdf0e10cSrcweir continue; 2367cdf0e10cSrcweir } 2368cdf0e10cSrcweir else 2369cdf0e10cSrcweir { 2370cdf0e10cSrcweir // Sonst eintragen 2371cdf0e10cSrcweir aCheckedInterfacesMap[ pIface ] = pIface; 2372cdf0e10cSrcweir } 2373cdf0e10cSrcweir 2374cdf0e10cSrcweir //******************************************************************** 2375cdf0e10cSrcweir 2376cdf0e10cSrcweir // 2. Fields als Properties registrieren 2377cdf0e10cSrcweir 2378cdf0e10cSrcweir // Felder holen 2379cdf0e10cSrcweir Sequence< Reference<XIdlField> > fields = rxIfaceClass->getFields(); 2380cdf0e10cSrcweir const Reference<XIdlField>* pFields = fields.getConstArray(); 2381cdf0e10cSrcweir sal_Int32 nLen = fields.getLength(); 2382cdf0e10cSrcweir 2383cdf0e10cSrcweir for( i = 0 ; i < nLen ; i++ ) 2384cdf0e10cSrcweir { 2385cdf0e10cSrcweir Reference<XIdlField> xField = pFields[i]; 2386cdf0e10cSrcweir Reference<XIdlClass> xPropType = xField->getType(); 2387cdf0e10cSrcweir 2388cdf0e10cSrcweir // Ist die PropertySequence gross genug? 2389cdf0e10cSrcweir pAccess->checkPropertyArraysSize 2390cdf0e10cSrcweir ( pAllPropArray, pMapTypeArray, pPropertyConceptArray, rPropCount ); 2391cdf0e10cSrcweir 2392cdf0e10cSrcweir // In eigenes Property-Array eintragen 2393cdf0e10cSrcweir Property& rProp = pAllPropArray[ rPropCount ]; 2394cdf0e10cSrcweir ::rtl::OUString aFieldName = xField->getName(); 2395cdf0e10cSrcweir rProp.Name = aFieldName; 2396cdf0e10cSrcweir rProp.Handle = rPropCount; 2397cdf0e10cSrcweir Type aFieldType( xPropType->getTypeClass(), xPropType->getName() ); 2398cdf0e10cSrcweir rProp.Type = aFieldType; 2399cdf0e10cSrcweir FieldAccessMode eAccessMode = xField->getAccessMode(); 2400cdf0e10cSrcweir rProp.Attributes = (eAccessMode == FieldAccessMode_READONLY || 2401cdf0e10cSrcweir eAccessMode == FieldAccessMode_CONST) 2402cdf0e10cSrcweir ? READONLY : 0; 2403cdf0e10cSrcweir 2404cdf0e10cSrcweir // Namen in Hashtable eintragen 2405cdf0e10cSrcweir ::rtl::OUString aPropName = rProp.Name; 2406cdf0e10cSrcweir 2407cdf0e10cSrcweir // Haben wir den Namen schon? 2408cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = rPropNameMap.find( aPropName ); 2409cdf0e10cSrcweir if( !( aIt == rPropNameMap.end() ) ) 2410cdf0e10cSrcweir { 2411cdf0e10cSrcweir /* TODO 2412cdf0e10cSrcweir OSL_TRACE( 2413cdf0e10cSrcweir String( "Introspection: Property \"" ) + 2414cdf0e10cSrcweir OOUStringToString( aPropName, CHARSET_SYSTEM ) + 2415cdf0e10cSrcweir String( "\" found more than once" ) ); 2416cdf0e10cSrcweir */ 2417cdf0e10cSrcweir continue; 2418cdf0e10cSrcweir } 2419cdf0e10cSrcweir 2420cdf0e10cSrcweir // Neuer Eintrag in die Hashtable 2421cdf0e10cSrcweir rPropNameMap[ aPropName ] = rPropCount; 2422cdf0e10cSrcweir 2423cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 2424cdf0e10cSrcweir rLowerToExactNameMap[ toLower( aPropName ) ] = aPropName; 2425cdf0e10cSrcweir 2426cdf0e10cSrcweir // Field merken 2427cdf0e10cSrcweir pAccess->checkInterfaceArraySize( pAccess->aInterfaceSeq1, 2428cdf0e10cSrcweir pInterfaces1, rPropCount ); 2429cdf0e10cSrcweir pInterfaces1[ rPropCount ] = xField; 2430cdf0e10cSrcweir 2431cdf0e10cSrcweir // Art der Property merken 2432cdf0e10cSrcweir pMapTypeArray[ rPropCount ] = MAP_FIELD; 2433cdf0e10cSrcweir pPropertyConceptArray[ rPropCount ] = ATTRIBUTES; 2434cdf0e10cSrcweir pAccess->mnAttributePropCount++; 2435cdf0e10cSrcweir 2436cdf0e10cSrcweir // Count pflegen 2437cdf0e10cSrcweir rPropCount++; 2438cdf0e10cSrcweir } 2439cdf0e10cSrcweir 2440cdf0e10cSrcweir //******************************************************************** 2441cdf0e10cSrcweir 2442cdf0e10cSrcweir // 3. Methoden 2443cdf0e10cSrcweir 2444cdf0e10cSrcweir // Zaehler fuer die gefundenen Listener 2445cdf0e10cSrcweir sal_Int32 nListenerCount = 0; 2446cdf0e10cSrcweir 2447cdf0e10cSrcweir // Alle Methoden holen und merken 2448cdf0e10cSrcweir Sequence< Reference<XIdlMethod> > methods = rxIfaceClass->getMethods(); 2449cdf0e10cSrcweir const Reference<XIdlMethod>* pSourceMethods = methods.getConstArray(); 2450cdf0e10cSrcweir sal_Int32 nSourceMethodCount = methods.getLength(); 2451cdf0e10cSrcweir 2452cdf0e10cSrcweir // 3. a) get/set- und Listener-Methoden suchen 2453cdf0e10cSrcweir 2454cdf0e10cSrcweir // Feld fuer Infos ueber die Methoden anlegen, damit spaeter leicht die Methoden 2455cdf0e10cSrcweir // gefunden werden koennen, die nicht im Zusammenhang mit Properties oder Listenern 2456cdf0e10cSrcweir // stehen. NEU: auch MethodConceptArray initialisieren 2457cdf0e10cSrcweir MethodType* pMethodTypes = new MethodType[ nSourceMethodCount ]; 2458cdf0e10cSrcweir sal_Int32* pLocalMethodConcepts = new sal_Int32[ nSourceMethodCount ]; 2459cdf0e10cSrcweir for( i = 0 ; i < nSourceMethodCount ; i++ ) 2460cdf0e10cSrcweir { 2461cdf0e10cSrcweir pMethodTypes[ i ] = STANDARD_METHOD; 2462cdf0e10cSrcweir pLocalMethodConcepts[ i ] = 0; 2463cdf0e10cSrcweir } 2464cdf0e10cSrcweir 2465cdf0e10cSrcweir ::rtl::OUString aMethName; 2466cdf0e10cSrcweir ::rtl::OUString aPropName; 2467cdf0e10cSrcweir ::rtl::OUString aStartStr; 2468cdf0e10cSrcweir for( i = 0 ; i < nSourceMethodCount ; i++ ) 2469cdf0e10cSrcweir { 2470cdf0e10cSrcweir // Methode ansprechen 2471cdf0e10cSrcweir const Reference<XIdlMethod>& rxMethod_i = pSourceMethods[i]; 2472cdf0e10cSrcweir sal_Int32& rMethodConcept_i = pLocalMethodConcepts[ i ]; 2473cdf0e10cSrcweir 2474cdf0e10cSrcweir // Namen besorgen 2475cdf0e10cSrcweir aMethName = rxMethod_i->getName(); 2476cdf0e10cSrcweir 2477cdf0e10cSrcweir // Methoden katalogisieren 2478cdf0e10cSrcweir // Alle (?) Methoden von XInterface filtern, damit z.B. nicht 2479cdf0e10cSrcweir // vom Scripting aus aquire oder release gerufen werden kann 2480cdf0e10cSrcweir if( rxMethod_i->getDeclaringClass()->equals( mxInterfaceClass ) ) 2481cdf0e10cSrcweir { 2482cdf0e10cSrcweir // XInterface-Methoden sind hiermit einmal beruecksichtigt 2483cdf0e10cSrcweir bFoundXInterface = sal_True; 2484cdf0e10cSrcweir 2485cdf0e10cSrcweir if( bXInterfaceIsInvalid ) 2486cdf0e10cSrcweir { 2487cdf0e10cSrcweir pMethodTypes[ i ] = INVALID_METHOD; 2488cdf0e10cSrcweir continue; 2489cdf0e10cSrcweir } 2490cdf0e10cSrcweir else 2491cdf0e10cSrcweir { 2492cdf0e10cSrcweir if( aMethName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("queryInterface")) ) 2493cdf0e10cSrcweir { 2494cdf0e10cSrcweir rMethodConcept_i |= MethodConcept::DANGEROUS; 2495cdf0e10cSrcweir continue; 2496cdf0e10cSrcweir } 2497cdf0e10cSrcweir } 2498cdf0e10cSrcweir } 2499cdf0e10cSrcweir else if( rxMethod_i->getDeclaringClass()->equals( mxAggregationClass ) ) 2500cdf0e10cSrcweir { 2501cdf0e10cSrcweir if( aMethName == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("setDelegator")) ) 2502cdf0e10cSrcweir { 2503cdf0e10cSrcweir rMethodConcept_i |= MethodConcept::DANGEROUS; 2504cdf0e10cSrcweir continue; 2505cdf0e10cSrcweir } 2506cdf0e10cSrcweir } 2507cdf0e10cSrcweir else if( rxMethod_i->getDeclaringClass()->equals( mxElementAccessClass ) ) 2508cdf0e10cSrcweir { 2509cdf0e10cSrcweir rMethodConcept_i |= ( NAMECONTAINER | 2510cdf0e10cSrcweir INDEXCONTAINER | 2511cdf0e10cSrcweir ENUMERATION ); 2512cdf0e10cSrcweir } 2513cdf0e10cSrcweir else if( rxMethod_i->getDeclaringClass()->equals( mxNameContainerClass ) || 2514cdf0e10cSrcweir rxMethod_i->getDeclaringClass()->equals( mxNameAccessClass ) ) 2515cdf0e10cSrcweir { 2516cdf0e10cSrcweir rMethodConcept_i |= NAMECONTAINER; 2517cdf0e10cSrcweir } 2518cdf0e10cSrcweir else if( rxMethod_i->getDeclaringClass()->equals( mxIndexContainerClass ) || 2519cdf0e10cSrcweir rxMethod_i->getDeclaringClass()->equals( mxIndexAccessClass ) ) 2520cdf0e10cSrcweir { 2521cdf0e10cSrcweir rMethodConcept_i |= INDEXCONTAINER; 2522cdf0e10cSrcweir } 2523cdf0e10cSrcweir else if( rxMethod_i->getDeclaringClass()->equals( mxEnumerationAccessClass ) ) 2524cdf0e10cSrcweir { 2525cdf0e10cSrcweir rMethodConcept_i |= ENUMERATION; 2526cdf0e10cSrcweir } 2527cdf0e10cSrcweir 2528cdf0e10cSrcweir // Wenn der Name zu kurz ist, wird's sowieso nichts 2529cdf0e10cSrcweir if( aMethName.getLength() <= 3 ) 2530cdf0e10cSrcweir continue; 2531cdf0e10cSrcweir 2532cdf0e10cSrcweir // Ist es eine get-Methode? 2533cdf0e10cSrcweir aStartStr = aMethName.copy( 0, 3 ); 2534cdf0e10cSrcweir if( aStartStr == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("get")) ) 2535cdf0e10cSrcweir { 2536cdf0e10cSrcweir // Namen der potentiellen Property 2537cdf0e10cSrcweir aPropName = aMethName.copy( 3 ); 2538cdf0e10cSrcweir 2539cdf0e10cSrcweir // get-Methode darf keinen Parameter haben 2540cdf0e10cSrcweir Sequence< Reference<XIdlClass> > getParams = rxMethod_i->getParameterTypes(); 2541cdf0e10cSrcweir if( getParams.getLength() > 0 ) 2542cdf0e10cSrcweir { 2543cdf0e10cSrcweir continue; 2544cdf0e10cSrcweir } 2545cdf0e10cSrcweir 2546cdf0e10cSrcweir // Haben wir den Namen schon? 2547cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = rPropNameMap.find( aPropName ); 2548cdf0e10cSrcweir if( !( aIt == rPropNameMap.end() ) ) 2549cdf0e10cSrcweir { 2550cdf0e10cSrcweir /* TODO 2551cdf0e10cSrcweir OSL_TRACE( 2552cdf0e10cSrcweir String( "Introspection: Property \"" ) + 2553cdf0e10cSrcweir OOUStringToString( aPropName, CHARSET_SYSTEM ) + 2554cdf0e10cSrcweir String( "\" found more than once" ) ); 2555cdf0e10cSrcweir */ 2556cdf0e10cSrcweir continue; 2557cdf0e10cSrcweir } 2558cdf0e10cSrcweir 2559cdf0e10cSrcweir // Eine readonly-Property ist es jetzt mindestens schon 2560cdf0e10cSrcweir rMethodConcept_i |= PROPERTY; 2561cdf0e10cSrcweir 2562cdf0e10cSrcweir pMethodTypes[i] = GETSET_METHOD; 2563cdf0e10cSrcweir Reference<XIdlClass> xGetRetType = rxMethod_i->getReturnType(); 2564cdf0e10cSrcweir 2565cdf0e10cSrcweir // Ist die PropertySequence gross genug? 2566cdf0e10cSrcweir pAccess->checkPropertyArraysSize 2567cdf0e10cSrcweir ( pAllPropArray, pMapTypeArray, pPropertyConceptArray, rPropCount ); 2568cdf0e10cSrcweir 2569cdf0e10cSrcweir // In eigenes Property-Array eintragen 2570cdf0e10cSrcweir Property& rProp = pAllPropArray[ rPropCount ]; 2571cdf0e10cSrcweir rProp.Name = aPropName; 2572cdf0e10cSrcweir rProp.Handle = rPropCount; 2573cdf0e10cSrcweir rProp.Type = Type( xGetRetType->getTypeClass(), xGetRetType->getName() ); 2574cdf0e10cSrcweir rProp.Attributes = READONLY; 2575cdf0e10cSrcweir 2576cdf0e10cSrcweir // Neuer Eintrag in die Hashtable 2577cdf0e10cSrcweir rPropNameMap[ aPropName ] = rPropCount; 2578cdf0e10cSrcweir 2579cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 2580cdf0e10cSrcweir rLowerToExactNameMap[ toLower( aPropName ) ] = aPropName; 2581cdf0e10cSrcweir 2582cdf0e10cSrcweir // get-Methode merken 2583cdf0e10cSrcweir pAccess->checkInterfaceArraySize( pAccess->aInterfaceSeq1, 2584cdf0e10cSrcweir pInterfaces1, rPropCount ); 2585cdf0e10cSrcweir pInterfaces1[ rPropCount ] = rxMethod_i; 2586cdf0e10cSrcweir 2587cdf0e10cSrcweir // Art der Property merken 2588cdf0e10cSrcweir pMapTypeArray[ rPropCount ] = MAP_GETSET; 2589cdf0e10cSrcweir pPropertyConceptArray[ rPropCount ] = METHODS; 2590cdf0e10cSrcweir pAccess->mnMethodPropCount++; 2591cdf0e10cSrcweir 2592cdf0e10cSrcweir // Passende set-Methode suchen 2593cdf0e10cSrcweir sal_Int32 k; 2594cdf0e10cSrcweir for( k = 0 ; k < nSourceMethodCount ; k++ ) 2595cdf0e10cSrcweir { 2596cdf0e10cSrcweir // Methode ansprechen 2597cdf0e10cSrcweir const Reference<XIdlMethod>& rxMethod_k = pSourceMethods[k]; 2598cdf0e10cSrcweir 2599cdf0e10cSrcweir // Nur Methoden nehmen, die nicht schon zugeordnet sind 2600cdf0e10cSrcweir if( k == i || pMethodTypes[k] != STANDARD_METHOD ) 2601cdf0e10cSrcweir continue; 2602cdf0e10cSrcweir 2603cdf0e10cSrcweir // Name holen und auswerten 2604cdf0e10cSrcweir ::rtl::OUString aMethName2 = rxMethod_k->getName(); 2605cdf0e10cSrcweir ::rtl::OUString aStartStr2 = aMethName2.copy( 0, 3 ); 2606cdf0e10cSrcweir // ACHTUNG: Wegen SDL-Bug NICHT != bei ::rtl::OUString verwenden !!! 2607cdf0e10cSrcweir if( !( aStartStr2 == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("set")) ) ) 2608cdf0e10cSrcweir continue; 2609cdf0e10cSrcweir 2610cdf0e10cSrcweir // Ist es denn der gleiche Name? 2611cdf0e10cSrcweir ::rtl::OUString aPropName2 = aMethName2.copy( 3 ); 2612cdf0e10cSrcweir // ACHTUNG: Wegen SDL-Bug NICHT != bei ::rtl::OUString verwenden !!! 2613cdf0e10cSrcweir if( !( aPropName == aPropName2 ) ) 2614cdf0e10cSrcweir continue; 2615cdf0e10cSrcweir 2616cdf0e10cSrcweir // set-Methode muss void returnen 2617cdf0e10cSrcweir Reference<XIdlClass> xSetRetType = rxMethod_k->getReturnType(); 2618cdf0e10cSrcweir if( xSetRetType->getTypeClass() != TypeClass_VOID ) 2619cdf0e10cSrcweir { 2620cdf0e10cSrcweir continue; 2621cdf0e10cSrcweir } 2622cdf0e10cSrcweir 2623cdf0e10cSrcweir // set-Methode darf nur einen Parameter haben 2624cdf0e10cSrcweir Sequence< Reference<XIdlClass> > setParams = rxMethod_k->getParameterTypes(); 2625cdf0e10cSrcweir sal_Int32 nParamCount = setParams.getLength(); 2626cdf0e10cSrcweir if( nParamCount != 1 ) 2627cdf0e10cSrcweir { 2628cdf0e10cSrcweir continue; 2629cdf0e10cSrcweir } 2630cdf0e10cSrcweir 2631cdf0e10cSrcweir // Jetzt muss nur noch der return-Typ dem Parameter-Typ entsprechen 2632cdf0e10cSrcweir const Reference<XIdlClass>* pParamArray2 = setParams.getConstArray(); 2633cdf0e10cSrcweir Reference<XIdlClass> xParamType = pParamArray2[ 0 ]; 2634cdf0e10cSrcweir if( xParamType->equals( xGetRetType ) ) 2635cdf0e10cSrcweir { 2636cdf0e10cSrcweir pLocalMethodConcepts[ k ] = PROPERTY; 2637cdf0e10cSrcweir 2638cdf0e10cSrcweir pMethodTypes[k] = GETSET_METHOD; 2639cdf0e10cSrcweir 2640cdf0e10cSrcweir // ReadOnly-Flag wieder loschen 2641cdf0e10cSrcweir rProp.Attributes &= ~READONLY; 2642cdf0e10cSrcweir 2643cdf0e10cSrcweir // set-Methode merken 2644cdf0e10cSrcweir pAccess->checkInterfaceArraySize( pAccess->aInterfaceSeq2, 2645cdf0e10cSrcweir pInterfaces2, rPropCount ); 2646cdf0e10cSrcweir pInterfaces2[ rPropCount ] = rxMethod_k; 2647cdf0e10cSrcweir } 2648cdf0e10cSrcweir } 2649cdf0e10cSrcweir 2650cdf0e10cSrcweir // Count pflegen 2651cdf0e10cSrcweir rPropCount++; 2652cdf0e10cSrcweir } 2653cdf0e10cSrcweir 2654cdf0e10cSrcweir // Ist es eine addListener-Methode? 2655cdf0e10cSrcweir else if( aStartStr == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("add")) ) 2656cdf0e10cSrcweir { 2657cdf0e10cSrcweir ::rtl::OUString aListenerStr( RTL_CONSTASCII_USTRINGPARAM("Listener" ) ); 2658cdf0e10cSrcweir 2659cdf0e10cSrcweir // Namen der potentiellen Property 2660cdf0e10cSrcweir sal_Int32 nStrLen = aMethName.getLength(); 2661cdf0e10cSrcweir sal_Int32 nCopyLen = nStrLen - aListenerStr.getLength(); 2662cdf0e10cSrcweir ::rtl::OUString aEndStr = aMethName.copy( nCopyLen > 0 ? nCopyLen : 0 ); 2663cdf0e10cSrcweir 2664cdf0e10cSrcweir // Endet das Teil auf Listener? 2665cdf0e10cSrcweir // ACHTUNG: Wegen SDL-Bug NICHT != bei ::rtl::OUString verwenden !!! 2666cdf0e10cSrcweir if( !( aEndStr == aListenerStr ) ) 2667cdf0e10cSrcweir continue; 2668cdf0e10cSrcweir 2669cdf0e10cSrcweir // Welcher Listener? 2670cdf0e10cSrcweir ::rtl::OUString aListenerName = aMethName.copy( 3, nStrLen - aListenerStr.getLength() - 3 ); 2671cdf0e10cSrcweir 2672cdf0e10cSrcweir // TODO: Hier koennten noch genauere Pruefungen vorgenommen werden 2673cdf0e10cSrcweir // - Rueckgabe-Typ 2674cdf0e10cSrcweir // - Anzahl und Art der Parameter 2675cdf0e10cSrcweir 2676cdf0e10cSrcweir 2677cdf0e10cSrcweir // Passende remove-Methode suchen, sonst gilt's nicht 2678cdf0e10cSrcweir sal_Int32 k; 2679cdf0e10cSrcweir for( k = 0 ; k < nSourceMethodCount ; k++ ) 2680cdf0e10cSrcweir { 2681cdf0e10cSrcweir // Methode ansprechen 2682cdf0e10cSrcweir const Reference<XIdlMethod>& rxMethod_k = pSourceMethods[k]; 2683cdf0e10cSrcweir 2684cdf0e10cSrcweir // Nur Methoden nehmen, die nicht schon zugeordnet sind 2685cdf0e10cSrcweir if( k == i || pMethodTypes[k] != STANDARD_METHOD ) 2686cdf0e10cSrcweir continue; 2687cdf0e10cSrcweir 2688cdf0e10cSrcweir // Name holen und auswerten 2689cdf0e10cSrcweir ::rtl::OUString aMethName2 = rxMethod_k->getName(); 2690cdf0e10cSrcweir sal_Int32 nNameLen = aMethName2.getLength(); 2691cdf0e10cSrcweir sal_Int32 nCopyLen2 = (nNameLen < 6) ? nNameLen : 6; 2692cdf0e10cSrcweir ::rtl::OUString aStartStr2 = aMethName2.copy( 0, nCopyLen2 ); 2693cdf0e10cSrcweir ::rtl::OUString aRemoveStr( RTL_CONSTASCII_USTRINGPARAM("remove" ) ); 2694cdf0e10cSrcweir // ACHTUNG: Wegen SDL-Bug NICHT != bei ::rtl::OUString verwenden !!! 2695cdf0e10cSrcweir if( !( aStartStr2 == aRemoveStr ) ) 2696cdf0e10cSrcweir continue; 2697cdf0e10cSrcweir 2698cdf0e10cSrcweir // Ist es denn der gleiche Listener? 2699cdf0e10cSrcweir if( aMethName2.getLength() - aRemoveStr.getLength() <= aListenerStr.getLength() ) 2700cdf0e10cSrcweir continue; 2701cdf0e10cSrcweir ::rtl::OUString aListenerName2 = aMethName2.copy 2702cdf0e10cSrcweir ( 6, aMethName2.getLength() - aRemoveStr.getLength() - aListenerStr.getLength() ); 2703cdf0e10cSrcweir // ACHTUNG: Wegen SDL-Bug NICHT != bei ::rtl::OUString verwenden !!! 2704cdf0e10cSrcweir if( !( aListenerName == aListenerName2 ) ) 2705cdf0e10cSrcweir continue; 2706cdf0e10cSrcweir 2707cdf0e10cSrcweir // TODO: Hier koennten noch genauere Pruefungen vorgenommen werden 2708cdf0e10cSrcweir // - Rueckgabe-Typ 2709cdf0e10cSrcweir // - Anzahl und Art der Parameter 2710cdf0e10cSrcweir 2711cdf0e10cSrcweir 2712cdf0e10cSrcweir // Methoden sind als Listener-Schnittstelle erkannt 2713cdf0e10cSrcweir rMethodConcept_i |= LISTENER; 2714cdf0e10cSrcweir pLocalMethodConcepts[ k ] |= LISTENER; 2715cdf0e10cSrcweir 2716cdf0e10cSrcweir pMethodTypes[i] = ADD_LISTENER_METHOD; 2717cdf0e10cSrcweir pMethodTypes[k] = REMOVE_LISTENER_METHOD; 2718cdf0e10cSrcweir nListenerCount++; 2719cdf0e10cSrcweir } 2720cdf0e10cSrcweir } 2721cdf0e10cSrcweir } 2722cdf0e10cSrcweir 2723cdf0e10cSrcweir 2724cdf0e10cSrcweir // Jetzt koennen noch SET-Methoden ohne zugehoerige GET-Methode existieren, 2725cdf0e10cSrcweir // diese muessen zu Write-Only-Properties gemachte werden. 2726cdf0e10cSrcweir for( i = 0 ; i < nSourceMethodCount ; i++ ) 2727cdf0e10cSrcweir { 2728cdf0e10cSrcweir // Methode ansprechen 2729cdf0e10cSrcweir const Reference<XIdlMethod>& rxMethod_i = pSourceMethods[i]; 2730cdf0e10cSrcweir 2731cdf0e10cSrcweir // Nur Methoden nehmen, die nicht schon zugeordnet sind 2732cdf0e10cSrcweir if( pMethodTypes[i] != STANDARD_METHOD ) 2733cdf0e10cSrcweir continue; 2734cdf0e10cSrcweir 2735cdf0e10cSrcweir // Namen besorgen 2736cdf0e10cSrcweir aMethName = rxMethod_i->getName(); 2737cdf0e10cSrcweir 2738cdf0e10cSrcweir // Wenn der Name zu kurz ist, wird's sowieso nichts 2739cdf0e10cSrcweir if( aMethName.getLength() <= 3 ) 2740cdf0e10cSrcweir continue; 2741cdf0e10cSrcweir 2742cdf0e10cSrcweir // Ist es eine set-Methode ohne zugehoerige get-Methode? 2743cdf0e10cSrcweir aStartStr = aMethName.copy( 0, 3 ); 2744cdf0e10cSrcweir if( aStartStr == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("set")) ) 2745cdf0e10cSrcweir { 2746cdf0e10cSrcweir // Namen der potentiellen Property 2747cdf0e10cSrcweir aPropName = aMethName.copy( 3 ); 2748cdf0e10cSrcweir 2749cdf0e10cSrcweir // set-Methode muss void returnen 2750cdf0e10cSrcweir Reference<XIdlClass> xSetRetType = rxMethod_i->getReturnType(); 2751cdf0e10cSrcweir if( xSetRetType->getTypeClass() != TypeClass_VOID ) 2752cdf0e10cSrcweir { 2753cdf0e10cSrcweir continue; 2754cdf0e10cSrcweir } 2755cdf0e10cSrcweir 2756cdf0e10cSrcweir // set-Methode darf nur einen Parameter haben 2757cdf0e10cSrcweir Sequence< Reference<XIdlClass> > setParams = rxMethod_i->getParameterTypes(); 2758cdf0e10cSrcweir sal_Int32 nParamCount = setParams.getLength(); 2759cdf0e10cSrcweir if( nParamCount != 1 ) 2760cdf0e10cSrcweir { 2761cdf0e10cSrcweir continue; 2762cdf0e10cSrcweir } 2763cdf0e10cSrcweir 2764cdf0e10cSrcweir // Haben wir den Namen schon? 2765cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = rPropNameMap.find( aPropName ); 2766cdf0e10cSrcweir if( !( aIt == rPropNameMap.end() ) ) 2767cdf0e10cSrcweir { 2768cdf0e10cSrcweir /* TODO: 2769cdf0e10cSrcweir OSL_TRACE( 2770cdf0e10cSrcweir String( "Introspection: Property \"" ) + 2771cdf0e10cSrcweir OOUStringToString( aPropName, CHARSET_SYSTEM ) + 2772cdf0e10cSrcweir String( "\" found more than once" ) ); 2773cdf0e10cSrcweir */ 2774cdf0e10cSrcweir continue; 2775cdf0e10cSrcweir } 2776cdf0e10cSrcweir 2777cdf0e10cSrcweir // Alles klar, es ist eine Write-Only-Property 2778cdf0e10cSrcweir pLocalMethodConcepts[ i ] = PROPERTY; 2779cdf0e10cSrcweir 2780cdf0e10cSrcweir pMethodTypes[i] = GETSET_METHOD; 2781cdf0e10cSrcweir Reference<XIdlClass> xGetRetType = setParams.getConstArray()[0]; 2782cdf0e10cSrcweir 2783cdf0e10cSrcweir // Ist die PropertySequence gross genug? 2784cdf0e10cSrcweir pAccess->checkPropertyArraysSize 2785cdf0e10cSrcweir ( pAllPropArray, pMapTypeArray, pPropertyConceptArray, rPropCount ); 2786cdf0e10cSrcweir 2787cdf0e10cSrcweir // In eigenes Property-Array eintragen 2788cdf0e10cSrcweir Property& rProp = pAllPropArray[ rPropCount ]; 2789cdf0e10cSrcweir rProp.Name = aPropName; 2790cdf0e10cSrcweir rProp.Handle = rPropCount; 2791cdf0e10cSrcweir rProp.Type = Type( xGetRetType->getTypeClass(), xGetRetType->getName() ); 2792cdf0e10cSrcweir rProp.Attributes = 0; // PROPERTY_WRITEONLY ??? 2793cdf0e10cSrcweir 2794cdf0e10cSrcweir // Neuer Eintrag in die Hashtable 2795cdf0e10cSrcweir rPropNameMap[ aPropName ] = rPropCount; 2796cdf0e10cSrcweir 2797cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 2798cdf0e10cSrcweir rLowerToExactNameMap[ toLower( aPropName ) ] = aPropName; 2799cdf0e10cSrcweir 2800cdf0e10cSrcweir // set-Methode merken 2801cdf0e10cSrcweir pAccess->checkInterfaceArraySize( pAccess->aInterfaceSeq2, 2802cdf0e10cSrcweir pInterfaces2, rPropCount ); 2803cdf0e10cSrcweir pInterfaces2[ rPropCount ] = rxMethod_i; 2804cdf0e10cSrcweir 2805cdf0e10cSrcweir // Art der Property merken 2806cdf0e10cSrcweir pMapTypeArray[ rPropCount ] = MAP_SETONLY; 2807cdf0e10cSrcweir pPropertyConceptArray[ rPropCount ] = METHODS; 2808cdf0e10cSrcweir pAccess->mnMethodPropCount++; 2809cdf0e10cSrcweir 2810cdf0e10cSrcweir // Count pflegen 2811cdf0e10cSrcweir rPropCount++; 2812cdf0e10cSrcweir } 2813cdf0e10cSrcweir } 2814cdf0e10cSrcweir 2815cdf0e10cSrcweir 2816cdf0e10cSrcweir //******************************************************************** 2817cdf0e10cSrcweir 2818cdf0e10cSrcweir // 4. Methoden in die Gesamt-Sequence uebernehmen 2819cdf0e10cSrcweir 2820cdf0e10cSrcweir // Wieviele Methoden muessen in die Method-Sequence? 2821cdf0e10cSrcweir sal_Int32 nExportedMethodCount = 0; 2822cdf0e10cSrcweir sal_Int32 nSupportedListenerCount = 0; 2823cdf0e10cSrcweir for( i = 0 ; i < nSourceMethodCount ; i++ ) 2824cdf0e10cSrcweir { 2825cdf0e10cSrcweir if( pMethodTypes[ i ] != INVALID_METHOD ) 2826cdf0e10cSrcweir { 2827cdf0e10cSrcweir nExportedMethodCount++; 2828cdf0e10cSrcweir } 2829cdf0e10cSrcweir if( pMethodTypes[ i ] == ADD_LISTENER_METHOD ) 2830cdf0e10cSrcweir { 2831cdf0e10cSrcweir nSupportedListenerCount++; 2832cdf0e10cSrcweir } 2833cdf0e10cSrcweir } 2834cdf0e10cSrcweir 2835cdf0e10cSrcweir // Sequences im Access-Objekt entsprechend aufbohren 2836cdf0e10cSrcweir pAccess->maAllMethodSeq.realloc( nExportedMethodCount + iAllExportedMethod ); 2837cdf0e10cSrcweir pAccess->maMethodConceptSeq.realloc( nExportedMethodCount + iAllExportedMethod ); 2838cdf0e10cSrcweir pAccess->maSupportedListenerSeq.realloc( nSupportedListenerCount + iAllSupportedListener ); 2839cdf0e10cSrcweir 2840cdf0e10cSrcweir // Methoden reinschreiben 2841cdf0e10cSrcweir Reference<XIdlMethod>* pDestMethods = pAccess->maAllMethodSeq.getArray(); 2842cdf0e10cSrcweir sal_Int32* pMethodConceptArray = pAccess->maMethodConceptSeq.getArray(); 2843cdf0e10cSrcweir Type* pListenerClassRefs = pAccess->maSupportedListenerSeq.getArray(); 2844cdf0e10cSrcweir for( i = 0 ; i < nSourceMethodCount ; i++ ) 2845cdf0e10cSrcweir { 2846cdf0e10cSrcweir if( pMethodTypes[ i ] != INVALID_METHOD ) 2847cdf0e10cSrcweir { 2848cdf0e10cSrcweir // Methode ansprechen 2849cdf0e10cSrcweir const Reference<XIdlMethod>& rxMethod = pSourceMethods[i]; 2850cdf0e10cSrcweir 2851cdf0e10cSrcweir // Namen in Hashtable eintragen, wenn nicht schon bekannt 2852cdf0e10cSrcweir ::rtl::OUString aMethName2 = rxMethod->getName(); 2853cdf0e10cSrcweir IntrospectionNameMap::iterator aIt = rMethodNameMap.find( aMethName2 ); 2854cdf0e10cSrcweir if( aIt == rMethodNameMap.end() ) 2855cdf0e10cSrcweir { 2856cdf0e10cSrcweir // Eintragen 2857cdf0e10cSrcweir rMethodNameMap[ aMethName2 ] = iAllExportedMethod; 2858cdf0e10cSrcweir 2859cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 2860cdf0e10cSrcweir rLowerToExactNameMap[ toLower( aMethName2 ) ] = aMethName2; 2861cdf0e10cSrcweir } 2862cdf0e10cSrcweir else 2863cdf0e10cSrcweir { 2864cdf0e10cSrcweir sal_Int32 iHashResult = (*aIt).second; 2865cdf0e10cSrcweir 2866cdf0e10cSrcweir Reference<XIdlMethod> xExistingMethod = pDestMethods[ iHashResult ]; 2867cdf0e10cSrcweir 2868cdf0e10cSrcweir Reference< XIdlClass > xExistingMethClass = 2869cdf0e10cSrcweir xExistingMethod->getDeclaringClass(); 2870cdf0e10cSrcweir Reference< XIdlClass > xNewMethClass = rxMethod->getDeclaringClass(); 2871cdf0e10cSrcweir if( xExistingMethClass->equals( xNewMethClass ) ) 2872cdf0e10cSrcweir continue; 2873cdf0e10cSrcweir } 2874cdf0e10cSrcweir 2875cdf0e10cSrcweir pDestMethods[ iAllExportedMethod ] = rxMethod; 2876cdf0e10cSrcweir 2877cdf0e10cSrcweir // Wenn kein Concept gesetzt wurde, ist die Methode "normal" 2878cdf0e10cSrcweir sal_Int32& rMethodConcept_i = pLocalMethodConcepts[ i ]; 2879cdf0e10cSrcweir if( !rMethodConcept_i ) 2880cdf0e10cSrcweir rMethodConcept_i = MethodConcept_NORMAL_IMPL; 2881cdf0e10cSrcweir pMethodConceptArray[ iAllExportedMethod ] = rMethodConcept_i; 2882cdf0e10cSrcweir iAllExportedMethod++; 2883cdf0e10cSrcweir } 2884cdf0e10cSrcweir if( pMethodTypes[ i ] == ADD_LISTENER_METHOD ) 2885cdf0e10cSrcweir { 2886cdf0e10cSrcweir // Klasse des Listeners ermitteln 2887cdf0e10cSrcweir const Reference<XIdlMethod>& rxMethod = pSourceMethods[i]; 2888cdf0e10cSrcweir 2889cdf0e10cSrcweir // void als Default-Klasse eintragen 2890cdf0e10cSrcweir Reference<XIdlClass> xListenerClass = TypeToIdlClass( getCppuVoidType(), m_xSMgr ); 2891cdf0e10cSrcweir // ALT: Reference<XIdlClass> xListenerClass = Void_getReflection()->getIdlClass(); 2892cdf0e10cSrcweir 2893cdf0e10cSrcweir // 1. Moeglichkeit: Parameter nach einer Listener-Klasse durchsuchen 2894cdf0e10cSrcweir // Nachteil: Superklassen muessen rekursiv durchsucht werden 2895cdf0e10cSrcweir Sequence< Reference<XIdlClass> > aParams = rxMethod->getParameterTypes(); 2896cdf0e10cSrcweir const Reference<XIdlClass>* pParamArray2 = aParams.getConstArray(); 2897cdf0e10cSrcweir 2898cdf0e10cSrcweir Reference<XIdlClass> xEventListenerClass = TypeToIdlClass( getCppuType( (Reference<XEventListener>*) NULL ), m_xSMgr ); 2899cdf0e10cSrcweir // ALT: Reference<XIdlClass> xEventListenerClass = XEventListener_getReflection()->getIdlClass(); 2900cdf0e10cSrcweir sal_Int32 nParamCount = aParams.getLength(); 2901cdf0e10cSrcweir sal_Int32 k; 2902cdf0e10cSrcweir for( k = 0 ; k < nParamCount ; k++ ) 2903cdf0e10cSrcweir { 2904cdf0e10cSrcweir const Reference<XIdlClass>& rxClass = pParamArray2[k]; 2905cdf0e10cSrcweir 2906cdf0e10cSrcweir // Sind wir von einem Listener abgeleitet? 2907cdf0e10cSrcweir if( rxClass->equals( xEventListenerClass ) || 2908cdf0e10cSrcweir isDerivedFrom( rxClass, xEventListenerClass ) ) 2909cdf0e10cSrcweir { 2910cdf0e10cSrcweir xListenerClass = rxClass; 2911cdf0e10cSrcweir break; 2912cdf0e10cSrcweir } 2913cdf0e10cSrcweir } 2914cdf0e10cSrcweir 2915cdf0e10cSrcweir // 2. Moeglichkeit: Namen der Methode auswerden 2916cdf0e10cSrcweir // Nachteil: geht nicht bei Test-Listenern, die es nicht gibt 2917cdf0e10cSrcweir //aMethName = rxMethod->getName(); 2918cdf0e10cSrcweir //aListenerName = aMethName.Copy( 3, aMethName.Len()-8-3 ); 2919cdf0e10cSrcweir //Reference<XIdlClass> xListenerClass = reflection->forName( aListenerName ); 2920cdf0e10cSrcweir Type aListenerType( TypeClass_INTERFACE, xListenerClass->getName() ); 2921cdf0e10cSrcweir pListenerClassRefs[ iAllSupportedListener ] = aListenerType; 2922cdf0e10cSrcweir iAllSupportedListener++; 2923cdf0e10cSrcweir } 2924cdf0e10cSrcweir } 2925cdf0e10cSrcweir 2926cdf0e10cSrcweir // Wenn in diesem Durchlauf XInterface-Methoden 2927cdf0e10cSrcweir // dabei waren, diese zukuenftig ignorieren 2928cdf0e10cSrcweir if( bFoundXInterface ) 2929cdf0e10cSrcweir bXInterfaceIsInvalid = sal_True; 2930cdf0e10cSrcweir 2931cdf0e10cSrcweir delete[] pMethodTypes; 2932cdf0e10cSrcweir delete[] pLocalMethodConcepts; 2933cdf0e10cSrcweir } 2934cdf0e10cSrcweir 2935cdf0e10cSrcweir // Super-Klasse(n) vorhanden? Dann dort fortsetzen 2936cdf0e10cSrcweir Sequence< Reference<XIdlClass> > aSuperClassSeq = xImplClass2->getSuperclasses(); 2937cdf0e10cSrcweir 2938cdf0e10cSrcweir // Zur Zeit wird nur von einer Superklasse ausgegangen 2939cdf0e10cSrcweir if( aSuperClassSeq.getLength() >= 1 ) 2940cdf0e10cSrcweir { 2941cdf0e10cSrcweir xImplClass2 = aSuperClassSeq.getConstArray()[0]; 2942cdf0e10cSrcweir OSL_ENSURE( xImplClass2.is(), "super class null" ); 2943cdf0e10cSrcweir } 2944cdf0e10cSrcweir else 2945cdf0e10cSrcweir { 2946cdf0e10cSrcweir xImplClass2 = NULL; 2947cdf0e10cSrcweir } 2948cdf0e10cSrcweir } 2949cdf0e10cSrcweir } 2950cdf0e10cSrcweir 2951cdf0e10cSrcweir // Anzahl der exportierten Methoden uebernehmen und Sequences anpassen 2952cdf0e10cSrcweir // (kann abweichen, weil doppelte Methoden erst nach der Ermittlung 2953cdf0e10cSrcweir // von nExportedMethodCount herausgeworfen werden) 2954cdf0e10cSrcweir sal_Int32& rMethCount = pAccess->mnMethCount; 2955cdf0e10cSrcweir rMethCount = iAllExportedMethod; 2956cdf0e10cSrcweir pAccess->maAllMethodSeq.realloc( rMethCount ); 2957cdf0e10cSrcweir pAccess->maMethodConceptSeq.realloc( rMethCount ); 2958cdf0e10cSrcweir 2959cdf0e10cSrcweir // Groesse der Property-Sequences anpassen 2960cdf0e10cSrcweir pAccess->maAllPropertySeq.realloc( rPropCount ); 2961cdf0e10cSrcweir pAccess->maPropertyConceptSeq.realloc( rPropCount ); 2962cdf0e10cSrcweir pAccess->maMapTypeSeq.realloc( rPropCount ); 2963cdf0e10cSrcweir 2964cdf0e10cSrcweir // Ende der Schleife ueber alle vom ClassProvider angegebenen Klassen 2965cdf0e10cSrcweir } 2966cdf0e10cSrcweir } 2967cdf0e10cSrcweir // Bei structs Fields als Properties registrieren 2968cdf0e10cSrcweir else //if( eType == TypeClass_STRUCT ) 2969cdf0e10cSrcweir { 2970cdf0e10cSrcweir // Ist es ein Interface oder eine struct? 2971cdf0e10cSrcweir //Reference<XIdlClass> xClassRef = aToInspectObj.getReflection()->getIdlClass(); 2972cdf0e10cSrcweir Reference<XIdlClass> xClassRef = TypeToIdlClass( aToInspectObj.getValueType(), m_xSMgr ); 2973cdf0e10cSrcweir if( !xClassRef.is() ) 2974cdf0e10cSrcweir { 2975cdf0e10cSrcweir OSL_ENSURE( sal_False, "Can't get XIdlClass from Reflection" ); 2976cdf0e10cSrcweir return pAccess; 2977cdf0e10cSrcweir } 2978cdf0e10cSrcweir 2979cdf0e10cSrcweir // Felder holen 2980cdf0e10cSrcweir Sequence< Reference<XIdlField> > fields = xClassRef->getFields(); 2981cdf0e10cSrcweir const Reference<XIdlField>* pFields = fields.getConstArray(); 2982cdf0e10cSrcweir sal_Int32 nLen = fields.getLength(); 2983cdf0e10cSrcweir 2984cdf0e10cSrcweir for( i = 0 ; i < nLen ; i++ ) 2985cdf0e10cSrcweir { 2986cdf0e10cSrcweir Reference<XIdlField> xField = pFields[i]; 2987cdf0e10cSrcweir Reference<XIdlClass> xPropType = xField->getType(); 2988cdf0e10cSrcweir ::rtl::OUString aPropName = xField->getName(); 2989cdf0e10cSrcweir 2990cdf0e10cSrcweir // Ist die PropertySequence gross genug? 2991cdf0e10cSrcweir pAccess->checkPropertyArraysSize 2992cdf0e10cSrcweir ( pAllPropArray, pMapTypeArray, pPropertyConceptArray, rPropCount ); 2993cdf0e10cSrcweir 2994cdf0e10cSrcweir // In eigenes Property-Array eintragen 2995cdf0e10cSrcweir Property& rProp = pAllPropArray[ rPropCount ]; 2996cdf0e10cSrcweir rProp.Name = aPropName; 2997cdf0e10cSrcweir rProp.Handle = rPropCount; 2998cdf0e10cSrcweir rProp.Type = Type( xPropType->getTypeClass(), xPropType->getName() ); 2999cdf0e10cSrcweir FieldAccessMode eAccessMode = xField->getAccessMode(); 3000cdf0e10cSrcweir rProp.Attributes = (eAccessMode == FieldAccessMode_READONLY || 3001cdf0e10cSrcweir eAccessMode == FieldAccessMode_CONST) 3002cdf0e10cSrcweir ? READONLY : 0; 3003cdf0e10cSrcweir 3004cdf0e10cSrcweir //FieldAccessMode eAccessMode = xField->getAccessMode(); 3005cdf0e10cSrcweir //rProp.Attributes = (eAccessMode == FieldAccessMode::READONLY || eAccessMode == CONST) 3006cdf0e10cSrcweir //? PropertyAttribute::READONLY : 0; 3007cdf0e10cSrcweir 3008cdf0e10cSrcweir // Namen in Hashtable eintragen 3009cdf0e10cSrcweir rPropNameMap[ aPropName ] = rPropCount; 3010cdf0e10cSrcweir 3011cdf0e10cSrcweir // Tabelle fuer XExactName pflegen 3012cdf0e10cSrcweir rLowerToExactNameMap[ toLower( aPropName ) ] = aPropName; 3013cdf0e10cSrcweir 3014cdf0e10cSrcweir // Field merken 3015cdf0e10cSrcweir pAccess->checkInterfaceArraySize( pAccess->aInterfaceSeq1, 3016cdf0e10cSrcweir pInterfaces1, rPropCount ); 3017cdf0e10cSrcweir pInterfaces1[ rPropCount ] = xField; 3018cdf0e10cSrcweir 3019cdf0e10cSrcweir // Art der Property merken 3020cdf0e10cSrcweir pMapTypeArray[ rPropCount ] = MAP_FIELD; 3021cdf0e10cSrcweir pPropertyConceptArray[ rPropCount ] = ATTRIBUTES; 3022cdf0e10cSrcweir pAccess->mnAttributePropCount++; 3023cdf0e10cSrcweir 3024cdf0e10cSrcweir // Count pflegen 3025cdf0e10cSrcweir rPropCount++; 3026cdf0e10cSrcweir } 3027cdf0e10cSrcweir } 3028cdf0e10cSrcweir 3029cdf0e10cSrcweir // Property-Sequence auf die richtige Laenge bringen 3030cdf0e10cSrcweir pAccess->maAllPropertySeq.realloc( pAccess->mnPropCount ); 3031cdf0e10cSrcweir 3032cdf0e10cSrcweir return pAccess; 3033cdf0e10cSrcweir } 3034cdf0e10cSrcweir 3035cdf0e10cSrcweir //************************************************************************* 3036cdf0e10cSrcweir Reference< XInterface > SAL_CALL ImplIntrospection_CreateInstance( const Reference< XMultiServiceFactory > & rSMgr ) 3037cdf0e10cSrcweir throw( RuntimeException ) 3038cdf0e10cSrcweir { 3039cdf0e10cSrcweir Reference< XInterface > xService = (OWeakObject*)(OComponentHelper*)new ImplIntrospection( rSMgr ); 3040cdf0e10cSrcweir return xService; 3041cdf0e10cSrcweir } 3042cdf0e10cSrcweir 3043cdf0e10cSrcweir } 3044cdf0e10cSrcweir 3045cdf0e10cSrcweir extern "C" 3046cdf0e10cSrcweir { 3047cdf0e10cSrcweir //================================================================================================== 3048cdf0e10cSrcweir void SAL_CALL component_getImplementationEnvironment( 3049cdf0e10cSrcweir const sal_Char ** ppEnvTypeName, uno_Environment ** ) 3050cdf0e10cSrcweir { 3051cdf0e10cSrcweir *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 3052cdf0e10cSrcweir } 3053cdf0e10cSrcweir //================================================================================================== 3054cdf0e10cSrcweir void * SAL_CALL component_getFactory( 3055cdf0e10cSrcweir const sal_Char * pImplName, void * pServiceManager, void * ) 3056cdf0e10cSrcweir { 3057cdf0e10cSrcweir void * pRet = 0; 3058cdf0e10cSrcweir 3059cdf0e10cSrcweir if (pServiceManager && rtl_str_compare( pImplName, IMPLEMENTATION_NAME ) == 0) 3060cdf0e10cSrcweir { 3061cdf0e10cSrcweir Reference< XSingleServiceFactory > xFactory( createOneInstanceFactory( 3062cdf0e10cSrcweir reinterpret_cast< XMultiServiceFactory * >( pServiceManager ), 3063cdf0e10cSrcweir ::rtl::OUString::createFromAscii( pImplName ), 3064cdf0e10cSrcweir stoc_inspect::ImplIntrospection_CreateInstance, 3065cdf0e10cSrcweir stoc_inspect::ImplIntrospection::getSupportedServiceNames_Static() ) ); 3066cdf0e10cSrcweir 3067cdf0e10cSrcweir if (xFactory.is()) 3068cdf0e10cSrcweir { 3069cdf0e10cSrcweir xFactory->acquire(); 3070cdf0e10cSrcweir pRet = xFactory.get(); 3071cdf0e10cSrcweir } 3072cdf0e10cSrcweir } 3073cdf0e10cSrcweir 3074cdf0e10cSrcweir return pRet; 3075cdf0e10cSrcweir } 3076cdf0e10cSrcweir } 3077cdf0e10cSrcweir 3078cdf0e10cSrcweir 3079