CORBA y Bonobo

Bonobo, como no podía ser menos, está basado en CORBA, la tecnología estrella del proyecto GNOME. Eso quiere decir que Bonobo define un conjunto de interfaces CORBA IDL para la consecución de los siguientes objetivos:

El uso de CORBA en Bonobo no se ha escogido única y exclusivamente por ser la tecnología "preferida" en GNOME. El usar CORBA para la implementación de Bonobo trae muchas ventajas, entre las que destacan:

La implementación de Bonobo está fuertemente inspirada en la implementación de OLE2, con la diferencia de que éste último está basado en COM, un sistema propietario de Microsoft que, evidentemente, sólo funciona en entornos Windows, mientras que Bonobo está basado en CORBA, hecho este que le abre un mundo mucho más grande, pues CORBA es un estándar avalado por la plana mayor de la industria informática. El estar basado en CORBA va a permitir que se intercambien componentes entre aplicaciones ejecutándose en distintas máquinas, plataformas o sistemas operativos. Otro de los puntos fuertes inherentes en el uso de CORBA como base de la arquitectura, es que, al estar todo definido en interfaces IDL de CORBA, es totalmente posible el hacer una implementación de Bonobo para otro sistema operativo/plataforma.

Bonobo propiamente dicho simplemente consiste en una serie de interfaces CORBA, por lo que en este artículo nos vamos a centrar en la implementación de Bonobo para el proyecto GNOME, que usa GTK+ y X Window. Pero los desarrolladores de Bonobo han puesto un cuidado especial en hacer Bonobo totalmente independiente del toolkit (GTK+) usado, por lo que sería perfectamente posible el realizar una implementación de Bonobo, por ejemplo, para QT, el toolkit usado por el proyecto KDE.

Bonobo se divide en distintos tipos de interfaces IDL, cada uno de ellos enfocado a un uso específico. Se pueden crear componentes Bonobo de tres tipos:

Los primeros, los componentes, son simples objetos CORBA que implementan la interfaz Bonobo::Unknown, que es en la que están basados todos los componentes, controles y empotrables. Es una interfaz CORBA muy sencilla:

      module Bonobo {
        interface Unknown {
          void ref ();
          void unref ();
          Unknown queryInterface (in string repoid);
        }
      }
    

Como puede verse, este interfaz es tan básico que, por si solo, sirve para más bien poco. Realmente, su única utilidad es para que todos los demás tipos de componentes Bonobo estén basados en este interfaz, que lo que implementa es el control de vida de los objetos (los métodos ref() y unref()) y la posibilidad de "preguntar" si un componente implementa un interfaz determinado. Así, por ejemplo, si tuviéramos un componente ya creado, podríamos hacer lo siguiente (NOTA: este código es inventado, no existen esos objetos/funciones en Bonobo):

      WordProcessor wp = word_processor_new();
      Application app = wp->queryInterface("IDL:Office/Application");
      if (app) {
        app.close();
      }
    

En este ejemplo, estamos creando un componente de tipo WordProcessor, al que, mediante el método queryInterface estamos preguntando si, además de este tipo de objeto, implementa el interfaz Office::Application. Esto nos sirve para tratar a un mismo objeto bajo distintas personalidades (= interfaces IDL implementados). Esta idea es muy parecida a lo que es la herencia en lenguajes orientados a objetos, como C++, Java, etc.

Este tipo de componentes pueden ser muy útiles para añadir servicios no visuales a nuestras aplicaciones, como por ejemplo podría ser un servidor de red compartido por varios usuarios, un interfaz encapsulando acceso a la configuración del sistema, etc. De todas formas, como hemos comentado anteriormente, TODOS, absolutamente TODOS los objetos Bonobo implementan este interfaz, por lo que, aún pareciendo un interfaz sin ningún sentido, es la base para la implementación del resto de componentes.