for w32 port
[oweals/gnunet.git] / src / include / gnunet_server_lib.h
index 6d495c1c09fd8a92c07ee76db0a4f41d2191bb29..20ed78baba2202246b1b745652ccfc11c3c448b5 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2009 Christian Grothoff (and other contributing authors)
+     (C) 2009, 2010 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -46,6 +46,10 @@ extern "C"
  */
 #define GNUNET_SERVER_MAX_MESSAGE_SIZE 65536
 
+/**
+ * Largest supported message.
+ */
+#define GNUNET_SERVER_MIN_BUFFER_SIZE sizeof (struct GNUNET_MessageHeader)
 
 /**
  * @brief handle for a server
@@ -108,6 +112,27 @@ struct GNUNET_SERVER_MessageHandler
 };
 
 
+/**
+ * Create a new server.
+ *
+ * @param sched scheduler to use
+ * @param access function for access control
+ * @param access_cls closure for access
+ * @param lsocks NULL-terminated array of listen sockets
+ * @param idle_timeout after how long should we timeout idle connections?
+ * @param require_found if YES, connections sending messages of unknown type
+ *        will be closed
+ * @return handle for the new server, NULL on error
+ *         (typically, "port" already in use)
+ */
+struct GNUNET_SERVER_Handle *
+GNUNET_SERVER_create_with_sockets (struct GNUNET_SCHEDULER_Handle *sched,
+                                  GNUNET_CONNECTION_AccessCheck access, void *access_cls,
+                                  struct GNUNET_NETWORK_Handle **lsocks,
+                                  struct GNUNET_TIME_Relative
+                                  idle_timeout,
+                                  int require_found);
+
 /**
  * Create a new server.
  *
@@ -116,7 +141,6 @@ struct GNUNET_SERVER_MessageHandler
  * @param access_cls closure for access
  * @param serverAddr address toes listen on (including port), NULL terminated array
  * @param socklen lengths of respective serverAddr 
- * @param maxbuf maximum write buffer size for accepted sockets
  * @param idle_timeout after how long should we timeout idle connections?
  * @param require_found if YES, connections sending messages of unknown type
  *        will be closed
@@ -130,7 +154,6 @@ struct GNUNET_SERVER_Handle *GNUNET_SERVER_create (struct
                                                    access, void *access_cls,
                                                   struct sockaddr *const*serverAddr,
                                                    const socklen_t *socklen,
-                                                   size_t maxbuf,
                                                    struct GNUNET_TIME_Relative
                                                    idle_timeout,
                                                    int require_found);
@@ -252,120 +275,6 @@ struct GNUNET_SERVER_Client *GNUNET_SERVER_connect_socket (struct
                                                            *connection);
 
 
-/**
- * Receive data from the given connection.  This function should call
- * "receiver" asynchronously using the scheduler.  It must return
- * "immediately".
- *
- * @param cls closure
- * @param sched scheduler to use
- * @param max maximum number of bytes to read
- * @param timeout maximum amount of time to wait (use -1 for "forever")
- * @param receiver function to call with received data
- * @param receiver_cls closure for receiver
- */
-typedef void
-  (*GNUNET_SERVER_ReceiveCallback) (void *cls,
-                                    size_t max,
-                                    struct GNUNET_TIME_Relative timeout,
-                                    GNUNET_CONNECTION_Receiver
-                                    receiver, void *receiver_cls);
-
-
-/**
- * Cancel receive request.
- *
- * @param cls closure
- */
-typedef void (*GNUNET_SERVER_ReceiveCancelCallback) (void *cls);
-
-
-/**
- * Notify us when the connection is ready to transmit size bytes.
- *
- * @param cls closure
- * @param size number of bytes to be ready for sending
- * @param timeout after how long should we give up (and call
- *        notify with buf NULL and size 0)?
- * @param notify function to call
- * @param notify_cls closure for notify
- * @return a handle that can be used to cancel
- *         the transmission request or NULL if
- *         queueing a transmission request failed
- */
-typedef void *(*GNUNET_SERVER_TransmitReadyCallback) (void *cls,
-                                                      size_t size,
-                                                      struct
-                                                      GNUNET_TIME_Relative
-                                                      timeout,
-                                                      GNUNET_CONNECTION_TransmitReadyNotify
-                                                      notify,
-                                                      void *notify_cls);
-
-
-/**
- * Cancel an earlier transmit notification request.
- *
- * @param cls closure
- * @param ctx handle that was returned by the TransmitReadyCallback
- */
-typedef void (*GNUNET_SERVER_TransmitReadyCancelCallback) (void *cls,
-                                                           void *ctx);
-
-
-/**
- * Check if connection is still valid (no fatal errors have happened so far).
- *
- * @param cls closure
- * @return GNUNET_YES if valid, GNUNET_NO otherwise
- */
-typedef int (*GNUNET_SERVER_CheckCallback) (void *cls);
-
-
-/**
- * Destroy this connection (free resources).
- *
- * @param cls closure
- * @pararm persist when connection is closed, "leak" socket
- */
-typedef void (*GNUNET_SERVER_DestroyCallback) (void *cls, int persist);
-
-
-/**
- * Add an arbitrary connection to the set of handles managed by this
- * server.  This can be used if a sending and receiving does not
- * really go over the network (internal transmission) or for servers
- * using UDP.
- *
- * @param server the server to use
- * @param chandle opaque handle for the connection
- * @param creceive receive function for the connection
- * @param ccancel cancel receive function for the connection
- * @param cnotify transmit notification function for the connection
- * @param cnotify_cancel transmit notification cancellation function for the connection
- * @param ccheck function to test if the connection is still up
- * @param cdestroy function to close and free the connection
- * @return the client handle (client should call
- *         "client_drop" on the return value eventually)
- */
-struct GNUNET_SERVER_Client *GNUNET_SERVER_connect_callback (struct
-                                                             GNUNET_SERVER_Handle
-                                                             *server,
-                                                             void *chandle,
-                                                             GNUNET_SERVER_ReceiveCallback
-                                                             creceive,
-                                                             GNUNET_SERVER_ReceiveCancelCallback
-                                                             ccancel,
-                                                             GNUNET_SERVER_TransmitReadyCallback
-                                                             cnotify,
-                                                             GNUNET_SERVER_TransmitReadyCancelCallback
-                                                             cnotify_cancel,
-                                                             GNUNET_SERVER_CheckCallback
-                                                             ccheck,
-                                                             GNUNET_SERVER_DestroyCallback
-                                                             cdestroy);
-
-
 /**
  * Notify the server that the given client handle should
  * be kept (keeps the connection up if possible, increments
@@ -610,6 +519,72 @@ GNUNET_SERVER_notification_context_broadcast (struct GNUNET_SERVER_NotificationC
 
 
 
+/**
+ * Handle to a message stream tokenizer.
+ */
+struct GNUNET_SERVER_MessageStreamTokenizer;
+
+/**
+ * Functions with this signature are called whenever a
+ * complete message is received by the tokenizer.
+ *
+ * @param cls closure
+ * @param client identification of the client
+ * @param message the actual message
+ */
+typedef void (*GNUNET_SERVER_MessageTokenizerCallback) (void *cls,
+                                                       void *client,
+                                                       const struct
+                                                       GNUNET_MessageHeader *
+                                                       message);
+
+
+/**
+ * Create a message stream tokenizer.
+ *
+ * @param cb function to call on completed messages
+ * @param cb_cls closure for cb
+ * @return handle to tokenizer
+ */
+struct GNUNET_SERVER_MessageStreamTokenizer *
+GNUNET_SERVER_mst_create (GNUNET_SERVER_MessageTokenizerCallback cb,
+                         void *cb_cls);
+
+
+/**
+ * Add incoming data to the receive buffer and call the
+ * callback for all complete messages.
+ *
+ * @param mst tokenizer to use
+ * @param client_identity ID of client for which this is a buffer,
+ *        can be NULL (will be passed back to 'cb')
+ * @param buf input data to add
+ * @param size number of bytes in buf
+ * @param purge should any excess bytes in the buffer be discarded 
+ *       (i.e. for packet-based services like UDP)
+ * @param one_shot only call callback once, keep rest of message in buffer
+ * @return GNUNET_OK if we are done processing (need more data)
+ *         GNUNET_NO if one_shot was set and we have another message ready
+ *         GNUNET_SYSERR if the data stream is corrupt
+ */
+int
+GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
+                          void *client_identity,
+                          const char *buf,
+                          size_t size,
+                          int purge,
+                          int one_shot);
+
+
+/**
+ * Destroys a tokenizer.
+ *
+ * @param mst tokenizer to destroy
+ */
+void
+GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst);
+
+
 #if 0                           /* keep Emacsens' auto-indent happy */
 {
 #endif