summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2024-05-04 11:40:49 +0200
committerSébastien Helleu <flashcode@flashtux.org>2024-05-04 11:40:49 +0200
commita21fa3359d25dfcb2b510cd780a38394e39c7e99 (patch)
tree30c4124357f996ab694e3e889f20a0f205267e11
parent4ac120e4358abe66425e1e9ddd2ddf91cb46afb4 (diff)
downloadweechat-a21fa3359d25dfcb2b510cd780a38394e39c7e99.zip
relay/remote: fix close of remote buffer
-rw-r--r--src/plugins/relay/api/relay-api-msg.c32
-rw-r--r--src/plugins/relay/api/relay-api-msg.h2
-rw-r--r--src/plugins/relay/api/relay-api-protocol.c62
-rw-r--r--src/plugins/relay/api/relay-api.c44
-rw-r--r--src/plugins/relay/api/relay-api.h2
-rw-r--r--src/plugins/relay/api/remote/relay-remote-event.c33
6 files changed, 140 insertions, 35 deletions
diff --git a/src/plugins/relay/api/relay-api-msg.c b/src/plugins/relay/api/relay-api-msg.c
index 2bcd5bc95..7974a0f8d 100644
--- a/src/plugins/relay/api/relay-api-msg.c
+++ b/src/plugins/relay/api/relay-api-msg.c
@@ -124,16 +124,14 @@ relay_api_msg_send_json_internal (struct t_relay_client *client,
int return_code,
const char *message,
const char *event_name,
- struct t_gui_buffer *event_buffer,
+ long long event_buffer_id,
const char *headers,
const char *body_type,
cJSON *json_body)
{
cJSON *json, *json_event;
+ char *string, *request;
int num_bytes, length;
- const char *ptr_id;
- char *string, *error, *request;
- long long id;
if (!client || !message)
return -1;
@@ -159,18 +157,9 @@ relay_api_msg_send_json_internal (struct t_relay_client *client,
cJSON_AddItemToObject (
json_event, "name",
cJSON_CreateString ((event_name) ? event_name : ""));
- id = -1;
- if (event_buffer)
- {
- ptr_id = weechat_buffer_get_string (event_buffer, "id");
- error = NULL;
- id = strtoll (ptr_id, &error, 10);
- if (!error || error[0])
- id = -1;
- }
cJSON_AddItemToObject (
json_event, "buffer_id",
- cJSON_CreateNumber (id));
+ cJSON_CreateNumber (event_buffer_id));
cJSON_AddItemToObject (json, "event", json_event);
}
}
@@ -193,12 +182,13 @@ relay_api_msg_send_json_internal (struct t_relay_client *client,
free (request);
}
}
- if (json_body)
+ if (body_type)
{
cJSON_AddItemToObject (json, "body_type",
- cJSON_CreateString ((body_type) ? body_type : ""));
- cJSON_AddItemToObject (json, "body", json_body);
+ cJSON_CreateString (body_type));
}
+ if (json_body)
+ cJSON_AddItemToObject (json, "body", json_body);
string = cJSON_PrintUnformatted (json);
num_bytes = relay_client_send (
client,
@@ -239,7 +229,7 @@ relay_api_msg_send_json (struct t_relay_client *client,
return_code,
message,
NULL, /* event_name */
- NULL, /* event_buffer */
+ -1, /* event_buffer_id */
NULL, /* headers */
body_type,
json_body);
@@ -286,7 +276,7 @@ relay_api_msg_send_error_json (struct t_relay_client *client,
return_code,
message,
NULL, /* event_name */
- NULL, /* event_buffer */
+ -1, /* event_buffer_id */
headers,
NULL, /* body_type */
json);
@@ -321,14 +311,14 @@ relay_api_msg_send_error_json (struct t_relay_client *client,
int
relay_api_msg_send_event (struct t_relay_client *client,
const char *name,
- struct t_gui_buffer *buffer,
+ long long buffer_id,
const char *body_type,
cJSON *json_body)
{
return relay_api_msg_send_json_internal (client,
RELAY_API_HTTP_0_EVENT,
name,
- buffer,
+ buffer_id,
NULL, /* headers */
body_type,
json_body);
diff --git a/src/plugins/relay/api/relay-api-msg.h b/src/plugins/relay/api/relay-api-msg.h
index f28f3b642..94a7a70aa 100644
--- a/src/plugins/relay/api/relay-api-msg.h
+++ b/src/plugins/relay/api/relay-api-msg.h
@@ -34,7 +34,7 @@ extern int relay_api_msg_send_error_json (struct t_relay_client *client,
const char *format, ...);
extern int relay_api_msg_send_event (struct t_relay_client *client,
const char *name,
- struct t_gui_buffer *buffer,
+ long long buffer_id,
const char *body_type,
cJSON *json_body);
extern cJSON *relay_api_msg_buffer_to_json (struct t_gui_buffer *buffer,
diff --git a/src/plugins/relay/api/relay-api-protocol.c b/src/plugins/relay/api/relay-api-protocol.c
index d56391b93..9a446c1f8 100644
--- a/src/plugins/relay/api/relay-api-protocol.c
+++ b/src/plugins/relay/api/relay-api-protocol.c
@@ -72,6 +72,9 @@ relay_api_protocol_signal_buffer_cb (const void *pointer, void *data,
struct t_gui_line_data *ptr_line_data;
cJSON *json;
long lines;
+ long long buffer_id;
+ const char *ptr_id;
+ char *error;
/* make C compiler happy */
(void) data;
@@ -92,18 +95,61 @@ relay_api_protocol_signal_buffer_cb (const void *pointer, void *data,
|| (strcmp (signal, "buffer_title_changed") == 0)
|| (strncmp (signal, "buffer_localvar_", 16) == 0)
|| (strcmp (signal, "buffer_cleared") == 0)
- || (strcmp (signal, "buffer_closing") == 0))
+ || (strcmp (signal, "buffer_closing") == 0)
+ || (strcmp (signal, "buffer_closed") == 0))
{
ptr_buffer = (struct t_gui_buffer *)signal_data;
if (!ptr_buffer || relay_buffer_is_relay (ptr_buffer))
return WEECHAT_RC_OK;
+ if (strcmp (signal, "buffer_closed") == 0)
+ {
+ /*
+ * when a buffer is closed, we send the buffer id
+ * with body type "buffer" and empty body
+ */
+ buffer_id = -1;
+ ptr_id = weechat_hashtable_get (
+ RELAY_API_DATA(ptr_client, buffers_closing),
+ ptr_buffer);
+ if (ptr_id)
+ {
+ error = NULL;
+ buffer_id = strtoll (ptr_id, &error, 10);
+ if (!error || error[0])
+ buffer_id = -1;
+ weechat_hashtable_remove (
+ RELAY_API_DATA(ptr_client, buffers_closing),
+ ptr_buffer);
+ }
+ relay_api_msg_send_event (ptr_client, signal, buffer_id, "buffer", NULL);
+ return WEECHAT_RC_OK;
+ }
+
+ if (strcmp (signal, "buffer_closing") == 0)
+ {
+ /*
+ * when a buffer is closing, we save its id in the hashtable
+ * "buffers_closing", it will be used when sending the event
+ * "buffer_closed"
+ */
+ weechat_hashtable_set (RELAY_API_DATA(ptr_client, buffers_closing),
+ ptr_buffer,
+ weechat_buffer_get_string (ptr_buffer, "id"));
+ }
+
+ /* we get all lines when a buffer is opened, otherwise none */
lines = (strcmp (signal, "buffer_opened") == 0) ? LONG_MIN : 0;
+
+ /* build body with buffer info */
json = relay_api_msg_buffer_to_json (
ptr_buffer, lines, 0, RELAY_API_DATA(ptr_client, sync_colors));
+
+ /* send to client */
if (json)
{
- relay_api_msg_send_event (ptr_client, signal, NULL, "buffer", json);
+ buffer_id = relay_api_get_buffer_id (ptr_buffer);
+ relay_api_msg_send_event (ptr_client, signal, buffer_id, "buffer", json);
cJSON_Delete (json);
}
}
@@ -127,7 +173,8 @@ relay_api_protocol_signal_buffer_cb (const void *pointer, void *data,
ptr_line_data, RELAY_API_DATA(ptr_client, sync_colors));
if (json)
{
- relay_api_msg_send_event (ptr_client, signal, ptr_buffer,
+ buffer_id = relay_api_get_buffer_id (ptr_buffer);
+ relay_api_msg_send_event (ptr_client, signal, buffer_id,
"line", json);
cJSON_Delete (json);
}
@@ -150,6 +197,7 @@ relay_api_protocol_hsignal_nicklist_cb (const void *pointer, void *data,
struct t_gui_nick_group *ptr_parent_group, *ptr_group;
struct t_gui_nick *ptr_nick;
cJSON *json;
+ long long buffer_id;
/* make C compiler happy */
(void) data;
@@ -170,6 +218,8 @@ relay_api_protocol_hsignal_nicklist_cb (const void *pointer, void *data,
if (!ptr_buffer || relay_buffer_is_relay (ptr_buffer))
return WEECHAT_RC_OK;
+ buffer_id = relay_api_get_buffer_id (ptr_buffer);
+
if ((strcmp (signal, "nicklist_group_added") == 0)
|| (strcmp (signal, "nicklist_group_changed") == 0)
|| (strcmp (signal, "nicklist_group_removing") == 0))
@@ -179,7 +229,7 @@ relay_api_protocol_hsignal_nicklist_cb (const void *pointer, void *data,
RELAY_API_DATA(ptr_client, sync_colors));
if (json)
{
- relay_api_msg_send_event (ptr_client, signal, ptr_buffer,
+ relay_api_msg_send_event (ptr_client, signal, buffer_id,
"nick_group", json);
cJSON_Delete (json);
}
@@ -193,7 +243,7 @@ relay_api_protocol_hsignal_nicklist_cb (const void *pointer, void *data,
RELAY_API_DATA(ptr_client, sync_colors));
if (json)
{
- relay_api_msg_send_event (ptr_client, signal, ptr_buffer,
+ relay_api_msg_send_event (ptr_client, signal, buffer_id,
"nick", json);
cJSON_Delete (json);
}
@@ -226,7 +276,7 @@ relay_api_protocol_signal_upgrade_cb (const void *pointer, void *data,
if ((strcmp (signal, "upgrade") == 0)
|| (strcmp (signal, "upgrade_ended") == 0))
{
- relay_api_msg_send_event (ptr_client, signal, NULL, NULL, NULL);
+ relay_api_msg_send_event (ptr_client, signal, -1, NULL, NULL);
}
return WEECHAT_RC_OK;
diff --git a/src/plugins/relay/api/relay-api.c b/src/plugins/relay/api/relay-api.c
index 633662f73..fda7d06f3 100644
--- a/src/plugins/relay/api/relay-api.c
+++ b/src/plugins/relay/api/relay-api.c
@@ -42,6 +42,32 @@
/*
+ * Returns buffer id.
+ */
+
+long long
+relay_api_get_buffer_id (struct t_gui_buffer *buffer)
+{
+ const char *ptr_id;
+ char *error;
+ long long id;
+
+ if (!buffer)
+ return -1;
+
+ ptr_id = weechat_buffer_get_string (buffer, "id");
+ if (!ptr_id)
+ return -1;
+
+ error = NULL;
+ id = strtoll (ptr_id, &error, 10);
+ if (!error || error[0])
+ return -1;
+
+ return id;
+}
+
+/*
* Returns value of "colors" URL parameter, an enum with one of these values:
* - RELAY_API_COLORS_ANSI (default)
* - RELAY_API_COLORS_WEECHAT
@@ -179,6 +205,12 @@ relay_api_alloc (struct t_relay_client *client)
RELAY_API_DATA(client, hook_signal_buffer) = NULL;
RELAY_API_DATA(client, hook_hsignal_nicklist) = NULL;
RELAY_API_DATA(client, hook_signal_upgrade) = NULL;
+ RELAY_API_DATA(client, buffers_closing) = weechat_hashtable_new (
+ 32,
+ WEECHAT_HASHTABLE_POINTER,
+ WEECHAT_HASHTABLE_STRING,
+ NULL,
+ NULL);
RELAY_API_DATA(client, sync_enabled) = 0;
RELAY_API_DATA(client, sync_nicks) = 0;
RELAY_API_DATA(client, sync_colors) = RELAY_API_COLORS_ANSI;
@@ -201,6 +233,12 @@ relay_api_alloc_with_infolist (struct t_relay_client *client,
RELAY_API_DATA(client, hook_signal_buffer) = NULL;
RELAY_API_DATA(client, hook_hsignal_nicklist) = NULL;
RELAY_API_DATA(client, hook_signal_upgrade) = NULL;
+ RELAY_API_DATA(client, buffers_closing) = weechat_hashtable_new (
+ 32,
+ WEECHAT_HASHTABLE_POINTER,
+ WEECHAT_HASHTABLE_STRING,
+ NULL,
+ NULL);
RELAY_API_DATA(client, sync_enabled) = weechat_infolist_integer (
infolist, "sync_enabled");
RELAY_API_DATA(client, sync_nicks) = weechat_infolist_integer (
@@ -244,6 +282,7 @@ relay_api_free (struct t_relay_client *client)
weechat_unhook (RELAY_API_DATA(client, hook_signal_buffer));
weechat_unhook (RELAY_API_DATA(client, hook_hsignal_nicklist));
weechat_unhook (RELAY_API_DATA(client, hook_signal_upgrade));
+ weechat_hashtable_free (RELAY_API_DATA(client, buffers_closing));
free (client->protocol_data);
@@ -302,6 +341,11 @@ relay_api_print_log (struct t_relay_client *client)
weechat_log_printf (" hook_signal_buffer. . . : %p", RELAY_API_DATA(client, hook_signal_buffer));
weechat_log_printf (" hook_hsignal_nicklist . : %p", RELAY_API_DATA(client, hook_hsignal_nicklist));
weechat_log_printf (" hook_signal_upgrade . . : %p", RELAY_API_DATA(client, hook_signal_upgrade));
+ weechat_log_printf (" buffers_closing. . . . .: %p (hashtable: '%s')",
+ RELAY_API_DATA(client, buffers_closing),
+ weechat_hashtable_get_string (
+ RELAY_API_DATA(client, buffers_closing),
+ "keys_values"));
weechat_log_printf (" sync_enabled. . . . . . : %d", RELAY_API_DATA(client, sync_enabled));
weechat_log_printf (" sync_nicks. . . . . . . : %d", RELAY_API_DATA(client, sync_nicks));
weechat_log_printf (" sync_colors . . . . . . : %d", RELAY_API_DATA(client, sync_colors));
diff --git a/src/plugins/relay/api/relay-api.h b/src/plugins/relay/api/relay-api.h
index 27130f90d..be089ee7b 100644
--- a/src/plugins/relay/api/relay-api.h
+++ b/src/plugins/relay/api/relay-api.h
@@ -56,11 +56,13 @@ struct t_relay_api_data
struct t_hook *hook_signal_buffer; /* hook for signals "buffer_*" */
struct t_hook *hook_hsignal_nicklist; /* hook for hsignals "nicklist_*" */
struct t_hook *hook_signal_upgrade; /* hook for signals "upgrade*" */
+ struct t_hashtable *buffers_closing; /* ptr -> "id" of buffers closing */
int sync_enabled; /* 1 if sync is enabled */
int sync_nicks; /* 1 if nicks are synchronized */
enum t_relay_api_colors sync_colors; /* colors to send with sync */
};
+extern long long relay_api_get_buffer_id (struct t_gui_buffer *buffer);
extern enum t_relay_api_colors relay_api_search_colors (const char *colors);
extern void relay_api_hook_signals (struct t_relay_client *client);
extern void relay_api_unhook_signals (struct t_relay_client *client);
diff --git a/src/plugins/relay/api/remote/relay-remote-event.c b/src/plugins/relay/api/remote/relay-remote-event.c
index bb9fdd4a4..22985afdd 100644
--- a/src/plugins/relay/api/remote/relay-remote-event.c
+++ b/src/plugins/relay/api/remote/relay-remote-event.c
@@ -139,7 +139,7 @@ RELAY_REMOTE_EVENT_CALLBACK(line)
int y;
struct timeval tv_date;
- if (!event->buffer)
+ if (!event->buffer || !event->json)
return WEECHAT_RC_OK;
JSON_GET_NUM(event->json, y, -1);
@@ -217,7 +217,7 @@ relay_remote_event_handle_nick (struct t_gui_buffer *buffer, cJSON *json)
long long id, parent_group_id;
int visible;
- if (!buffer)
+ if (!buffer || !json)
return;
JSON_GET_NUM(json, id, -1);
@@ -276,7 +276,7 @@ relay_remote_event_handle_nick_group (struct t_gui_buffer *buffer, cJSON *json)
long long id, parent_group_id;
int visible;
- if (!buffer)
+ if (!buffer || !json)
return;
JSON_GET_NUM(json, id, -1);
@@ -346,7 +346,7 @@ RELAY_REMOTE_EVENT_CALLBACK(nick_group)
cJSON *json_obj;
long long id;
- if (!event->buffer)
+ if (!event->buffer || !event->json)
return WEECHAT_RC_OK;
if (weechat_strcmp (event->name, "nicklist_group_removing") == 0)
@@ -376,7 +376,7 @@ RELAY_REMOTE_EVENT_CALLBACK(nick)
cJSON *json_obj;
long long id;
- if (!event->buffer)
+ if (!event->buffer || !event->json)
return WEECHAT_RC_OK;
if (weechat_strcmp (event->name, "nicklist_nick_removing") == 0)
@@ -482,6 +482,20 @@ RELAY_REMOTE_EVENT_CALLBACK(buffer)
long long id;
int number, nicklist, nicklist_case_sensitive, nicklist_display_groups;
+ if (weechat_strcmp (event->name, "buffer_closed") == 0)
+ {
+ weechat_buffer_close (event->buffer);
+ return WEECHAT_RC_OK;
+ }
+
+ /* ignore "buffer_closing" event */
+ if (weechat_strcmp (event->name, "buffer_closing") == 0)
+ return WEECHAT_RC_OK;
+
+ /* for other events, we need a body */
+ if (!event->json)
+ return WEECHAT_RC_OK;
+
JSON_GET_NUM(event->json, id, -1);
JSON_GET_STR(event->json, name);
JSON_GET_STR(event->json, short_name);
@@ -522,7 +536,7 @@ RELAY_REMOTE_EVENT_CALLBACK(buffer)
weechat_hashtable_set (buffer_props, "input_get_any_user_data", "1");
/* if buffer exists, set properties, otherwise create buffer */
- ptr_buffer = relay_remote_event_search_buffer (event->remote, id);
+ ptr_buffer = event->buffer;
if (ptr_buffer)
{
weechat_hashtable_map (buffer_props,
@@ -568,7 +582,6 @@ RELAY_REMOTE_EVENT_CALLBACK(buffer)
}
}
-
/* add lines */
json_lines = cJSON_GetObjectItem (event->json, "lines");
if (json_lines && cJSON_IsArray (json_lines))
@@ -602,6 +615,9 @@ RELAY_REMOTE_EVENT_CALLBACK(version)
cJSON *json_obj;
const char *weechat_version, *weechat_version_git, *relay_api_version;
+ if (!event->json)
+ return WEECHAT_RC_OK;
+
JSON_GET_STR(event->json, weechat_version);
JSON_GET_STR(event->json, weechat_version_git);
JSON_GET_STR(event->json, relay_api_version);
@@ -625,6 +641,9 @@ relay_remote_event_sync_with_remote (struct t_relay_remote *remote)
{
cJSON *json, *json_body;
+ if (!remote)
+ return;
+
json = cJSON_CreateObject ();
if (!json)
goto end;