========================== 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. Anmerkung (M.Prüß): GateXpr.Library ist eine veränderte Version (siehe History), entspricht aber in allen Punkten bis auf die Filegrößenermittlung dem Original. =============================== 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 Bytes CPS 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.2 Da es inzwischen Versionen bis hoch zu 6.5 gibt und ich eine Kollision vermeiden möchte wurde die Library umgetauft. Diese Version trägt den Namen GateXpr.Library, ist aber ansonsten identisch mit MetaXpr.Library 4.1a V4.1a Einige kleinere Optimierungen in der Anpassung. V4.1 Anpassungen für Gateway-BBS by Michaela Prüß. Neue Berechnung der Filegröße, da das Original und Aztec-C nicht miteinander harmo- nierten. Danke an Olaf Barthel für die Quellen! 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.