Merge branch 'topic/mm-fixes' of git://208.110.73.182/silc into silc.1.1.branch
[silc.git] / lib / silcclient / client.h
index 0fc86888d79db4e36a85196b5f37c1e58ce6401f..d66808dcef168e06473e7168104b18f97430ce43 100644 (file)
@@ -1,10 +1,10 @@
 /*
 
-  client.h 
+  client.h
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2002 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
 #ifndef CLIENT_H
 #define CLIENT_H
 
+#ifndef SILCCLIENT_H
+#error "Do not include this header directly"
+#endif
+
 /* Forward declarations */
 typedef struct SilcClientStruct *SilcClient;
 typedef struct SilcClientConnectionStruct *SilcClientConnection;
-typedef struct SilcClientPingStruct SilcClientPing;
-typedef struct SilcClientAwayStruct SilcClientAway;
-typedef struct SilcClientKeyAgreementStruct *SilcClientKeyAgreement;
-typedef struct SilcClientFtpSessionStruct *SilcClientFtpSession;
 typedef struct SilcClientEntryStruct *SilcClientEntry;
 typedef struct SilcChannelEntryStruct *SilcChannelEntry;
 typedef struct SilcServerEntryStruct *SilcServerEntry;
-typedef struct SilcClientCommandStruct *SilcClientCommand;
-typedef struct SilcClientCommandContextStruct *SilcClientCommandContext;
+
+typedef struct SilcClientKeyAgreementStruct *SilcClientKeyAgreement;
+typedef struct SilcClientFtpSessionStruct *SilcClientFtpSession;
 typedef struct SilcClientCommandReplyContextStruct
                                            *SilcClientCommandReplyContext;
 typedef struct SilcChannelUserStruct *SilcChannelUser;
 typedef struct SilcClientInternalStruct *SilcClientInternal;
-typedef struct SilcClientConnectionInternalStruct 
-                                          *SilcClientConnectionInternal;
-  
-#endif
+typedef struct SilcClientConnectionInternalStruct
+     *SilcClientConnectionInternal;
+typedef struct SilcChannelPrivateKeyStruct *SilcChannelPrivateKey;
+
+/* Internal client entry context */
+typedef struct SilcClientEntryInternalStruct {
+  void *prv_waiter;            /* Private message packet waiter */
+  SilcRwLock lock;             /* Read/write lock */
+  SilcCipher send_key;         /* Private message key for sending */
+  SilcCipher receive_key;      /* Private message key for receiving */
+  SilcHmac hmac_send;          /* Private mesage key HMAC for sending */
+  SilcHmac hmac_receive;       /* Private mesage key HMAC for receiving */
+  unsigned char *key;          /* Valid if application provided the key */
+  SilcUInt32 key_len;          /* Key data length */
+  SilcClientKeyAgreement ke;   /* Current key agreement context or NULL */
+
+  SilcAtomic32 refcnt;         /* Reference counter */
+  SilcAtomic32 deleted;                /* Flag indicating whether the client object is
+                                  already scheduled for deletion */
+  SilcUInt16 resolve_cmd_ident;        /* Command identifier when resolving */
+
+  /* Flags */
+  unsigned int valid       : 1;        /* FALSE if this entry is not valid.  Entry
+                                  without nickname is not valid. */
+  unsigned int generated   : 1; /* TRUE if library generated `key' */
+  unsigned int prv_resp    : 1; /* TRUE if we are responder when using
+                                  private message keys. */
+} SilcClientEntryInternal;
+
+/* Internal channel entry context */
+typedef struct SilcChannelEntryInternalStruct {
+  SilcRwLock lock;                          /* Read/write lock */
+
+  /* SilcChannelEntry status information */
+  SilcDList old_channel_keys;
+  SilcDList old_hmacs;
+
+  /* Channel private keys */
+  SilcDList private_keys;                   /* List of private keys or NULL */
+  SilcChannelPrivateKey curr_key;           /* Current private key */
+
+  /* Channel keys */
+  SilcCipher send_key;                       /* The channel key */
+  SilcCipher receive_key;                    /* The channel key */
+  SilcHmac hmac;                            /* Current HMAC */
+  unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]; /* Current IV */
+
+  SilcAtomic32 refcnt;                      /* Reference counter */
+  SilcAtomic32 deleted;                      /* Flag indicating whether the
+                                               channel object is already
+                                               scheduled for deletion */
+  SilcUInt16 resolve_cmd_ident;                     /* Channel information resolving
+                                               identifier. This is used when
+                                               resolving users, and other
+                                               stuff that relates to the
+                                               channel. Not used for the
+                                               channel resolving itself. */
+} SilcChannelEntryInternal;
+
+/* Internal server entry context */
+typedef struct SilcServerEntryInternalStruct {
+  SilcRwLock lock;                          /* Read/write lock */
+  SilcUInt16 resolve_cmd_ident;                     /* Resolving identifier */
+  SilcAtomic32 refcnt;                      /* Reference counter */
+} SilcServerEntryInternal;
+
+#endif /* CLIENT_H */