Difference between revisions of "FR/Documentation/L'automation d'OpenOffice.org avec un binaire exécutable"

From Apache OpenOffice Wiki
Jump to: navigation, search
m (Introduction à partir d'un exemple du SDK)
m (Introduction à partir d'un exemple du SDK)
Line 86: Line 86:
 
On veut maintenant l'objet desktop pour charger un document tableur OOoCalc.  
 
On veut maintenant l'objet desktop pour charger un document tableur OOoCalc.  
 
La première étape est d'obtenir le desktop. Ensuite vous ajouté ce code:
 
La première étape est d'obtenir le desktop. Ensuite vous ajouté ce code:
<source lang="cpp>
+
<source lang="cpp">
 
//Listing 15  
 
//Listing 15  
 
// C++
 
// C++
Line 94: Line 94:
 
Votre objet desktop est dans notre variable xDesktop.
 
Votre objet desktop est dans notre variable xDesktop.
 
Deuxième étape : demander une interface XComponentLoader
 
Deuxième étape : demander une interface XComponentLoader
<source lang="cpp>
+
<source lang="cpp">
 
//Listing 16  
 
//Listing 16  
 
// C++
 
// C++
Line 107: Line 107:
 
error 'XComponentLoader' undeclared (First use this function) ....
 
error 'XComponentLoader' undeclared (First use this function) ....
 
Cela nous montre qu'il y a un problème avec  XComponentLoader : Cela indique que nous devons probablement ajouter un fichier hpp dans les directives habituelles d'inclusion. Le nom du fichier est sûrement XComponentLoader.hpp mais nous devons trouver où il se situe. Un moyen simple consiste a aller sur :  http://api.openoffice.org/docs/common/ref/index-files/index-1.html et regarder pour XComponentLoader. Nous trouvons: “::com::sun::star::frame” ce qui indique qu'une directive :
 
Cela nous montre qu'il y a un problème avec  XComponentLoader : Cela indique que nous devons probablement ajouter un fichier hpp dans les directives habituelles d'inclusion. Le nom du fichier est sûrement XComponentLoader.hpp mais nous devons trouver où il se situe. Un moyen simple consiste a aller sur :  http://api.openoffice.org/docs/common/ref/index-files/index-1.html et regarder pour XComponentLoader. Nous trouvons: “::com::sun::star::frame” ce qui indique qu'une directive :
<source lang="cpp>
+
<source lang="cpp">
 
//Listing 17  
 
//Listing 17  
 
// C++
 
// C++
Line 136: Line 136:
 
On obtient cette fois encore le même message d'erreur dans le projet. Mais que manque-t-il donc encore pour éviter ce message ?  
 
On obtient cette fois encore le même message d'erreur dans le projet. Mais que manque-t-il donc encore pour éviter ce message ?  
 
Il manque juste une assertion de nommage dans le fichier source :
 
Il manque juste une assertion de nommage dans le fichier source :
<source lang="cpp>
+
<source lang="cpp">
 
//Listing 18  
 
//Listing 18  
 
// C++
 
// C++
Line 142: Line 142:
 
</source>
 
</source>
 
Troisième étape : obtenir une instance du tableur  
 
Troisième étape : obtenir une instance du tableur  
<source lang="cpp>
+
<source lang="cpp">
 
//Listing 19  
 
//Listing 19  
 
// C++
 
// C++

Revision as of 11:59, 4 July 2008

Nous voulons maintenant nous attaquer a un programme entier en UNO/OpenOffice.org. Ce programme effectuera quelques taches sur des documents OpenOffice.org , chargements de fichiers, modifications de fichiers, sauvegardes de fichiers....

Introduction à partir d'un exemple du SDK

Danny Brewer a écrit dans le forum sur Openoffice :ici. Pour faire quelque chose d'utile avec OOo à travers l'API, dans la plupart des cas, cela nécessite soit de créer, soit d'ouvrir un nouveau document. Ensuite vous aimeriez manipuler le contenu du document, en extraire de l'information, l'imprimer, le convertir en un autre format, travailler avec des données d'un formulaire ou encore réaliser d'autres tâches sur les documents. Pour cela la première chose à apprendre est comment ouvrir ou créer des documents. Les objets ServiceManager et Desktop

Pour pouvoir travailler avec OOo avec l'API, vous devez obtenir deux objets absolument essentiels 1. le ServiceManager (gestionnaire de service) 2. le Desktop (le bureau)

Une fois le ServiceManager obtenu,un appel à sa méthoded createInstance() permet d'obtenir l'objet Desktop. Une fois obtenu cet objet Desktop, vous pouvez l'utiliser pour créer ou ouvrir des nouveaux documents.

Obtenir le gestionnaire de services

pour chaque différent langage, il y a un mécanisme permettant d' acquérir le “Service Manager.” Le moyen d'obtenir le service manager est donné dans l'exemple SDK  : <OpenOffice.org1.1_SDK>/examples/DevelopersGuide/ProfUNO/CppBinding Nous regardons le premier exemple en premier (sous Linux) :

cd <OpenOffice.org1.1_SDK>
./setsdkenv_unix
cd examples/DevelopersGuide/ProfUNO/CppBinding
make
make Office_connect.run

Qui écrit seulement : "Connected successfully to the office". Mais c'est déjà pas mal ? Non ? Nous commencerons notre travail à partir de cet exemple. Tout les listings que nous donnerons sont à ajouter à cet exemple. Où ça? Ceci montré maintenant :

//Listing 14 
//C++  *** extract from office_connect.cxx
int main( )
{
	// create the initial component context
	Reference< XComponentContext > rComponentContext =
		defaultBootstrap_InitialComponentContext();
	// retrieve the servicemanager from the context
	Reference< XMultiComponentFactory > rServiceManager =
		rComponentContext->getServiceManager();
	// instantiate a sample service with the servicemanager.
	Reference< XInterface > rInstance =
		rServiceManager->createInstanceWithContext(
			OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver" ),
			rComponentContext );
	// Query for the XUnoUrlResolver interface
	Reference< XUnoUrlResolver > rResolver( rInstance, UNO_QUERY );
	if( ! rResolver.is() )
	{
		printf( "Error: Couldn't instantiate com.sun.star.bridge.UnoUrlResolver service\n" );
		return 1;
	}
	try
	{
		// resolve the uno-url
		rInstance = rResolver->resolve( OUString::createFromAscii( 
			"uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" ) );
		if( ! rInstance.is() )
		{
			printf( "StarOffice.ServiceManager is not exported from remote counterpart\n" );
			return 1;
		}
		// query for the simpler XMultiServiceFactory interface, sufficient for scripting
		Reference< XMultiServiceFactory > rOfficeServiceManager (rInstance, UNO_QUERY);
		if( ! rInstance.is() )
        {
            printf( "XMultiServiceFactory interface is not exported for StarOffice.ServiceManager\n" );
            return 1;
        }
 
        printf( "Connected sucessfully to the office\n" );
//  ***** mettez votre code ici 
	}
	catch( Exception &e )
	{
		OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
		printf( "Error: %s\n", o.pData->buffer );
		return 1;
	}
	return 0;
}

Je ne peux pas expliquer complètement toutes les lignes de ce fichier source. Je peux juste dire que c'est un moyen parmi d'autres d'obtenir le “ Service Manager”. Une autre façon de le faire est donnée dans <OpenOffice.org1.1_SDK>/examples/cpp/DocumentLoader's example.

On veut maintenant l'objet desktop pour charger un document tableur OOoCalc. La première étape est d'obtenir le desktop. Ensuite vous ajouté ce code:

//Listing 15 
// C++
Reference< XInterface  > xDesktop = rOfficeServiceManager->createInstance(
   	OUString::createFromAscii( "com.sun.star.frame.Desktop" ));

Votre objet desktop est dans notre variable xDesktop. Deuxième étape : demander une interface XComponentLoader

//Listing 16 
// C++
// query a XcomponentLoader Interface 
Reference< XComponentLoader > rComponentLoader (xDesktop, UNO_QUERY);
if( rComponentLoader.is() )
    	{
        	printf( "XComonentloader succesfully instanciated\n" );
    	}

Le code ci dessus donne des messages d'erreurs : error 'XComponentLoader' undeclared (First use this function) .... Cela nous montre qu'il y a un problème avec XComponentLoader : Cela indique que nous devons probablement ajouter un fichier hpp dans les directives habituelles d'inclusion. Le nom du fichier est sûrement XComponentLoader.hpp mais nous devons trouver où il se situe. Un moyen simple consiste a aller sur : http://api.openoffice.org/docs/common/ref/index-files/index-1.html et regarder pour XComponentLoader. Nous trouvons: “::com::sun::star::frame” ce qui indique qu'une directive :

//Listing 17 
// C++
#include <com/sun/star/frame/XComponentLoader.hpp>

est requise. Nous pouvons essayer de l'ajouter, tout cela pour s'apercevoir que ce n'est pas suffisant. On obtient toujours le même message d'erreur aussi qu'un autre en bonus : com/sun/star/frame/XComponentLoader.hpp: No such file or directory Je discuterais ce fait beaucoup plus en détail dans le chapitre XX : le SDK ne fournit pas les fichiers hpp , ils doivent être construit à partir de fichiers IDL . Pour cela il nous faut ouvrir et changer le makefile comme indiqué ci-dessous (repérez bien la ligne correspondante).

#added com.sun.star.frame.XComponentLoader
TYPES := \
	com.sun.star.uno.XNamingService \
	com.sun.star.uno.XComponentContext \
	com.sun.star.uno.XWeak \
	com.sun.star.uno.XAggregation \
	com.sun.star.frame.XComponentLoader \
	com.sun.star.lang.XMain \ 
    com.sun.star.lang.XMultiServiceFactory \
	com.sun.star.lang.XSingleComponentFactory \
	com.sun.star.lang.XTypeProvider \
	com.sun.star.lang.XComponent \
	com.sun.star.registry.XSimpleRegistry \
	com.sun.star.registry.XImplementationRegistration \
	com.sun.star.bridge.XBridgeFactory \
	com.sun.star.bridge.XUnoUrlResolver \
    com.sun.star.container.XHierarchicalNameAccess

On obtient cette fois encore le même message d'erreur dans le projet. Mais que manque-t-il donc encore pour éviter ce message ? Il manque juste une assertion de nommage dans le fichier source :

//Listing 18 
// C++
using namespace com::sun::star::frame;

Troisième étape : obtenir une instance du tableur

//Listing 19 
// C++
Reference< XComponent > xcomponent = rComponentLoader->loadComponentFromURL(
	OUString::createFromAscii("private:factory/scalc"),
        OUString::createFromAscii("_blank"),
        0,
        Sequence < ::com::sun::star::beans::PropertyValue >());

Avec toutes ces modifications vous venez de créer visuellement un document tableur vierge sans nom.

La chaîne de compilation

Il est très important de connaître la chaîne de compilation si vous voulez modifier un makefile. Si vous n'en n'avez pas l'intention passer au chapitre 4.3 Pour résumer, nous donnons le flot de conception (voir Figure 3) d'un exemple vu précédemment.

<OpenOffice.org1.1_SDK>/examples/DevelopersGuide/ProfUNO/CppBinding
Personal tools