updates.
[silc.git] / lib / silccore / silcprotocol.h
index 534aa493d8e88da565e1fb55e3f0d04f9f932a50..197307c225306f0db706d018fd7db7711710c827 100644 (file)
@@ -1,30 +1,92 @@
-/*
-
-  silcprotocol.h
-
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
-
-  Copyright (C) 1997 - 2000 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; either version 2 of the License, or
-  (at your option) any later version.
-  
-  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* silccore/silcprotocol.h
+ *
+ * NAME
+ *
+ * silcprotocol.h
+ *
+ * COPYRIGHT
+ *
+ * Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+ *
+ * Copyright (C) 1997 - 2000 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * DESCRIPTION
+ *
+ * Implementation of the protocol handling routines for SILC applications.
+ * These routines allow execution of arbitrary protocols in the application.
+ * New protocols may be registered by type and allocated later by that
+ * type for the execution. The protocols implements a state machine style
+ * execution where each state is executed one after the other. The
+ * application controls these states and their order of execution.
+ * 
+ * After the protocol has been executed, an final callback is called
+ * which the application may use to do post-protocol work or to start
+ * perhaps other protocols. These routines are generic and the actual
+ * protocols, their types, callback and final callbacks functions must
+ * be implemented in the application.
+ *
+ ***/
 
 #ifndef SILCPROTOCOL_H
 #define SILCPROTOCOL_H
 
-/* Protocol type definition. */
+/****d* silccore/SilcProtocolAPI/SilcProtocolType
+ *
+ * NAME
+ * 
+ *    typedef unsigned char SilcProtocolType;
+ *
+ * DESCRIPTION
+ *
+ *    Protocol type definition. The protocol types are application
+ *    specific and this is just a generic type for them.
+ *
+ ***/
 typedef unsigned char SilcProtocolType;
 
-/* Protocol state definition. */
+/****d* silccore/SilcProtocolAPI/SilcProtocolState
+ *
+ * NAME
+ * 
+ *    typedef unsigned char SilcProtocolState;
+ *
+ * DESCRIPTION
+ *
+ *    Protocol state definition and the defined protocol states. These
+ *    states are the generic states. However, each protocol actually
+ *    implements the states. The state after SILC_PROTOCOL_STATE_START
+ *    would be state 2 in the application. These states can be easily
+ *    used for example inside switch() statement.
+ *
+ * EXAMPLE
+ *
+ *    switch (protocol->state) {
+ *    case SILC_PROTOCOL_STATE_START:
+ *      protocol_starts_here();
+ *    case 2:
+ *      ...
+ *    case 3:
+ *      ...
+ *    case SILC_PROTOCOL_STATE_END:
+ *      protocol_ends_here();
+ *    case SILC_PROTOCOL_STATE_FAILURE:
+ *      remote_end_sent_failure();
+ *    case SILC_PROTOCOL_STATE_ERROR:
+ *      local_error_during_protocol();
+ *    }
+ *
+ * SOURCE
+ */
 typedef unsigned char SilcProtocolState;
 
 /* Protocol states. Do NOT change the values of these states, especially
@@ -34,96 +96,255 @@ typedef unsigned char SilcProtocolState;
 #define SILC_PROTOCOL_STATE_END 252
 #define SILC_PROTOCOL_STATE_FAILURE 253         /* Received failure from remote */
 #define SILC_PROTOCOL_STATE_ERROR 254    /* Local error at our end */
+/***/
 
-/* Type definition for above auth methods */
+/* Type definition for authentication protocol's auth methods. */
+/* XXX strictly speaking this belongs to application */
 typedef unsigned char SilcProtocolAuthMeth;
 
-/* 
-   SILC Protocol Object.
-
-   Short description of the field following:
-   
-   SilcProtocolType type
-
-       Protocol type. This is enumeration.
-  
-   SilcProtocolCallback callback;
-
-       Callback function for the protocol. This is SilcTaskCallback function
-       pointer as the protocols in SILC are executed as timeout tasks.
-
-   The object expands to another structure as well. Short description of 
-   these fields following:
-
-   SilcProtocolObject *protocol
-
-       This is the pointer to the protocol object defined above.
-
-   SilcProtocolState state
-
-       Protocol state. This is enumeration. The state of the protocol can
-       be changed in the callback function.
-
-   void *context
-
-       Context to be sent for the callback function. This is usually 
-       object for either SILC client or server. However, this abstraction 
-       makes it possible that this pointer could be some other object as well. 
-
-   SilcProtocolExecute execute;
-
-       Executes the protocol and its states. The correct state must be set
-       before calling this function. The state is usually set in the protocol
-       specific routines.
-
-   SilcProtocolExecute execute_final;
-
-       Executes the final callback function of the protocol. Read on.
-
-   SilcProtocolFinalCallback final_callback;
-
-       This is a callback function that is called with timeout _after_ the
-       protocol has finished or error occurs. If this is NULL, naturally 
-       nothing will be executed. Protocol should call this function only at 
-       SILC_PROTOCOL_STATE_END and SILC_PROTOCOL_STATE_ERROR states.
-
-*/
+/****f* silccore/SilcProtocolAPI/SilcProtocolCallback
+ *
+ * SYNOPSIS
+ *
+ *    typedef SilcTaskCallback SilcProtocolCallback;
+ *
+ * DESCRIPTION
+ *
+ *    Protocol callback. This callback is set when registering new
+ *    protocol. The callback is called everytime the protocol is executed.
+ *    The `context' delivered to this callback function is the SilcProtocol
+ *    context and needs to be explicitly type casted to SilcProtocol in
+ *    the callback function.
+ *
+ ***/
 typedef SilcTaskCallback SilcProtocolCallback;
 
+/****f* silccore/SilcProtocolAPI/SilcProtocolFinalCallback
+ *
+ * SYNOPSIS
+ *
+ *    typedef SilcTaskCallback SilcProtocolFinalCallback;
+ *
+ * DESCRIPTION
+ *
+ *    Final protocol callback. This callback is set when allocating
+ *    protocol for execution. This is called when the protocol has ended.
+ *    The `context' delivered to this callback function is the SilcProtocol
+ *    context and needs to be explicitly type casted to SilcProtocol in
+ *    the callback function.
+ *
+ ***/
+typedef SilcTaskCallback SilcProtocolFinalCallback;
+
+/****s* silccore/SilcProtocolAPI/SilcProtocolObject
+ *
+ * NAME
+ * 
+ *    typedef struct SilcProtocolObjectStruct { ... } SilcProtocolObject;
+ *
+ * DESCRIPTION
+ *
+ *    The object for one protocol. This hold the information of one
+ *    registered protocol. Application must not allocate this type
+ *    directly. It is used by the protocol routines.
+ *
+ *    Short description of the field following:
+ *  
+ *    SilcProtocolType type
+ *
+ *      Protocol type.
+ * 
+ *    SilcProtocolCallback callback;
+ *
+ *      Callback function for the protocol. This is SilcTaskCallback function
+ *      pointer as the protocols in SILC are executed as timeout tasks.
+ *
+ *    struct SilcProtocolObjectStruct *next;
+ *
+ *      Pointer to the next protocol.
+ *
+ ***/
 typedef struct SilcProtocolObjectStruct {
   SilcProtocolType type;
   SilcProtocolCallback callback;
-
   struct SilcProtocolObjectStruct *next;
 } SilcProtocolObject;
 
-typedef SilcTaskCallback SilcProtocolFinalCallback;
-typedef SilcTaskCallback SilcProtocolExecute;
-
+/****s* silccore/SilcProtocolAPI/SilcProtocol
+ *
+ * NAME
+ * 
+ *    typedef struct SilcProtocolStruct { ... } *SilcProtocol;
+ *
+ * DESCRIPTION
+ *
+ *    The actual protocol object. This is allocated by the silc_protocol_alloc
+ *    and holds the information about the current protocol. Information
+ *    such as the current state, execution callback and final callback.
+ *    The context is freed by silc_protocol_free function.
+ *
+ *    Short description of the field following:
+ *
+ *    SilcProtocolObject *protocol
+ *
+ *      This is the pointer to the SilcProtocolObject and holds the
+ *      protocol specific information.
+ *
+ *    SilcProtocolState state
+ *
+ *      Protocol state. The state of the protocol can be changed in the
+ *      callback function.
+ *
+ *    void *context
+ *
+ *      Context to be sent for the callback function. This is usually 
+ *      object for either SILC client or server. However, this abstraction 
+ *      makes it possible that this pointer could be some other object as
+ *      well. Note that the context is not delivered in any callback 
+ *      function. Application can access it through this context.
+ *
+ *    SilcProtocolFinalCallback final_callback;
+ *
+ *      This is a callback function that is called with timeout _after_ the
+ *      protocol has finished or error occurs. If this is NULL, naturally 
+ *      nothing will be executed. Protocol should call this function only at 
+ *      SILC_PROTOCOL_STATE_END and SILC_PROTOCOL_STATE_ERROR states.
+ *
+ ***/
 typedef struct SilcProtocolStruct {
   SilcProtocolObject *protocol;
   SilcProtocolState state;
   void *context;
-
-  //  SilcProtocolExecute execute;
-  void (*execute)(void *, int, void *, int, long, long);
-  SilcProtocolExecute execute_final;
   SilcProtocolFinalCallback final_callback;
 } *SilcProtocol;
 
 /* Prototypes */
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_register
+ *
+ * SYNOPSIS
+ *
+ *    void silc_protocol_register(SilcProtocolType type,
+ *                                SilcProtocolCallback callback);
+ *
+ * DESCRIPTION
+ *
+ *    Dynamically registers new protocol. The protocol is added into protocol
+ *    list and can be unregistered with silc_protocol_unregister. The
+ *    `type' is the type of the protocol and is used to identify the
+ *    protocol when allocating it with silc_protocol_alloc. The `callback'
+ *    is the actual protocol function that is called when protocol is
+ *    executed (and it performes the actual protocol). The protocol
+ *    is unregistered by silc_protocol_unregister function.
+ *
+ ***/
 void silc_protocol_register(SilcProtocolType type,
                            SilcProtocolCallback callback);
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_unregister
+ *
+ * SYNOPSIS
+ *
+ *    void silc_protocol_unregister(SilcProtocolType type,
+ *                                  SilcProtocolCallback callback);
+ *
+ * DESCRIPTION
+ *
+ *    Unregisters protocol. The unregistering is done by both protocol type
+ *    and the protocol callback. Every registered protocol must be 
+ *    unregistered using this function.
+ *
+ ***/
 void silc_protocol_unregister(SilcProtocolType type,
                               SilcProtocolCallback callback);
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_alloc
+ *
+ * SYNOPSIS
+ *
+ *    void silc_protocol_alloc(SilcProtocolType type, 
+ *                             SilcProtocol *new_protocol,
+ *                             void *context, 
+ *                             SilcProtocolFinalCallback callback);
+ *
+ * DESCRIPTION
+ *
+ *    Allocates a new protocol. The new allocated and initialized 
+ *    protocol is returned to the `new_protocol' argument. The argument
+ *    context `context' is the context to be sent as argument for the
+ *    protocol callback function. The `callback' argument is the function
+ *    to be called after the protocol has finished.
+ *
+ ***/
 void silc_protocol_alloc(SilcProtocolType type, SilcProtocol *new_protocol,
                         void *context, SilcProtocolFinalCallback callback);
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_free
+ *
+ * SYNOPSIS
+ *
+ *    void silc_protocol_free(SilcProtocol protocol);
+ *
+ * DESCRIPTION
+ *
+ *    Frees the protocol context. This must be called for all allocated
+ *    protocols.
+ *
+ ***/
 void silc_protocol_free(SilcProtocol protocol);
-void silc_protocol_execute(void *qptr, int type,
-                          void *context, int fd,
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_execute
+ *
+ * SYNOPSIS
+ *
+ *    void silc_protocol_execute(SilcProtocol protocol, void *timeout_queue,
+ *                               long secs, long usecs);
+ *
+ * DESCRIPTION
+ *
+ *    Executes the protocol. This calls the state that has been set.
+ *    The state must be set before calling this function. This is then
+ *    also used to call always the next state after changing the state
+ *    of the protocol. The `timeout_queue' is a timeout task queue from
+ *    the application. It is passed to the protocol callback functions.
+ *    The `secs' and `usecs' are the timeout before the protocol is
+ *    executed. If both zero the protocol is executed immediately.
+ *
+ ***/
+void silc_protocol_execute(SilcProtocol protocol, void *timeout_queue,
                           long secs, long usecs);
-void silc_protocol_execute_final(void *qptr, int type, 
-                                void *context, int fd);
-void silc_protocol_cancel(void *qptr, void *context);
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_execute_final
+ *
+ * SYNOPSIS
+ *
+ *    void 
+ *    silc_protocol_execute_final(SilcProtocol protocol, void *timeout_queue);
+ *
+ * DESCRIPTION
+ *
+ *    Executes the final callback for the protocol. The `timeout_queue' is
+ *    a timeout task queue from the application. It is passed to the
+ *    protocol callback functions. The final callback is executed 
+ *    immediately.
+ *
+ ***/
+void silc_protocol_execute_final(SilcProtocol protocol, void *timeout_queue);
+
+/****f* silccore/SilcProtocolAPI/silc_protocol_cancel
+ *
+ * SYNOPSIS
+ *
+ *    void silc_protocol_cancel(SilcProtocol protocol, void *timeout_queue);
+ *
+ * DESCRIPTION
+ *
+ *    Cancels the execution of the next state of the protocol. This has
+ *    effect only if the silc_protocol_execute was called with timeout.
+ *    It is guaranteed that if the protocol is cancelled before the timeout
+ *    has elapsed the protocol callback won't be called.
+ *
+ ***/
+void silc_protocol_cancel(SilcProtocol protocol, void *timeout_queue);
 
 #endif