AMIGA-Magazin · Ausgabe 02/05 OS4-Programmierung: Preferences und application.library

Aktuelles Heft 02/05

Bequeme Einstellungen

Fast jedes Programm oder Systemkomponente verfügt über eine Funktion für Einstellungen und Optionen. Oft werden die Settings nicht für den nächsten Programmstart zwischengespeichert. Diese Aufgabe übernimmt bei »AmigaOS 4« eine Bibliothek.

von Michael Christoph

Bisher gab es auf dem Amiga kein einheitliches Format, mit dem sich Programmeinstellungen verarbeiten und speichern lassen. So findet man neben reinen Text-Dateien (wie sie unter Linux meist anzutreffen sind) auch Dateien im IFF-Format (z.B. verwenden alle Systemeinsteller noch dieses Format). Und dann gibt es auch noch die ganz unstrukturierten Daten, die einfach als Binärdatei geschrieben werden. Und auch die Speicherorte sind »wild« auf der Festplatte verstreut. Neben dem Programmverzeichnis und ENVARC: findet man auch Programme, die ihre Einstellungen im Verzeichnis S: sichern.

Höchste Zeit, sich diesem Thema anzunehmen und das System zu vereinheitlichen. Dieser »Jemand« war bei AmigaOS 4 Stefan Robl, von dem auch das Programm »AmiDock« stammt. Im Zuge der Neuentwicklung für AmigaOS 4 wurde auch die application.library entwickelt. Ein Teil davon sind die Prefs-Objecte, mit denen sich die Einstellungen flexibel verwalten lassen.
Bereits im letzten Teil war die application.library Thema. Dort ging es um die Kommunikation der Anwendung mit ihrer Umgebung bzw. dem Betriebssystem. Die application.library stellt aber noch ein zweites Interface bereit: PrefsObjects.

Über dieses Interface werden verschiedene Funktionen zum Erzeugen, Verwalten und Lesen von Prefs-Dateien angeboten. Die Daten werden, wie bei Systemdateien auch, in ENV: bzw. ENVARC: gespeichert, sofern kein anderes Basisverzeichnis angegeben wird. Dabei wird XML als Beschreibung verwendet. Doch keine Angst, als Programmierer kommen Sie nicht mit den XML-Anweisungen in Berührung. Dies erledigt alles die application.library für Sie. Durch XML wird aber eine sehr flexible Verarbeitung ermöglicht. Auch Änderungen im Inhalt oder Aufbau sind ohne Eingreifen der Anwendung möglich. Dabei werden alle Arten von Datentypen unterstützt: Text, Zahlen, Datumswerte, Dateinamen, Arrays und sogar binäre Daten (z.B. ein Bild) sind möglich. Und auch Änderungen innerhalb der Beschreibung der Prefs-Dateien wird transparent erledigt.

Erste Schritte
Über PrefsDictionary() wird ein neuer Prefs-Container erzeugt, während PrefsArray() oder PrefsString() Daten-Objekte erzeugt. Den Daten muss noch per DictSetObjectForKey() ein Schlüssel zugewiesen werden, unter dem die Daten wieder gesucht werden können. Der Schlüssel ist ein String, sodass hier auch beschreibende Namen möglich sind (z.B. Kundenname, Telefonnummer etc.). Die Verwaltung eines einfachen Textes zeigt Listing 3 und in Listing 4 sehen Sie ein analoges Beispiel mit einem Datumswert.

Die Methoden mit vorangestelltem »Alloc« reservieren selbstständig Speicherplatz, um den Prefs-Wert aufzunehmen. Bei Verwendung der anderen Methoden müssen Sie sicherstellen, dass der Prefs-Wert im eigenen Programmcode solange nicht freigegeben wird, bis die Prefs-Datei gespeichert wurde. Variablen auf dem Stack sind dazu also ungeeignet, bzw. dann sind die Alloc-Tags zu bevorzugen.

Um eine Verknüpfung der Variablen mit dem Prefs-Container herzustellen, wird DictSetObjectForKey() verwendet (Listing 5). Wie sich Array-Werte verwalten lassen, zeigt der Ausschnitt in Listing 6. Wie Sie sehen, ist für jeden Array-Eintrag extra Speicher anzufordern.

Über ALPOARR_AddObj können Sie beliebig viele Werte der Verwaltungsstruktur zuweisen. Es ist auch möglich, Einträge wieder zu entfernen ­ nutzen Sie dazu
ALPOARR_RemoveObjAtIndex. Mit ALPOARR_ReplaceObjAtIndex ersetzen Sie Werte. Alle Einträge eines Arrays lassen sich einfach per ALPOARR_Clear löschen.

Suchen, lesen und speichern
Gesucht werden die Daten über die Funktion DictGetObjectForKey(). Verschiedene DictGetxxx()-Funktionen helfen bei der Suche nach einzelnen Werten in Abhängigkeit vom Variablentyp. Unser im Beispiel zugewiesener Text lässt sich, wie in Listing 8, suchen. Das Auslesen von Arrays (Listing 7) ist etwas aufwändiger, da hier mehrere Ergebnisse zu einem Suchbegriff vorliegen.
Damit die Daten auch dauerhaft, also über das Programmende hinaus, gesichert werden, gibt es die WritePrefs()-Funktion. Umgekehrt liest ReadPrefs() die Daten von der Festplatte. Nach dem Allocieren des Containers ist also die Read-Funktion zu benutzen und vor der Freigabe (ALPO_Release) die Write-Funktion (Listing 9).

Beim Aufruf von WritePrefs können Sie unterschiedliche Tags mitgeben. Im Beispiel wurde WRITEPREFS_FileName verwendet ­ damit wird der Name der Datei für Voreinstellungen festgelegt. Es können auch absolute Pfadangaben zum Einsatz kommen. Die Tags WRITEPREFS_WriteENV bzw. WRITEPREFS_WriteENVARC kommen zum Einsatz, wenn Sie die Einstellungen in den Verzeichnissen ENV: bzw. ENVARC: ablegen. Für ReadPrefs stehen analog entsprechende Tags (READPREFS_xxx) zur Verfügung. Anhand von WRITEPREFS_LastAppDocs wird der application.library mitgeteilt, dass alle Einstellungen des Programms gespeichert sind. So kann zum Beispiel eine Anwendung auf die neuen Daten reagieren, die in einem eigenen Einstellungsprogramm verändert wurden.

Zum Probieren
Vollständige, dokumentierte Beispielprogramme und ausführbare Dateien finden Sie auf der Heft-CD. Sie können wieder zum Experimentieren und als Grundlagen für eigene Programme verwendet werden. Sie finden dort auch das Beispielprogramm zum Auslesen der XML-Datei mit Voreinstellungen (s. Bild »Ausgelesen«).

Bisher wurden allerdings das SDK und passende Unterlagen zur application.
library noch nicht öffentlich durch das AmigaOS-Team freigegeben. Die Entwicklung ist noch nicht abgeschlossen und es kann u.U. noch Änderungen geben. Durch die späte Freigabe des Pakets soll sicher verhindert werden, dass noch anstehende Änderungen für Inkompatibilitäten sorgen.

In der nächsten Ausgabe werden zeigen wir Ihnen wie Sie mit der utlitiy.library arbeiten. So unscheinbar sie mit Kickstart 2.0 eingeführt wurde, bietet sie mittlerweile eine riesige Fülle an nützlichen Funktionen.

Verwaltbare Typen
Name/Typbezeichnung Prefix in den Includes Erläuterung
String ALPOSTR_xxx Text, für die Zukunft ist bereits eine Unicode-Unterstützung vorbereitet.
Number ALPONUM_xxx Zahlen im Integerwertebereich oder Ja/Nein-Einstellungen (Bool).
Date ALPODAT_xxx Datumswert incl. Uhrzeit im Format »stdc c_time« oder Amiga-spezifischen »timeval«-Format.
Binary ALPOBIN_xxx Beliebige Binärdaten (z.B: Grafikdaten).Array ALPOARR_xxx Kann eine beliebige Anzahl der vorherigen Typen enthalten.
Dictionary ALPODICT_xxx Ist die Sammlung aller Einstellungen eines Programmes. Die Tags können an PrefsDictionary() übergeben werden.
Im Editor:
Die Prefs-Daten liegen bei »AmigaOS 4« im XML-Format vor. Sie lassen sich im Klartext anzeigen und per Editor bearbeiten.

 

 

 

Listingübersicht

Listing 1: Das Interface-Handling für Prefs-Dateien

Listing 2: Handling von Prefs mit Hilfe der application.library.
Listing 3: Schreiben eines einfachen Textobjekts.
Listing 4: Ein Beispiel mit dem Datumswert.
Listing 5: Die Verknüpfung eines Prefs-Container mit Array-Werten.
Listing 6: Die Verwaltung von Array-Werten.
Listing 7: Auslesen eines Arrays.
Listing 8: Suche nach einem Array-Element.
Listing 9: Lesen und Schreiben von Prefs-Daten.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ausgelesen: Ein kleines Demoprogramm zum Auslesen und Anzeigen der Prefs-Daten.

 

 

 

 

 

 


Download:enthält:
Download OeffneInterface.c : Interface öffnen
ReadWritePrefs.c : Prefs-Datei schreiben und auslesen (mit Arrays)
ReadWriteText.c : Texte und Zeitwerte sichern und laden
os4prog-7-prefsobjects-src.lha,
59.993 bytes


Hauptseite © 2005 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 18. Februar 2005, Michael Christoph.