updates.
[silc.git] / lib / silcclient / silcapi.h
index 157d658ad66cf6e5eb41fed9a4dd64e457bca4a8..e7d7b9cc25355e491e33f5053c5d803d25df0495 100644 (file)
@@ -2,7 +2,7 @@
 
   silcapi.h
   
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+  Author: Pekka Riikonen <priikone@silcnet.org>
   
   Copyright (C) 2000 - 2001 Pekka Riikonen
   
@@ -344,13 +344,41 @@ typedef struct {
      silc_client_perform_key_agreement). If TRUE is returned also the
      `completion' and `context' arguments must be set by the application. */
   int (*key_agreement)(SilcClient client, SilcClientConnection conn,
-                      SilcClientEntry client_entry, char *hostname,
-                      int port,
-                      SilcKeyAgreementCallback *completion,
+                      SilcClientEntry client_entry, const char *hostname,
+                      uint16 port, SilcKeyAgreementCallback *completion,
                       void **context);
+
+  /* Notifies application that file transfer protocol session is being
+     requested by the remote client indicated by the `client_entry' from
+     the `hostname' and `port'. The `session_id' is the file transfer
+     session and it can be used to either accept or reject the file
+     transfer request, by calling the silc_client_file_receive or
+     silc_client_file_close, respectively. */
+  void (*ftp)(SilcClient client, SilcClientConnection conn,
+             SilcClientEntry client_entry, uint32 session_id,
+             const char *hostname, uint16 port);
 } SilcClientOperations;
 /***/
 
+/****f* silcclient/SilcClientAPI/SilcNicknameFormatParse
+ *
+ * SYNOPSIS
+ *
+ *    typedef void (*SilcNicknameFormatParse)(const char *nickname,
+ *                                            char **ret_nickname);
+ *
+ * DESCRIPTION
+ *
+ *    A callback function provided by the application for the library in
+ *    SilcClientParams structure. This function parses the formatted
+ *    nickname string `nickname' and returns the true nickname to the
+ *    `ret_nickname' pointer. The library can call this function at
+ *    any time.
+ *
+ ***/
+typedef void (*SilcNicknameFormatParse)(const char *nickname,
+                                       char **ret_nickname);
+
 /****s* silcclient/SilcClientAPI/SilcClientParams
  *
  * NAME
@@ -381,6 +409,56 @@ typedef struct {
      in this time interval we'll assume the reply will not come at all. 
      If set to zero, the default value (2 seconds) will be used. */
   unsigned int connauth_request_secs;
+
+  /* Nickname format string. This can be used to order the client library
+     to save the nicknames in the library in a certain format. Since 
+     nicknames are not unique in SILC it is possible to have multiple same
+     nicknames. Using this format string it is possible to order the library
+     to separate the multiple same nicknames from each other. The format
+     types are defined below and they can appear in any order in the format
+     string. If this is NULL then default format is used which is the
+     default nickname without anything else. The string MUST be NULL
+     terminated.
+     
+     Following format types are available:
+     
+     %n  nickname      - the real nickname returned by the server (mandatory)
+     %h  hostname      - the stripped hostname of the client
+     %H  full hostname - the full hostname of the client
+     %s  server name   - the server name the client is connected
+     %S  full server   - the full server name the client is connected
+     %a  number        - ascending number in case there are several
+                         same nicknames (fe. nick@host and nick@host2)
+
+     Example format strings: "%n@%h%a"   (fe. nick@host, nick@host2)
+                             "%a!%n@%s"  (fe. nick@server, 2!nick@server)
+                            "%n@%H"     (fe. nick@host.domain.com)
+
+     By default this format is employed to the nicknames by the libary
+     only when there appears multiple same nicknames. If the library has
+     only one nickname cached the nickname is saved as is and without the
+     defined format. If you want always to save the nickname in the defined
+     format set the boolean field `nickname_force_format' to value TRUE.
+  */
+  char nickname_format[32];
+
+  /* If this is set to TRUE then the `nickname_format' is employed to all
+     saved nicknames even if there are no multiple same nicknames in the 
+     cache. By default this is FALSE, which means that the `nickname_format'
+     is employed only if the library will receive a nickname that is
+     already saved in the cache. It is recommended to leave this to FALSE
+     value. */
+  bool nickname_force_format;
+
+  /* A callback function provided by the application for the library to
+     parse the nickname from the formatted nickname string. Even though
+     the libary formats the nicknames the application knows generally the
+     format better so this function should be provided for the library
+     if the application sets the `nickname_format' field. The library
+     will call this to get the true nickname from the provided formatted
+     nickname string whenever it needs the true nickname. */
+  SilcNicknameFormatParse nickname_parse;
+
 } SilcClientParams;
 /***/
 
@@ -583,12 +661,13 @@ void silc_client_del_socket(SilcClient client, SilcSocketConnection sock);
  *    directly if application is performing its own connecting and does not
  *    use the connecting provided by this library. This function is normally
  *    used only if the application performed the connecting outside the
- *    library. The library however may use this internally.
+ *    library. The library however may use this internally. Returns FALSE
+ *    if the key exchange could not be started.
  *
  ***/
-int silc_client_start_key_exchange(SilcClient client,
-                                  SilcClientConnection conn,
-                                   int fd);
+bool silc_client_start_key_exchange(SilcClient client,
+                                   SilcClientConnection conn,
+                                   int fd);
 
 /****f* silcclient/SilcClientAPI/silc_client_close_connection
  *
@@ -718,8 +797,8 @@ typedef void (*SilcGetClientCallback)(SilcClient client,
  *
  *    void silc_client_get_clients(SilcClient client,
  *                                 SilcClientConnection conn,
- *                                 char *nickname,
- *                                 char *server,
+ *                                 const char *nickname,
+ *                                 const char *server,
  *                                 SilcGetClientCallback completion,
  *                                 void *context);
  *
@@ -740,8 +819,8 @@ typedef void (*SilcGetClientCallback)(SilcClient client,
  ***/
 void silc_client_get_clients(SilcClient client,
                             SilcClientConnection conn,
-                            char *nickname,
-                            char *server,
+                            const char *nickname,
+                            const char *server,
                             SilcGetClientCallback completion,
                             void *context);
 
@@ -751,21 +830,26 @@ void silc_client_get_clients(SilcClient client,
  *
  *    SilcClientEntry *silc_client_get_clients_local(SilcClient client,
  *                                                   SilcClientConnection conn,
- *                                                   char *nickname,
- *                                                   char *server,
+ *                                                   const char *nickname,
+ *                                                   const char *format,
  *                                                   uint32 *clients_count);
  *
  * DESCRIPTION
  *
  *    Same as silc_client_get_clients function but does not resolve anything
- *    from the server.  This checks local cache and returns all clients from
- *    the local cache. 
+ *    from the server. This checks local cache and returns all matching
+ *    clients from the local cache. If none was found this returns NULL.
+ *    The `nickname' is the real nickname of the client, and the `format'
+ *    is the formatted nickname to find exact match from multiple found
+ *    entries. The format must be same as given in the SilcClientParams
+ *    structure to the client library. If the `format' is NULL all found
+ *    clients by `nickname' are returned.
  *
  ***/
 SilcClientEntry *silc_client_get_clients_local(SilcClient client,
                                               SilcClientConnection conn,
-                                              char *nickname,
-                                              char *server,
+                                              const char *nickname,
+                                              const char *format,
                                               uint32 *clients_count);
 
 /****f* silcclient/SilcClientAPI/silc_client_get_clients_by_list
@@ -919,7 +1003,7 @@ SilcChannelEntry silc_client_get_channel_by_id(SilcClient client,
                                               SilcClientConnection conn,
                                               SilcChannelID *channel_id);
 
-/****f* silcclient/SilcClientAPI/silc_client_get_channel
+/****f* silcclient/SilcClientAPI/silc_client_get_channel_by_id_resolve
  *
  * SYNOPSIS
  *
@@ -1681,4 +1765,130 @@ silc_client_request_authentication_method(SilcClient client,
                                          SilcConnectionAuthRequest callback,
                                          void *context);
 
+typedef enum {
+  SILC_CLIENT_FILE_MONITOR_SEND,
+  SILC_CLIENT_FILE_MONITOR_RECEIVE,
+  SILC_CLIENT_FILE_MONITOR_GET,
+  SILC_CLIENT_FILE_MONITOR_PUT,
+  SILC_CLIENT_FILE_MONITOR_CLOSE,
+} SilcClientMonitorStatus;
+
+/****f* silcclient/SilcClientAPI/silc_client_file_receive
+ *
+ * SYNOPSIS
+ *
+ *    typedef void (*SilcClientFileMonitor)(SilcClient client,
+ *                                          SilcClientConnection conn,
+ *                                          SilcClientMonitorStatus status,
+ *                                          uint64 offset,
+ *                                          uint64 filesize,
+ *                                          SilcClientEntry client_entry,
+ *                                          uint32 session_id,
+ *                                          const char *filepath,
+ *                                          void *context);
+ *
+ * DESCRIPTION
+ *
+ *    Monitor callback that is called during the file transmission to
+ *    monitor the transmission process.  The `status' indicates the current
+ *    monitoring process.  The `offset' is the currently transmitted amount
+ *    of total `filesize'.  The `client_entry' indicates the remote client,
+ *    and the transmission session ID is the `session_id'.  The filename
+ *    being transmitted is indicated by the `filepath'.
+ *
+ ***/
+typedef void (*SilcClientFileMonitor)(SilcClient client,
+                                     SilcClientConnection conn,
+                                     SilcClientMonitorStatus status,
+                                     uint64 offset,
+                                     uint64 filesize,
+                                     SilcClientEntry client_entry,
+                                     uint32 session_id,
+                                     const char *filepath,
+                                     void *context);
+
+/****f* silcclient/SilcClientAPI/silc_client_file_send
+ *
+ * SYNOPSIS
+ *
+ *    void silc_client_file_send(SilcClient client,
+ *                               SilcClientConnection conn,
+ *                               SilcClientFileMonitor monitor,
+ *                               void *monitor_context,
+ *                               SilcClientEntry client_entry,
+ *                               const char *filepath);
+ *
+ * DESCRIPTION
+ *
+ *    Sends a file indicated by the `filepath' to the remote client 
+ *    indicated by the `client_entry'.  This will negotiate a secret key
+ *    with the remote client before actually starting the transmission of
+ *    the file.  The `monitor' callback will be called to monitor the
+ *    transmission of the file.
+ *
+ *    This returns a file session ID for the file transmission.  It can
+ *    be used to close the session (and abort the file transmission) by
+ *    calling the silc_client_file_close function.  The session ID is
+ *    also returned in the `monitor' callback. This returns 0 if the
+ *    file indicated by the `filepath' is being transmitted to the remote
+ *    client indicated by the `client_entry', already.
+ *
+ ***/
+uint32 silc_client_file_send(SilcClient client,
+                            SilcClientConnection conn,
+                            SilcClientFileMonitor monitor,
+                            void *monitor_context,
+                            SilcClientEntry client_entry,
+                            const char *filepath);
+
+/****f* silcclient/SilcClientAPI/silc_client_file_receive
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_client_file_receive(SilcClient client,
+ *                                  SilcClientConnection conn,
+ *                                  SilcClientFileMonitor monitor,
+ *                                  void *monitor_context,
+ *                                  SilcClientEntry client_entry,
+ *                                  uint32 session_id);
+ *
+ * DESCRIPTION
+ *
+ *    Receives a file from a client indicated by the `client_entry'.  The
+ *    `session_id' indicates the file transmission session and it has been
+ *    received in the `ftp' client operation function.  This will actually
+ *    perform the key agreement protocol with the remote client before
+ *    actually starting the file transmission.  The `monitor' callback
+ *    will be called to monitor the transmission.
+ *
+ ***/
+bool silc_client_file_receive(SilcClient client,
+                             SilcClientConnection conn,
+                             SilcClientFileMonitor monitor,
+                             void *monitor_context,
+                             SilcClientEntry client_entry,
+                             uint32 session_id);
+
+/****f* silcclient/SilcClientAPI/silc_client_file_close
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_client_file_close(SilcClient client,
+ *                                SilcClientConnection conn,
+ *                                uint32 session_id);
+ *
+ * DESCRIPTION
+ *
+ *    Closes file transmission session indicated by the `session_id'.
+ *    If file transmission is being conducted it will be aborted
+ *    automatically. This function is also used to close the session
+ *    after successful file transmission. This function can be used
+ *    also to reject incoming file transmission request.  Returns TRUE
+ *    if the session was closed and FALSE if such session does not exist.
+ *
+ ***/
+bool silc_client_file_close(SilcClient client,
+                           SilcClientConnection conn,
+                           uint32 session_id);
+
 #endif