Documentation/FR/Interface XIDLReflection

From Apache OpenOffice Wiki
Jump to: navigation, search

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). Jetez un oeil sur les autres interfaces mentionnées dans le code com.sun.star.reflection.XIdlMethod, com.sun.star.reflection.XIdlField et com.sun.star.reflection.XIdlArray.

Un exemple utilisant l'interface com.sun.star.reflection.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");

UsingXIDLRfelection.png


Une autre amélioration dans la Figure précédente est la gestion de l'interface (deprecated) com.sun.star.reflection.XIdlField avec com.sun.star.reflection.XIdlField2. Le code correspondant est enfin présenté 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.

Personal tools