Este art�culo est� basado en el libro de Mathieu Lacage y Dirk-Jan C. Binnema titulado "GNOME y CORBA". Se har� menos hincapi� en CORBA de lo que se hace en el libro, y nos centraremos en el uso de CORBA dentro de GNOME, en concreto en c�mo CORBA logr� que todas las aplicaciones de GNOME se puedan comunicar entre ellas y, gracias a Bonobo, incluso una aplicaci�n puede contener a otra y controlarla.
Este ejemplo pr�ctico del uso de CORBA en GNOME cubre casi todos los aspectos de la arquitectura CORBA y abre puertas a una metodolog�a de desarrollo nueva, abierta y multiplataforma, gracias a las interfaces IDL que definen todo el sistema. En cierto modo se va dejando el mundo de las cabeceras de C para pasar al mundo de las interfaces IDL, que son en la mayor�a de los casos mucho m�s f�ciles de entender.
Para desarrollar con GNOME vamos a necesitar lo m�s nuevo en cuesti�n de software, ya que hasta hace muy poco este desarrollo era complejo y las interfaces de programaci�n cambiaban de forma incompatible. Por ello se recomienda al lector que intente seguir el art�culo desde un distribuci�n como Linux Mandrake 6.1.
�CORBA en GNOME
Ya comentamos en anteriores entregas de la serie la exitencia de ORBit, una implementaci�n de CORBA 2.2 muy ligera y desarrollada en C. Esta implementaci�n se desarroll� en exclusiva para GNOME ya que las necesidades de GNOME eran muy espec�ficas: necesitaba una implementaci�n de CORBA reducida y muy r�pida ya que se incluye dentro de la mayor�a de aplicaciones de GNOME. Cuando se comenz� a desarrollar GNOME se dispon�a de MICO pero su lentitud a la hora de ser utilizado dentro de las aplicaciones y la cantidad de recursos que necesitaba, forzaron a los desarrolladores de GNOME, muchos de ellos con m�quinas poco potentes, a abondonar su uso y desarrollar su propia implementaci�n.
El principal problema de ORBit a la hora de empezar a manejarlo es que utiliza C orientado a objetos, al igual que lo hace GTK, y la sintaxis inicialmente es un tanto engorrosa. Esta sensaci�n inicial se vence tras los primeros programas, y ORBit incluye facilidades para ahorrarnos el tener que teclear m�s de los estr�ctamente necesario, siendo capaz de generar c�digo de ejemplo al que lo �nico que le falta es rellenar la implementaci�n de las funciones de las interfaces IDL.
Aparte de las funcionalidades del propio ORBit, se ha desarrollado una librer�a para facilitar el uso de CORBA dentro de GNOME, conocida como libgnorba y que describimos en el siguiente apartado.
�La librer�a de CORBA de GNOME: libgnorba
Para facilitar el uso de CORBA dentro de GNOME se ha desarrollado una librer�a que intenta encapsular la mayor parte posible de CORBA, con el objetivo de facilitar la vida del desarrollador. Esta librer�a es gnorba y recubre principalmente las llamadas de inicializaci�n de CORBA que se encargan de inicializar el ORB y de resolver las referencias a los servicios predefinidos dentro del ORB.
�Inicializaci�n de CORBA en GNOME
Quiz�s este es un buen momento para que el lector acuda a la anterior entrega de este curso con el objetivo de no perderse. Vamos a recordar estos conceptos de inicializaci�n:
- CORBA_ORB_init: esta funci�n era la encargada de inicializar el ORB tanto en el cliente como en el servidor, y deb�a de ser llamada antes de empezar a utilizar CORBA.
- CORBA_ORB_resolve_initial_services: dentro de CORBA exisen servicios para facilitar la vida del desarrollador y la potencia de la plataforma. En la anterior entrega cubrimos con detalle el servicio de nombres. Algunos de estos servicios son tan importantes que el uso de CORBA sin ellos es complejo y mucho menos potente, por lo que se incluyen por defecto dentro del ORB, y el ORB conoce las referencias a estos servicios. Para acceder a estas referencia de servicios ya registrados dentro del ORB utilizamos "CORBA_ORB_resolve_initial_services" pasando como par�metro a esta funci�n el servicio que queramos utilizar. Recordemos que esta funci�n ya la hemos utilizado para obtener la referencia al servidor de nombres y al POA ra�z (RootPOA) en ejemplos anteriores de esta serie de CORBA.
Unas reglas inciales del uso de C orientado a objetos dentro de CORBA podr�an ser: ORB es un objeto de la clase CORBA y la sintaxis para llamar a funciones de este objeto es CORBA_ORB_nombre_funcion. Cuando queramos aplicar una funci�n sobre un objeto este objeto se le pasar� como par�metro a la funci�n. Y para el tratamiento de las excepciones habr� que pasar en toda llamada a funci�n CORBA un par�metro en d�nde se guarar�n las posibles excepciones. De cualquier forma en los ejemplos tendremos tiempo de analizar en concreto esta sintaxis.
Prosigamos con la librer�a gnorba de GNOME. Cuando quer�amos que un servidor CORBA se quedara a la espera de los clientes, finalizabamos al servidor en un bucle infinito (CORBA_ORB_run()) desde el que se trataban todos los accesos al servidor CORBA.
La librer�a GTK, con la que se crean las interfaces gr�ficas en GNOME, tambi�n acaba sus programas en un bucle final, en el que se reciben los eventos del usuario sobre la interfaz gr�fica (pulsaciones de un bot�n, arrastre de una ventana ...).
Est� claro pues que un programa que utilice GNOME deber�a de terminar en dos bucles infinitos, algo que no es posible. La librer�a gnorba se encarga de encapsular estos dos bucles e integrar el bucle de CORBA dentro del de GTK en la llamada a la funci�n gnome_CORBA_init. Veamos un ejemplo de su uso:
#include
#include
#include
int main (int argc, char **argv)
{
CORBA_ORB orb;
CORBA_Environment ev;
CORBA_exception_init (&ev);
orb = gnome_CORBA_init ("ejemplo de inicializaci�n de ORB y GTK",
"v 1.0 Barrapunto - acs",
&argc,
argv,
GNORBA_INIT_SERVER_FUNC,
&ev);
return 0;
}
Vemos que se utiliza la librer�a orbit, gnorba y gnome la cual a su vez utiliza GTK. La llamada a la funci�n gnome_CORBA_init nos devuelve el ORB con el que vamos a trabajar a partir de este momento.
Para poder compilar los ejemplos de este art�culo es indispensable tener instalada una distribuci�n con un GNOME actualizado y con los paquetes de desarrollo instalados. Para compilar estos ejemplos se va a utilizar Mandrake 6.1. Para compilar este peque�o programa se puede utilizar la l�nea:
gcc `gnome-config --cflags gnorba` ej1.c
Aqu� vemos una utilidad muy potente a la hora de compilar que nos evita el uso de complejos Makefiles. Con gnome-config podemos obtener los distintos flags necesarios a la hora de compilar y enlazar con las distintas librer�as de gnome. En este caso, como s�lo compilamos y no enlazamos, le decimos que nos d� los flags necesarios para poder compilar un programa que utiliza la librer�a gnorba, cuyo resultado es: -I/usr/include -DNEED_GNOMESUPPORT_H -I/usr/lib/gnome-libs/include -I/usr/lib/glib/include. Las librer�as GTK y GLIB tambi�n nos proporcionan utilidades similares.
�Servidor de Nombres en GNOME
Como ya vimos en anteriores cap�tulos el servidor de nombres CORBA nos permite acceder a las referencias a los objetos por medio de un nombre. Es una especie de DNS pero para los IOR ( identificador de objeto interoperable). Un problema que tiene ORBit es que no se puede acceder actualmente al servidor de nombres a trav�s de la funci�n del ORB CORBA_ORB_resolve_initial_reference. Y un segundo problema es c�mo se arranca el servidor de nombres CORBA de forma autom�tica cuando se necesite.
De nuevo libgnorba viene en nuestro auxilio y se encarga de resolver ambos problemas. Utilizando la llamada gnome_name_service_get obtenemos la referencia al servidor de nombres en el caso de que el servidor est� arrancado. En el caso de que no lo est�, esta llamada lo arranca de forma autom�tica y nos devuelve el IOR del servidor de nombres arrancado.
Por lo tanto el programador es liberado de ambas labores y para el casi transparente el c�mo se gestiona el servidor de nombres. El sabe que a esta referencia puede pedirle que le devuelva la IOR de otros objetos a partir de un nombre.
�GOAD: Demonio de Activaci�n de Objetos en GNOME
Dentro de libgnorba tambi�n tenemos unos API que nos permiten obtener un listado de todos los servidores CORBA disponibles en el sistema, y podemos activarlos y desactivarlo en funci�n de nuestras necesidades.
Con la propia librer�a viene una utilidad conocida como goad-browser que permite acceder al conjunto de servidores registrados dentro del sistema. En la siguiente figura vemos la informaci�n que nos proporciona dicha utilidad.

En la primera columna vemos el identificador del servidor, si est� activo o no lo est� (desde aqu� lo podemos activar) y el identificador de la interfaz IDL que describe al servidor. Por ejemplo, si activamos el control_center nos aparecer� la ventana que nos permite configurar todo el entorno gnome. En cierto modo el goad-browser lo podemos ver como un lanzador de aplicaciones.

Pero la verdadera potencia est� en la API de acceso a GOAD, muy sencilla. De ella presentamos las dos funciones principales de la misma (dentro de gnorba.h est� la API completa).
| Nombre funci�n | Uso de funci�n |
|---|---|
| goad_server_list_get | Lista de servidores registrados en GOAD |
| goad_server_activate | Activa un servidor CORBA de GOAD |
Cuando desarrollemos un programa en CORBA, si necesitamos la funcionalidad de otro que est� presente en el sistema y registrado dentro de GOAD, podremos activarlo a trav�s de esta interfaz de forma muy sencilla. Y adem�s, podremos acceder a todas la funcionalidad que exporte por su interfaz IDL, tal y como se har�a en cualquier servidor CORBA en otro entorno. De esta forma empezamos a ver la potencia y sencillez que aporta CORBA a un entorno gr�fico como GNOME, y esto a�n es s�lo el principio, la verdadera potencia llegar� con el mundo de los componentes y Bonobo.
Si una vez que hemos desarrollado nuestro programa creemos que puede ser �til registrarlo como un servidor CORBA dentro de GOAD, lo debemos de dar de alta dentro del directorio /etc/CORBA/servers (en Linux Mandrake 6.1). Para ello a�adimos en este directorio un nuevo fichero con el nombre nombre_servidor.gnorba. Por ejemplo, si nos fijamos de nuevo en el Centro de Control el fichero que lo describe es gnomecc.gnorba y su contenido es:
[control_center] type=exe repo_id=IDL:GNOME/control_center:1.0 description=GNOME Control Center location_info=gnomecc
El fichero como vemos es autodescriptivo: gnomecc es un ejecutable cuya interfaz IDL es IDL:GNOME/control_center:1.0.
�Conclusiones de libgnorba
Gracias a esta librer�a podemos evitar temas siempre espinosos y de poco inter�s para nuestra aplicaci�n final: la inicializaci�n de CORBA, la activaci�n y acceso al servidor de nombres de CORBA y el control de registro de servidores CORBA y su activaci�n. El lector que tenga m�s presente POA posiblemente piense que el GOAD es algo que se podr�a implementar con POA y los servant manager. Es cierto, pero los desarrolladores de GNOME entienden que esta soluci�n es m�s sencilla. Quiz�s como no tienen el problema de la portabilidad entre ORBs, este tipo de aspectos los prefieren solucionar "ad-hoc" (a medida) para su caso concreto.
�El escritorio GNOME
Ha llegado el momento de ver c�mo todas las piezas del sistema se combinan entre s�. Y son todas esta piezas coordinadas lo que se conoce como el escritorio de GNOME, un sistema en el que varias aplicaciones se unen entre s� con el fin de dar un conjunto de funcionalidades de forma gr�fica al usuario del sistema.
La mayor�a de las definiciones de las interfaces de las aplicaciones GNOME se encuentran en el directorio /usr/share/idl.
Entre las interfaces IDL que se definen destacan:
- desktop-viewer.idl: interfaz que implementan todas las aplicaciones capaces de visualizar texto.
- desktop-editor.idl: interfaz que implementan las aplicaciones que quieren sr consideredas editores de texto dentro del entorno.
- gnome-unknown.idl: interfaz COM Unknown b�sica dentro del modelo de componentes Bonobo.
- GnomeObject.idl: interfaz com�n para todos los objetos Bonobo.
- gnome-factory.idl: interfaz sencilla para objetos factor�a.
- gnome-panel.idl: interfaz del panel de GNOME, compleja y amplia.
- help-browser.idl: interfaz al sistema de ayuda de GNOME.
Por ejemplo, si quisieramos crear un entorno de desarrollo para GNOME, lo que hacemos es crear el n�cleo que interacciona con el editor de textos, el compilador, el depurador etc. a trav�s de las respectivas interfaces IDL de cada m�dulo. Nuestro entorno a partir de este desarrollo podr� trabajar con diferentes editores y compiladores de diferentes lenguajes sin mas que cambiar el objeto al que accedemos para que haga cada uno de los papeles. Es la flexibilidad llevada a su m�xima expresi�n.
Desde cualquier aplicaci�n nuestra dentro del entorno de GNOME podemos acceder a todos los servicios que nos ofrecen estas interfaces. No hay que olvidar que el tener las interfaces IDL nos permite poder acceder a los objetos que las implementan. Vemos que la uni�n entre todos los elementos de GNOME se consigue en gran medida gracias a CORBA.
Para que el lector se pueda hacer una idea de c�mo est�n definidas estas interfaces en el siguiente cuadro se puede ver la de help-browser.idl.
module help_browser {
interface simple_browser {
void fetch_url(in string URL); // muestra URL en el navegador actual
simple_browser show_url (in string URL); // abre navegador y muestra URL
};
};
El lector, si ha seguido la serie, no tendr� ning�n problema en entender con detalle la interfaz. Recordemos que si quisieramos acceder a la interfaz de ayuda, a partir de este IDL y utilizando el compilador IDL de ORBit (orbit-idl), generamos los cabos (en lenguaje C) en este caso, los cuales incluimos en nuestro programa y ya podemos utilizar el sistema de ayuda integrado de GNOME. Para localizar el objeto que implementa esta interfaz, utilizamos el servidor de nombres y buscamos la IOR del objeto cuyo nombre sea gnome-help-browser. Una vez que tenemos la referencia al objeto ya sabemos lo sencillo que es utilizar el objeto con simples llamadas sobre esta referencia.
Realmente todo este proceso se simplifica algo gracias a las librer�as de GNOME, pero las ideas que est�n detr�s siguen siendo las mismas.