FR/Documentation/Base de registres
OpenOffice.org peut être étendue, on peut lui ajouter des fonctionnalités en OooBasic, en C++, en Java en Python... Ces fonctionnalités ajoutées sont appelées add-on et l'on peut se demander comment OpenOffice.org peut connaître quelque chose sur ces codes. Ceci se fait à l'aide de la base de registre UNO à l'aide des outils regview, regcomp, regmerge et idlc.
Contents
Pourquoi une base de registre UNO ?
Il est très commun pour un programmeur de réaliser un programme qui utilise une librairie statique. Si la librairie est dynamique, le problème de l'édition de lien est laissé au système d'exploitation. Ce système d'exploitation a à savoir si la librairie est déjà chargée en mémoire et dans le cas contraire où est le fichier correspondant. Mais que se passe-t-il si vous avez déjà un fichier binaire exécutable et que vous désiriez lui ajouter des fonctionnalités avec des librairies que vous créez ? Cela peut être réalisé avec Openoffice.org comme déjà mentionné. La première chose est qu'il est impossible pour votre binaire exécutable OpenOffice.org de connaître à l'avance le nom de la librairie que vous allez réaliser(c'est un nom que vous avez choisi).Il faut dons un mécanisme à OpenOffice.org pour retrouver ce nom et d'autres informations : ceci est le principal objectif de la base de registre UNO. Le nom des librairies n'est pas la seule information indispensable à gérer par cette base de registre. Si l'on imagine que l'on peut étendre avec plusieurs librairies, il faudra savoir que le sous-brogramme bidon1 vient de telle librairie et que bidon2 vient de telle autre. En OpenOffice.org l'élément central est l'interface et donc l'information pertinente est que telle interface se trouve dans telle librairie...
La base de registre UNO utilise des fichiers binaires d'extension rdb. Ce format binaire est difficile à lire par l'homme et un outil pour faciliter la lecture est donc fournit avec le SDK (aller au chapitre 10.3 pour voir une description de regview).
Comment utiliser la base de registres
La documentation concernant la base de registre UNO existe et peut être consultée à l'adresse suivante : http://udk.openoffice.org/common/man/tutorial/uno_registries.html On peut aussi trouver de l'information à : http://www.ooomacros.org/dev.php sur
- Add On Tool
Author: Bernard Marcelly
- Add On Installer
Author: Didier Lachièze, with code from Danny Brewer, Bernard Marcelly and Andrew Brown
- Basic Library Installer
Author: Danny Brewer, with code from Andrew Brown & Didier Lachièze
De mon point de vue la manière la plus simple d'ajouter de l'information dans la base de registres est de modifier le fichier unorc (sous linux) ou uno.ini (sous Windows). Vous devez mettre votre fichier your_library.uno.rdb dans le répertoire <OOo>/program, et éditer /modifier le fichier <OOo>/program/unorc (sous linux) en ajoutant ce que j'ai coloré en rouge ci-dessous :
#unorc or uno.ini [Bootstrap] UNO_SHARED_PACKAGES=${$SYSBINDIR/bootstraprc:BaseInstallation}/share/uno_packages UNO_SHARED_PACKAGES_CACHE=$UNO_SHARED_PACKAGES/cache UNO_USER_PACKAGES=${$SYSBINDIR/bootstraprc:UserInstallation}/user/uno_packages UNO_USER_PACKAGES_CACHE=$UNO_USER_PACKAGES/cache UNO_TYPES=$SYSBINDIR/types.rdb ?$UNO_SHARED_PACKAGES_CACHE/types.rdb ?$UNO_USER_PACKAGES_CACHE/types.rdb UNO_SERVICES= ?$UNO_USER_PACKAGES_CACHE/services.rdb ?$UNO_SHARED_PACKAGES_CACHE/services.rdb $SYSBINDIR/services.rdb ?$SYSBINDIR/your_library.uno.rdb
Il ne faut pas oublier d'enregistrer la position de votre fichier your_library.uno.so dans le fichier your_library.uno.rdb. Cela est réalisé avec l'outil regcomp :
regcomp -Register -r your_library.uno.rdb -c <somewhere>/your_library.uno.so
Un autre moyen d'obtenir ce résultat est d'utiliser pkgchk ou unopkg depuis OOo2.X
Jouons un peu avec regview
To do : put the example of chapter 7.3 in an other way C=omment voit-on la base de registre en OooBasic ?= OooBasic permet beaucoup de choses et en particulier une exploration de la base de registre. Le code de Danny Brewer présenté ici : http://www.oooforum.org/forum/viewtopic.php?t=8737 nous montre comment ? Examinons un peu plus en détail ce code :
'Listing 160 Code d'exploration de la base de registre en OOoBasic REM ***** BASIC ***** Sub Main oReflection = createUnoService( "com.sun.star.reflection.CoreReflection" ) oInfo = oReflection.forName( "nom.dannybrewer.test.XDannysCalcFunctions1" ) aMethods = oInfo.getMethods() For i = 0 To UBound( aMethods ) oMethod = aMethods( i ) Print oMethod.getName() Next End Sub
puis nous créons un fichier IDL :
Listing 161 Fichier IDL d'exemple // IDL #include <com/sun/star/uno/XInterface.idl> #include <com/sun/star/lang/XInitialization.idl> module my_module { interface XSomething : com::sun::star::uno::XInterface { long getCount(); void setCount( [in] long nCount ); long increment(); long decrement(); }; service MyService { interface XSomething; }; };
Avec ce fichier IDL il nous est possible de créer un fichier rdb et de l'enregistrer dans la base de registre. Maintenant OpenOffice.org fonctionne comme si nous avions une interface supplémentaire même si l'on n'a pas encore écrit le code correspondant. Evidemment, il nous est impossible d'utiliser ce service puis qu'il n'y a pas ded code corrrespondant, mais on peut le voir. Pour cela on modifie légèrement le code de Danny :
'Listing 162 REM ***** BASIC ***** 'From Danny : http://www.oooforum.org/forum/viewtopic.php?t=8737 Sub Main oReflection = createUnoService( "com.sun.star.reflection.CoreReflection" ) oInfo = oReflection.forName( "my_module.XSomething" ) aMethods = oInfo.getMethods() 'XRay.XRay oInfo print UBound( aMethods )+1 & " methods : ****" For i = 0 To UBound( aMethods ) oMethod = aMethods( i ) Print oMethod.getName() Next aTypes = oInfo.getTypes() print UBound( aTypes )+1 & " types : ****" For i = 0 To UBound( aTypes ) oType = aTypes( i ) Print "Types : " + oType.getName() Next aInterfaces = oInfo.getInterfaces() print UBound( aInterfaces )+1 & " interfaces : ****" For i = 0 To UBound( aInterfaces ) oInterface = aInterfaces( i ) Print "Interfaces : " + oInterface.getName() Next End Sub
qui lancé produit l'affichage suivant :
7 methods : **** queryInterface acquire release getCount setCount increment decrement 3 types : **** Types : com.sun.star.reflection.XIdlClass Types : com.sun.star.lang.XTypeProvider Types : com.sun.star.uno.XWeak 0 Interfaces : ****
où l'on peut voir parmi d'autres choses les quatre méthodes données dans le fichier IDL. Template:Documentation/Note
To do : continue...
Comment manipuler la base de registre en C++ ?
See the registery Class in the C++ documentation To do