+Sun Jun 16 11:49:45 EEST 2002 Pekka Riikonen <priikone@silcnet.org>
+
+ * Added SILC_MESSAGE_FLAG_UTF8 to the protocol specs and the
+ core library, and implemented it. All textual messages SHOULD
+ use this flag and the message MUST be UTF-8 encoded.
+ All text messages sent by Irssi SILC client are now UTF-8
+ encoded (regardless whether the terminal supports UTF-8 or not).
+ Affected files are lib/silccore/silcchannel.h,
+ irssi/src/silc/core/silc-servers.c, silc-channels.c and
+ client_ops.c.
+
Sat Jun 15 18:23:39 EEST 2002 Pekka Riikonen <priikone@silcnet.org>
* Added lots of new statistics updating that was missing from
TODO/bugs in Irssi SILC client
==============================
+ o Testing
+
+
TODO/bugs In SILC Client Library
================================
printformat_module("fe-common/silc", server, channel->channel_name,
MSGLEVEL_NOTICES, SILCTXT_CHANNEL_NOTICE,
nick == NULL ? "[<unknown>]" : nick->nick, message);
- else
+ else {
+ 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_ASCII,
+ cp, message_len);
+ signal_emit("message public", 6, server, cp,
+ nick == NULL ? "[<unknown>]" : nick->nick,
+ nick == NULL ? "" : nick->host == NULL ? "" : nick->host,
+ chanrec->name, nick);
+ silc_free(dm);
+ return;
+ }
+
signal_emit("message public", 6, server, message,
nick == NULL ? "[<unknown>]" : nick->nick,
nick == NULL ? "" : nick->host == NULL ? "" : nick->host,
chanrec->name, nick);
+ }
}
/* Private message to the client. The `sender' is the nickname of the
if (!message)
return;
+ 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_ASCII,
+ cp, message_len);
+ signal_emit("message private", 4, server, cp,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ sender->username ? userhost : NULL);
+ silc_free(dm);
+ return;
+ }
+
signal_emit("message private", 4, server, message,
sender->nickname ? sender->nickname : "[<unknown>]",
sender->username ? userhost : NULL);
SILC_CHANNEL_REC *chanrec;
char *tmpcmd = "ME", *tmp;
SilcUInt32 argc = 0;
+ unsigned char *message = NULL;
unsigned char **argv;
SilcUInt32 *argv_lens, *argv_types;
int i;
if (chanrec == NULL)
cmd_return_error(CMDERR_CHAN_NOT_FOUND);
+ if (!silc_term_utf8()) {
+ int len = silc_utf8_encoded_len(argv[1], argv_lens[1], SILC_STRING_ASCII);
+ message = silc_calloc(len + 1, sizeof(*message));
+ g_return_if_fail(message != NULL);
+ silc_utf8_encode(argv[1], argv_lens[1], SILC_STRING_ASCII, message, len);
+ }
+
/* Send the action message */
silc_client_send_channel_message(silc_client, server->conn,
chanrec->entry, NULL,
- SILC_MESSAGE_FLAG_ACTION,
- argv[1], argv_lens[1], TRUE);
+ SILC_MESSAGE_FLAG_ACTION |
+ SILC_MESSAGE_FLAG_UTF8,
+ message ? message : argv[1],
+ message ? strlen(message) : argv_lens[1],
+ TRUE);
printformat_module("fe-common/silc", server, chanrec->entry->channel_name,
MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_OWNACTION,
silc_free(argv[i]);
silc_free(argv_lens);
silc_free(argv_types);
+ silc_free(message);
}
/* ACTION local command. Same as ME but takes the channel as mandatory
SILC_CHANNEL_REC *chanrec;
char *tmpcmd = "ME", *tmp;
SilcUInt32 argc = 0;
+ unsigned char *message = NULL;
unsigned char **argv;
SilcUInt32 *argv_lens, *argv_types;
int i;
if (chanrec == NULL)
cmd_return_error(CMDERR_CHAN_NOT_FOUND);
+ if (!silc_term_utf8()) {
+ int len = silc_utf8_encoded_len(argv[2], argv_lens[2], SILC_STRING_ASCII);
+ message = silc_calloc(len + 1, sizeof(*message));
+ g_return_if_fail(message != NULL);
+ silc_utf8_encode(argv[2], argv_lens[2], SILC_STRING_ASCII, message, len);
+ }
+
/* Send the action message */
silc_client_send_channel_message(silc_client, server->conn,
chanrec->entry, NULL,
- SILC_MESSAGE_FLAG_ACTION,
- argv[2], argv_lens[2], TRUE);
+ SILC_MESSAGE_FLAG_ACTION |
+ SILC_MESSAGE_FLAG_UTF8,
+ message ? message : argv[2],
+ message ? strlen(message) : argv_lens[2],
+ TRUE);
printformat_module("fe-common/silc", server, chanrec->entry->channel_name,
MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_OWNACTION,
silc_free(argv[i]);
silc_free(argv_lens);
silc_free(argv_types);
+ silc_free(message);
}
/* NOTICE local command. */
SILC_CHANNEL_REC *chanrec;
char *tmpcmd = "ME", *tmp;
SilcUInt32 argc = 0;
+ unsigned char *message = NULL;
unsigned char **argv;
SilcUInt32 *argv_lens, *argv_types;
int i;
if (chanrec == NULL)
cmd_return_error(CMDERR_CHAN_NOT_FOUND);
+ if (!silc_term_utf8()) {
+ int len = silc_utf8_encoded_len(argv[1], argv_lens[1], SILC_STRING_ASCII);
+ message = silc_calloc(len + 1, sizeof(*message));
+ g_return_if_fail(message != NULL);
+ silc_utf8_encode(argv[1], argv_lens[1], SILC_STRING_ASCII, message, len);
+ }
+
/* Send the action message */
silc_client_send_channel_message(silc_client, server->conn,
chanrec->entry, NULL,
- SILC_MESSAGE_FLAG_NOTICE,
- argv[1], argv_lens[1], TRUE);
+ SILC_MESSAGE_FLAG_NOTICE |
+ SILC_MESSAGE_FLAG_UTF8,
+ message ? message : argv[1],
+ message ? strlen(message) : argv_lens[1],
+ TRUE);
printformat_module("fe-common/silc", server, chanrec->entry->channel_name,
MSGLEVEL_NOTICES, SILCTXT_CHANNEL_OWNNOTICE,
silc_free(argv[i]);
silc_free(argv_lens);
silc_free(argv_types);
+ silc_free(message);
}
/* AWAY local command. Sends UMODE command that sets the SILC_UMODE_GONE
}
silc_client_send_channel_message(silc_client, server->conn, rec->entry,
- NULL, 0, msg, strlen(msg), TRUE);
+ NULL, SILC_MESSAGE_FLAG_UTF8,
+ msg, strlen(msg), TRUE);
}
typedef struct {
}
/* Send the private message */
- silc_client_send_private_message(client, conn, target, 0,
+ silc_client_send_private_message(client, conn, target,
+ SILC_MESSAGE_FLAG_UTF8,
rec->msg, strlen(rec->msg),
TRUE);
}
/* Send the private message directly */
silc_free(nickname);
silc_client_send_private_message(silc_client, server->conn,
- clients[0], 0, msg, strlen(msg), TRUE);
+ clients[0], SILC_MESSAGE_FLAG_UTF8,
+ msg, strlen(msg), TRUE);
}
static int isnickflag_func(char flag)
static void send_message(SILC_SERVER_REC *server, char *target,
char *msg, int target_type)
{
+ char *message = NULL;
+ int len;
+
g_return_if_fail(server != NULL);
g_return_if_fail(target != NULL);
g_return_if_fail(msg != NULL);
+ if (!silc_term_utf8()) {
+ len = silc_utf8_encoded_len(msg, strlen(msg), SILC_STRING_ASCII);
+ message = silc_calloc(len + 1, sizeof(*message));
+ g_return_if_fail(message != NULL);
+ silc_utf8_encode(msg, strlen(msg), SILC_STRING_ASCII, message, len);
+ }
+
if (target_type == SEND_TARGET_CHANNEL)
- silc_send_channel(server, target, msg);
+ silc_send_channel(server, target, message ? message : msg);
else
- silc_send_msg(server, target, msg);
+ silc_send_msg(server, target, message ? message : msg);
+
+ silc_free(message);
}
static void sig_connected(SILC_SERVER_REC *server)
}
}
-SILC_SERVER_REC *silc_server_connect(SILC_SERVER_CONNECT_REC *conn)
-{
+SILC_SERVER_REC *silc_server_connect(SILC_SERVER_CONNECT_REC *conn){
SILC_SERVER_REC *server;
g_return_val_if_fail(IS_SILC_SERVER_CONNECT(conn), NULL);
}
}
}
+
+bool silc_term_utf8(void)
+{
+ const char *str;
+ str = settings_get_str("term_type");
+ if (str)
+ if (g_strcasecmp(str, "utf-8") == 0)
+ return TRUE;
+ return FALSE;
+}
void silc_server_deinit(void);
void silc_server_free_ftp(SILC_SERVER_REC *server,
SilcClientEntry client_entry);
+bool silc_term_utf8(void);
#endif
document should define how this flag is interpreted
and define any associated payloads.
- 0x0100 - 0x0800 RESERVED
+ 0x0100 SILC_MESSAGE_FLAG_UTF8
+
+ This flag indicates that the message is UTF-8 encoded
+ textual message. When sending text messages this
+ flag SHOULD be used. When this flag is used the text
+ sent as message MUST be UTF-8 encoded.
+
+ 0x0200 - 0x0800 RESERVED
Reserved for future flags
typedef SilcUInt16 SilcMessageFlags;
/* The message flags (shared by both channel and private messages) */
-#define SILC_MESSAGE_FLAG_NONE 0x0000
-#define SILC_MESSAGE_FLAG_AUTOREPLY 0x0001
-#define SILC_MESSAGE_FLAG_NOREPLY 0x0002
-#define SILC_MESSAGE_FLAG_ACTION 0x0004
-#define SILC_MESSAGE_FLAG_NOTICE 0x0008
-#define SILC_MESSAGE_FLAG_REQUEST 0x0010
-#define SILC_MESSAGE_FLAG_SIGNED 0x0020
-#define SILC_MESSAGE_FLAG_REPLY 0x0040
-#define SILC_MESSAGE_FLAG_DATA 0x0080
-#define SILC_MESSAGE_FLAG_RESERVED 0x0100 /* to 0x0800 */
-#define SILC_MESSAGE_FLAG_PRIVATE 0x1000 /* to 0x8000 */
+#define SILC_MESSAGE_FLAG_NONE 0x0000 /* No flags */
+#define SILC_MESSAGE_FLAG_AUTOREPLY 0x0001 /* Automatically replied */
+#define SILC_MESSAGE_FLAG_NOREPLY 0x0002 /* Send no reply to this */
+#define SILC_MESSAGE_FLAG_ACTION 0x0004 /* Action message */
+#define SILC_MESSAGE_FLAG_NOTICE 0x0008 /* Notice message */
+#define SILC_MESSAGE_FLAG_REQUEST 0x0010 /* A request */
+#define SILC_MESSAGE_FLAG_SIGNED 0x0020 /* Message is signed */
+#define SILC_MESSAGE_FLAG_REPLY 0x0040 /* A reply */
+#define SILC_MESSAGE_FLAG_DATA 0x0080 /* MIME object */
+#define SILC_MESSAGE_FLAG_UTF8 0x0100 /* UTF-8 string */
+#define SILC_MESSAGE_FLAG_RESERVED 0x0200 /* to 0x0800 */
+#define SILC_MESSAGE_FLAG_PRIVATE 0x1000 /* to 0x8000 */
/***/
/* Prototypes */