Previous Next Contents

2. Definieren von neuen Tcl Channel

Bemerkung: Definition von Tcl Channel ist in man pages 'Tcl_Createchannel' genau beschrieben.

Ein Channel wird mit der Funktion


Tcl_CreateChannel(typePtr, channelName, instanceData, mask)
       Tcl_ChannelType      *typePtr;
       char                 *channelName;
       ClientData           instanceData;
       int                  mask; (Kombination von TCL_READABLE und TCL_WRITABLE)

Die wichtigste Struktur Tcl_ChannelType beinhaltet alle Grundfunktionnen eines Channels, die als Callbacks von Tcl Interpreter aufgerufen werden. Die Verwaltung von Channel übernimmt großenteils der Tcl Interpreter. Der Wert instanceData wird jeder Funktion als Parameter übergeben und kann benutzt werden um Channel spezifische Strukturen zu referenzieren.

Die Tcl_ChannelType Struktur und die dazugehörige Funktionssignaturen.


static Tcl_ChannelType channelType = {
  "mime",               /* Type name.                                    */
  NULL,                 /* Set blocking/nonblocking behaviour. NULL'able */
  Close,                /* Close channel, clean instance data            */
  Input,                /* Handle read request                           */
  Output,               /* Handle write request                          */
  Seek,                 /* Move location of access point.      NULL'able */
  NULL,                 /* Set options.                        NULL'able */
  GetOption,            /* Get options.                        NULL'able */
  WatchChannel,         /* Initialize notifier                           */
  GetFile               /* Get OS handle from the channel.               */
};
static int Close _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp));

static int Input _ANSI_ARGS_((ClientData instanceData,
                              char *buf, int toRead, int *errorCodePtr));

static int Output _ANSI_ARGS_((ClientData instanceData,
                               char *buf, int toWrite, int *errorCodePtr));

static int Seek _ANSI_ARGS_((ClientData instanceData,
                             long offset, int mode, int *errorCodePtr));

static void WatchChannel _ANSI_ARGS_((ClientData instanceData, int mask));


static int GetOption _ANSI_ARGS_((
    ClientData instanceData, Tcl_Interp* interp,
    char *optionName, Tcl_DString *dsPtr));

static void ChannelReady _ANSI_ARGS_((ClientData instanceData));
static int GetFile _ANSI_ARGS_((ClientData instanceData, int direction,
                                ClientData* handlePtr));

static int MimechanCmd _ANSI_ARGS_ ((ClientData notUsed,
                                       Tcl_Interp* interp,
                                       int argc, char** argv));

Ein so definiertes Channel muß nur noch der Funktion Tcl_RegisterChannel (interp, chan); registriert werden.


Previous Next Contents