UTF-8 text message support for actions and notices.
authorPekka Riikonen <priikone@silcnet.org>
Wed, 1 Oct 2003 17:33:28 +0000 (17:33 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 1 Oct 2003 17:33:28 +0000 (17:33 +0000)
Crashbug fix with channel message handling if libary returns
incomplete SilcClientEntry.

apps/irssi/src/silc/core/client_ops.c
apps/irssi/src/silc/core/silc-channels.c
apps/irssi/src/silc/core/silc-nicklist.c

index b8f062aa044182ce490122a562adde5f34a0e2aa..476fbeda80d86fcaf14452563f78aa176807ef19 100644 (file)
@@ -422,13 +422,47 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn,
   /* FIXME: replace those printformat calls with signals and add signature
             information to them (if present) */
   if (flags & SILC_MESSAGE_FLAG_ACTION)
-    printformat_module("fe-common/silc", server, channel->channel_name,
-                      MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_ACTION,
-                       nick == NULL ? "[<unknown>]" : nick->nick, message);
+    if(flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) {
+      char tmp[256], *cp, *dm = NULL;
+      memset(tmp, 0, sizeof(tmp));
+      cp = tmp;
+      if(message_len > sizeof(tmp) - 1) {
+        dm = silc_calloc(message_len + 1, sizeof(*dm));
+        cp = dm;
+      }
+      silc_utf8_decode(message, message_len, SILC_STRING_LANGUAGE,
+                       cp, message_len);
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                         MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_ACTION,
+                         nick == NULL ? "[<unknown>]" : nick->nick, cp);
+      silc_free(dm);
+    } else {
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                         MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_ACTION,
+                         nick == NULL ? "[<unknown>]" : nick->nick,
+                         message);
+    }
   else if (flags & SILC_MESSAGE_FLAG_NOTICE)
-    printformat_module("fe-common/silc", server, channel->channel_name,
-                      MSGLEVEL_NOTICES, SILCTXT_CHANNEL_NOTICE,
-                       nick == NULL ? "[<unknown>]" : nick->nick, message);
+    if(flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) {
+      char tmp[256], *cp, *dm = NULL;
+      memset(tmp, 0, sizeof(tmp));
+      cp = tmp;
+      if(message_len > sizeof(tmp) - 1) {
+        dm = silc_calloc(message_len + 1, sizeof(*dm));
+        cp = dm;
+      }
+      silc_utf8_decode(message, message_len, SILC_STRING_LANGUAGE,
+                       cp, message_len);
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                         MSGLEVEL_NOTICES, SILCTXT_CHANNEL_NOTICE,
+                         nick == NULL ? "[<unknown>]" : nick->nick, cp);
+      silc_free(dm);
+    } else {
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                         MSGLEVEL_NOTICES, SILCTXT_CHANNEL_NOTICE,
+                         nick == NULL ? "[<unknown>]" : nick->nick,
+                         message);
+    }
   else {
     if (flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) {
       char tmp[256], *cp, *dm = NULL;
@@ -519,7 +553,8 @@ void silc_private_message(SilcClient client, SilcClientConnection conn,
       message = (const unsigned char *)data;
     } else {
       silc_emit_mime_sig(server, NULL, data, data_len,
-                       enc, type, sender->nickname);
+                       enc, type, sender->nickname ? sender->nickname :
+                                  "[<unknown>]");
       message = NULL;
     }
   }
index 72cca3a3a90bf1d02f305b2191f1ce7d82960650..2ebdcc7ab42de108834ae6b9405a080ad8b704ba 100644 (file)
@@ -1030,7 +1030,7 @@ void silc_channels_init(void)
   command_bind_silc("notice", MODULE_NAME, (SIGNAL_FUNC) command_notice);
   command_bind_silc("away", MODULE_NAME, (SIGNAL_FUNC) command_away);
   command_bind_silc("key", MODULE_NAME, (SIGNAL_FUNC) command_key);
-  command_bind_silc("listkeys", MODULE_NAME, (SIGNAL_FUNC) command_listkeys);
+/*  command_bind_silc("listkeys", MODULE_NAME, (SIGNAL_FUNC) command_listkeys); */
 
   silc_nicklist_init();
 }
@@ -1049,7 +1049,7 @@ void silc_channels_deinit(void)
   command_unbind("notice", (SIGNAL_FUNC) command_notice);
   command_unbind("away", (SIGNAL_FUNC) command_away);
   command_unbind("key", (SIGNAL_FUNC) command_key);
-  command_unbind("listkeys", (SIGNAL_FUNC) command_listkeys);
+/*  command_unbind("listkeys", (SIGNAL_FUNC) command_listkeys); */
 
   silc_nicklist_deinit();
 }
index a8c302bca499c9fb424caced1af589bcdd811842..c3419f98730df0b4d717329731b0f0ad9650f807 100644 (file)
@@ -33,6 +33,8 @@ SILC_NICK_REC *silc_nicklist_insert(SILC_CHANNEL_REC *channel,
 
   g_return_val_if_fail(IS_SILC_CHANNEL(channel), NULL);
   g_return_val_if_fail(user != NULL, NULL);
+  g_return_val_if_fail(user->client != NULL, NULL);
+  g_return_val_if_fail(user->client->nickname != NULL, NULL);
 
   rec = g_new0(SILC_NICK_REC, 1);
   rec->nick = g_strdup(user->client->nickname);