Fixed packet wrapper stream API to support encoder/decoder
[silc.git] / lib / silccore / silcpacket.h
index 1a880927dc6dd229044bdcdad77c0babe85a04fa..cef13ca27a978cc49584cc9c337ec75efcf22a37 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2006 Pekka Riikonen
+  Copyright (C) 1997 - 2007 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
@@ -85,6 +85,7 @@ typedef SilcUInt8 SilcPacketType;
 #define SILC_PACKET_RESUME_ROUTER        26      /* Backup router resume */
 #define SILC_PACKET_FTP                  27      /* File Transfer */
 #define SILC_PACKET_RESUME_CLIENT        28      /* Client resume */
+#define SILC_PACKET_ACK                  29      /* Acknowledgement */
 
 #define SILC_PACKET_PRIVATE              200     /* Private range start  */
 #define SILC_PACKET_MAX                  255     /* RESERVED */
@@ -113,9 +114,10 @@ typedef SilcUInt8 SilcPacketFlags;
 #define SILC_PACKET_FLAG_LIST             0x02   /* Packet is a list */
 #define SILC_PACKET_FLAG_BROADCAST        0x04   /* Packet is a broadcast */
 #define SILC_PACKET_FLAG_COMPRESSED       0x08    /* Payload is compressed */
+#define SILC_PACKET_FLAG_ACK              0x10    /* Acknowledge packet */
 
 /* Impelemntation specific flags */
-#define SILC_PACKET_FLAG_LONG_PAD         0x10    /* Use maximum padding */
+#define SILC_PACKET_FLAG_LONG_PAD         0x12    /* Use maximum padding */
 /***/
 
 /****s* silccore/SilcPacketAPI/SilcPacketEngine
@@ -515,20 +517,19 @@ void silc_packet_stream_set_iv_included(SilcPacketStream stream);
  * SYNOPSIS
  *
  *    void silc_packet_stream_set_stream(SilcPacketStream packet_stream,
- *                                       SilcStream stream,
- *                                       SilcSchedule schedule);
+ *                                       SilcStream stream);
  *
  * DESCRIPTION
  *
  *    This function may be used to change the underlaying stream in the
  *    packet stream indicated by `packet_stream'.  Note that the old
  *    stream will not be used after calling this function.  The caller is
- *    responsible destroying the old stream.
+ *    responsible destroying the old stream.  The `stream' will use
+ *    the same scheduler as the `packet_stream'.
  *
  ***/
 void silc_packet_stream_set_stream(SilcPacketStream packet_stream,
-                                  SilcStream stream,
-                                  SilcSchedule schedule);
+                                  SilcStream stream);
 
 /****f* silccore/SilcPacketAPI/silc_packet_stream_get_stream
  *
@@ -612,6 +613,88 @@ void silc_packet_stream_unlink(SilcPacketStream stream,
                               SilcPacketCallbacks *callbacks,
                               void *callback_context);
 
+/****f* silccore/SilcPacketAPI/SilcPacketWrapCoder
+ *
+ * SYNOPSIS
+ *
+ *    typedef SilcBool (*SilcPacketWrapCoder)(SilcStream stream,
+ *                                            SilcStreamStatus status,
+ *                                            SilcBuffer buffer,
+ *                                            void *context);
+ *
+ * DESCRIPTION
+ *
+ *    The encoder/decoder callback for silc_packet_stream_wrap.  If the
+ *    `status' is SILC_STREAM_CAN_WRITE then additional data can be added
+ *    to `buffer'.  It is added before the data that is written with
+ *    silc_stream_write.  The silc_buffer_enlarge should be called to verify
+ *    there is enough room in `buffer' before adding data to it.  The `buffer'
+ *    must not be freed.
+ *
+ *    If the `status' is SILC_STREAM_CAN_READ then data from the `buffer'
+ *    may be read before it is passed to readed when silc_stream_read is
+ *    called.  The `buffer' may be advanced also to hide data in it.
+ *
+ *    This function returns FALSE in case of error.
+ *
+ ***/
+typedef SilcBool (*SilcPacketWrapCoder)(SilcStream stream,
+                                       SilcStreamStatus status,
+                                       SilcBuffer buffer,
+                                       void *context);
+
+/****f* silccore/SilcPacketAPI/silc_packet_stream_wrap
+ *
+ * SYNOPSIS
+ *
+ *    SilcStream silc_packet_stream_wrap(SilcPacketStream stream,
+ *                                       SilcPacketType type,
+ *                                       SilcPacketFlags flags,
+ *                                       SilcBool blocking_mode,
+ *                                       SilcPacketWrapCoder coder,
+ *                                       void *context);
+ *
+ * DESCRIPTION
+ *
+ *    Wraps the packet stream indicated by `stream' into a SilcStream for
+ *    the packet type indicated by `type' with packet flags indicated by
+ *    `flags'.  The returned SilcStream can be used to read and write the
+ *    specified SILC packets with the specified packet flags, by calling
+ *    silc_stream_read and silc_stream_write, respectively.  The returned
+ *    stream can be destroyed by calling silc_stream_destroy.  It does not
+ *    destroy the wrapped packet stream.
+ *
+ *    If the `blocking_mode' mode is TRUE then the silc_stream_read and
+ *    silc_stream_write may block the calling process or thread until SILC
+ *    packet is read or written.  If it is FALSE the stream is in non-blocking
+ *    mode and the calls never block.  The returned stream is thread-safe and
+ *    packets may be read and written in multi-threaded environment.
+ *
+ *    In non-blocking mode the silc_stream_set_notifier must be called before
+ *    the returned stream can be used to read packets.  The stream status
+ *    SILC_STREAM_CAN_READ will be returned to the notifier callback to
+ *    indicate that a packet is ready for reading.  Calling silc_stream_read
+ *    once returns one complete SILC packet data payload (which is of type of
+ *    `type').
+ *
+ *    The `coder' is optional encoder/decoder callback which the packet engine
+ *    will call if it is non-NULL.  It can be used to encode additional data
+ *    into each packet when silc_stream_write is called or decode data before
+ *    it is passed to reader when silc_stream_read is called.  The `context'
+ *    is passed to `coder'.
+ *
+ *    The returned SilcStream can be used as any normal stream and all
+ *    SilcStream API functions may be used with the stream.  This returns
+ *    NULL on error.
+ *
+ ***/
+SilcStream silc_packet_stream_wrap(SilcPacketStream stream,
+                                  SilcPacketType type,
+                                  SilcPacketFlags flags,
+                                  SilcBool blocking_mode,
+                                  SilcPacketWrapCoder coder,
+                                  void *context);
+
 /****f* silccore/SilcPacketAPI/silc_packet_get_sender
  *
  * SYNOPSIS