Merge commit 'origin/silc.1.1.branch'
[silc.git] / lib / silcclient / client_internal.h
index 0acee44df7bbbdfe4c7593bebee14bbc3b15cd06..a297182024c827335a6caf89aa4e7ac4de015e22 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
@@ -29,6 +29,8 @@
 #include "client_channel.h"
 #include "client_notify.h"
 #include "client_keyagr.h"
+#include "client_ftp.h"
+#include "client_listener.h"
 
 /****************************** Definitions *********************************/
 
@@ -47,49 +49,7 @@ typedef struct {
   SilcSKE ske;
   SilcSKEVerifyCbCompletion completion;
   void *completion_context;
-} *VerifyKeyContext;
-
-/* Context to hold the connection authentication request callbacks that
-   will be called when the server has replied back to our request about
-   current authentication method in the session. */
-typedef struct {
-  SilcConnectionAuthRequest callback;
-  void *context;
-  SilcTask timeout;
-} *SilcClientConnAuthRequest;
-
-/* Generic rekey context for connections */
-typedef struct {
-  /* Current sending encryption key, provided for re-key. The `pfs'
-     is TRUE if the Perfect Forward Secrecy is performed in re-key. */
-  unsigned char *send_enc_key;
-  SilcUInt32 enc_key_len;
-  int ske_group;
-  SilcBool pfs;
-  SilcUInt32 timeout;
-  void *context;
-} *SilcClientRekey;
-
-/* Internal context for connection process. This is needed as we
-   doing asynchronous connecting. */
-typedef struct {
-  SilcClient client;
-  SilcClientConnection conn;
-  SilcTask task;
-  int sock;
-  char *host;
-  int port;
-  void *context;
-} SilcClientInternalConnectContext;
-
-/* Structure to hold away messages set by user. This is mainly created
-   for future extensions where away messages could be set according filters
-   such as nickname and hostname. For now only one away message can
-   be set in one connection. */
-struct SilcClientAwayStruct {
-  char *away;
-  struct SilcClientAwayStruct *next;
-};
+} *SilcVerifyKeyContext;
 
 /* Command and command reply context used to hold registered commands
    in the SILC client. */
@@ -138,26 +98,31 @@ typedef struct SilcClientCommandContextStruct {
 /* Internal context for the client->internal pointer in the SilcClient. */
 struct SilcClientInternalStruct {
   SilcFSMStruct fsm;                    /* Client's FSM */
-  SilcFSMSemaStruct wait_event;                 /* Event signaller */
+  SilcFSMEventStruct wait_event;        /* Event signaller */
   SilcClientOperations *ops;            /* Client operations */
   SilcClientParams *params;             /* Client parameters */
   SilcPacketEngine packet_engine;        /* Packet engine */
   SilcMutex lock;                       /* Client lock */
   SilcList commands;                    /* Registered commands */
+  SilcDList ftp_sessions;               /* FTP sessions */
   char *silc_client_version;            /* Version set by application */
+  SilcClientRunning running;            /* Running/Stopped callback */
+  void *running_context;                /* Context for runnign callback */
+  SilcAtomic32 conns;                   /* Number of connections in client */
+  SilcUInt16 next_session_id;           /* Next FTP session ID */
 
   /* Events */
-  unsigned int run_callback    : 1;     /* Call running callback */
+  unsigned int stop              : 1;   /* Stop client */
+  unsigned int run_callback      : 1;   /* Call running/stopped callback */
+  unsigned int connection_closed : 1;   /* A connection closed */
 };
 
 /* Internal context for conn->internal in SilcClientConnection. */
 struct SilcClientConnectionInternalStruct {
-  SilcIDCacheEntry local_entry;                 /* Local client cache entry */
   SilcClientConnectionParams params;    /* Connection parameters */
-
   SilcFSMStruct fsm;                    /* Connection FSM */
   SilcFSMThreadStruct event_thread;      /* FSM thread for events */
-  SilcFSMSemaStruct wait_event;                 /* Event signaller */
+  SilcFSMEventStruct wait_event;        /* Event signaller */
   SilcSchedule schedule;                /* Connection's scheduler */
   SilcMutex lock;                       /* Connection lock */
   SilcSKE ske;                          /* Key exchange protocol */
@@ -169,18 +134,26 @@ struct SilcClientConnectionInternalStruct {
   SilcBuffer local_idp;                         /* Local ID Payload */
   SilcBuffer remote_idp;                /* Remote ID Payload */
   SilcAsyncOperation op;                /* Protocols async operation */
+  SilcAsyncOperation cop;               /* Async operation for application */
+  SilcHashTable attrs;                  /* Configured user attributes */
+  SilcStream user_stream;               /* Low level stream in connecting */
+  char *disconnect_message;             /* Disconnection message */
+  char *away_message;                   /* Away message */
 
   SilcIDCache client_cache;             /* Client entry cache */
   SilcIDCache channel_cache;            /* Channel entry cache */
   SilcIDCache server_cache;             /* Server entry cache */
 
+  SilcUInt32 remote_version;            /* Remote SILC protocol version */
   SilcAtomic16 cmd_ident;               /* Current command identifier */
   SilcUInt8 retry_count;                /* Packet retry counter */
   SilcUInt8 retry_timer;                /* Packet retry timer */
+  SilcClientConnectionStatus status;    /* Connection callback status */
+  SilcStatus error;                     /* Connection callback error */
 
   /* Events */
   unsigned int connect            : 1;  /* Connect remote host */
-  unsigned int disconnected       : 1;  /* Disconnected by remote host */
+  unsigned int disconnected       : 1;  /* Disconnect remote connection */
   unsigned int key_exchange       : 1;   /* Start key exchange */
   unsigned int rekeying           : 1;   /* Start rekey */
 
@@ -188,14 +161,7 @@ struct SilcClientConnectionInternalStruct {
   unsigned int verbose            : 1;   /* Notify application */
   unsigned int registering        : 1;  /* Set when registering to network */
   unsigned int rekey_responder    : 1;   /* Set when rekeying as responder */
-
-  SilcClientAway *away;
-  SilcClientConnAuthRequest connauth;
-  SilcDList ftp_sessions;
-  SilcUInt32 next_session_id;
-  SilcClientFtpSession active_session;
-  SilcHashTable attrs;
-  SilcHashTable privmsg_wait;           /* Waited private messages */
+  unsigned int auth_request       : 1;   /* Set when requesting auth method */
 };
 
 SILC_FSM_STATE(silc_client_connection_st_run);
@@ -203,31 +169,26 @@ SILC_FSM_STATE(silc_client_connection_st_packet);
 SILC_FSM_STATE(silc_client_connection_st_close);
 SILC_FSM_STATE(silc_client_error);
 SILC_FSM_STATE(silc_client_disconnect);
+SILC_FSM_STATE(silc_client_st_stop);
 
 void silc_client_del_connection(SilcClient client, SilcClientConnection conn);
-SilcBool silc_client_del_client(SilcClient client, SilcClientConnection conn,
-                               SilcClientEntry client_entry);
-SilcBool silc_client_del_channel(SilcClient client, SilcClientConnection conn,
-                                SilcChannelEntry channel);
-SilcBool silc_client_del_server(SilcClient client, SilcClientConnection conn,
-                               SilcServerEntry server);
-SilcUInt16 silc_client_command_send_argv(SilcClient client,
-                                        SilcClientConnection conn,
-                                        SilcCommand command,
-                                        SilcClientCommandReply reply,
-                                        void *reply_context,
-                                        SilcUInt32 argc,
-                                        unsigned char **argv,
-                                        SilcUInt32 *argv_lens,
-                                        SilcUInt32 *argv_types);
-void silc_client_command_free(SilcClientCommandContext cmd);
 void silc_client_fsm_destructor(SilcFSM fsm, void *fsm_context,
                                void *destructor_context);
-
-void silc_client_ftp(SilcClient client, SilcClientConnection conn,
-                    SilcPacket packet);
-void silc_client_connection_auth_request(SilcClient client,
-                                        SilcClientConnection conn,
-                                        SilcPacket packet);
-
-#endif
+void silc_client_command_free(SilcClientCommandContext cmd);
+SilcClientConnection
+silc_client_add_connection(SilcClient client,
+                          SilcConnectionType conn_type,
+                          SilcBool connect,
+                          SilcClientConnectionParams *params,
+                          SilcPublicKey public_key,
+                          SilcPrivateKey private_key,
+                          char *remote_host, int port,
+                          SilcClientConnectCallback callback,
+                          void *context);
+void silc_client_attributes_process(SilcClient client,
+                                   SilcClientConnection conn,
+                                   SilcDList attrs,
+                                   SilcPKCSSignCb sign_cb,
+                                   void *context);
+
+#endif /* CLIENT_INTERNAL_H */