home *** CD-ROM | disk | FTP | other *** search
-
- Das Handler-Konzept
- ===================
-
- In Version 2 der Library wurde lediglich die Anzeige konstanter Texte
- unterstützt, die aus den auf Disk vorliegenden Projekt-Dateien entnommen
- wurden. Ab Library-Version 3 besteht noch zusätzlich die Möglichkeit,
- HotHelp um sogenannte HotHelp-Handler zu erweitern. Diese sind in der
- Lage, beliebige Texte zu erzeugen und an HotHelp weiterzuleiten, wenn der
- Benutzer einen normalerweise unbekannten Begriff angefordert hat.
-
- Bisher erzeugte HotHelp lediglich eine Fehlermeldung, wenn ein
- gesuchter Begriff nicht in den disk-residenten Projekten aufgefunden
- werden konnte. Ab Version 3 leitet HotHelp nun einen unbekannten Begriff
- an die HotHelp-Handler weiter. Diese können dann überprüfen, ob sie über
- einen zu dem Begriff passenden Hilfstext verfügen und diesen an HotHelp
- zurückgeben. Dieser Text muß aus keiner Datei entnommen werden, sondern
- kann vom Handler beliebig während der Laufzeit generiert werden. Dadurch
- eröffnen sich bisher nicht mögliche Wege, über HotHelp interaktiv mit dem
- Anwender zu kommunizieren. Die Datenbasis HotHelps, die bisher nur aus
- den konstanten Disk-Projekten bestand, kann durch Handler beliebig und
- flexibel erweitert werden. Ein Beispiel dafür zeigt das Programm
- HotKeyHelp, das vom User in einem Editor markierte Textblöcke als
- Online-Projekte verwaltet und wieder in einem HotHelp-Fenster darstellen
- kann, sobald der entsprechende Schlüssel wieder angefordert wird. Unter
- Version 2 der Library wäre dies unmöglich gewesen, da nur Texte aus vorher
- übersetzten Projekt-Dateien dargestellt werden konnten!
-
- Neben der Fähigkeit, Texte zu sonst unbekannten Begriffen darstellen zu
- können, gibt HotHelp den einzelnen Handlern auch die Möglichkeit, die von
- ihnen verwalteten Texte in Pseudo-Projekte einzuteilen, die genau wie
- normale Projekte behandelt werden - mit dem großen Unterschied, daß ihr
- Inhalt erst zur Laufzeit bestimmt wird. Die Projekt-Einteilung unterliegt
- dabei keinem festgelegten Format; ein Handler sollte lediglich auf Anfrage
- von HotHelp hin in der Lage sein, einen oder mehrere Projekt-Namen
- anzugeben. Treten diese später als Teil eines unbekannten Such-Begriffes
- auf, sollte der Handler dann auch darauf reagieren. HotHelp fordert diese
- Namen an, wenn der Benutzer die Projekt-Übersicht aufruft. Die
- zurückgegebenen Namen werden dann in diese Übersicht mit aufgenommen.
- Diese Möglichkeit ist insbesondere für Handler interessant, deren Texte
- verhältnismäßig statisch sind (wie dies z.B. bei HotKeyHelps
- Online-Projekten der Fall ist). Doch auch Handler, die keine statischen
- Texte verwalten, sollten mindestens einen Projekt-Namen angeben, der
- sinnvollerweise einen Bezug zur Aufgabe des Handlers haben sollte. Wird
- kein Name angegeben, kann der Handler auch nicht über die
- Projekt-Übersicht angesprochen werden.
-
- Wählt der Benutzer eines der Pseudo-Projekte aus der Projekt-Übersicht
- an, so fordert HotHelp vom entsprechenden Handler einen dazu passenden
- Eintrag mit einleitenden Informationen an, der der Startseite eines
- Disk-Projektes entspricht. Natürlich kann der Handler hier einen
- beliebigen Eintrag zurückgeben - z.B. auch eine Übersicht über alle von
- ihm verwalteten Texte in Form von Querverweisen. Wird einer dieser
- Querverweise ausgewählt, kann der Handler dann den entsprechenden Text
- darstellen.
-
- Weiterhin können auch mehrere Texte eines Handlers gleichzeitig durch
- Verwendung eines Musters angesprochen werden. Hierzu wird dem Handler
- nicht nur der gesuchte Begriff mitgeteilt; daneben erhält er auch noch die
- Information, daß es sich bei dem Begriff um ein Muster handelt. Der
- Handler sollte dann alle von ihm unterstützten Schlüssel-Begriffe mit
- diesem Muster vergleichen. Zu diesem Zweck stellt HotHelp die
- Library-Funktion 'HH_CheckPattern ()' zur Verfügung, die ein Muster mit
- einem String vergleicht. Durch Verwendung dieser Funktion wird
- sichergestellt, daß der Handler genau dieselben Muster-Kennungen
- unterstützt wie die HotHelp-Library, da die Art des eingestellten
- Pattern-Matchings (DOS oder HotHelp-intern) dem Handler nicht bekannt ist.
-
- Hat der Handler festgestellt, daß er über mehrere Schlüssel verfügt,
- die zu dem geforderten Muster passen, sollte er intern eine entsprechende
- Übersicht aufbauen. Dabei handelt es sich um einen Text, der die
- passenden Schlüssel-Begriffe in Form von Querverweisen enthält und der
- dann zur Ausgabe an HotHelp zurückgegeben wird.
-
- HotHelp merkt sich immer, ob der aktuelle Text eines Fensters aus einem
- normalen Projekt oder von einem Handler stammt. Dies beeinflußt
- insbesondere die Auswahl von Querverweisen. Wird ein Querverweis in einem
- normalen Projekt ausgewählt, durchsucht HotHelp erst die Disk-Projekte
- nach diesem Schlüssel (entweder zuerst nur das aktuelle und nur im Falle
- eines Mißerfolgs die restlichen, oder aber direkt alle Projekte - dies
- kann über HotHelpPref festgelegt werden). Nur, wenn er dort nicht
- gefunden wurde, werden die Handler angesprochen.
-
- Stammt der aktuelle Text jedoch von einem Handler, so wird als erstes
- dieser Handler aufgefordert, einen zu dem Querverweis passenden Text
- anzugeben. Nur, wenn der Handler nicht über einen solchen Text verfügt
- (weil es sich z.B. um einen Verweis auf einen Begriff aus einem der
- Standard-Projekte handelt), werden diese Projekte durchsucht. Erst, wenn
- der Verweis auch hier nicht gefunden wird, wird der Begriff an die
- restlichen Handler übergeben. Dadurch ist gewährleistet, daß ein Handler
- immer als erster die Möglichkeit hat, zu seinen Querverweisen passende
- Texte zu liefern.
-
-
- Technische Informationen
- ========================
-
- Bei einem Handler handelt es sich um eine einzelne Funktion, deren
- Startadresse HotHelp über die Funktion 'HH_AddHandler ()' bekannt gemacht
- werden muß. Zum Entfernen kann die Funktion 'HH_RemHandler ()' verwendet
- werden. Diese muß spätestens am Programmende aufgerufen werden -
- ansonsten würde HotHelp bei einem späteren Aufruf des Handlers die bereits
- aus dem Speicher entfernte Handler-Funktion anspringen...
-
- Es können ohne weiteres mehrere Handler von einem oder mehreren
- Programmen gleichzeitig installiert sein. Die Reihenfolge, in der HotHelp
- die Handler anspricht, richtet sich dabei nach einer Priorität, die Werte
- zwischen -128 und 127 annehmen kann. Normalerweise sollte ein Wert von 0
- verwendet werden. Je niedriger die Priorität ist, desto später wird der
- Handler auch angesprochen.
-
- Die Handler werden entsprechend ihrer Priorität in eine Liste
- eingegliedert. Taucht nun ein unbekannter Begriff auf, ruft HotHelp die
- erste Handler-Funktion der Liste auf und übergibt ihr eine
- HH_HandlerData-Struktur, aus der die genauen Anforderungen hervorgehen.
- Die Adresse dieser Struktur wird der Funktion in Register A0 übergeben.
- In A1 erhält die Funktion die Adresse eines beliebigen Daten-Bereiches,
- die beim Installieren des Handlers festgelegt wurde. In den meisten
- Fällen erwartet HotHelp noch eine Rückmeldung des Handlers in Form des
- Rückgabewertes der Funktion, der wie üblich als 32-Bit-Wert in Register D0
- vorliegen muß.
-
- Wer schon einmal einen Input-Handler programmiert hat, wird sicherlich
- eine Reihe von Parallelen erkannt haben. Für die Handler-Funktion gelten
- auch dieselben Voraussetzung wie für einen Input-Handler:
-
- Die Funktion läuft nicht als Teil des Programms ab, in dem sie
- enthalten ist, sondern wird von der HotHelp-Library aus aufgerufen. Aus
- diesem Grund enthält (außer den Übergaberegistern A0 und A1 und dem
- Stackpointer A7) kein Register einen definierten Wert - insbesondere
- irgendwelche Basis-Zeiger (wie üblicherweise A4 für den Datenbereich) sind
- NICHT initialisiert; dies muß durch eine eigene Funktion des
- entsprechenden Compilers sichergestellt werden. Bei Verwendung des
- Aztec-C-Compilers muß z.B. direkt am Anfang der Funktion 'int_start ()'
- und am Ende 'int_end ()' aufgerufen werden. Nähere Informationen finden
- Sie in Ihrem Compiler-Handbuch. Außerdem müssen (wie üblich) die Inhalte
- aller Register außer A0, A1, D0 und D1 während des Aufrufs erhalten
- bleiben.
-
- Im Gegensatz zu Input-Handlern laufen HotHelp-Handler als Teil eines
- Prozesses ab, so daß auch DOS-Aufrufe möglich sind. Ein Handler darf also
- grundsätzlich alle Library-Funktionen aufrufen - mit Ausnahme von
- HotHelp-Funktionen! Ausgenommen von dieser Regel sind lediglich
- 'HH_CheckPattern ()', 'HH_Translate ()' und 'HH_TranslateFree ()', die
- speziell für Handler vorgesehen wurden, sowie die allgemeingültigen
- Funktionen, die in keinem direkten Zusammenhang zu HotHelp stehen
- ('HH_Request ()', 'HH_StrCmp ()' etc.). Alle anderen HotHelp-Funktionen
- dürfen in keinem Fall verwendet werden!
-
- Natürlich ist ein HotHelp-Handler auch nicht so zeitkritisch wie ein
- Input-Handler - auch im Normalfall vergeht ja eine gewisse Zeit zwischen
- der Eingabe eines Begriffes und dem Darstellen des zugehörigen Textes, da
- dieser erst nachgeladen werden muß.
-
- Da der Handler mit dem Stack desjenigen Prozesses arbeitet, der für die
- Verwaltung des entsprechenden HotHelp-Fensters zuständig ist, sollten
- keine großen Datenmengen auf dem Stapel angelegt werden - werden diese
- benötigt, sollten sie besser dynamisch angelegt werden, um das Auftreten
- eines Stack-Overflows zu vermeiden.
-
- Handler-Funktionen müssen nicht unbedingt reentrant sein: HotHelp
- besitzt ein internes Schutzprotokoll, so daß immer nur ein einziger Task
- mit der Handler-Liste arbeiten kann. Somit können also auch problemlos
- globale und statische Variablen verwendet werden. Insbesondere folgt auf
- ein HHA_KEY- bzw. HHA_PROJECT_START-Kommando immer als nächstes ein
- HHA_FREE-Kommando. Will ein weiterer Prozeß einen Schlüssel von einem
- Handler anfordern, solange noch dessen zuletzt gelieferter Text bearbeitet
- wird, muß dieser Prozeß bis zum Ende der Aktion warten.
-
- Es ist nicht gewährleistet, daß beim Aufruf einer Handler-Funktion das
- Multitasking aktiv ist - es kann auch evtl. über 'Forbid ()' abgeschaltet
- worden sein. Dies ist normalerweise kein Problem, muß aber beachtet
- werden, wenn der Handler Kontakt mit anderen Prozessen aufnehmen soll. In
- diesem Fall muß die Kommunikation über die von Exec angebotenen Mittel wie
- Signals oder Messages durchgeführt werden, so daß der andere Prozeß auch
- im Falle von ausgeschaltetem Multitasking in Aktion treten kann.
-
-
- Kommunikation mit dem Handler
- =============================
-
- Zur Kommunikation mit einem Handler verwendet HotHelp die
- HH_HandlerData-Struktur. Wird ein Handler aufgerufen, erhält er von
- HotHelp einen Zeiger auf eine solche Struktur übergeben. Was genau vom
- Handler angefordert wird, geht dann aus der Variable 'action' hervor. In
- späteren Versionen können noch weitere Kommandos hinzukommen; daher sollte
- ein Handler im Fall eines unbekannten 'action'-Wertes grundsätzlich FALSE
- zurückgeben.
-
- Im Folgenden finden Sie dazu eine Übersicht über alle möglichen Werte,
- wobei zu jeder Aktion auch erklärt wird, welche Bedeutung die restlichen
- Variablen der Struktur haben. Nicht genannte Variablen haben keine
- Bedeutung für das entsprechende Kommando und dürfen vom Handler weder
- ausgelesen noch verändert werden. Da diese Vorschrift unbedingt beachtet
- werden muß, wird am Ende jedes Kommandos nochmals zusammengefaßt, welche
- Variablen bei der Ausführung ausgelesen und welche beschrieben werden
- dürfen. Außerdem wird noch erklärt, welche Werte von der Funktion bei der
- jeweiligen Aktion zurückgegeben werden dürfen. Es ist nicht zulässig,
- andere als die genannten Werte zurückzugeben, da evtl. in späteren
- Library-Versionen noch weitere Rückgabewerte definiert werden.
-
- HHA_PROJECTS:
- HotHelp benötigt eine Liste aller von Handlern gebildeter Projekte.
- Bei dieser Liste handelt es sich um eine Exec-Standard-Liste in Form
- einer List-Struktur unter dem Namen 'pro_names'. Der Handler sollte
- nun für jedes Projekt, das er unterstützt, eine neue Node-Struktur
- dynamisch erzeugen, den Namen des Projekts in der 'ln_Name'-Variablen
- dieser Struktur festhalten und die Struktur dann in die Liste einfügen.
- Der bisherige Inhalt der Liste darf nicht geändert werden; es dürfen
- lediglich neue Elemente hinzugefügt werden. Die Reihenfolge, in der
- die Namen eingefügt werden, ist beliebig, da die Liste anschließend von
- HotHelp alphabetisch sortiert wird.
- ACHTUNG: Nachdem HotHelp die Liste komplett ausgewertet hat, wird
- jeder einzelne Node der Liste durch den Aufruf 'FreeMem (node, sizeof
- (struct Node))' wieder freigegeben. Aus diesem Grund müssen alle
- Listenelemente auch unbedingt dynamisch über 'AllocMem (sizeof (struct
- Node), MEMF_CLEAR)' angelegt werden! Wird dies nicht beachtet, kann es
- zu Speicherplatzverlusten oder Abstürzen kommen!
- Die Strings, die die Namen der Projekte beinhalten, können beliebig
- angelegt werden, da sie von HotHelp lediglich ausgelesen, nicht aber
- beschrieben oder freigegeben werden.
- Unterstützt ein Handler keinen Projekt-Namen, kann er dieses Kommando
- ignorieren und TRUE zurückgeben.
-
- Definierte Rückgabewerte:
- TRUE:
- Der normale Rückgabewert, wenn kein Fehler auftrat.
- -1:
- Speicherplatzmangel.
- -2:
- DOS-Fehler.
- -3:
- Sonstiger Fehler.
- Lesbar:
- 'action'
- Beschreibbar:
- 'pro_names' (nur indirekt über Execs Listen-Funktionen 'AddHead ()',
- 'AddTail ()', 'Enqueue ()' und 'Insert ()')
-
- HHA_KEY:
- Dies ist der Normalfall für einen Handler - HotHelp sucht nach einem
- unbekannten Schlüssel-Begriff. Der gesuchte Begriff setzt sich aus
- einem Projekt- und einem Schlüssel-Namen zusammen, die aus 'project'
- und 'key' hervorgehen. Falls es sich bei einem oder beiden um ein
- Muster handelt, ist das entsprechende Flag 'pro_pattern' bzw.
- 'key_pattern' gesetzt. In diesem Fall sollte der Handler den
- entsprechenden String mit Hilfe der 'HH_CheckPattern ()'-Funktion mit
- allen zur Verfügung stehenden Projekt- bzw. Schlüssel-Begriffen
- vergleichen. Die Muster sollten nicht selber ausgewertet werden, da
- sie auch binäre Steuercodes beinhalten können. Ein normaler Vergleich
- (z.B. mit 'strcmp ()') sollte nur durchgeführt werden, wenn es sich
- bei dem entsprechenden String nicht um ein Muster handelt.
- 'HH_CheckPattern ()' kann natürlich auch dann angewendet werden, wenn
- es sich bei dem gesuchten String nicht um ein Pattern handelt - die
- Funktion ist lediglich nicht so effektiv wie ein einfacher
- Stringvergleich.
- Als Besonderheit sollte jeder Handler auch den Schlüssel-Begriff
- 'Startseite' unterstützen - dieser wird üblicherweise verwendet, um
- einen Text mit einleitenden Informationen über das entsprechende
- Projekt zu liefern. Es sollte sich um denselben Text handeln, der auch
- beim HHA_PROJECT_START-Kommando zurückgegeben wird (s.u.).
- Findet der Handler einen passenden Schlüssel, so sollte er den
- zugehörigen Text in einer HH_CustomText-Struktur festhalten und deren
- Adresse in der Variablen 'custom_text' ablegen. Falls im Falle eines
- Patterns sogar mehrere passende Schlüssel vorliegen, sollte der Handler
- statt dessen einen Text erzeugen, in dem alle gefundenen Schlüssel als
- Querverweise auftauchen. Dieser Text muß dann ebenfalls in der oben
- beschriebenen Form an HotHelp zurückgegeben werden, so daß der Benutzer
- wie üblich nach Eingabe seines Musters eine Übersicht über alle
- passenden Schlüssel erhält. Informationen über den Aufbau einer
- HH_CustomText-Struktur finden Sie bei deren Beschreibung.
- Sobald HotHelp die Struktur ausgewertet und alle erforderlichen Daten
- kopiert hat, wird der Handler mit dem HHA_FREE-Kommando aufgerufen,
- damit er z.B. jetzt nicht mehr benötigten Speicher wieder freigeben
- kann. Es wird garantiert, daß zwischen dem HHA_KEY- und dem
- HHA_KEY_FREE-Kommando kein anderes Kommando an den Handler geschickt
- wird.
-
- Definierte Rückgabewerte:
- TRUE:
- Der Handler verfügt über ein oder mehrere passende Schlüssel und
- gibt in 'custom_text' einen entsprechenden Text zurück. HotHelp
- beendet dann die Untersuchung und stellt diesen Text dar. Nur in
- diesem Fall dürfen auch Variablen der Struktur geändert werden.
- FALSE:
- Es wurde keine passender Schlüssel gefunden. HotHelp spricht
- daraufhin den nächsten Handler an.
- -1:
- Als wohl typischster Fehler trat Speicherplatzmangel auf, so daß
- der Handler seine Aktionen nicht durchführen konnte. HotHelp
- bricht die Suche ab und stellt einen Fehlertext dar.
- -2:
- DOS-Fehler.
- -3:
- Sonstiger Fehler.
- Lesbar:
- 'action'
- 'project'
- 'key'
- 'pro_pattern'
- 'key_pattern'
- Beschreibbar:
- 'custom_text'
-
- HHA_PROJECT_START:
- Wird aus der Projekt-Übersicht ein Name ausgewählt, der nicht zu den
- disk-residenten Projekten gehört, sendet HotHelp der Reihe nach dieses
- Kommando zusammen mit dem entsprechenden Projekt-Namen an die Handler.
- Der Projekt-Name befindet sich im Buffer 'project'. Er wird immer als
- normaler String angegeben (nicht als Muster), so daß ein einfacher
- String-Vergleich angewendet werden kann. Der Name wird immer in
- Großbuchstaben angegeben. Erkennt ein Handler diesen Namen nun als
- denjenigen eines von ihm unterstützten Projektes, den er vorher in
- einer Projekt-Liste angegeben hat, so sollte er eine entsprechende
- Startseite erzeugen und über die 'custom_text'-Struktur an HotHelp
- zurückgeben (s.o.). Der Aufbau der Startseite sollte sich an den
- normalen Projekten orientieren; es könnte also z.B. ein Text mit
- einleitenden Informationen dargestellt werden oder auch eine Übersicht
- über alle Schlüssel, die der Handler anbietet.
- Es muß sich bei dieser Startseite um denselben Text handeln, den der
- Handler auch im Fall eines HHA_KEY-Kommandos zurückliefern würde, wenn
- der Schlüssel 'Startseite' lautet (oder ein entsprechendes Pattern
- beinhaltet). Nur so kann gewährleistet werden, daß die
- Projekt-Startseite durch das Vortext-Gadget wieder zurückgeholt werden
- kann!
- Sobald HotHelp die Struktur ausgewertet und alle erforderlichen Daten
- kopiert hat, wird der Handler mit dem HHA_FREE-Kommando aufgerufen,
- damit er z.B. jetzt nicht mehr benötigten Speicher wieder freigeben
- kann. Es wird garantiert, daß zwischen dem HHA_PROJECT_START- und dem
- HHA_KEY_FREE-Kommando kein anderes Kommando an den Handler geschickt
- wird.
-
- Definierte Rückgabewerte:
- TRUE:
- Der Handler unterstützt den gesuchten Projektnamen und gibt über
- 'custom_text' einen passenden Text zurück, der dann von HotHelp
- angezeigt wird. Nur in diesem Fall dürfen auch Variablen der
- Struktur geändert werden.
- FALSE:
- Der Handler unterstützt das Projekt nicht, so daß HotHelp die
- folgenden Handler ansprechen muß.
- -1:
- Speicherplatzmangel.
- -2:
- DOS-Fehler.
- -3:
- Sonstiger Fehler.
- Lesbar:
- 'action'
- 'project'
- Beschreibbar:
- 'custom_text'
-
- HHA_FREE:
- Nachdem HotHelp über HHA_KEY oder HHA_PROJECT_START einen Text von
- einem Handler erhalten hat, wird dieser Text im entsprechenden Fenster
- dargestellt. Dazu wird eine komplette Kopie des gesamten
- Text-Bereiches der HH_CustomText-Struktur angefertigt. Anschließend
- werden dieser Bereich und die Struktur selber nicht mehr benötigt.
- HotHelp ruft daher, direkt nachdem ein Handler-Text dargestellt wurde,
- den entsprechenden Handler mit dieser Kennung auf. Dieser sollte nun
- alle dynamisch angelegten Speicherbereiche wieder freigeben, die er
- beim vorhergehenden HHA_KEY- bzw. HHA_PROJECT_START-Kommando angelegt
- hat. Wurde der Text z.B. durch einen Aufruf von 'HH_Translate ()'
- erzeugt, wäre jetzt der passende Zeitpunkt für ein 'HH_TranslateFree
- ()'. Wurde der vielleicht schon vorher übersetzte Text von Disk
- eingelesen, so kann nun sein Speicherbereich freigegeben werden.
- Dadurch wird gewährleistet, daß der nicht mehr benötigte Speicher nicht
- länger blockiert wird.
- Der Handler erhält in 'custom_text' einen Zeiger auf die (unveränderte)
- Struktur, die er beim vorhergehenden HHA_KEY- oder
- HHA_PROJECT_START-Kommando an HotHelp übergeben hatte.
-
- Definierte Rückgabewerte:
- Die Handler-Funktion muß immer TRUE zurückgeben.
- Lesbar:
- 'action'
- 'custom_text'
- Beschreibbar:
- -
-
-