diff --git a/src/server_events.c b/src/server_events.c index 59c461d3..7dc3d850 100644 --- a/src/server_events.c +++ b/src/server_events.c @@ -469,18 +469,24 @@ handle_room_configure(const char * const room, DataForm *form) ui_handle_room_configuration(room, form); } -void -handle_room_config_submit_result(void) -{ - ui_handle_room_config_submit_result(); -} - void handle_room_configuration_form_error(const char * const room, const char * const message) { ui_handle_room_configuration_form_error(room, message); } +void +handle_room_config_submit_result(const char * const room) +{ + ui_handle_room_config_submit_result(room); +} + +void +handle_room_config_submit_result_error(const char * const room, const char * const message) +{ + ui_handle_room_config_submit_result_error(room, message); +} + void handle_room_roster_complete(const char * const room) { diff --git a/src/server_events.h b/src/server_events.h index 06e851f0..868f3000 100644 --- a/src/server_events.h +++ b/src/server_events.h @@ -98,6 +98,7 @@ void handle_ping_result(const char * const from, int millis); void handle_ping_error_result(const char * const from, const char * const error); void handle_room_configure(const char * const room, DataForm *form); void handle_room_configuration_form_error(const char * const from, const char * const message); -void handle_room_config_submit_result(void); +void handle_room_config_submit_result(const char * const room); +void handle_room_config_submit_result_error(const char * const room, const char * const message); #endif diff --git a/src/ui/core.c b/src/ui/core.c index 892dc52a..5a21f7ff 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -2093,9 +2093,75 @@ _ui_handle_room_configuration_form_error(const char * const room, const char * c } static void -_ui_handle_room_config_submit_result(void) +_ui_handle_room_config_submit_result(const char * const room) { - cons_show("GOT ROOM CONFIG SUBMIT RESULT!!!!"); + ProfWin *muc_window = NULL; + ProfWin *form_window = NULL; + int num; + + if (room) { + GString *form_recipient = g_string_new(room); + g_string_append(form_recipient, " config"); + + muc_window = wins_get_by_recipient(room); + form_window = wins_get_by_recipient(form_recipient->str); + g_string_free(form_recipient, TRUE); + + if (form_window) { + num = wins_get_num(form_window); + wins_close_by_num(num); + } + + if (muc_window) { + int num = wins_get_num(muc_window); + ui_switch_win(num); + win_save_print(muc_window, '!', NULL, 0, COLOUR_ROOMINFO, "", "Room configuration successfull"); + } else { + ui_switch_win(1); + cons_show("Room configuration successfull: %s", room); + } + } else { + cons_show("Room configuration successful"); + } +} + +static void +_ui_handle_room_config_submit_result_error(const char * const room, const char * const message) +{ + ProfWin *console = wins_get_console(); + ProfWin *muc_window = NULL; + ProfWin *form_window = NULL; + + if (room) { + GString *form_recipient = g_string_new(room); + g_string_append(form_recipient, " config"); + + muc_window = wins_get_by_recipient(room); + form_window = wins_get_by_recipient(form_recipient->str); + g_string_free(form_recipient, TRUE); + + if (form_window) { + if (message) { + win_save_vprint(form_window, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error: %s", message); + } else { + win_save_print(form_window, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error"); + } + } else if (muc_window) { + if (message) { + win_save_vprint(muc_window, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error: %s", message); + } else { + win_save_print(muc_window, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error"); + } + } else { + if (message) { + win_save_vprint(console, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error for %s: %s", room, message); + } else { + win_save_vprint(console, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error for %s", room); + } + } + } else { + win_save_print(console, '!', NULL, 0, COLOUR_ERROR, "", "Configuration error"); + } } static void @@ -2438,6 +2504,7 @@ ui_init_module(void) ui_room_destroyed = _ui_room_destroyed; ui_handle_room_configuration = _ui_handle_room_configuration; ui_handle_room_config_submit_result = _ui_handle_room_config_submit_result; + ui_handle_room_config_submit_result_error = _ui_handle_room_config_submit_result_error; ui_win_has_unsaved_form = _ui_win_has_unsaved_form; ui_show_form = _ui_show_form; ui_show_form_field = _ui_show_form_field; diff --git a/src/ui/ui.h b/src/ui/ui.h index 33640637..0d0bdc10 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -162,7 +162,8 @@ void (*ui_clear_win_title)(void); void (*ui_handle_room_join_error)(const char * const room, const char * const err); void (*ui_handle_room_configuration)(const char * const room, DataForm *form); void (*ui_handle_room_configuration_form_error)(const char * const room, const char * const message); -void (*ui_handle_room_config_submit_result)(void); +void (*ui_handle_room_config_submit_result)(const char * const room); +void (*ui_handle_room_config_submit_result_error)(const char * const room, const char * const message); void (*ui_show_form)(ProfWin *window, const char * const room, DataForm *form); void (*ui_show_form_field)(ProfWin *window, DataForm *form, char *tag); void (*ui_show_form_help)(ProfWin *window, DataForm *form); diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index 62dfd64a..822e552d 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -666,14 +666,24 @@ _room_config_submit_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stan void * const userdata) { const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID); + const char *type = xmpp_stanza_get_type(stanza); + const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); if (id != NULL) { - log_debug("IQ room config handler fired, id: %s.", id); + log_debug("IQ room config submit handler fired, id: %s.", id); } else { - log_debug("IQ room config handler fired."); + log_debug("IQ room config submit handler fired."); } - handle_room_config_submit_result(); + // handle error responses + if (g_strcmp0(type, STANZA_TYPE_ERROR) == 0) { + char *error_message = stanza_get_error_message(stanza); + handle_room_config_submit_result_error(from, error_message); + free(error_message); + return 0; + } + + handle_room_config_submit_result(from); return 0; }