Difference between revisions of "Documentation/FR/Interface XIDLReflection"

From Apache OpenOffice Wiki
Jump to: navigation, search
m (New page: Avant de lire cette section vous pouvez regarder ici : registry and OOoBasic et aussi [[Extensions_develop...)
 
m
 
(8 intermediate revisions by 2 users not shown)
Line 2: Line 2:
  
 
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 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 nous montre les deux méthodes :
+
Le fichier IDL <idl>com.sun.star.reflection.XIdlReflection</idl> nous montre les deux méthodes :
<pre>
+
<source lang="IDL">
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module reflection {
 
module com {  module sun {  module star {  module reflection {
Line 12: Line 12:
 
};
 
};
 
}; }; }; };  
 
}; }; }; };  
</pre>  
+
</source>  
Maintenant il nous faut nous renseigner sur l'interface XIDLClass. Voici le fichier IDL correspondant :
+
Maintenant il nous faut nous renseigner sur l'interface <idl>com.sun.star.reflection.XIdlClass</idl>. Voici le fichier IDL correspondant :
<pre>
+
<source lang="IDL">
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module reflection {
 
module com {  module sun {  module star {  module reflection {
Line 45: Line 45:
 
};
 
};
 
}; }; }; };
 
}; }; }; };
</pre>
+
</source>
où vous remarquez beaucoup de méthodes à ne plus utiliser (deprecated).
+
où vous remarquez beaucoup de méthodes à ne plus utiliser (deprecated). Jetez un oeil sur les autres interfaces mentionnées dans le code <idl>com.sun.star.reflection.XIdlMethod</idl>, <idl>com.sun.star.reflection.XIdlField</idl> et <idl>com.sun.star.reflection.XIdlArray</idl>.
  
Un exemple utilisant l'interface XIdlReflection en action pourrait être :
+
Un exemple utilisant l'interface <idl>com.sun.star.reflection.XIdlReflection</idl> en action pourrait être :
 
<source lang="cpp">
 
<source lang="cpp">
 
// Listing 7 Using XIdlReflection interface
 
// Listing 7 Using XIdlReflection interface
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 :
<pre>
+
<source lang="IDL">
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module reflection {
 
module com {  module sun {  module star {  module reflection {
Line 129: Line 129:
 
};  
 
};  
 
}; }; }; };  
 
}; }; }; };  
</pre>
+
</source>
 
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 :
 
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 :
 
<source lang="cpp">
 
<source lang="cpp">
Line 174: Line 174:
  
  
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 :
+
Une autre amélioration dans la Figure précédente est la gestion de l'interface (deprecated) <idl>com.sun.star.reflection.XIdlField</idl> avec <idl>com.sun.star.reflection.XIdlField2</idl>. Le code correspondant est enfin présenté ci-dessous :
 
<source lang="cpp">
 
<source lang="cpp">
 
//Listing 11 Utiliser l'interface XIdlField2 au lieu de XIdlField
 
//Listing 11 Utiliser l'interface XIdlField2 au lieu de XIdlField
Line 190: Line 190:
  
 
Retournez à [[Documentation/FR/Fichiers_IDL_et_C%2B%2B#Le_service_de_Core_reflection_et_son_interface_XIdlReflection|Le service de Core reflection et son interface XIdlReflection]].
 
Retournez à [[Documentation/FR/Fichiers_IDL_et_C%2B%2B#Le_service_de_Core_reflection_et_son_interface_XIdlReflection|Le service de Core reflection et son interface XIdlReflection]].
 +
 +
[[Category:FR]]

Latest revision as of 11:53, 30 March 2010

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