In TCL ist ein Channel so wie ein Stream in C++. In TCL gibt es ein Einheitliches Interface Konzept für Ausgabe- und Eingabeströme. Man kann so genau auf die gleiche Art eine Datei, ein Socket, oder ein Gerät ansprechen.
Beispiel in TCL
set file [open gizmofile w]
puts -nonewline $fout "Dieser Satz wird zu Datei gizmofile geschrieben"
close $file
Die Idee des Mimechannel ist, den Konventierungsalgorithmus in solchen Channel zu kapseln. Man schreibt in Mimechannel mit Hilfe von put
irgendwelche Daten und beim lesen (durch read
) bekommt man kodierte oder dekodierte Daten.
Um Mimechannel richtig nutzen zu können, muß man in den Interpreter die Bibliothek mimechan.so erstmal laden. Das geschieht mit
load $PATH/mimechann.so MIMECHAN
Wobei selbstverständlich die Variable $PATH mit dem Pfad zu der Datei mimechan.so zu initialisieren ist.
ein Channel öffnet man Kommando mimechan deren Syntax Darstellung in BNF (Backus-Naur-Form) ist
mimechann <normaloption>|<specialoption>
<normaloption> ::= (-decode|-encode) (-base64|-qouted-printable|-uucode)
<specialoption> ::= -encode -qouted-printable -noLFconvert
Als Rückgabewert bekommt man einen Händler für gerade geöffnetes Mimechannel, der für Schreib- und Lesefunktionen des TCL als Argument zu übergeben ist.
Die Optionen sind angeordnet.
Hauptoptionen, sind immer notwendig
-encode
oder Dekodieren -decode
.-base64 -qouted-printable -uucode
-noLFconvert
kann nur mit Optionnen -encode -quoted-printable eingesetz werden. Normalleweise werden auch Bruchzeilen kodiert. Diese Option unterdrückt dieses Verhalten.
Ein Satz kodieren und auf dem Terminal ausgeben
set Z [mimechan -encode -base64]
puts -nonewline $Z "Dieser Satz wird zu base64 kodiert"
puts -nonewline [read $Z]
close $Z
close $Z
ist wichtig, weil bis dahin unnötig der Speicherplatz belegt wird
Wichtig: Nach ersten read-Zugriff kann in den Channel nicht mehr geschrieben werden. (Erklärung sehe KODIERUNG)
In Datei test.base64 liegt eine base64 kodierte Datei. Diese Datei soll dekodiert ausgeben werden.
set Z [mimechan -decode -base64]
set fin [open test.base64 r]
puts -nonewline $Z [read $fin]
close $fin
puts [read $Z]
close $Z
In diesem Fall (bei Dekodierung) kann der Channel kontinuierlich beschrieben und gelesen werden. Bei Lesen wird es soviel zurückgegeben wie es von letzten Schreibzugriff zu dekodieren möglich war.