Difference between revisions of "Documentation/FR/Interface XIDLReflection"
SergeMoutou (Talk | contribs) m |
SergeMoutou (Talk | contribs) m |
||
Line 110: | Line 110: | ||
******* Fields : (0) | ******* Fields : (0) | ||
</pre> | </pre> | ||
− | Le programme C++ précédent est un exemple très simple. L'interface XIdlMethod peut fournir bien plus d'information que ce que l'on présente. Les fichiers IDL pour cela nous montrent toutes les possibilités : | + | Le programme C++ précédent est un exemple très simple. L'interface <idl>com.sun.star.reflection.XIdlMethod</idl> peut fournir bien plus d'information que ce que l'on présente. Les fichiers IDL pour cela nous montrent toutes les possibilités : |
<source lang="IDL"> | <source lang="IDL"> | ||
// IDL | // IDL |
Revision as of 11:06, 28 February 2009
Avant de lire cette section vous pouvez regarder ici : registry and OOoBasic et aussi Introducing the OpenOffice.org_API et encore OOoBasic Introspection.
Le Developer's Guide dit : le service com.sun.star.reflection.CoreReflection supportant l'interface com.sun.star.reflection.XIdlReflection est un point d'entrée important pour l'API UNO permettant la Reflection. L'interface XIdlReflection a deux méthodes qui pour chacune retourne une interface com.sun.star.reflection.XIdlClass pour un nom déterminé (méthode forName()) pour n'importe quelle valeur (méthode getType()). Le fichier IDL com.sun.star.reflection.XIdlReflection nous montre les deux méthodes :
// IDL module com { module sun { module star { module reflection { interface XIdlReflection: com::sun::star::uno::XInterface { com::sun::star::reflection::XIdlClass forName( [in] string aTypeName ); com::sun::star::reflection::XIdlClass getType( [in] any aObj ); }; }; }; }; };
Maintenant il nous faut nous renseigner sur l'interface com.sun.star.reflection.XIdlClass. Voici le fichier IDL correspondant :
// IDL module com { module sun { module star { module reflection { interface XIdlField; interface XIdlMethod; interface XIdlArray; interface XIdlClass: com::sun::star::uno::XInterface { /** Deprecated. Do not call. */ sequence<XIdlClass> getClasses(); /** Deprecated. Do not call. */ XIdlClass getClass( [in] string aName ); boolean equals( [in] XIdlClass Type ); boolean isAssignableFrom( [in] XIdlClass xType ); com::sun::star::uno::TypeClass getTypeClass(); string getName(); /** Deprecated. Do not call. */ com::sun::star::uno::Uik getUik(); sequence<XIdlClass> getSuperclasses(); /** Deprecated. Do not call. */ sequence<XIdlClass> getInterfaces(); XIdlClass getComponentType(); XIdlField getField( [in] string aName ); sequence<XIdlField> getFields(); XIdlMethod getMethod( [in] string aName ); sequence<XIdlMethod> getMethods(); XIdlArray getArray(); void createObject( [out] any obj ); }; }; }; }; };
où vous remarquez beaucoup de méthodes à ne plus utiliser (deprecated).
Un exemple utilisant l'interface XIdlReflection en action pourrait être :
// Listing 7 Using XIdlReflection interface // C++ void LittleXRay(OUString OUStr,Reference< XMultiServiceFactory > rOServiceManager) { // Don't forget to add : using namespace com::sun::star::reflection; // Don't forget to add : #include <com/sun/star/reflection/XIdlReflection.hpp> // Don't forget to add "com.sun.star.reflection.XIdlReflection \" in the makefile Reference< XIdlReflection >rIDLReflection = Reference< XIdlReflection > ( rOServiceManager->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.reflection.CoreReflection" ))), UNO_QUERY ); if (! rIDLReflection.is()) { printf("Error XIDLRflection\n"); return;} Reference< XIdlClass > rIDLClass=rIDLReflection->forName(OUStr); // OUString::createFromAscii("com.sun.star.frame.XDesktop")); Sequence< Reference< XIdlClass > > SeqIdlClass = rIDLClass->getSuperclasses(); printf("******** superClasses :(%d)\n",SeqIdlClass.getLength()); for (int i=0;i<SeqIdlClass.getLength();i++){ OString o = OUStringToOString( SeqIdlClass[i]->getName(),RTL_TEXTENCODING_ASCII_US ); printf("%s\n", o.pData->buffer ); } Sequence< Reference< XIdlMethod > > SeqIdlMethods = rIDLClass->getMethods(); printf("******** methods : (%d)\n",SeqIdlMethods.getLength()); for (int i=0;i<SeqIdlMethods.getLength();i++){ OString o = OUStringToOString( SeqIdlMethods[i]->getName(),RTL_TEXTENCODING_ASCII_US ); printf("%s\n", o.pData->buffer ); } // Don't forget to add : #include <com/sun/star/reflection/XIdlField2.hpp> // Don't forget to add : "com.sun.star.reflection.XIdlField2 \" in the Makefile Sequence< Reference< XIdlField > > SeqIdlFields = rIDLClass->getFields(); printf("******* Fields : (%d)\n",SeqIdlFields.getLength()); for (int i=0;i<SeqIdlFields.getLength();i++){ OString o = OUStringToOString( SeqIdlFields[i]->getName(),RTL_TEXTENCODING_ASCII_US ); printf("%s\n", o.pData->buffer ); } }
qui pourrait être appelé avec ce code :
// Listing 8 // C++ LittleXRay(OUString::createFromAscii("com.sun.star.frame.XDesktop"),rOfficeServiceManager);
et qui donnerait à l'affichage le résultat ci-dessous :
******** superClasses :(1) com.sun.star.uno.XInterface ******** methods : (9) queryInterface acquire release terminate addTerminateListener removeTerminateListener getComponents getCurrentComponent getCurrentFrame ******* Fields : (0)
Le programme C++ précédent est un exemple très simple. L'interface com.sun.star.reflection.XIdlMethod peut fournir bien plus d'information que ce que l'on présente. Les fichiers IDL pour cela nous montrent toutes les possibilités :
// IDL module com { module sun { module star { module reflection { interface XIdlClass; interface XIdlMethod: com::sun::star::reflection::XIdlMember { XIdlClass getReturnType(); sequence<XIdlClass> getParameterTypes(); sequence<ParamInfo> getParameterInfos(); sequence<com::sun::star::reflection::XIdlClass> getExceptionTypes(); com::sun::star::reflection::MethodMode getMode(); any invoke( [in] any obj, [inout] sequence<any> args ) raises( com::sun::star::lang::IllegalArgumentException, com::sun::star::reflection::InvocationTargetException ); }; }; }; }; };
Si vous voulez retrouvé le type retourné par une méthode, par exemple, la méthode getReturnType est votre amie. Un exemple est présenté maintenant :
//Listing 9 Improve the returned information // C++ Sequence< Reference< XIdlMethod > > SeqIdlMethods = rIDLClass->getMethods(); printf("******** methods : (%d)\n",SeqIdlMethods.getLength()); for (int i=0;i<SeqIdlMethods.getLength();i++){ OString o = "(" + OUStringToOString( SeqIdlMethods[i]->getReturnType()-> getName(),RTL_TEXTENCODING_ASCII_US ) + ") " + OUStringToOString( SeqIdlMethods[i]->getName(), RTL_TEXTENCODING_ASCII_US ); printf("%s\n", o.pData->buffer ); }
Si vous exécutez ce code, vous obtenez dans une console :
******** methods : (9) (any) queryInterface (void) acquire (void) release (boolean) terminate (void) addTerminateListener (void) removeTerminateListener (com.sun.star.container.XEnumerationAccess) getComponents (com.sun.star.lang.XComponent) getCurrentComponent (com.sun.star.frame.XFrame) getCurrentFrame
Toute l'information sur les paramètres peut être trouvée de la même façon, mais avec d'autres méthodes, comme par exemple getParamaterTypes() et getMode().
La Figure ci-dessous est un condensé de la programmation de l'interface XIdlReflection. Le code correspondant est donné en Listing 10 en lieu et place du Listing 7, ce dernier utilisant l'interface XIdlReflection en une instruction tandis que l'autre le fait en deux instructions.
//Listing 10 Obtenir XIdlReflection en deux instructions //C++ Reference< XInterface > xInterface = rOServiceManager->createInstance( OUString::createFromAscii( "com.sun.star.reflection.CoreReflection" )); Reference< XIdlReflection >rIDLReflection(xInterface,UNO_QUERY); if (! rIDLReflection.is()) printf("Error XIDLRflection\n");
Une autre amélioration dans la Figure précédente est la gestion de l'interface (deprecated) XIdlField. Le code correspondant est enfin présendé ci-dessous :
//Listing 11 Utiliser l'interface XIdlField2 au lieu de XIdlField // C++ // Don't forget to add : #include <com/sun/star/reflection/XIdlField2.hpp> // Don't forget to add : "com.sun.star.reflection.XIdlField2 \" in the Makefile printf("******* Fields : (%d)\n",SeqIdlFields.getLength()); for (int i=0;i<SeqIdlFields.getLength();i++){ Reference< XIdlField2 > xIdlField2(SeqIdlFields[i],UNO_QUERY); OString o = OUStringToOString( xIdlField2->getName(),RTL_TEXTENCODING_ASCII_US ); printf("%s\n", o.pData->buffer ); }
Au lieu d'aller plus loin, je préfère examiner un autre chemin : l'utilisation de l'interface XIntrospection où l'interface XIdlMethod est utilisée aussi.
Retournez à Le service de Core reflection et son interface XIdlReflection.