diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/irc/irc-command.c | 5 | ||||
-rw-r--r-- | src/plugins/irc/irc-ctcp.c | 5 | ||||
-rw-r--r-- | src/plugins/xfer/xfer-chat.c | 33 | ||||
-rw-r--r-- | src/plugins/xfer/xfer.c | 32 | ||||
-rw-r--r-- | src/plugins/xfer/xfer.h | 1 |
5 files changed, 55 insertions, 21 deletions
diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index f570e1164..f6d17e602 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -845,7 +845,7 @@ irc_command_dcc (void *data, struct t_gui_buffer *buffer, int argc, unsigned long address; struct t_infolist *infolist; struct t_infolist_item *item; - char plugin_id[128], str_address[128]; + char plugin_id[128], str_address[128], charset_modifier[256]; IRC_GET_SERVER_CHANNEL(buffer); IRC_COMMAND_CHECK_SERVER("dcc", 1); @@ -915,6 +915,9 @@ irc_command_dcc (void *data, struct t_gui_buffer *buffer, int argc, weechat_infolist_new_var_string (item, "type", "chat_send"); weechat_infolist_new_var_string (item, "remote_nick", argv[2]); weechat_infolist_new_var_string (item, "local_nick", ptr_server->nick); + snprintf (charset_modifier, sizeof (charset_modifier), + "irc.%s.%s", ptr_server->name, argv[2]); + weechat_infolist_new_var_string (item, "charset_modifier", charset_modifier); snprintf (str_address, sizeof (str_address), "%lu", address); weechat_infolist_new_var_string (item, "address", str_address); diff --git a/src/plugins/irc/irc-ctcp.c b/src/plugins/irc/irc-ctcp.c index 088411aa6..6ae341a4c 100644 --- a/src/plugins/irc/irc-ctcp.c +++ b/src/plugins/irc/irc-ctcp.c @@ -368,7 +368,7 @@ irc_ctcp_recv_dcc (struct t_irc_server *server, const char *nick, char *dcc_args, *pos, *pos_file, *pos_addr, *pos_port, *pos_size, *pos_start_resume; struct t_infolist *infolist; struct t_infolist_item *item; - char plugin_id[128]; + char plugin_id[128], charset_modifier[256]; if (!arguments || !arguments[0]) return; @@ -768,6 +768,9 @@ irc_ctcp_recv_dcc (struct t_irc_server *server, const char *nick, weechat_infolist_new_var_string (item, "type", "chat_recv"); weechat_infolist_new_var_string (item, "remote_nick", nick); weechat_infolist_new_var_string (item, "local_nick", server->nick); + snprintf (charset_modifier, sizeof (charset_modifier), + "irc.%s.%s", server->name, nick); + weechat_infolist_new_var_string (item, "charset_modifier", charset_modifier); weechat_infolist_new_var_string (item, "proxy", IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_PROXY)); weechat_infolist_new_var_string (item, "address", pos_addr); diff --git a/src/plugins/xfer/xfer-chat.c b/src/plugins/xfer/xfer-chat.c index 579e47fd0..d4792266b 100644 --- a/src/plugins/xfer/xfer-chat.c +++ b/src/plugins/xfer/xfer-chat.c @@ -55,6 +55,7 @@ xfer_chat_sendf (struct t_xfer *xfer, const char *format, ...) va_list args; static char buffer[4096]; int size_buf; + char *ptr_msg, *msg_encoded; if (!xfer || (xfer->sock < 0)) return; @@ -62,15 +63,18 @@ xfer_chat_sendf (struct t_xfer *xfer, const char *format, ...) va_start (args, format); size_buf = vsnprintf (buffer, sizeof (buffer) - 1, format, args); va_end (args); - if (size_buf == 0) return; - buffer[sizeof (buffer) - 1] = '\0'; - if ((size_buf < 0) || (size_buf > (int) (sizeof (buffer) - 1))) - size_buf = strlen (buffer); - if (xfer_chat_send (xfer, buffer, strlen (buffer)) <= 0) + msg_encoded = (xfer->charset_modifier) ? + weechat_hook_modifier_exec ("charset_encode", + xfer->charset_modifier, + buffer) : NULL; + + ptr_msg = (msg_encoded) ? msg_encoded : buffer; + + if (xfer_chat_send (xfer, ptr_msg, strlen (ptr_msg)) <= 0) { weechat_printf (NULL, _("%s%s: error sending data to \"%s\" via xfer chat"), @@ -78,6 +82,9 @@ xfer_chat_sendf (struct t_xfer *xfer, const char *format, ...) xfer->remote_nick); xfer_close (xfer, XFER_STATUS_FAILED); } + + if (msg_encoded) + free (msg_encoded); } /* @@ -90,7 +97,7 @@ xfer_chat_recv_cb (void *arg_xfer, int fd) struct t_xfer *xfer; static char buffer[4096 + 2]; char *buf2, *pos, *ptr_buf, *next_ptr_buf; - char *ptr_buf_without_weechat_colors, *ptr_buf_color; + char *ptr_buf_decoded, *ptr_buf_without_weechat_colors, *ptr_buf_color; int num_read; /* make C compiler happy */ @@ -137,15 +144,23 @@ xfer_chat_recv_cb (void *arg_xfer, int fd) if (ptr_buf) { - ptr_buf_without_weechat_colors = weechat_string_remove_color (ptr_buf, "?"); + ptr_buf_decoded = (xfer->charset_modifier) ? + weechat_hook_modifier_exec ("charset_decode", + xfer->charset_modifier, + ptr_buf) : NULL; + ptr_buf_without_weechat_colors = weechat_string_remove_color ((ptr_buf_decoded) ? ptr_buf_decoded : ptr_buf, + "?"); ptr_buf_color = weechat_hook_modifier_exec ("irc_color_decode", "1", (ptr_buf_without_weechat_colors) ? - ptr_buf_without_weechat_colors : ptr_buf); + ptr_buf_without_weechat_colors : ((ptr_buf_decoded) ? ptr_buf_decoded : ptr_buf)); weechat_printf_tags (xfer->buffer, "notify_message", "%s\t%s", xfer->remote_nick, (ptr_buf_color) ? - ptr_buf_color : ((ptr_buf_without_weechat_colors) ? ptr_buf_without_weechat_colors : ptr_buf)); + ptr_buf_color : ((ptr_buf_without_weechat_colors) ? + ptr_buf_without_weechat_colors : ((ptr_buf_decoded) ? ptr_buf_decoded : ptr_buf))); + if (ptr_buf_decoded) + free (ptr_buf_decoded); if (ptr_buf_without_weechat_colors) free (ptr_buf_without_weechat_colors); if (ptr_buf_color) diff --git a/src/plugins/xfer/xfer.c b/src/plugins/xfer/xfer.c index 0f12668ec..612e53646 100644 --- a/src/plugins/xfer/xfer.c +++ b/src/plugins/xfer/xfer.c @@ -388,6 +388,8 @@ xfer_send_signal (struct t_xfer *xfer, const char *signal) xfer->remote_nick); weechat_infolist_new_var_string (item, "local_nick", xfer->local_nick); + weechat_infolist_new_var_string (item, "charset_modifier", + xfer->charset_modifier); weechat_infolist_new_var_string (item, "filename", xfer->filename); snprintf (str_long, sizeof (str_long), "%lu", xfer->size); @@ -432,6 +434,7 @@ xfer_alloc () new_xfer->port = 0; new_xfer->remote_nick = NULL; new_xfer->local_nick = NULL; + new_xfer->charset_modifier = NULL; new_xfer->type = 0; new_xfer->protocol = 0; @@ -478,9 +481,10 @@ xfer_alloc () */ struct t_xfer * -xfer_new (const char *plugin_name, const char *plugin_id, enum t_xfer_type type, - enum t_xfer_protocol protocol, const char *remote_nick, - const char *local_nick, const char *filename, +xfer_new (const char *plugin_name, const char *plugin_id, + enum t_xfer_type type, enum t_xfer_protocol protocol, + const char *remote_nick, const char *local_nick, + const char *charset_modifier, const char *filename, unsigned long size, const char *proxy, unsigned long address, int port, int sock, const char *local_filename) { @@ -508,6 +512,7 @@ xfer_new (const char *plugin_name, const char *plugin_id, enum t_xfer_type type, new_xfer->protocol = protocol; new_xfer->remote_nick = strdup (remote_nick); new_xfer->local_nick = (local_nick) ? strdup (local_nick) : NULL; + new_xfer->charset_modifier = (charset_modifier) ? strdup (charset_modifier) : NULL; if (XFER_IS_FILE(type)) new_xfer->filename = (filename) ? strdup (filename) : NULL; else @@ -653,6 +658,8 @@ xfer_free (struct t_xfer *xfer) free (xfer->remote_nick); if (xfer->local_nick) free (xfer->local_nick); + if (xfer->charset_modifier) + free (xfer->charset_modifier); if (xfer->filename) free (xfer->filename); if (xfer->unterminated_message) @@ -674,11 +681,12 @@ xfer_free (struct t_xfer *xfer) */ int -xfer_add_cb (void *data, const char *signal, const char *type_data, void *signal_data) +xfer_add_cb (void *data, const char *signal, const char *type_data, + void *signal_data) { struct t_infolist *infolist; const char *plugin_name, *plugin_id, *str_type, *str_protocol; - const char *remote_nick, *local_nick, *filename, *proxy; + const char *remote_nick, *local_nick, *charset_modifier, *filename, *proxy; int type, protocol; const char *weechat_dir; char *dir1, *dir2, *filename2, *short_filename, *pos; @@ -728,6 +736,7 @@ xfer_add_cb (void *data, const char *signal, const char *type_data, void *signal str_protocol = weechat_infolist_string (infolist, "protocol"); remote_nick = weechat_infolist_string (infolist, "remote_nick"); local_nick = weechat_infolist_string (infolist, "local_nick"); + charset_modifier = weechat_infolist_string (infolist, "charset_modifier"); filename = weechat_infolist_string (infolist, "filename"); proxy = weechat_infolist_string (infolist, "proxy"); protocol = XFER_NO_PROTOCOL; @@ -999,13 +1008,13 @@ xfer_add_cb (void *data, const char *signal, const char *type_data, void *signal /* add xfer entry and listen to socket if type is file or chat "send" */ if (XFER_IS_FILE(type)) ptr_xfer = xfer_new (plugin_name, plugin_id, type, protocol, - remote_nick, local_nick, short_filename, - file_size, proxy, local_addr, port, sock, - filename2); + remote_nick, local_nick, charset_modifier, + short_filename, file_size, proxy, local_addr, + port, sock, filename2); else ptr_xfer = xfer_new (plugin_name, plugin_id, type, protocol, - remote_nick, local_nick, NULL, 0, proxy, - local_addr, port, sock, NULL); + remote_nick, local_nick, charset_modifier, NULL, + 0, proxy, local_addr, port, sock, NULL); if (!ptr_xfer) { @@ -1233,6 +1242,8 @@ xfer_add_to_infolist (struct t_infolist *infolist, struct t_xfer *xfer) return 0; if (!weechat_infolist_new_var_string (ptr_item, "local_nick", xfer->local_nick)) return 0; + if (!weechat_infolist_new_var_string (ptr_item, "charset_modifier", xfer->charset_modifier)) + return 0; if (!weechat_infolist_new_var_string (ptr_item, "filename", xfer->filename)) return 0; snprintf (value, sizeof (value), "%lu", xfer->size); @@ -1329,6 +1340,7 @@ xfer_print_log () xfer_protocol_string[ptr_xfer->protocol]); weechat_log_printf (" remote_nick . . . . : '%s'", ptr_xfer->remote_nick); weechat_log_printf (" local_nick. . . . . : '%s'", ptr_xfer->local_nick); + weechat_log_printf (" charset_modifier. . : '%s'", ptr_xfer->charset_modifier); weechat_log_printf (" filename. . . . . . : '%s'", ptr_xfer->filename); weechat_log_printf (" size. . . . . . . . : %lu", ptr_xfer->size); weechat_log_printf (" proxy . . . . . . . : '%s'", ptr_xfer->proxy); diff --git a/src/plugins/xfer/xfer.h b/src/plugins/xfer/xfer.h index e17bfc7e8..dfde32347 100644 --- a/src/plugins/xfer/xfer.h +++ b/src/plugins/xfer/xfer.h @@ -113,6 +113,7 @@ struct t_xfer enum t_xfer_protocol protocol; /* xfer protocol (for file transfer) */ char *remote_nick; /* remote nick */ char *local_nick; /* local nick */ + char *charset_modifier; /* string for charset modifier_data */ char *filename; /* filename */ unsigned long size; /* file size */ char *proxy; /* proxy to use (optional) */ |