X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_notify.c;h=50aebb3ca84f19db80c87459f2450b7237abd492;hb=ed3133837d3466b1d9eb15278677d82971bbd35f;hp=1e7778583f6e864b8ab307ff57f2484d4bf980c9;hpb=275e2f50c1cbe4a0eec582cf490ef485049541af;p=silc.git diff --git a/lib/silcclient/client_notify.c b/lib/silcclient/client_notify.c index 1e777858..50aebb3c 100644 --- a/lib/silcclient/client_notify.c +++ b/lib/silcclient/client_notify.c @@ -456,7 +456,7 @@ void silc_client_notify_by_server(SilcClient client, goto out; /* Ignore my ID */ - if (SILC_ID_CLIENT_COMPARE(client_id, conn->local_id)) + if (conn->local_id && SILC_ID_CLIENT_COMPARE(client_id, conn->local_id)) break; /* Find old Client entry */ @@ -482,6 +482,31 @@ void silc_client_notify_by_server(SilcClient client, tmp = silc_argument_get_arg_type(args, 3, NULL); if (tmp) { /* Protocol version 1.1 */ + char *tmp_nick; + + /* Check whether nickname changed at all. It is possible that nick + change notify is received but nickname didn't changed, only the + ID changes. */ + if (client->internal->params->nickname_parse) + client->internal->params->nickname_parse(client_entry->nickname, + &tmp_nick); + else + tmp_nick = strdup(tmp); + + if (!strcmp(tmp, tmp_nick)) { + /* Nickname didn't change. Update only the ID */ + silc_idcache_del_by_context(conn->client_cache, client_entry); + silc_free(client_entry->id); + client_entry->id = silc_id_dup(client_id, SILC_ID_CLIENT); + silc_idcache_add(conn->client_cache, strdup(tmp), + client_entry->id, client_entry, 0, NULL); + + /* Notify application */ + client->internal->ops->notify(client, conn, type, + client_entry, client_entry); + break; + } + silc_free(tmp_nick); /* Create new client entry, and save all old information with the new nickname and client ID */