mirror of
https://github.com/weechat/weechat.git
synced 2026-07-06 17:53:13 +02:00
relay: fix commands sync/desync in weechat protocol (bug #38215)
Fix: - use proper arguments in commands sync/desync (use argv[0] instead of argv[1]) - when searching if a buffer is synchronized, its name has higher priority on "*" (so first check if buffer is synchronized, and if not found, search if "*" is synchronized) - when receiving a "nicklist_*" signal, check if the buffer is synchronized with flag "RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST"
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
WeeChat ChangeLog
|
||||
=================
|
||||
Sébastien Helleu <flashcode@flashtux.org>
|
||||
v0.4.1-dev, 2013-01-31
|
||||
v0.4.1-dev, 2013-02-03
|
||||
|
||||
|
||||
Version 0.4.1 (under dev!)
|
||||
@@ -19,6 +19,7 @@ Version 0.4.1 (under dev!)
|
||||
* irc: add color in output of /names when result is on server buffer (channel
|
||||
not joined) (bug #38070)
|
||||
* perl: simplify code to load scripts
|
||||
* relay: fix commands sync/desync in weechat protocol (bug #38215)
|
||||
* scripts: do not allow empty script name in function "register"
|
||||
|
||||
Version 0.4.0 (2013-01-20)
|
||||
|
||||
@@ -87,6 +87,46 @@ relay_weechat_protocol_get_buffer (const char *arg)
|
||||
return ptr_buffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if buffer is synchronized, according to flags.
|
||||
*
|
||||
* First search buffer with full_name in hashtable "buffers_sync".
|
||||
* If buffer is not found, search "*" (which means "all buffers").
|
||||
*
|
||||
* The "flags" argument can be a combination (logical OR) of:
|
||||
* RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER
|
||||
* RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST
|
||||
*
|
||||
* Returns:
|
||||
* 1: buffer is synchronized for these flags
|
||||
* 0: buffer is NOT synchronized for these flags
|
||||
*/
|
||||
|
||||
int
|
||||
relay_weechat_protocol_buffer_is_sync (struct t_relay_client *ptr_client,
|
||||
const char *full_name, int flags)
|
||||
{
|
||||
int *ptr_flags;
|
||||
|
||||
/* search buffer using "full_name" */
|
||||
ptr_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
full_name);
|
||||
if (ptr_flags)
|
||||
return ((*ptr_flags) & flags) ? 1 : 0;
|
||||
|
||||
/* search buffer "*" */
|
||||
ptr_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
"*");
|
||||
if (ptr_flags)
|
||||
return ((*ptr_flags) & flags) ? 1 : 0;
|
||||
|
||||
/*
|
||||
* buffer not found at all in hashtable (neither name, neitner "*")
|
||||
* => it is NOT synchronized
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for command "init" (from client).
|
||||
*
|
||||
@@ -463,12 +503,11 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer || (relay_raw_buffer && (ptr_buffer == relay_raw_buffer)))
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
/* check if buffer is synchronized (== able to receive events) */
|
||||
if (weechat_hashtable_has_key (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
"*")
|
||||
|| weechat_hashtable_has_key (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
weechat_buffer_get_string (ptr_buffer,
|
||||
"full_name")))
|
||||
/* check if buffer is synchronized with flag "buffer" */
|
||||
if (relay_weechat_protocol_buffer_is_sync (ptr_client,
|
||||
weechat_buffer_get_string (ptr_buffer,
|
||||
"full_name"),
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
@@ -591,6 +630,8 @@ relay_weechat_protocol_signal_nicklist_cb (void *data, const char *signal,
|
||||
{
|
||||
struct t_relay_client *ptr_client;
|
||||
char *pos, *str_buffer;
|
||||
int rc;
|
||||
long unsigned int buffer;
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) signal;
|
||||
@@ -607,16 +648,28 @@ relay_weechat_protocol_signal_nicklist_cb (void *data, const char *signal,
|
||||
str_buffer = weechat_strndup (signal_data, pos - (char *)signal_data);
|
||||
if (!str_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(ptr_client, buffers_nicklist),
|
||||
str_buffer, "1");
|
||||
free (str_buffer);
|
||||
|
||||
if (RELAY_WEECHAT_DATA(ptr_client, hook_timer_nicklist))
|
||||
/* check if buffer is synchronized with flag "nicklist" */
|
||||
rc = sscanf (str_buffer, "%lx", &buffer);
|
||||
if ((rc != EOF) && (rc != 0))
|
||||
{
|
||||
weechat_unhook (RELAY_WEECHAT_DATA(ptr_client, hook_timer_nicklist));
|
||||
RELAY_WEECHAT_DATA(ptr_client, hook_timer_nicklist) = NULL;
|
||||
if (relay_weechat_protocol_buffer_is_sync (ptr_client,
|
||||
weechat_buffer_get_string ((void *)buffer,
|
||||
"full_name"),
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST))
|
||||
{
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(ptr_client, buffers_nicklist),
|
||||
str_buffer, "1");
|
||||
if (RELAY_WEECHAT_DATA(ptr_client, hook_timer_nicklist))
|
||||
{
|
||||
weechat_unhook (RELAY_WEECHAT_DATA(ptr_client, hook_timer_nicklist));
|
||||
RELAY_WEECHAT_DATA(ptr_client, hook_timer_nicklist) = NULL;
|
||||
}
|
||||
relay_weechat_hook_timer_nicklist (ptr_client);
|
||||
}
|
||||
}
|
||||
relay_weechat_hook_timer_nicklist (ptr_client);
|
||||
|
||||
free (str_buffer);
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
@@ -675,7 +728,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(sync)
|
||||
|
||||
RELAY_WEECHAT_PROTOCOL_MIN_ARGS(0);
|
||||
|
||||
buffers = weechat_string_split ((argc > 0) ? argv[1] : "*", ",", 0, 0,
|
||||
buffers = weechat_string_split ((argc > 0) ? argv[0] : "*", ",", 0, 0,
|
||||
&num_buffers);
|
||||
if (buffers)
|
||||
{
|
||||
@@ -683,7 +736,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(sync)
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
if (argc > 1)
|
||||
{
|
||||
flags = weechat_string_split (argv[2], ",", 0, 0, &num_flags);
|
||||
flags = weechat_string_split (argv[1], ",", 0, 0, &num_flags);
|
||||
if (flags)
|
||||
{
|
||||
add_flags = 0;
|
||||
@@ -707,7 +760,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(sync)
|
||||
full_name = NULL;
|
||||
if (strcmp (buffers[i], "*") == 0)
|
||||
{
|
||||
full_name = strdup ("*");
|
||||
full_name = strdup (buffers[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -754,7 +807,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(desync)
|
||||
|
||||
RELAY_WEECHAT_PROTOCOL_MIN_ARGS(0);
|
||||
|
||||
buffers = weechat_string_split ((argc > 0) ? argv[1] : "*", ",", 0, 0,
|
||||
buffers = weechat_string_split ((argc > 0) ? argv[0] : "*", ",", 0, 0,
|
||||
&num_buffers);
|
||||
if (buffers)
|
||||
{
|
||||
@@ -762,7 +815,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(desync)
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
if (argc > 1)
|
||||
{
|
||||
flags = weechat_string_split (argv[2], ",", 0, 0, &num_flags);
|
||||
flags = weechat_string_split (argv[1], ",", 0, 0, &num_flags);
|
||||
if (flags)
|
||||
{
|
||||
sub_flags = 0;
|
||||
@@ -786,14 +839,16 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(desync)
|
||||
full_name = NULL;
|
||||
if (strcmp (buffers[i], "*") == 0)
|
||||
{
|
||||
full_name = strdup ("*");
|
||||
full_name = strdup (buffers[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr_buffer = relay_weechat_protocol_get_buffer (buffers[i]);
|
||||
if (ptr_buffer)
|
||||
{
|
||||
full_name = strdup (weechat_buffer_get_string (ptr_buffer,
|
||||
"full_name"));
|
||||
}
|
||||
}
|
||||
if (full_name)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user