about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/server_events.c14
-rw-r--r--src/server_events.h3
-rw-r--r--src/ui/core.c71
-rw-r--r--src/ui/ui.h3
-rw-r--r--src/xmpp/iq.c16
5 files changed, 96 insertions, 11 deletions
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
@@ -470,15 +470,21 @@ handle_room_configure(const char * const room, DataForm *form)
 }
 
 void
-handle_room_config_submit_result(void)
+handle_room_configuration_form_error(const char * const room, const char * const message)
 {
-    ui_handle_room_config_submit_result();
+    ui_handle_room_configuration_form_error(room, message);
 }
 
 void
-handle_room_configuration_form_error(const char * const room, const char * const message)
+handle_room_config_submit_result(const char * const room)
 {
-    ui_handle_room_configuration_form_error(room, message);
+    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
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 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();
+    handle_room_config_submit_result(from);
 
     return 0;
 }