From a1382ec067aa0f7c5dbfb93853384230fb9d5a40 Mon Sep 17 00:00:00 2001 From: Jochen Eisinger Date: Sun, 24 Aug 2003 21:42:16 +0000 Subject: [PATCH] Sun Aug 24 23:35:19 CEST 2003 Jochen Eisinger * Provide a signal handler to send MIME encoded messages and emit a signal when a MIME encoded message is received. Also document the signals for usage with the perl interface. A sample perl script will be supplied at a later point. Affected files are irssi/docs/signals.txt, irssi/src/silc/core/client_ops.[ch], irssi/src/silc/core/silc-{channels,servers}.c --- CHANGES | 12 ++++ apps/irssi/docs/signals.txt | 9 +++ apps/irssi/src/silc/core/client_ops.c | 73 +++++++++++++++++++++--- apps/irssi/src/silc/core/client_ops.h | 4 ++ apps/irssi/src/silc/core/silc-channels.c | 17 ++++++ apps/irssi/src/silc/core/silc-servers.c | 11 +++- 6 files changed, 116 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index da247f3c..49395ce6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,15 @@ +Sun Aug 24 23:35:19 CEST 2003 Jochen Eisinger + + * Provide a signal handler to send MIME encoded messages and emit + a signal when a MIME encoded message is received. Also document + the signals for usage with the perl interface. + + A sample perl script will be supplied at a later point. + + Affected files are irssi/docs/signals.txt, + irssi/src/silc/core/client_ops.[ch], + irssi/src/silc/core/silc-{channels,servers}.c + Sun Aug 24 12:58:30 CEST 2003 Jochen Eisinger * Use SILC_COMMAND_PING to estimate the round-trip time to the diff --git a/apps/irssi/docs/signals.txt b/apps/irssi/docs/signals.txt index df582873..7c03fad5 100644 --- a/apps/irssi/docs/signals.txt +++ b/apps/irssi/docs/signals.txt @@ -324,3 +324,12 @@ gui-readline.c: gui-printtext.c: "beep" + +SILC +--- + +silc-channels.c: + "mime", SERVER_REC, CHANNEL_REC, char *blob, char *enc, char *type, char *nick + +silc-servers.c: + "mime-send", SERVER_REC, WI_ITEM_REC, char *blob, char *enc, char *type diff --git a/apps/irssi/src/silc/core/client_ops.c b/apps/irssi/src/silc/core/client_ops.c index a087f47a..dfa69c98 100644 --- a/apps/irssi/src/silc/core/client_ops.c +++ b/apps/irssi/src/silc/core/client_ops.c @@ -288,6 +288,68 @@ int verify_message_signature(SilcClientEntry sender, return ret; } +char * silc_unescape_data(const char *escaped_data, SilcUInt32 *length) +{ + SilcUInt32 ctr, dest=0; + char *data; + + data = silc_calloc(strlen(escaped_data), sizeof(char)); + + for (ctr = 0; ctr < strlen(escaped_data); ctr++) + if (escaped_data[ctr] == 1) + data[dest++] = escaped_data[++ctr] - 1; + else + data[dest++] = escaped_data[ctr]; + + *length = dest; + return data; +} + +char * silc_escape_data(const char *data, SilcUInt32 len) +{ + char *escaped_data; + SilcUInt32 ctr, zeros=0; + + for (ctr = 0; ctr < len; ctr++) + if (data[ctr] == 0 || data[ctr] == 1) + zeros++; + + escaped_data = silc_calloc(zeros + len, sizeof(char)); + + zeros=0; + for (ctr = 0; ctr < len; ctr++) + switch (data[ctr]) { + case 0: + escaped_data[zeros++] = 1; + escaped_data[zeros++] = 1; + break; + + case 1: + escaped_data[zeros++] = 1; + escaped_data[zeros++] = 2; + break; + + default: + escaped_data[zeros++] = data[ctr]; + } + + return escaped_data; +} + +void silc_emit_mime_sig(SILC_SERVER_REC *server, SILC_CHANNEL_REC *channel, + const char *data, SilcUInt32 data_len, + const char *encoding, const char *type, const char *nick) +{ + char *escaped_data; + + escaped_data = silc_escape_data(data, data_len); + + signal_emit("mime", 6, server, channel, escaped_data, encoding, type, nick); + + silc_free(escaped_data); +} + + /* Message for a channel. The `sender' is the nickname of the sender received in the packet. The `channel_name' is the name of the channel. */ @@ -348,9 +410,8 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn, /* It is something textual, display it */ message = (const unsigned char *)data; } else { - printformat_module("fe-common/silc", server, channel->channel_name, - MSGLEVEL_CRAP, SILCTXT_MESSAGE_DATA, - nick == NULL ? "[]" : nick->nick, type); + silc_emit_mime_sig(server, chanrec, data, data_len, + enc, type, nick == NULL ? NULL : nick->nick); message = NULL; } } @@ -457,10 +518,8 @@ void silc_private_message(SilcClient client, SilcClientConnection conn, /* It is something textual, display it */ message = (const unsigned char *)data; } else { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_MESSAGE_DATA, - sender->nickname ? sender->nickname : "[]", - type); + silc_emit_mime_sig(server, NULL, data, data_len, + enc, type, sender->nickname); message = NULL; } } diff --git a/apps/irssi/src/silc/core/client_ops.h b/apps/irssi/src/silc/core/client_ops.h index 8c3f7630..31f5ad29 100644 --- a/apps/irssi/src/silc/core/client_ops.h +++ b/apps/irssi/src/silc/core/client_ops.h @@ -70,5 +70,9 @@ void silc_ftp(SilcClient client, SilcClientConnection conn, void silc_detach(SilcClient client, SilcClientConnection conn, const unsigned char *detach_data, SilcUInt32 detach_data_len); +char * +silc_unescape_data(const char *escaped_data, SilcUInt32 *length); +char * +silc_escape_data(const char *data, SilcUInt32 len); #endif diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index e28768bd..72cca3a3 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -45,6 +45,21 @@ #include "silc-commands.h" +void sig_mime(SILC_SERVER_REC *server, SILC_CHANNEL_REC *channel, + const char *blob, const char *enc, const char *type, + const char *nick) +{ + + if (!(IS_SILC_SERVER(server))) + return; + + printformat_module("fe-common/silc", server, + channel == NULL ? NULL : channel->name, + MSGLEVEL_CRAP, SILCTXT_MESSAGE_DATA, + nick == NULL ? "[]" : nick, type); + +} + SILC_CHANNEL_REC *silc_channel_create(SILC_SERVER_REC *server, const char *name, const char *visible_name, @@ -1007,6 +1022,7 @@ void silc_channels_init(void) signal_add("server connected", (SIGNAL_FUNC) sig_connected); signal_add("server quit", (SIGNAL_FUNC) sig_server_quit); signal_add("gui exit", (SIGNAL_FUNC) sig_gui_quit); + signal_add("mime", (SIGNAL_FUNC) sig_mime); command_bind_silc("part", MODULE_NAME, (SIGNAL_FUNC) command_part); command_bind_silc("me", MODULE_NAME, (SIGNAL_FUNC) command_me); @@ -1025,6 +1041,7 @@ void silc_channels_deinit(void) signal_remove("server connected", (SIGNAL_FUNC) sig_connected); signal_remove("server quit", (SIGNAL_FUNC) sig_server_quit); signal_remove("gui exit", (SIGNAL_FUNC) sig_gui_quit); + signal_remove("mime", (SIGNAL_FUNC) sig_mime); command_unbind("part", (SIGNAL_FUNC) command_part); command_unbind("me", (SIGNAL_FUNC) command_me); diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index bf091268..808941d4 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -175,11 +175,13 @@ static int silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg, } void silc_send_mime(SILC_SERVER_REC *server, WI_ITEM_REC *to, - const char *data, int data_len, + const char *data, const char *enc, const char *type) { SILC_CHANNEL_REC *channel; QUERY_REC *query; + char *unescaped_data; + int unescaped_data_len; char *mime_data; int mime_data_len; @@ -187,9 +189,11 @@ void silc_send_mime(SILC_SERVER_REC *server, WI_ITEM_REC *to, (enc == NULL) || (type == NULL)) return; + unescaped_data = silc_unescape_data(data, &unescaped_data_len); + #define SILC_MIME_HEADER "MIME-Version: 1.0\r\nContent-Type: %s\r\nContent-Transfer-Encoding: %s\r\n\r\n" - mime_data_len = data_len + strlen(SILC_MIME_HEADER) - 4 + mime_data_len = unescaped_data_len + strlen(SILC_MIME_HEADER) - 4 + strlen(enc) + strlen(type); if (mime_data_len >= SILC_PACKET_MAX_LEN) return; @@ -198,7 +202,7 @@ void silc_send_mime(SILC_SERVER_REC *server, WI_ITEM_REC *to, mime_data = silc_calloc(mime_data_len, sizeof(*mime_data)); snprintf(mime_data, mime_data_len, SILC_MIME_HEADER, type, enc); memmove(mime_data + strlen(SILC_MIME_HEADER) - 4 + strlen(enc) + strlen(type), - data, data_len); + unescaped_data, unescaped_data_len); #undef SILC_MIME_HEADER @@ -215,6 +219,7 @@ void silc_send_mime(SILC_SERVER_REC *server, WI_ITEM_REC *to, } silc_free(mime_data); + silc_free(unescaped_data); } static int isnickflag_func(char flag) -- 2.43.0