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.