diff options
-rw-r--r-- | src/plugins/relay/api/relay-api-msg.c | 32 | ||||
-rw-r--r-- | src/plugins/relay/api/relay-api-msg.h | 2 | ||||
-rw-r--r-- | src/plugins/relay/api/relay-api-protocol.c | 62 | ||||
-rw-r--r-- | src/plugins/relay/api/relay-api.c | 44 | ||||
-rw-r--r-- | src/plugins/relay/api/relay-api.h | 2 | ||||
-rw-r--r-- | src/plugins/relay/api/remote/relay-remote-event.c | 33 |
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; |