Moved the SilcClient and SilcClientConnection to the public
[silc.git] / lib / silcclient / idlist.c
index e827bebfa124a0295384c58df7b64b9b90a7027f..2e4c3707280994b557f3f63066d072e768453d7b 100644 (file)
@@ -50,7 +50,8 @@ SilcClientEntry *silc_client_get_clients_local(SilcClient client,
   bool found = FALSE;
 
   /* Find ID from cache */
-  if (!silc_idcache_find_by_name(conn->client_cache, (char *)nickname, &list))
+  if (!silc_idcache_find_by_name(conn->internal->client_cache,
+                                (char *)nickname, &list))
     return NULL;
 
   if (!silc_idcache_list_count(list)) {
@@ -158,6 +159,7 @@ void silc_client_get_clients(SilcClient client,
                             void *context)
 {
   GetClientInternal i;
+  int len;
   char *userhost;
 
   if (!nickname)
@@ -172,13 +174,13 @@ void silc_client_get_clients(SilcClient client,
   i->context = context;
 
   if (nickname && server) {
-    userhost = silc_calloc(strlen(nickname) + strlen(server) + 2,
-                          sizeof(*userhost));
-    strncat(userhost, nickname, strlen(nickname));
-    strncat(userhost, "@", 1);
-    strncat(userhost, server, strlen(server));
+    len = strlen(nickname) + strlen(server) + 3;
+    userhost = silc_calloc(len, sizeof(*userhost));
+    silc_strncat(userhost, len, nickname, strlen(nickname));
+    silc_strncat(userhost, len, "@", 1);
+    silc_strncat(userhost, len, server, strlen(server));
   } else {
-    userhost = strdup(nickname);
+    userhost = silc_memdup(nickname, strlen(nickname));
   }
 
   /* Register our own command reply for this command */
@@ -218,8 +220,8 @@ SilcClientEntry silc_idlist_get_client(SilcClient client,
   SILC_LOG_DEBUG(("Start"));
 
   /* Find ID from cache */
-  if (!silc_idcache_find_by_name(conn->client_cache, (char *)nickname, 
-                                &list)) {
+  if (!silc_idcache_find_by_name(conn->internal->client_cache,
+                                (char *)nickname, &list)) {
   identify:
 
     if (query) {
@@ -324,7 +326,7 @@ SILC_CLIENT_CMD_FUNC(get_clients_list_callback)
     }
 
     /* Get the client entry */
-    if (silc_idcache_find_by_id_one_ext(i->conn->client_cache, 
+    if (silc_idcache_find_by_id_one_ext(i->conn->internal->client_cache, 
                                        (void *)client_id, 
                                        NULL, NULL, 
                                        silc_hash_client_id_compare, NULL,
@@ -400,8 +402,8 @@ void silc_client_get_clients_by_list(SilcClient client,
 
     /* Check if we have this client cached already. */
     ret =
-      silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, 
-                                     NULL, NULL, 
+      silc_idcache_find_by_id_one_ext(conn->internal->client_cache,
+                                     (void *)client_id, NULL, NULL, 
                                      silc_hash_client_id_compare, NULL,
                                      &id_cache);
 
@@ -502,8 +504,8 @@ SilcClientEntry silc_client_get_client_by_id(SilcClient client,
                  silc_id_render(client_id, SILC_ID_CLIENT)));
 
   /* Find ID from cache */
-  if (!silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, 
-                                      NULL, NULL, 
+  if (!silc_idcache_find_by_id_one_ext(conn->internal->client_cache,
+                                      (void *)client_id, NULL, NULL, 
                                       silc_hash_client_id_compare, NULL,
                                       &id_cache))
     return NULL;
@@ -547,6 +549,7 @@ SILC_CLIENT_CMD_FUNC(get_client_by_id_callback)
 void silc_client_get_client_by_id_resolve(SilcClient client,
                                          SilcClientConnection conn,
                                          SilcClientID *client_id,
+                                         SilcBuffer attributes,
                                          SilcGetClientCallback completion,
                                          void *context)
 {
@@ -569,7 +572,9 @@ void silc_client_get_client_by_id_resolve(SilcClient client,
   /* Send the command */
   idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
   silc_client_command_send(client, conn, SILC_COMMAND_WHOIS, conn->cmd_ident,
-                          1, 4, idp->data, idp->len);
+                          2, 3, attributes ? attributes->data : NULL,
+                          attributes ? attributes->len : 0,
+                          4, idp->data, idp->len);
   silc_buffer_free(idp);
 
   /* Add pending callback */
@@ -618,7 +623,7 @@ silc_client_add_client(SilcClient client, SilcClientConnection conn,
   silc_client_nickname_format(client, conn, client_entry);
   
   /* Add client to cache, the non-formatted nickname is saved to cache */
-  if (!silc_idcache_add(conn->client_cache, nick, client_entry->id, 
+  if (!silc_idcache_add(conn->internal->client_cache, nick, client_entry->id, 
                        (void *)client_entry, 0, NULL)) {
     silc_free(client_entry->nickname);
     silc_free(client_entry->username);
@@ -646,9 +651,14 @@ void silc_client_update_client(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
-  if (!client_entry->username && username)
-    silc_parse_userfqdn(username, &client_entry->username, 
+  if ((!client_entry->username || !client_entry->hostname) && username) {
+    silc_free(client_entry->username);
+    silc_free(client_entry->hostname);
+    client_entry->username = NULL;
+    client_entry->hostname = NULL;
+    silc_parse_userfqdn(username, &client_entry->username,
                        &client_entry->hostname);
+  }
   if (!client_entry->realname && userinfo)
     client_entry->realname = strdup(userinfo);
   if (!client_entry->nickname && nickname) {
@@ -660,8 +670,8 @@ void silc_client_update_client(SilcClient client,
 
   if (nick) {
     /* Remove the old cache entry and create a new one */
-    silc_idcache_del_by_context(conn->client_cache, client_entry);
-    silc_idcache_add(conn->client_cache, nick, client_entry->id, 
+    silc_idcache_del_by_context(conn->internal->client_cache, client_entry);
+    silc_idcache_add(conn->internal->client_cache, nick, client_entry->id, 
                     client_entry, 0, NULL);
   }
 }
@@ -698,7 +708,8 @@ void silc_client_del_client_entry(SilcClient client,
 bool silc_client_del_client(SilcClient client, SilcClientConnection conn,
                            SilcClientEntry client_entry)
 {
-  bool ret = silc_idcache_del_by_context(conn->client_cache, client_entry);
+  bool ret = silc_idcache_del_by_context(conn->internal->client_cache,
+                                        client_entry);
 
   /* Remove from channels */
   silc_client_remove_from_channels(client, conn, client_entry);
@@ -729,7 +740,7 @@ SilcChannelEntry silc_client_add_channel(SilcClient client,
                                             NULL, NULL, NULL, TRUE);
 
   /* Put it to the ID cache */
-  if (!silc_idcache_add(conn->channel_cache, channel->channel_name, 
+  if (!silc_idcache_add(conn->internal->channel_cache, channel->channel_name, 
                        (void *)channel->id, (void *)channel, 0, NULL)) {
     silc_free(channel->channel_name);
     silc_hash_table_free(channel->user_list);
@@ -761,7 +772,8 @@ static void silc_client_del_channel_foreach(void *key, void *context,
 bool silc_client_del_channel(SilcClient client, SilcClientConnection conn,
                             SilcChannelEntry channel)
 {
-  bool ret = silc_idcache_del_by_context(conn->channel_cache, channel);
+  bool ret = silc_idcache_del_by_context(conn->internal->channel_cache,
+                                        channel);
 
   SILC_LOG_DEBUG(("Start"));
 
@@ -806,10 +818,11 @@ bool silc_client_replace_channel_id(SilcClient client,
   SILC_LOG_DEBUG(("New Channel ID id(%s)", 
                  silc_id_render(new_id, SILC_ID_CHANNEL)));
 
-  silc_idcache_del_by_id(conn->channel_cache, channel->id);
+  silc_idcache_del_by_id(conn->internal->channel_cache, channel->id);
   silc_free(channel->id);
   channel->id = new_id;
-  return silc_idcache_add(conn->channel_cache, channel->channel_name, 
+  return silc_idcache_add(conn->internal->channel_cache,
+                         channel->channel_name, 
                          (void *)channel->id, (void *)channel, 0, NULL);
 
 }
@@ -827,7 +840,7 @@ SilcChannelEntry silc_client_get_channel(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_name_one(conn->channel_cache, channel, 
+  if (!silc_idcache_find_by_name_one(conn->internal->channel_cache, channel, 
                                     &id_cache))
     return NULL;
 
@@ -851,7 +864,7 @@ SilcChannelEntry silc_client_get_channel_by_id(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_id_one(conn->channel_cache, channel_id, 
+  if (!silc_idcache_find_by_id_one(conn->internal->channel_cache, channel_id, 
                                   &id_cache))
     return NULL;
 
@@ -937,8 +950,8 @@ SilcServerEntry silc_client_get_server(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_name_one(conn->server_cache, server_name, 
-                                    &id_cache))
+  if (!silc_idcache_find_by_name_one(conn->internal->server_cache,
+                                    server_name, &id_cache))
     return NULL;
 
   entry = (SilcServerEntry)id_cache->context;
@@ -957,8 +970,8 @@ SilcServerEntry silc_client_get_server_by_id(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_id_one(conn->server_cache, (void *)server_id, 
-                                  &id_cache))
+  if (!silc_idcache_find_by_id_one(conn->internal->server_cache,
+                                  (void *)server_id, &id_cache))
     return NULL;
 
   entry = (SilcServerEntry)id_cache->context;
@@ -976,6 +989,8 @@ SilcServerEntry silc_client_add_server(SilcClient client,
 {
   SilcServerEntry server_entry;
 
+  SILC_LOG_DEBUG(("Start"));
+
   server_entry = silc_calloc(1, sizeof(*server_entry));
   if (!server_entry || !server_id)
     return NULL;
@@ -987,7 +1002,8 @@ SilcServerEntry silc_client_add_server(SilcClient client,
     server_entry->server_info = strdup(server_info);
 
   /* Add server to cache */
-  if (!silc_idcache_add(conn->server_cache, server_entry->server_name,
+  if (!silc_idcache_add(conn->internal->server_cache,
+                       server_entry->server_name,
                        server_entry->server_id, server_entry, 0, NULL)) {
     silc_free(server_entry->server_id);
     silc_free(server_entry->server_name);
@@ -1004,7 +1020,7 @@ SilcServerEntry silc_client_add_server(SilcClient client,
 bool silc_client_del_server(SilcClient client, SilcClientConnection conn,
                            SilcServerEntry server)
 {
-  bool ret = silc_idcache_del_by_context(conn->server_cache, server);
+  bool ret = silc_idcache_del_by_context(conn->internal->server_cache, server);
   silc_free(server->server_name);
   silc_free(server->server_info);
   silc_free(server->server_id);
@@ -1012,6 +1028,34 @@ bool silc_client_del_server(SilcClient client, SilcClientConnection conn,
   return ret;
 }
 
+/* Updates the `server_entry' with the new information sent as argument. */
+
+void silc_client_update_server(SilcClient client,
+                              SilcClientConnection conn,
+                              SilcServerEntry server_entry,
+                              const char *server_name,
+                              const char *server_info)
+{
+  SILC_LOG_DEBUG(("Start"));
+
+  if (server_name && (!server_entry->server_name ||
+                     strcmp(server_entry->server_name, server_name))) {
+
+    silc_idcache_del_by_context(conn->internal->server_cache, server_entry);
+    silc_free(server_entry->server_name);
+    server_entry->server_name = strdup(server_name);
+    silc_idcache_add(conn->internal->server_cache, server_entry->server_name,
+                    server_entry->server_id,
+                    server_entry, 0, NULL);
+  }
+
+  if (server_info && (!server_entry->server_info ||
+                     strcmp(server_entry->server_info, server_info))) {
+    silc_free(server_entry->server_info);
+    server_entry->server_info = strdup(server_info);
+  }
+}
+
 /* Formats the nickname of the client specified by the `client_entry'.
    If the format is specified by the application this will format the
    nickname and replace the old nickname in the client entry. If the
@@ -1080,6 +1124,9 @@ void silc_client_nickname_format(SilcClient client,
       if (!client_entry->hostname)
        break;
       len = strcspn(client_entry->hostname, ".");
+      i = strcspn(client_entry->hostname, "-");
+      if (i < len)
+        len = i;
       newnick = silc_realloc(newnick, sizeof(*newnick) * (off + len));
       memcpy(&newnick[off], client_entry->hostname, len);
       off += len;