PlugIns fr GEMAR ¾ Steffen Engel 1992,93 17.12.93 ALLGEMEINES In dieser Datei werden alle n”tigen Informationen zu PlugIns gegeben, der aktuelle Stand der von GEMAR installierten PlugIn-Calls, die Liste der aktuell existierenden PlugIns und der aktuelle Stand der PlugIns und ihrer Programmierung. Die mit GEMAR gelieferten PlugIns sind grunds„tzlich alle deaktiviert, indem die Namen mit PLX enden. Bitte beurteilen Sie selbst, welche PlugIns fr Sie sinnvoll sind. WAS SIND PLUGINS? Um GEMAR mit weiteren F„higkeiten auszustatten, wurde ein Konzept entworfen, mit dem externe Programme als Erweiterung hinzugeladen werden k”nnen. Dabei wird von GEMAR an bestimmten Stellen einfach kontrolliert, ob ein zu diesem Zweck geh”rendes PlugIn existiert, und ruft es gegebenenfalls auf. Grunds„tzlich wurde das Konzept relativ einfach gehalten, da es dadurch einerseits einfach zu verstehen und programmieren ist und andererseits kein vollst„ndig modulares Programmierungssystem entworfen werden sollte. Mit diesem Konzept sind nur kleine Erweiterungen oder Ersetzungen von Teilen von GEMAR m”glich. PlugIns sind vor allem dann sinnvoll, wenn kleine Erweiterungen an GEMAR gemacht werden sollen, die fr bestimmte Probleme sinnvoll sind, aber zu speziell sind, um allgemein in GEMAR eingebaut zu werden. PlugIns werden von GEMAR grunds„tzlich im Ordner PLUGIN im GEMAR-Pfad gesucht. EXISTIERENDE PLUGINS Zur Zeit existieren drei PlugIns: -REQSENSE pr„zisiert die Fehlermeldungen des Streamers, die in den Request Sense Daten bergeben werden. -INDEX wird nach jedem Backup aufgerufen und kann entweder den Inhalt eines Bandes ausdrucken, oder in eine Datei schreiben. -SCANINDE wird beim Indexscanning aufgerufen. Damit kann eine Datei auf einem Band gesucht werden. -SPACE wird bei Space-Operationen des Streamers gerufen, um ein modifziertes Spacing durchzufhren -QFA wird bei eingeschaltetem Quick File Access fr die Funktionen benutzt. Dabei ist egal, welche Art eingeschaltet ist (Seek oder Locate) SCANINDE und INDEX besitzen gleiche Aufrufe, daž heižt, Sie k”nnen INDEX.PLG in SCANINDE.PLG umbenennen und damit per 'Scannen' nachtr„glich den Inhalt des Bandes in eine Datei schreiben lassen. EXISTIERENDE PLUGIN-AUFRUFE -REQSENSE: Aufruf : Nach einem Scsi-Fehler (Check Condition auf Streamerzugriff). Name : REQSENSE.PLG Parameter : Zeiger auf Request-Sense-Daten, die vorher vom SCSI-Ger„t geholt wurden. Antwort : Zeiger auf einen (nullterminierten) String, der in die Alertbox eingesetzt wird ('Check Condition(%s)') -INDEX: Aufruf : Nach einem Backup Name : INDEX.PLG Parameter : Rumpf belkommt in private einen Zeiger auf den Index-Header. Ein Aufruf des Calls mit Parameter NIL zeigt an, daž eine neuer Index gelesen wurde und der Header mit den Daten gefllt ist. Ansonsten bekommt der Call Zeiger auf Index-Eintr„ge, jeweils einen Ordner alphabetisch durchlaufen, danach den n„chst- tieferen Ordner. Auf dieser Basis w„re zB ein Exporter in eine Datenbank m”glich. bergebene Struktur: s. INDEX.M -SCANINDEX: Aufruf : bei Index-Scanning Name : SCANINDE.PLG Parameter : wie INDEX, retour = 1 bricht Scanning ab und w„hlt den aktuellen Index -SPACE: Aufruf : Anstelle eines SCSI-Cmds Space Name : SPACE.PLG Parameter : Zeiger auf die Struktur RECORD Code : SHORTCARD; (* Opcode fr das Space-Kommando *) Count : LONGINT; (* Anzahl davon *) END; private : Zeiger auf RECORD Version : SHORTCARD; (* = 0101H = 1.01 *) ScsiIn : PROCEDURE ((* Cmd *) ADDRESS, (* CmdLen *) SHORTCARD, (* Buffer *) ADDRESS, (* Transferlen *) LONGCARD, (* Timeout *) LONGCARD) : SHORTCARD; ScsiOut : PROCEDURE ((* Cmd *) ADDRESS, (* CmdLen *) SHORTCARD, (* Buffer *) ADDRESS, (* Transferlen *) LONGCARD, (* CmdTimeout *) LONGCARD, (* DataTimeout *) LONGCARD) : SHORTCARD; END; -QFA: Aufruf : Anstelle eines SCSI-Cmds fr Quick File Access Zweck : Anpassung von Streamern mit Problemen/Einschr„nkungen bei Quick File Access, oder auch zur Anpassung an Streamer, die andere QFA-Befehle als Seek/Locate haben. Name : QFA.PLG Parameter : Zeiger auf die Struktur RECORD Opcode : SHORTCARD; (* 1 = Position lesen * 2 = Position ansteuern *) Imed : SHORTCARD; BlockAdr : POINTER TO LONGCARD; END; private : Zeiger auf RECORD Version : SHORTCARD; (* = 0101H = 1.01 *) ScsiIn : PROCEDURE ((* Cmd *) ADDRESS, (* CmdLen *) SHORTCARD, (* Buffer *) ADDRESS, (* Transferlen *) LONGCARD, (* Timeout *) LONGCARD) : SHORTCARD; ScsiOut : PROCEDURE ((* Cmd *) ADDRESS, (* CmdLen *) SHORTCARD, (* Buffer *) ADDRESS, (* Transferlen *) LONGCARD, (* CmdTimeout *) LONGCARD, (* DataTimeout *) LONGCARD) : SHORTCARD; END; Weitere Aufrufe richte ich gerne ein, Ideen sind immer willkommen. PROGRAMMIERUNG VON PLUGINS PlugIns werden grunds„tzlich als Pozeduren aufgerufen. Als Methode wurde der gleiche Weg gew„hlt wie bei CPX-Modulen. PlugIns werden von GEMAR geladen und danach wird der Rumpf des PlugIns mit einem Zeiger auf folgende Struktur aufgerufen: tPlugEnvironment = RECORD (* aktuelle Parameterversion = 1.00 = 0100H *) Version : sINTEGER; (* Version zeigt Umfang der Parameter an *) Private : ADDRESS; (* spezielle Parameter fr den Rumpf *) ApplId : sINTEGER; (* Applikationsid des rufenden Programmes *) VDIHandle : sINTEGER; (* Workstation des Hauptprogrammes *) PlugPath : POINTER TO ARRAY[0..512] OF CHAR; (* Name und Pfad des PlugIn, kann auch relativ sein *) Alert : PROCEDURE((* def *) sINTEGER, VAR (* msg *) STRING) : sINTEGER; END; Die Struktur wird grunds„tzlich abw„rtskompatibel sein, d.h. bei erweiterten Versionen kommen zus„tzliche Parameter hinzu und die Versionsnummer wird erh”ht. Nach einer evtl. n”tigen Initialisierung (zB Abfragen, ob das Modul berhaupt aktiviert werden soll) muž das PlugIn mit der Einsprungadresse der Aktionsprozedur antworten. Diese Aktionsprozedur wird dann zur eigentlichen Verwendung ein- oder mehrmals aufgerufen. Als Parameter wird ein Zeiger bergeben, der auf die zu bearbeitenden Daten zeigt. Bitte beachten Sie, daž UNBEDINGT aller Speicher bei der Deinitialisierung des PlugIns freigegeben wird, da der Speicher nicht durch das freigeben des PlugIn freigeben wird! Als Beispiel sollten Sie sich die beiliegenden PlugIns ansehen, insbesondere PLUGPARMS.D Steffen Engel