updates.
[silc.git] / lib / silcclient / client.h
index d8bee7ad186bcf52747812ae46bb0382767be9d6..2b40557b91296c9053ec432884e15ca7e7e53cc0 100644 (file)
@@ -1,6 +1,6 @@
 /*
 
-  client.h
+  client.h 
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
@@ -8,9 +8,8 @@
 
   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.
-  
+  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
@@ -23,6 +22,7 @@
 
 /* Forward declarations */
 typedef struct SilcClientStruct *SilcClient;
+typedef struct SilcClientInternalStruct *SilcClientInternal;
 typedef struct SilcClientConnectionStruct *SilcClientConnection;
 typedef struct SilcClientPingStruct SilcClientPing;
 typedef struct SilcClientAwayStruct SilcClientAway;
@@ -151,174 +151,28 @@ struct SilcClientConnectionStruct {
 
 /* Main client structure. */
 struct SilcClientStruct {
-  /*
-   * Public data. All the following pointers must be set by the allocator
-   * of this structure.
-   */
-
-  /* Users's username, hostname and realname. */
-  char *username;
-  char *hostname;
-  char *realname;
-
-  /* Private and public key of the user. */
-  SilcPKCS pkcs;
-  SilcPublicKey public_key;
-  SilcPrivateKey private_key;
-
-  /* Application specific user data pointer. Client library does not
-     touch this. */
-  void *application;
-
-  /*
-   * Private data. Following pointers are used internally by the client
-   * library and should be considered read-only fields.
-   */
-
-  /* All client operations that are implemented in the application. */
-  SilcClientOperations *ops;
-
-  /* Client Parameters */
-  SilcClientParams *params;
-
-  /* SILC client scheduler */
-  SilcSchedule schedule;
+  char *username;              /* Username, must be set by application */
+  char *hostname;              /* hostname, must be set by application */
+  char *realname;              /* Real name, must be set be application */
 
-  /* Table of connections in client. All the connection data is saved here. */
-  SilcClientConnection *conns;
-  uint32 conns_count;
+  SilcPublicKey public_key;    /* Public key of user, set by application */
+  SilcPrivateKey private_key;  /* Private key of user, set by application */
+  SilcPKCS pkcs;               /* PKCS allocated by application */
 
-  /* Table of listenning sockets in client.  Client can have listeners
-     (like key agreement protocol server) and those sockets are saved here.
-     This table is checked always if the connection object cannot be found
-     from the `conns' table. */
-  SilcSocketConnection *sockets;
-  uint32 sockets_count;
-
-  /* Generic cipher and hash objects. These can be used and referenced
-     by the application as well. */
-  SilcCipher none_cipher;
-  SilcHash md5hash;
-  SilcHash sha1hash;
-  SilcHmac md5hmac;
-  SilcHmac sha1hmac;
+  SilcSchedule schedule;       /* Scheduler, automatically allocated by
+                                  the client library. */
 
   /* Random Number Generator. Application should use this as its primary
      random number generator. */
   SilcRng rng;
 
-  /* Client version. Used to compare to remote host's version strings. */
-  char *silc_client_version;
+  /* Application specific user data pointer. Client library does not
+     touch this. This the context sent as argument to silc_client_alloc. */
+  void *application;
+
+  /* Internal data for client library. Application cannot access this
+     data at all. */
+  SilcClientInternal internal;
 };
 
-/* Macros */
-
-/* Registers generic task for file descriptor for reading from network and
-   writing to network. As being generic task the actual task is allocated 
-   only once and after that the same task applies to all registered fd's. */
-#define SILC_CLIENT_REGISTER_CONNECTION_FOR_IO(fd)     \
-do {                                                   \
-  silc_schedule_task_add(client->schedule, (fd),       \
-                        silc_client_packet_process,    \
-                        context, 0, 0,                 \
-                        SILC_TASK_GENERIC,             \
-                        SILC_TASK_PRI_NORMAL);         \
-} while(0)
-
-#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd)            \
-do {                                                           \
-  silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ);      \
-} while(0)
-     
-#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd)           \
-do {                                                           \
-  silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ |     \
-                                         SILC_TASK_WRITE));    \
-} while(0)
-
-/* Finds socket connection object by file descriptor */
-#define SILC_CLIENT_GET_SOCK(__x, __fd, __sock)                \
-do {                                                   \
-  int __i;                                             \
-                                                       \
-  for (__i = 0; __i < (__x)->conns_count; __i++)       \
-    if ((__x)->conns[__i] &&                           \
-       (__x)->conns[__i]->sock->sock == (__fd))        \
-      break;                                           \
-                                                       \
-  if (__i >= (__x)->conns_count) {                     \
-    (__sock) = NULL;                                   \
-    for (__i = 0; __i < (__x)->sockets_count; __i++)   \
-      if ((__x)->sockets[__i] &&                       \
-         (__x)->sockets[__i]->sock == (__fd))          \
-        (__sock) = (__x)->sockets[__i];                        \
-  } else                                               \
-    (__sock) = (__x)->conns[__i]->sock;                        \
-} while(0)
-
-/* Check whether rekey protocol is active */
-#define SILC_CLIENT_IS_REKEY(sock)                                     \
-  (sock->protocol && sock->protocol->protocol &&                       \
-   sock->protocol->protocol->type == SILC_PROTOCOL_CLIENT_REKEY)
-
-/* Prototypes (some of the prototypes are defined in the silcapi.h) */
-
-void silc_client_packet_send(SilcClient client, 
-                            SilcSocketConnection sock,
-                            SilcPacketType type, 
-                            void *dst_id,
-                            SilcIdType dst_id_type,
-                            SilcCipher cipher,
-                            SilcHmac hmac,
-                            unsigned char *data, 
-                            uint32 data_len, 
-                            int force_send);
-void silc_client_disconnected_by_server(SilcClient client,
-                                       SilcSocketConnection sock,
-                                       SilcBuffer message);
-void silc_client_error_by_server(SilcClient client,
-                                SilcSocketConnection sock,
-                                SilcBuffer message);
-void silc_client_receive_new_id(SilcClient client,
-                               SilcSocketConnection sock,
-                               SilcIDPayload idp);
-SilcChannelEntry silc_client_new_channel_id(SilcClient client,
-                                           SilcSocketConnection sock,
-                                           char *channel_name,
-                                           uint32 mode, 
-                                           SilcIDPayload idp);
-void silc_client_save_channel_key(SilcClientConnection conn,
-                                 SilcBuffer key_payload, 
-                                 SilcChannelEntry channel);
-void silc_client_receive_channel_key(SilcClient client,
-                                    SilcSocketConnection sock,
-                                    SilcBuffer packet);
-void silc_client_channel_message(SilcClient client, 
-                                SilcSocketConnection sock, 
-                                SilcPacketContext *packet);
-void silc_client_remove_from_channels(SilcClient client,
-                                     SilcClientConnection conn,
-                                     SilcClientEntry client_entry);
-void silc_client_replace_from_channels(SilcClient client, 
-                                      SilcClientConnection conn,
-                                      SilcClientEntry old,
-                                      SilcClientEntry newclient);
-void silc_client_process_failure(SilcClient client,
-                                SilcSocketConnection sock,
-                                SilcPacketContext *packet);
-void silc_client_key_agreement(SilcClient client,
-                              SilcSocketConnection sock,
-                              SilcPacketContext *packet);
-void silc_client_notify_by_server(SilcClient client,
-                                 SilcSocketConnection sock,
-                                 SilcPacketContext *packet);
-void silc_client_private_message(SilcClient client, 
-                                SilcSocketConnection sock, 
-                                SilcPacketContext *packet);
-void silc_client_connection_auth_request(SilcClient client,
-                                        SilcSocketConnection sock,
-                                        SilcPacketContext *packet);
-void silc_client_ftp(SilcClient client,
-                    SilcSocketConnection sock,
-                    SilcPacketContext *packet);
 #endif