========================== metaxpr.library 4.0 ============================
===========================================================================
Eine  Bibliothek,  die  Datentransfer  über xpr#?.library-Implementierungen
erleichtert.  © Copyright 1991-92 by Olaf Barthel, alle Rechte vorbehalten.
   Es   wird   keinerlei   Gewährleistungspflicht   für   die  vollständige
Funktionsfähigkeit   der   in   diesem   Dokument   beschriebenen  Software
übernommen.  Jegliche Nutzung geschieht auf eigene Gefahr.


=============================== Motivation ================================
===========================================================================
Fast   alle   Programmierer,   die   sich  mit  der  Erstellung  von  Tele-
kommunikationsoftware  beschäftigen,  stolpern  irgendwann  einmal über die
xpr#?.libraries,  die  auf allgemeine Art und Weise Protokollle für Up- und
Download implementieren.
   An  dieser  Stelle  verläßt  die meisten Programmierer der Mut.  Wer hat
schon  Lust,  eine  über  100 KBytes große Dokumentation (in Englisch!  wer
spricht  schon  Englisch!)  durchzuarbeiten,  um  hinterher  doch nur einen
Absturz zu Gesicht zu bekommen.
   Nun  gibt  es  aber  dennoch Programmierer, die es geschafft haben, eine
Implementierung  der  entsprechenden  Transferroutinen  zu  schreiben.  Das
Resultat  sind  Programme,  die mit einem Satz Parameter von CLI oder Shell
aufgerufen werden können.
   Hier  liegt  der  Hund  begraben, denn soweit die Implementierung stabil
ist,  so  ergeben  sich  beim  Aufruf Probleme:  Ist der Transfer geglückt?
Wurde   das   Programm   eventuell   gar  nicht  geladen?   Wie  sehen  die
Einstellungen des serial.device aus?
   Hinzu   kommt   meist   noch,   daß   ein   Programm,  das  ein  solches
Transferprogramm  aufrufen  will,  unbedingt  von CLI oder Shell aufgerufen
werden muß.

   Vor  diesem  Hintergrund  habe ich mich entschlossen, eine Bibliothek zu
schreiben,   die   externe   Programmaufrufe  für  die  Durchführung  eines
Up-/Downloads  überflüssig  macht.   Weiterhin  hat das aufrufende Programm
fast völlige Kontrolle über die Ansteuerung der seriellen Schnittstelle und
die Möglichkeiten des Up-/Downloads.


==================== Bestandteile des MetaXPR-Paketes =====================
===========================================================================
Die   folgenden  Dateien,  bzw.   Verzeichnisse  samt  Inhalt  gehören  zum
MetaXPR-Paket:

   MetaXPR.dok..................... Die Dokumentation der Library

   metaxpr.library................. Die  Library  selbst  (auf allen  680x0
                                    Prozessoren lauffähig)
   metaxpr.library.020............. Die Library selbst (benötigt mindestens
                                    einen  68020  Prozessor).  Um   sie  zu
                                    installieren,   bitte   umbenennen   in
                                    "metaxpr.library"
   metaxpr_lib.fd.................. Funktionsdefinitionsdatei der Library

   MetaXPR.h....................... Header-Datei für `C' Programmierer

   Receive,Receive.c............... Beispielprogramm für das Empfangen  von
                                    Dateien, in `C' geschrieben

   Send,Send.c..................... Beispielprogramm  für  das  Verschicken
                                    von Dateien, in `C' geschrieben

   SendFiles,SendFiles.c........... Beispielprogramm  für  das  Verschicken
                                    von mehreren Dateien,in `C' geschrieben

   LinkLibs/amigados_metaxpr.lib... Linker-Library im AmigaDOS-Objektformat
   LinkLibs/manx36_metaxpr.lib..... Linker-Library für Aztec `C' 3.6
   LinkLibs/manx50_metaxpr.lib..... Linker-Library für Aztec `C' 5.0
   LinkLibs/sasc_metaxpr.lib....... Linker-Library für Lattice/SAS `C'

   Glue,SAS_Glue................... Quellcode zu den Linker-Libraries

============================= Funktionsweise ==============================
===========================================================================
Die Bibliothek metaxpr.library ist eine gewöhnliche Amiga-Systembibliothek,
die  in  das LIBS:-Verzeichnis kopiert werden sollte.  Sie benimmt sich wie
jede  andere  Bibliothek  (intuition.library, graphics.library, etc.).  Wer
sich  mit  diesen  Bibliotheken abgerackert hat, der wird auch diese nutzen
können.

   Nach   dem   Öffnen  der  Bibliothek  stehen  dem  Programmierer  sieben
Funktionen zur Verfügung:

   TransferSetup......... Initialisiert  den  seriellen  Treiber und öffnet
                          die  benötigte  xpr.library.   Diese  Routine muß
                          aufgerufen   werden,  bevor  eine  der  folgenden
                          Steuerroutinen aufgerufen wird.

   TransferSetupShared... Eine  in  Version  2.0 der Bibliothek eingeführte
                          Funktion, die analog zu TransferSetup() arbeitet,
                          es aber erlaubt, vom aufrufenden Programm bereits
                          für   den   Datentransfer   geöffnete  Kanäle  zu
                          verwenden,   anstatt  diese  von  der  Bibliothek
                          öffnen zu lassen.

   InstallTransferNote... Diese   Funktion   wurde   in   Version  3.0  der
                          Bibliothek   eingeführt   und   erlaubt  es,  den
                          Transferroutinen  eine  Struktur zu übergeben, in
                          der  Transferparameter  (wie  z.B.   verbleibende
                          Übertragungsdauer   in   Sekunden   und  noch  zu
                          übertragende Bytes) vermerkt werden und, wenn ein
                          Struktureintrag   auf   0   gesetzt   wird,   den
                          programmtechnischen    Abbruch    des   Transfers
                          herbeiführt.

   ReceiveFile........... Empfängt  eine  Datei  unter Ausnutzung der durch
                          TransferSetup/TransferSetupShared   eingestellten
                          Parameter.

   SendFile.............. Verschickt  eine Datei unter Ausnutzung der durch
                          TransferSetup/TransferSetupShared   eingestellten
                          Parameter.

   SendMultipleFiles..... Diese   Funktion   wurde   in   Version  3.1  der
                          Bibliothek  eingeführt  und dient zum Verschicken
                          mehrerer Dateien am Stück.  Es werden wie bei der
                          Funktion         `SendFile'        die        mit
                          TransferSetup/TransferSetupShared   eingestellten
                          Parameter benutzt.

   GetOptions............ Liest  die  für die aktuell geöffnete xpr.library
                          eingestellten Parameter aus.

   SetOptions............ Setzt   die   internen   Parameter   der  aktuell
                          geöffneten   xpr.library   (siehe   dazugehöriger
                          Dokumentation).

   Im  folgenden  wird  auf  die  einzelnen  Routinen  und  deren Benutzung
eingegangen:

                                     *

Fehler = TransferSetup(Treiber, Unit, Bibliothek, Baudrate, Datenbits,
  D0                      A0     D0       A1        D1         D2

                       Stopbits, Parität, Handshaking)
                          D3        D4        D5

Treiber         - Name    des    zu    benutzenden    seriellen    Treibers
                  (serial.device, modem0.device, etc).  Wird als eine durch
                  ein Nullbyte abgeschlossene Zeichenkette übergeben.

Unit            - Die   Treibereinheit,   die   angesprochen  werden  soll;
                  entspricht  üblicherweise der Nummer des seriellen Ports,
                  sollte  man  über keine Steckkarte mit mehreren seriellen
                  Anschlüssen verfügen, so ist hier eine 0 einzutragen.

Bibliothek      - Der  Name  der  xpr.library, die für den Transfer benutzt
                  werden  soll (xprzmodem.library, xprxmodem.library, etc).
                  Der  Name  wird  als  durch  ein  Nullbyte abgeschlossene
                  Zeichenkette übergeben.

Baurate         - Übertragungsgeschwindigkeit    in   Bits   pro   Sekunde.
                  Gebräuchliche  Baudraten  bewegen  sich  zwischen 300 und
                  31250 Baud.

Datenbits       - Die  Anzahl  Datenbits, die bei der Übertragung verwendet
                  werden sollen.  Üblicherweise 8, manchmal auch 7.

Stopbits        - Die  Anzahl  Stopbits,  die bei der Übertragung verwendet
                  werden sollen.  Üblicherweise 1, sonst auch 0 oder 2.

Parität         - Die  bei  der Übertragung zu verwendende Parität, gültige
                  Werte sind:

                  0 - Keine Parität.
                  1 - Gerade Parität.
                  2 - Ungerade Partität.
                  3 - Paritätsbit ist immer gesetzt.
                  4 - Paritätsbit ist immer gelöscht.

Handshaking     - Gibt  an,  ob  Hardware-Handshaking  eingeschaltet werden
                  soll (0 = aus, 1 = ein).

   Es  muß  darauf  hingewiesen  werden,  daß  diese  Routine den seriellen
Treiber  exklusiv für sich öffnet.  Hat das aufrufende Programm den Treiber
bereits  für  sich  belegt,  wird  der Aufruf dieser Funktion fehlschlagen!
Wenn  man  diesen  Effekt vermeiden möchte, sollte man statt dieser Routine
besser TransferSetupShared() verwenden.

   Der  von  dieser  Routine  geöffnete serielle Treiber wird erst nach dem
Schließen der metaxpr.library freigegeben!

   Diese  Routine  liefert  einen  Wert  zurück, der gleich 0 ist, wenn die
Initialisierungen  geglückt  sind  und ungleich 0, wenn die Initialisierung
fehlgeschlagen   ist.    Anhand  des  zurückgelieferten  Wertes  läßt  sich
entscheiden, welcher Fehler aufgetreten ist:

   1 - Einer oder mehrere an die Routine übergebenen Aufrufparameter waren
       nicht zulässig.

   2 - Es konnte nicht genügend Speicher angefordert werden.

   3 - Beim Anlegen von MsgPorts ist ein Fehler aufgetreten (alle
       Signalbits sind offenbar schon belegt).

   4 - Beim Öffnen des seriellen Treibers ist ein Fehler aufgetreten.

   5 - Die Parameter des seriellen Treibers ließen sich nicht setzen.

   6 - Der Zeitgeber (timer.device) ließ sich nicht öffnen.

   7 - Die zu verwendende xpr.library ließ sich nicht öffnen.

   8 - Die Initialisierung der xpr.library schlug fehl.

   9 - Wurden  die  Übertragungsparameter  über TransferSetup() gesetzt, so
       können  sie  nur  über die selbe Routine verändert werden.  Gleiches
       gilt für die Routine TransferSetupShared().

   Diese  Routine  selbst  läßt  sich  beliebig  oft  mit  neuen Parametern
aufrufen.   Alle  hier  angeforderten  Resourcen  werden beim Schließen der
Bibliothek wieder freigegeben.

                                     *

Fehler = TransferSetupShared(ReadRequest, WriteRequest, Bibliothek)
  D0                             A0            A1           A2

ReadRequest     - Die  vom  aufrufenden  Programm  zum  Lesen von Daten der
                  seriellen   Schnittstelle   verwendete  Struktur  (struct
                  IOExtSer).

WriteRequest    - Die  vom  aufrufenden Programm zum Schicken von Daten zur
                  seriellen   Schnittstelle   verwendete  Struktur  (struct
                  IOExtSer).

Bibliothek      - Der  Name  der  xpr.library, die für den Transfer benutzt
                  werden  soll (xprzmodem.library, xprxmodem.library, etc).
                  Der  Name  wird  als  durch  ein  Nullbyte abgeschlossene
                  Zeichenkette übergeben.

   Ein  Telekommunikationsprogramm  sollte  üblicherweise  mindestens  zwei
Kanäle offen haben, um auf die seriellen Schnittstelle zugreifen zu können.
Möchte man diese Kanäle nicht schließen (einige Modems legen z.B.  auf wenn
die  vom serial.device aktivierte DTR-Leitung plötzlich abfällt), so bietet
es  sich  an,  sie  dieser  Routine  zu  übergeben.  Vorsicht:  die Routine
überprüft, ob ReadRequest und WriteRequest verschieden sind und liefert bei
Übereinstimmung Fehlercode 1 zurück.
   TransferSetupShared() verhält sich ansonsten genauso wie TransferSetup()
und liefert dieselben Fehlercodes zurück.
   Baudrate  oder  Parameter  von ReadRequest und WriteRequest werden nicht
modifiziert.   Ich  empfehle  sowohl  vor  dem  Aufruf  dieser  Routine ein
CMD_CLEAR an den seriellen Treiber zu schicken, als auch nach dem Schließen
der   metaxpr.library.    Es  sollten  keine  Annahmen  über  die  Einträge
io_Command,   io_Data,   io_Actual   oder  io_Length  von  ReadRequest  und
WriteRequest gemacht werden, wenn die Routinen SendFile() und ReceiveFile()
zurückkehren!

                                     *

Erfolg = ReceiveFile(Name, ÖffneFenster, Bildschirm)
  D0                  A0       D0            A1


Name            - Der  Name  der  zu empfangenden Datei.  Der Name wird als
                  eine   durch  ein  Nullbyte  abgeschlossene  Zeichenkette
                  übergeben.   In diese Zeichenkette wird auch der Name der
                  zuletzt  übertragenen Datei eingetragen, die Zeichenkette
                  sollte mindestens 256 Zeichen lang sein.
                     Nach  Abschluß  der  Übertragung  befindet sich in der
                  übergebenen   Zeichenkette   der   komplette   Name   der
                  empfangenen  Datei  (der  sich  besonders  bei Kermit und
                  ZModem  vom  übergebenen  Dateinamen unterscheiden wird).
                  Die   dieser   Routine   übergebene  Zeichenkette  sollte
                  mindestens 256 Zeichen lang sein.  Wurden mehrere Dateien
                  empfangen,  so  enthält  diese Zeichenkette nur den Namen
                  der zuletzt übertragenen Datei!

ÖffneFenster    - Bestimmt, ob während der Übertragung ein Fenster geöffnet
                  werden  soll,  in dem Informationen über den Fortgang der
                  Übertragung angezeigt werden.

                  0 = kein Fenster soll geöffnet werden.
                  1 = ein Fenster soll geöffnet werden.
                  2 = ein  Fenster  soll  geöffnet,  aber  nicht  aktiviert
                      werden.

Bildschirm      - Dieser  Parameter operiert zusammen mit dem Parameter für
                  `ÖffneFenster'.   Er bestimmt, auf welchem Bildschirm das
                  Fenster  -  wenn  überhaupt - geöffnet werden soll.  Hier
                  übergibt   man   die   Adresse  der  Screen-Struktur  des
                  jeweiligen  Bildschirmes,  oder  den  Wert  NULL,  um das
                  Fenster auf dem Workbench-Bildschirm zu öffnen.

   Diese  Routine  liefert  einen  Wert  zurück,  der  über  den Erfolg des
Transfers  informiert.   Ist  dieser  Wert gleich 0, so ist die Übertragung
fehlgeschlagen  oder  abgebrochen  worden.  Ist der Wert ungleich 0, so ist
die Übertragung geglückt.

                                     *

Erfolg = SendFile(Name, ÖffneFenster, Bildschirm)
  D0               A0       D0            A1


Name            - Der  Name der zu verschickenden Datei.  Der Name wird als
                  durch ein Nullbyte abgeschlossene Zeichenkette übergeben.
                  In  diese  Zeichenkette  wird  auch  der Name der zuletzt
                  übertragenen  Datei  eingetragen, die Zeichenkette sollte
                  mindestens 256 Zeichen lang sein.

ÖffneFenster    - Bestimmt, ob während der Übertragung ein Fenster geöffnet
                  werden  soll,  in dem Informationen über den Fortgang der
                  Übertragung angezeigt werden.

                  0 = kein Fenster soll geöffnet werden.
                  1 = ein Fenster soll geöffnet werden.
                  2 = ein  Fenster  soll  geöffnet,  aber  nicht  aktiviert
                      werden.

Bildschirm      - Dieser  Parameter operiert zusammen mit dem Parameter für
                  `ÖffneFenster'.   Er bestimmt, auf welchem Bildschirm das
                  Fenster  -  wenn  überhaupt - geöffnet werden soll.  Hier
                  übergibt   man   die   Adresse  der  Screen-Struktur  des
                  jeweiligen  Bildschirmes,  oder  den  Wert  NULL,  um das
                  Fenster auf dem Workbench-Bildschirm zu öffnen.

   Diese  Routine  liefert  einen  Wert  zurück,  der  über  den Erfolg des
Transfers  informiert.   Ist  dieser  Wert gleich 0, so ist die Übertragung
fehlgeschlagen  oder  abgebrochen  worden.  Ist der Wert ungleich 0, so ist
die Übertragung geglückt.

                                     *

Erfolg = SendMultipleFiles(Namen, ÖffneFenster, Bildschirm)
  D0                        A0       D0            A1


Name            - Die  Adresse  einer  Reihe von Adresswerten von mit einem
                  Nullbyte    abgeschlossenen    Zeichenketten.    In   `C'
                  entspräche      dies      z.B.       der     Konstruktion
                  `char *Namen[123]', in anderen Sprachen kann man sich die
                  verlangte  Datenstruktur  als  ein  Feld  von Langwörtern
                  vorstellen,   von   denen   jedes   die   Adresse   einer
                  Zeichenkette enthält:

                                 Feld[ 0 ] -> "Dateiname 0"
                                 Feld[ 1 ] -> "Dateiname 1"
                                 Feld[ 2 ] -> "Dateiname 2"

                                 :
                                 :

                                 Feld[n-1] -> "Dateiname n-1"
                                 Feld[ n ] -> 0

                     Wie man an dieser Tabelle schon sieht, muß der Adresse
                  des  letzten  Dateinamens  eine  Null  folgen,  sodaß die
                  Library  weiß,  welche  die  letzte zu übertragende Datei
                  war.
                     Der    Inhalt    dieses    Feldes    wird    von   der
                  Übertragungsroutine nicht verändert.

ÖffneFenster    - Bestimmt, ob während der Übertragung ein Fenster geöffnet
                  werden  soll,  in dem Informationen über den Fortgang der
                  Übertragung angezeigt werden.

                  0 = kein Fenster soll geöffnet werden.
                  1 = ein Fenster soll geöffnet werden.
                  2 = ein  Fenster  soll  geöffnet,  aber  nicht  aktiviert
                      werden.

Bildschirm      - Dieser  Parameter operiert zusammen mit dem Parameter für
                  `ÖffneFenster'.   Er bestimmt, auf welchem Bildschirm das
                  Fenster  -  wenn  überhaupt - geöffnet werden soll.  Hier
                  übergibt   man   die   Adresse  der  Screen-Struktur  des
                  jeweiligen  Bildschirmes,  oder  den  Wert  NULL,  um das
                  Fenster auf dem Workbench-Bildschirm zu öffnen.

   Diese  Routine  liefert  einen  Wert  zurück,  der  über  den Erfolg des
Transfers  informiert.   Ist  dieser  Wert gleich 0, so ist die Übertragung
fehlgeschlagen  oder  abgebrochen  worden.  Ist der Wert ungleich 0, so ist
die Übertragung geglückt.
   Man   sollte   nicht   erwarten,   daß   sich   diese  Routine  auch  um
Pattern-Matching  und  ähnlichen  Luxus kümmert, es wird immer versucht die
jeweiligen   Dateien   unter   den   gegebenen   Namen   zu  öffnen.   Wird
Pattern-Matching benötigt, so müssen die zu übertragenden Dateien ermittelt
werden, bevor die Übertragung stattfindet.
   Ob  diese  Funktion  ihren  Zweck  erfüllen  kann,  hängt  stark von der
verwendeten  xpr.library  ab;  unterstützt  diese keinen Batch-Transfer, so
wird zumindest versucht, die erste zu übertragende Datei zu verschicken.

                                     *

Erfolg = GetOptions(Puffer)
  D0                  A0

Puffer          - Hier   werden  die  aktuell  eingestellten  Optionen  der
                  geöffneten    xpr.library   abgelegt.    Es   wird   eine
                  Zeichenkette  erwartet,  die  mindestens 256 Zeichen lang
                  ist.

   Diese  Routine liefert einen Wert zurück, der über den Erfolg der Aktion
informiert.   Ist dieser gleich 0, so konnten die Optionen nicht ausgelesen
werden.   Ist er ungleich 0, so enthält der übergebene Puffer die mit einem
Nullbyte abgeschlossenen aktuellen Optionen.

                                     *

Erfolg = SetOptions(Optionen)
  D0                   A0

Optionen        - Die  zu  setzenden Optionen für die aktuelle xpr.library.
                  Wird   als   mit  einem  Nullbyte  beendete  Zeichenkette
                  erwartet.

   Diese  Routine liefert einen Wert zurück, der über den Erfolg der Aktion
informiert.   Ist  dieser  gleich  0, so konnten die Optionen nicht gesetzt
werden.  Ist er ungleich 0, so wurden die Optionen korrekt gesetzt.

                                     *

Fehler = InstallTransferNote(Note)
  D0                          A0

Note            - Die  Adresse  einer  `C'-Struktur,  die man sich auch als
                  eine Aufreihung von dreizehn Langwörtern vorstellen kann,
                  sie sieht wie folgt aus:

                      struct TransferNote
                      {
                         LONG tn_Continue;     /* Ist dieser Wert gleich 0,
                                                * so wird der Transfer-
                                                * vorgang sofort ab-
                                                * gebrochen.
                                                */

                         LONG tn_CarrierDetect;/* Der Inhalt dieser Variable
                                                * gibt an, ob das Modem ein
                                                * Trägersignal (Carrier)
                                                * erkennt. Ist dieses Signal
                                                * nicht mehr vorhanden, ist
                                                * die Verbindung unterbrochen
                                                * worden.
                                                */

                         LONG tn_Seconds;      /* Anzahl der Sekunden, die
                                                * der Transfervorgang noch
                                                * dauern wird. Vorsicht!
                                                * dieser Wert kann von
                                                * Anfang an gleich 0 sein
                                                * und sich während des
                                                * gesamten Transfers
                                                * nicht verändern.
                                                */

                         LONG tn_Bytes;        /* Anzahl der noch zu
                                                * übertragenden Bytes.
                                                * Auch dieser Wert kann
                                                * von Anfang an gleich 0
                                                * sein und sich während
                                                * des gesamten Transfers
                                                * nicht verändern.
                                                */

                         APTR tn_UserData;     /* Ein Eintrag, der vom
                                                * Benutzer für seine
                                                * Zwecke verwendet
                                                * werden kann.
                                                */

                         char *tn_CurrentFile; /* Adresse einer Zeichenkette,
                                                * die den Namen der gerade
                                                * übertragenen Datei enthält.
                                                * Vorsicht: dieser Wert kann
                                                * auch NULL (0) sein, wenn
                                                * gerade keine Datei übertragen
                                                * wird.
                                                */

                         LONG tn_FilesToGo;    /* Soweit bekannt, enthält diese
                                                * Variable die Anzahl der noch
                                                * zu übertragenden Dateien
                                                * (0 = die letzte Datei wird
                                                * gerade verschickt).
                                                */

                         LONG tn_ProtocolName; /* Name einer Datei, in der die
                                                * Namen aller empfangenen und
                                                * verschickten Dateien eingetragen
                                                * werden. Steht hier eine Null,
                                                * so wird keine Protokolldatei
                                                * angelegt.
                                                */

                         LONG tn_Extension;    /* Anzahl der dieser Strukturform
                                                * noch folgenden Langwörter (für
                                                * künftige Erweiterungen reserviert).
                                                */

                         LONG tn_WatchCarrier; /* Sofern tn_Extension einen Wert >= 1
                                                * enthält, wird der Library über den
                                                * Inhalt dieses Langworts mitgeteilt,
                                                * ob bei Verlust des Trägersignals
                                                * der Transfer abgebrochen werden
                                                * soll. Falls Ja, ist hier eine 1,
                                                * falls Nein, eine 0 einzutragen.
                                                */

                         LONG tn_Aborted;      /* Sofern tn_Extension einen Wert >= 2
                                                * enthält, wird der Library über den
                                                * Inhalt dieses Langworts mitgeteilt,
                                                * ob der Transfer durch den Anwender
                                                * abgebrochen wurde.
                                                */

                         LONG tn_Error;        /* Sofern tn_Extension einen Wert >= 3
                                                * enthält, wird der Library über den
                                                * Inhalt dieses Langworts mitgeteilt,
                                                * ob der Transfer aufgrund eines
                                                * Fehlers abgebrochen wurde. Ist der
                                                * hier eingetragene Wert = 0, so ist
                                                * kein Fehler aufgetreten, ist er 1,
                                                * liegt ein AmigaDOS-Fehler vor, bei
                                                * 2 ist ein Schnittstellenfehler
                                                * aufgetreten.
                                                */

                         LONG tn_ErrorCode;    /* Sofern tn_Extension einen Wert >= 4
                                                * enthält, wird der Library über den
                                                * Inhalt dieses Langworts mitgeteilt,
                                                * aufgrund welchen Fehlers der Transfer
                                                * abgebrochen wurde. Dies ist entweder
                                                * ein AmigaDOS-Fehlercode, ein Fehlercode
                                                * der Schnittstelle oder der Wert 1000,
                                                * der angibt, daß das Carrier-Signal
                                                * verlorengegangen ist.
                                                */
                      };

   Diese  Routine liefert einen Wert ungleich 0 zurück, wenn beim Eintragen
ein   Fehler   aufgetreten  ist  (die  jeweiligen  Fehlerwerte  sind  unter
`TransferSetup'  aufgeführt),  ein Wert gleich 0 wird zurückgeliefert, wenn
kein Fehler aufgetreten ist.
   Typischerweise  wird  diese Funktion von einem separat laufenden Process
benutzt,  um  den  im Transfer befindlichen Process überwachen und notfalls
abbrechen  zu  können.   Die übergebene `TransferNote'-Struktur muß während
des    gesamten    Transfervorganges   erhalten   bleiben,   sonst   können
Systemabstürze  die  Folge sein.  Der Bezug auf die Struktur bleibt bis zum
Schließen   der  Library  oder  bis  zum  nächsten  Aufruf  der  Funktionen
TransferSetupShared() und TransferSetup() erhalten.

   Zum   Format   der   Protokolldatei:    wird  eine  Datei  gelesen  oder
beschrieben,  wenn  sie  verschickt  oder  empfangen wird, so wird ihr Name
zusammen  mit  dem  jeweiligen  Zugriffsmodus  (`R'  für Empfangen, `S' für
Verschicken)  in  die  Datei  geschrieben, deren Name unter tn_ProtocolName
eingetragen  ist.   Typischerweise  sieht  der  Inhalt dieser Datei am Ende
einer Übertragung folgendermaßen aus:

                      R Work:Download/EmpfangeDatei1
                      R Work:Download/EmpfangeDatei2
                                     :
                                     :
                                    etc.

An  die  unter  tn_ProtocolName  angegebene  Datei  werden  die  Namen  der
empfangenen/verschickten    Dateien    _angehängt_,    sie   wird   _nicht_
überschrieben.
   Wird  eine  Datei  nicht korrekt verschickt/empfangen, so wird statt der
Großbuchstaben "R" / "S" ein Kleinbuchstabe "r" / "s" vorangestellt.
   Zum Schluß wird an die Liste der Dateinamen eine Zeile mit statistischen
Daten angehängt, die folgenden Aufbau hat:

               + Files <Anzahl> Bytes <Anzahl> CPS <Anzahl>

   Es  wird  die  Anzahl  der  empfangenen Dateien, die Anzahl der empfang-
enen  Dateien    und  die  durchschnittliche Übertragungsgeschwindigkeit in
Zeichen pro Sekunde angegeben.
                                     
================================ Anwendung ================================
===========================================================================
Für  `C'  habe  ich  eine  Header-Datei  bereitgestellt, die Prototypen und
Übergabewerte  enthält,  Linker-Bibliotheken sind ebenfalls vorhanden.  Für
alle anderen Sprachen muß man sich mit der .fd-Datei behelfen.

       Die übliche Reihenfolge der Aufrufe sähe z.B. wie folgt aus:

        MetaXprBase = OpenLibrary("metaxpr.library",0);

        :
        :

        Fehler = TransferSetup("serial.device",0,"xprzmodem.library",
                                2400,8,1,0,0);

        :
        :

        Erfolg = ReceiveFile("Datei",0,0);

        :
        :

        Erfolg = SendFile("Datei",1,Screen);

        :
        :

        CloseLibrary(MetaXprBase);

   Wem  diese  paar Zeilen nicht helfen, der kann mir seine Fragen entweder
brieflich, oder auf elektronischem Wege über Z-Net oder Usenet stellen.


====================== Anschrift & Bitte des Autors =======================
===========================================================================
Die  Benutzung  der  metaxpr.library  ist  kostenfrei,  ich  verlange keine
Spenden,  noch  erwarte  ich  sie.  Die einzige Auflage, die ich mache, ist
die, daß jeder, der neue Supportroutinen für die Bibliothek schreibt, diese
dem  MetaXPR-Paket hinzufügt, oder sie mir zuschickt.  Auf diese Weise soll
Jedermann Zugang zur Nutzung der Bibliothek erhalten.

                             Meine Anschrift:

                               Olaf Barthel
                             Brabeckstraße 35
                            D-3000 Hannover 71

                        Z-Netz: O.BARTHEL@A-LINK-H
                      Internet: olsen@sourcery.mxm.sub.org
                                o.barthel@a-link-h.comlink.de


========================= Entwicklungsgeschichte ==========================
===========================================================================
V4.0    Erweiterung   der   Überwachungsfunktionen,   verschiedene   Fehler
        erschlagen.

V3.6-   Interne Versionen.
V3.9

V3.5    Die Protokollierung der empfangenen und verschickten Dateien ist um
        statistische   Daten  erweitert  worden.  Ebenfalls  ist  es  jetzt
        möglich, den Transfer bei Verlust des Carrier-Signales abbrechen zu
        lassen.

V3.4    Die   Library   unterstützt   andere   Treiber   als  das  Original
        serial.device    jetzt   besser,   es   ist   jetzt   möglich,  die
        Transferaktionen  in  einer  Datei mitprotokollieren zu lassen, das
        Transferfenster kann jetzt auch inaktiv geöffnet werden.

V3.3    Einige  interne  Änderungen  sind  notwendig  geworden; die Library
        meldet  jetzt  korrekt,  wenn ein Transfer abgebrochen wurde und es
        erscheint  kein  AmigaDOS-Requester  mehr,  wenn  Diskettenprobleme
        auftreten  (dieses  Feature ist zur Unterstützung der automatischen
        Ausführung von Netcalls gedacht).

V3.1    Die  Library  wurde  wieder einmal um eine neue Funktion erweitert:
        `SendMultipleFiles'      ist      hinzugekommen.       Auch     die
        TransferNote-Struktur  ist  um einige Felder erweitert worden, auch
        die Carrier-Erkennung sollte jetzt funktionieren.

V3.0    Die   Library   wurde   um   die  Funktion  `InstallTransferNote()'
        erweitert.

V2.0    Es  gibt  die  neue  Funktion  `TransferSetupShared()', die Library
        sollte  intern  jetzt etwas stabiler arbeiten, ein paar Fehler sind
        beseitigt.

V1.2    Das Fenster verträgt sich auch mit anderen Systemfonts als topaz 8,
        werden  andere  Tasten  als  ^C  oder  Escape  gedrückt,  hängt der
        Transfervorgang  nicht  mehr,  die  Bibliothek läßt sich auch unter
        Kickstart  2.0  öffnen.   Der Send und Receive übergebene Dateiname
        enthält  nach  der  Übertragung  den Namen der zuletzt übertragenen
        Datei.

V1.1    Erste öffentliche Verbreitung.
