Initial code commit for Toolkit 1.1.
[runtime.git] / lib / silcutil / silcstream.h
diff --git a/lib/silcutil/silcstream.h b/lib/silcutil/silcstream.h
new file mode 100644 (file)
index 0000000..cb7b93f
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+
+  silcstream.h
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2005 Pekka Riikonen
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+/****h* silcutil/SILC Stream Interface
+ *
+ * DESCRIPTION
+ *
+ * SILC Stream API is a generic representation of a stream.  A common API
+ * is defined that can be used to read from and write to the stream.  Any
+ * other stream API derived from this API can use this same interface for
+ * sending and receiving.
+ *
+ ***/
+
+#ifndef SILCSTREAM_H
+#define SILCSTREAM_H
+
+/****s* silcutil/SilcStreamAPI/SilcStream
+ *
+ * NAME
+ *
+ *    typedef void *SilcStream;
+ *
+ * DESCRIPTION
+ *
+ *    Abstact stream context representing any stream.  All streams are using
+ *    this abstraction so that the stream can be accessed using the standard
+ *    silc_stream_* functions.  All streams are destroyed by calling the
+ *    silc_stream_destroy function.
+ *
+ ***/
+typedef void *SilcStream;
+
+/****d* silcutil/SilcStreamAPI/SilcStreamStatus
+ *
+ * NAME
+ *
+ *    typedef enum { ... } SilcStreamStatus;
+ *
+ * DESCRIPTION
+ *
+ *    Stream status.  This status is returned into the SilcStreamNotifier
+ *    callback function to indicate the status of the stream at a given
+ *    moment.
+ *
+ * SOURCE
+ */
+typedef enum {
+  SILC_STREAM_CAN_READ,                /* Data available for reading */
+  SILC_STREAM_CAN_WRITE,       /* Stream ready for writing */
+  SILC_STREAM_EOS,             /* End of stream */
+  SILC_STREAM_CLOSED,          /* Stream is closed */
+  SILC_STREAM_INVALID,         /* Stream is invalid */
+  SILC_STREAM_NO_MEMORY,       /* System out of memory */
+  SILC_STREAM_ERROR,           /* Unknown error */
+} SilcStreamStatus;
+/***/
+
+/****f* silcutil/SilcStreamAPI/SilcStreamNotifier
+ *
+ * SYNOPSIS
+ *
+ *    typedef void (*SilcStreamNotifier)(SilcStream stream,
+ *                                       SilcStreamStatus status,
+ *                                       void *context);
+ *
+ * DESCRIPTION
+ *
+ *    A callback of this type is called as stream notifier to notify of a
+ *    certain action taken over the stream.  This is called to notify for
+ *    example that data is ready for reading, or writing or that end of
+ *    stream occurred.
+ *
+ ***/
+typedef void (*SilcStreamNotifier)(SilcStream stream,
+                                  SilcStreamStatus status,
+                                  void *context);
+
+/****s* silcutil/SilcStreamAPI/SilcStreamOps
+ *
+ * NAME
+ *
+ *    typedef struct { ... } SilcStreamOps;
+ *
+ * DESCRIPTION
+ *
+ *    SILC Stream operations structure.  This structure includes callback
+ *    functions to the actual stream implementation.  Any stream that
+ *    use SILC Stream abstraction must fill this structure with the actual
+ *    stream implementation.
+ *
+ *    Each stream implementation MUST set this structure as the first field
+ *    in their stream structure.  As it is that structure that is passed
+ *    to the silc_stream_* routines, the SILC Stream API expects that the
+ *    SilcStream context starts with this structure.
+ *
+ * EXAMPLE
+ *
+ *    typedef struct {
+ *      const SilcStreamOps *ops;
+ *      ... other stuff ...
+ *    } *SilcFooStream;
+ *
+ *    SilcFooStream foo;
+ *    silc_stream_write(foo, data, data_len);
+ *
+ * SOURCE
+ */
+typedef struct {
+  /* This is called to read data from the stream.  This is called when
+     silc_stream_read function was called. */
+  int (*read)(SilcStream stream, unsigned char *buf, SilcUInt32 buf_len);
+
+  /* This is called when writing data to the stream.  This is called when
+     silc_stream_write function was called. */
+  int (*write)(SilcStream stream, const unsigned char *data,
+              SilcUInt32 data_len);
+
+  /* This is called to close the stream.  This is called when the
+     silc_stream_close function was called. */
+  bool (*close)(SilcStream stream);
+
+  /* This is called to destroy the stream.  This is called when the
+     silc_stream_destroy function was called. */
+  void (*destroy)(SilcStream stream);
+
+  /* This is called to set a notifier callback to the stream.  This is
+     called when silc_stream_set_notifier was called. */
+  void (*notifier)(SilcStream stream, SilcStreamNotifier callback,
+                  void *context);
+} SilcStreamOps;
+/***/
+
+/****f* silcutil/SilcStreamAPI/silc_stream_read
+ *
+ * SYNOPSIS
+ *
+ *    int silc_stream_read(SilcStream stream, unsigned char *buf,
+ *                         SilcUInt32 buf_len);
+ *
+ * DESCRIPTION
+ *
+ *    Reads data from the stream indicated by `stream' into the data buffer
+ *    indicated by `buf' which is size of `buf_len'.  This returns the amount
+ *    of data read, zero (0) if end of stream occurred, -1 if data could
+ *    not be read at this moment, or -2 if error occurred.  If -1 is returned
+ *    the notifier callback will later be called with SILC_STREAM_CAN_READ
+ *    status when stream is again ready for reading.
+ *
+ ***/
+int silc_stream_read(SilcStream stream, unsigned char *buf,
+                    SilcUInt32 buf_len);
+
+/****f* silcutil/SilcStreamAPI/silc_stream_write
+ *
+ * SYNOPSIS
+ *
+ *    int silc_stream_write(SilcStream stream, const unsigned char *data,
+ *                          SilcUInt32 data_len);
+ *
+ * DESCRIPTION
+ *
+ *    Writes `data_len' bytes of data to the stream indicated by `stream' from
+ *    data buffer indicated by `data'.  Returns the amount of data written,
+ *    zero (0) if end of stream occurred, -1 if data could not be written
+ *    at this moment, or -2 if error occurred.  If -1 is returned the
+ *    notifier callback will later be called with SILC_STREAM_CAN_WRITE
+ *    status when stream is again ready for writing.
+ *
+ ***/
+int silc_stream_write(SilcStream stream, const unsigned char *data,
+                     SilcUInt32 data_len);
+
+/****f* silcutil/SilcStreamAPI/silc_stream_close
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_stream_close(SilcStream stream);
+ *
+ * DESCRIPTION
+ *
+ *    Closes the stream indicated by `stream'.  No data can be read or written
+ *    to the stream after calling this function.  Return TRUE if the stream
+ *    could be closed.  If action is taken on closed stream the notifier
+ *    callback will be called with an error status.
+ *
+ ***/
+bool silc_stream_close(SilcStream stream);
+
+/****f* silcutil/SilcStreamAPI/silc_stream_destroy
+ *
+ * SYNOPSIS
+ *
+ *    void silc_stream_destroy(SilcStream stream);
+ *
+ * DESCRIPTION
+ *
+ *    Destroy the stream indicated by `stream'.  The `stream' will become
+ *    invalid after this function returns.  All streams are destroyed by
+ *    calling this function.  The silc_stream_close should be called
+ *    before calling this function.  However, if it is not called this
+ *    function will call it.
+ *
+ ***/
+void silc_stream_destroy(SilcStream stream);
+
+/****f* silcutil/SilcStreamAPI/silc_stream_set_notifier
+ *
+ * SYNOPSIS
+ *
+ *    void silc_stream_set_notifier(SilcStream stream,
+ *                                  SilcStreamNotifier notifier,
+ *                                  void *context);
+ *
+ * DESCRIPTION
+ *
+ *    Set a notifier callback for the stream indicated by `stream' to be called
+ *    when some action takes place on the stream.  It is called for example
+ *    when data is available for reading or writing, or if an error occurs.
+ *    This can be called at any time for valid stream.  If `notifier' is set
+ *    to NULL no callback will be called for the stream.
+ *
+ ***/
+void silc_stream_set_notifier(SilcStream stream, SilcStreamNotifier notifier,
+                             void *context);
+
+#endif /* SILCSTREAM_H */