From a62b243af514dc3b38dafb9536818dae6f4f12e3 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Thu, 17 May 2012 11:24:59 +0200 Subject: [PATCH] relay: add signals "upgrade" and "upgrade_ended" in WeeChat protocol --- ChangeLog | 1 + doc/en/weechat_relay_protocol.en.txt | 50 +++++++++++++------ .../relay/weechat/relay-weechat-protocol.c | 38 +++++++++++++- .../relay/weechat/relay-weechat-protocol.h | 4 ++ src/plugins/relay/weechat/relay-weechat.c | 14 ++++++ src/plugins/relay/weechat/relay-weechat.h | 5 +- 6 files changed, 95 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96a483f16..fa4c14c9b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -70,6 +70,7 @@ Version 0.3.8 (under dev!) logger.color.backlog_line and logger.color.backlog_end (task #11966) * perl: fix compilation on OS X (bug #30701) * perl: fix crash on quit on OS X +* relay: add signals "upgrade" and "upgrade_ended" in WeeChat protocol * relay: fix crash on /upgrade when client is connected using WeeChat protocol * relay: redirect some irc messages from clients to hide output (messages: mode, ison, list, names, topic, who, whois, whowas, time, userhost) (bug #33516) diff --git a/doc/en/weechat_relay_protocol.en.txt b/doc/en/weechat_relay_protocol.en.txt index 37e3d6f95..52171a90c 100644 --- a/doc/en/weechat_relay_protocol.en.txt +++ b/doc/en/weechat_relay_protocol.en.txt @@ -424,58 +424,80 @@ There are two different identifiers ('id'): WeeChat reserved identifiers: -[width="100%",cols="5m,5,3,15",options="header"] +[width="100%",cols="5m,5,3,10,8",options="header"] |===================================================== | Identifier | Description | Hdata type | Hdata content +| Recommended action in client | _buffer_opened | Buffer opened | buffer | 'number' (integer), 'full_name' (string), 'short_name' (string), + 'nicklist' (integer), 'title' (string), 'local_variables' (hashtable), + - 'prev_buffer' (pointer), 'next_buffer' (pointer) + 'prev_buffer' (pointer), 'next_buffer' (pointer) | + Open buffer | _buffer_type_changed | Type of buffer changed | buffer | 'number' (integer), 'full_name' (string), + - 'type' (integer) + 'type' (integer) | + Change type of buffer | _buffer_moved | Buffer moved | buffer | 'number' (integer), 'full_name' (string), + - 'prev_buffer' (pointer), 'next_buffer' (pointer) + 'prev_buffer' (pointer), 'next_buffer' (pointer) | + Move buffer | _buffer_merged | Buffer merged | buffer | 'number' (integer), 'full_name' (string), + - 'prev_buffer' (pointer), 'next_buffer' (pointer) + 'prev_buffer' (pointer), 'next_buffer' (pointer) | + Merge buffer | _buffer_unmerged | Buffer unmerged | buffer | 'number' (integer), 'full_name' (string), + - 'prev_buffer' (pointer), 'next_buffer' (pointer) + 'prev_buffer' (pointer), 'next_buffer' (pointer) | + Unmerge buffer | _buffer_renamed | Buffer renamed | buffer | 'number' (integer), 'full_name' (string), 'short_name' (string), - 'local_variables' (hashtable) + 'local_variables' (hashtable) | + Rename buffer | _buffer_title_changed | Title of buffer changed | buffer | - 'number' (integer), 'full_name' (string), 'title' (string) + 'number' (integer), 'full_name' (string), 'title' (string) | + Change title of buffer | _buffer_localvar_added | Local variable added | buffer | - 'number' (integer), 'full_name' (string), 'local_variables' (hashtable) + 'number' (integer), 'full_name' (string), 'local_variables' (hashtable) | + Add local variable in buffer | _buffer_localvar_changed | Local variable changed | buffer | - 'number' (integer), 'full_name' (string), 'local_variables' (hashtable) + 'number' (integer), 'full_name' (string), 'local_variables' (hashtable) | + Change local variable inbuffer | _buffer_localvar_removed | Local variable removed | buffer | - 'number' (integer), 'full_name' (string), 'local_variables' (hashtable) + 'number' (integer), 'full_name' (string), 'local_variables' (hashtable) | + Remove local variable from buffer | _buffer_line_added | Line added in buffer | line | 'buffer' (pointer), 'date' (time), 'date_printed' (time), 'displayed' (char), - 'highlight' (char), 'prefix' (string), 'message' (string) + 'highlight' (char), 'prefix' (string), 'message' (string) | + Display line in buffer | _buffer_closing | Buffer closing | buffer | - 'number' (integer), 'full_name' (string) + 'number' (integer), 'full_name' (string) | + Close buffer | _nicklist | Nicklist for a buffer | nicklist_item | 'group' (char), 'visible' (char), 'level' (integer), + 'name' (string), 'color' (string), + - 'prefix' (string), 'prefix_color' (string) + 'prefix' (string), 'prefix_color' (string) | + Update nicklist + +| _upgrade | WeeChat is upgrading | (empty) | + (empty) | + Desync from WeeChat (send command 'desync') + +| _upgrade_ended | Upgrade of WeeChat done | (empty) | + (empty) | + Resync with WeeChat (resend all commands sent on startup after the 'init') |===================================================== [[message_objects]] diff --git a/src/plugins/relay/weechat/relay-weechat-protocol.c b/src/plugins/relay/weechat/relay-weechat-protocol.c index 304bca743..abd8a924c 100644 --- a/src/plugins/relay/weechat/relay-weechat-protocol.c +++ b/src/plugins/relay/weechat/relay-weechat-protocol.c @@ -278,7 +278,6 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal, char cmd_hdata[64], str_signal[128]; /* make C compiler happy */ - (void) signal; (void) type_data; ptr_client = (struct t_relay_client *)data; @@ -595,6 +594,43 @@ relay_weechat_protocol_signal_nicklist_cb (void *data, const char *signal, return WEECHAT_RC_OK; } +/* + * relay_weechat_protocol_signal_upgrade_cb: callback for "upgrade*" signals + */ + +int +relay_weechat_protocol_signal_upgrade_cb (void *data, const char *signal, + const char *type_data, + void *signal_data) +{ + struct t_relay_client *ptr_client; + struct t_relay_weechat_msg *msg; + char str_signal[128]; + + /* make C compiler happy */ + (void) type_data; + (void) signal_data; + + ptr_client = (struct t_relay_client *)data; + if (!ptr_client || !relay_client_valid (ptr_client)) + return WEECHAT_RC_OK; + + snprintf (str_signal, sizeof (str_signal), "_%s", signal); + + if ((strcmp (signal, "upgrade") == 0) + || (strcmp (signal, "upgrade_ended") == 0)) + { + msg = relay_weechat_msg_new (str_signal); + if (msg) + { + relay_weechat_msg_send (ptr_client, msg, 0); + relay_weechat_msg_free (msg); + } + } + + return WEECHAT_RC_OK; +} + /* * relay_weechat_protocol_cb_sync: 'sync' command from client */ diff --git a/src/plugins/relay/weechat/relay-weechat-protocol.h b/src/plugins/relay/weechat/relay-weechat-protocol.h index 27355137a..a0e555b85 100644 --- a/src/plugins/relay/weechat/relay-weechat-protocol.h +++ b/src/plugins/relay/weechat/relay-weechat-protocol.h @@ -72,6 +72,10 @@ extern int relay_weechat_protocol_signal_nicklist_cb (void *data, const char *signal, const char *type_data, void *signal_data); +extern int relay_weechat_protocol_signal_upgrade_cb (void *data, + const char *signal, + const char *type_data, + void *signal_data); extern int relay_weechat_protocol_timer_nicklist_cb (void *data, int remaining_calls); extern void relay_weechat_protocol_recv (struct t_relay_client *client, diff --git a/src/plugins/relay/weechat/relay-weechat.c b/src/plugins/relay/weechat/relay-weechat.c index 02f1e6605..c82323ecf 100644 --- a/src/plugins/relay/weechat/relay-weechat.c +++ b/src/plugins/relay/weechat/relay-weechat.c @@ -81,6 +81,10 @@ relay_weechat_hook_signals (struct t_relay_client *client) weechat_hook_signal ("nicklist_*", &relay_weechat_protocol_signal_nicklist_cb, client); + RELAY_WEECHAT_DATA(client, hook_signal_upgrade) = + weechat_hook_signal ("upgrade*", + &relay_weechat_protocol_signal_upgrade_cb, + client); } /* @@ -100,6 +104,11 @@ relay_weechat_unhook_signals (struct t_relay_client *client) weechat_unhook (RELAY_WEECHAT_DATA(client, hook_signal_nicklist)); RELAY_WEECHAT_DATA(client, hook_signal_nicklist) = NULL; } + if (RELAY_WEECHAT_DATA(client, hook_signal_upgrade)) + { + weechat_unhook (RELAY_WEECHAT_DATA(client, hook_signal_upgrade)); + RELAY_WEECHAT_DATA(client, hook_signal_upgrade) = NULL; + } } /* @@ -205,6 +214,7 @@ relay_weechat_alloc (struct t_relay_client *client) NULL); RELAY_WEECHAT_DATA(client, hook_signal_buffer) = NULL; RELAY_WEECHAT_DATA(client, hook_signal_nicklist) = NULL; + RELAY_WEECHAT_DATA(client, hook_signal_upgrade) = NULL; RELAY_WEECHAT_DATA(client, buffers_nicklist) = weechat_hashtable_new (16, WEECHAT_HASHTABLE_STRING, @@ -258,6 +268,7 @@ relay_weechat_alloc_with_infolist (struct t_relay_client *client, } RELAY_WEECHAT_DATA(client, hook_signal_buffer) = NULL; RELAY_WEECHAT_DATA(client, hook_signal_nicklist) = NULL; + RELAY_WEECHAT_DATA(client, hook_signal_upgrade) = NULL; RELAY_WEECHAT_DATA(client, buffers_nicklist) = weechat_hashtable_new (16, WEECHAT_HASHTABLE_STRING, @@ -304,6 +315,8 @@ relay_weechat_free (struct t_relay_client *client) weechat_unhook (RELAY_WEECHAT_DATA(client, hook_signal_buffer)); if (RELAY_WEECHAT_DATA(client, hook_signal_nicklist)) weechat_unhook (RELAY_WEECHAT_DATA(client, hook_signal_nicklist)); + if (RELAY_WEECHAT_DATA(client, hook_signal_upgrade)) + weechat_unhook (RELAY_WEECHAT_DATA(client, hook_signal_upgrade)); if (RELAY_WEECHAT_DATA(client, buffers_nicklist)) weechat_hashtable_free (RELAY_WEECHAT_DATA(client, buffers_nicklist)); @@ -355,6 +368,7 @@ relay_weechat_print_log (struct t_relay_client *client) "keys_values")); weechat_log_printf (" hook_signal_buffer . . : 0x%lx", RELAY_WEECHAT_DATA(client, hook_signal_buffer)); weechat_log_printf (" hook_signal_nicklist . : 0x%lx", RELAY_WEECHAT_DATA(client, hook_signal_nicklist)); + weechat_log_printf (" hook_signal_upgrade. . : 0x%lx", RELAY_WEECHAT_DATA(client, hook_signal_upgrade)); weechat_log_printf (" buffers_nicklist . . . : 0x%lx (hashtable: '%s')", RELAY_WEECHAT_DATA(client, buffers_nicklist), weechat_hashtable_get_string (RELAY_WEECHAT_DATA(client, buffers_nicklist), diff --git a/src/plugins/relay/weechat/relay-weechat.h b/src/plugins/relay/weechat/relay-weechat.h index bfa346955..32a857ddd 100644 --- a/src/plugins/relay/weechat/relay-weechat.h +++ b/src/plugins/relay/weechat/relay-weechat.h @@ -41,8 +41,9 @@ struct t_relay_weechat_data /* sync of buffers */ struct t_hashtable *buffers_sync; /* buffers synchronized (events */ /* received for these buffers) */ - struct t_hook *hook_signal_buffer; /* hook for signals "buffer_xxx" */ - struct t_hook *hook_signal_nicklist; /* hook for signals "nicklist_xxx"*/ + struct t_hook *hook_signal_buffer; /* hook for signals "buffer_*" */ + struct t_hook *hook_signal_nicklist; /* hook for signals "nicklist_*" */ + struct t_hook *hook_signal_upgrade; /* hook for signals "upgrade*" */ struct t_hashtable *buffers_nicklist; /* send nicklist for these buffers*/ struct t_hook *hook_timer_nicklist; /* timer for sending nicklist */ };