4. Steuerung mittels CORBA

SandUhr besitzt eine umfangreiche CORBA-Schnittstelle. Damit kann man auch in eigenen Skripten und Programmen neue Uhren erzeugen oder auf bestehende Uhren zugreifen. Die Schnittstelle erlaubt es sogar, eigene Alarmmechanismen an das Programm anzuschließen. Unten findet sich als Beispiel eine Methode, um die Alarmmeldung per Email zuzustellen.

4.1. CORBA-Einführung

CORBA ist ein komplexes Gefüge, das dazu dient unterschiedliche Programmteile auch dann miteinander verbinden zu können, wenn sie möglicherweise in unterschiedlichen Programmiersprachen geschrieben sind, oder auf unterschiedlichen Rechnern eines Netzwerkes laufen. Die volle Dosis an Schlagworten findet sich auf der offiziellen CORBA-Webseite unter www.corba.org.

CORBA ist objektorientiert. Ein CORBA-Server implementiert Objekte und Kunden können (vom Server vorgegebene) Anforderungen an den Server senden, um bestimme Aufgaben zu erledigen. SandUhr implementiert zwei Klassen von CORBA-Objekten:

Die CORBA-Unterstützung von SandUhr ist mittels ORBit realisiert. Dies ist der Standard-CORBA-ORB des GNOME-Projekts. Informationen über ORBit gibt es auf der ORBit homepage. Die Kommunikation zwischen unterschiedlichen ORB-Implementationen ist standardisiert, so dass (zumindest in der Theorie) jede ORB-Implementation geeignet sein sollte, um mit SandUhr zusammenzuarbeiten. Wenn Sie mehr über CORBA lernen wollen, dann sollten Sie den Artikel CORBA Applications In GNOME von Elliot Lee lesen. Dieser ist auf der GNOME development site veröffentlicht.

In den folgenden Beispielen werde ich die Python-Schnittstelle für ORBit verwenden. Diese gibt es auf der Seite orbit-python.sault.org. Außerdem wird die OAF-Bibliothek für GNOME benötigt. Hier verwende ich die Python-Anbindung, die im bonobo-python Paket unter bonobo-python.lajnux.nu enthalten ist.

4.2. Einfache CORBA-Skripte

Mittels CORBA eine neue Uhr zu erzeugen, ist leicht. Das einzige Problem besteht darin, Zugriff auf ein SandUhr::TimerFactory-Objekt zu bekommen. Wir können dann dieses Objekt einfach anweisen, für uns eine neue Uhr zu erzeugen. Das Problem wird durch die OAF-Bibliothek von GNOME (dem „Object Activation Framework“) gelöst. Wir können bei OAF einfach ein CORBA-Objekt anfordern, das die SandUhr::TimerFactory-Klasse implementiert. Diese Technik wird durch Beispiel 3 illustriert.

Wenn Sie erst einmal dieses Beispiel bewältigt haben, dann ist es kein Problem mehr, die Uhr weiter anzupassen. Beispiel 4 demonstriert, wie man einen pinkfarbenen Timer erzeugt, der fünfmal piept.

4.3. Fortgeschrittene CORBA-Anwendungen

Eine aufwändigere Anwendung der CORBA-Schnittstelle besteht darin, neue Alarmmechanismen an das Programm anzuschließen. Dadurch können sie die Alarmmeldung mittels beliebiger Programme zustellen. Beispiel 5 zeigt exemplarisch, wie Sie das per Email tun.

Das Programm muss hier einen CORBA-Server bereitstellen, der die SandUhr::AlarmAction-Schnittstelle, wie sie in SandUhr::AlarmAction(3) beschrieben ist, implementiert: es muss das SandUhr::AlarmAction::NeedsPopup-Attribut und die Methoden SandUhr::AlarmAction::Attach, SandUhr::AlarmAction::Detach und SandUhr::AlarmAction::Deliver bereitstellen.

Für objektorientierte Programmiersprachen stellt die ORB-Implementation dazu gewöhnlich eine Klasse, die etwa SandUhr__POA::AlarmAction benannt ist, zur Verfügung (für Python ist der Name SandUhr__POA.AlarmAction). Davon müssen Sie nun eine neue Klasse ableiten, die NeedsPopup, Attach, Detach und Deliver überlädt.

SandUhr greift auf den Server zu, um die Alarmmeldung zuzustellen. Daher müssen sie Ihr Programm am Laufen halten, bis der Timer abgelaufen ist. Gewöhnlich ruft man dazu die Methode ORB::run des ORBs auf.

Es gibt noch eine weitere Methode, um CORBA-basierte Alarmmechanismen an das Programm anzuschließen: mittels ORB::object_to_string kann man den IOR-String des AlarmAction-Objektes herausfinden. Diesen String kann man in das entsprechende Feld der Seite Aktion im Eigenschaftendialog der Uhr eintragen. Die Uhr wird dann den Alarm mit Hilfe unseres Servers zustellen. Dies wird durch Beispiel 6 demonstriert.

Anmerkung

Diese Technik ist manchmal nützlich, da sie im Gegensatz zu den oben geschilderten Methoden nicht die OAF-Bibliothek benötigt. Man kann dieses Verfahren also auch mit Programmiersprachen verwenden, für die es noch keine OAF-Anbindung gibt.