about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/profanity.c7
-rw-r--r--src/profanity.h1
-rw-r--r--src/ui/ui.h1
-rw-r--r--src/ui/windows.c20
-rw-r--r--src/xmpp/iq.c13
5 files changed, 37 insertions, 5 deletions
diff --git a/src/profanity.c b/src/profanity.c
index 627a778e..ffa883f5 100644
--- a/src/profanity.c
+++ b/src/profanity.c
@@ -408,6 +408,13 @@ prof_handle_room_list(GSList *rooms, const char *conference_node)
     win_current_page_off();
 }
 
+void
+prof_handle_disco_items(GSList *items, const char *jid)
+{
+    cons_show_disco_items(items, jid);
+    win_current_page_off();
+}
+
 /*
  * Take a line of input and process it, return TRUE if profanity is to
  * continue, FALSE otherwise
diff --git a/src/profanity.h b/src/profanity.h
index 851cb2d3..bbf6e8c1 100644
--- a/src/profanity.h
+++ b/src/profanity.h
@@ -72,5 +72,6 @@ void prof_handle_version_result(const char * const jid,
     const char * const presence, const char * const name,
     const char * const version, const char * const os);
 void prof_handle_room_list(GSList *rooms, const char *conference_node);
+void prof_handle_disco_items(GSList *items, const char *jid);
 
 #endif
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 9c06089b..d9c9e473 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -174,6 +174,7 @@ void cons_show_software_version(const char * const jid,
     const char * const version, const char * const os);
 void cons_show_account_list(gchar **accounts);
 void cons_show_room_list(GSList *room, const char * const conference_node);
+void cons_show_disco_items(GSList *items, const char * const jid);
 
 // status bar actions
 void status_bar_refresh(void);
diff --git a/src/ui/windows.c b/src/ui/windows.c
index 33b7ace3..b20dbeef 100644
--- a/src/ui/windows.c
+++ b/src/ui/windows.c
@@ -1324,6 +1324,26 @@ cons_show_room_list(GSList *rooms, const char * const conference_node)
 }
 
 void
+cons_show_disco_items(GSList *items, const char * const jid)
+{
+    if ((items != NULL) && (g_slist_length(items) > 0)) {
+        cons_show("Service discovery items for %s:", jid);
+        while (items != NULL) {
+            DiscoItem *item = items->data;
+            _win_show_time(console->win, '-');
+            wprintw(console->win, "  %s", item->jid);
+            if (item->name != NULL) {
+                wprintw(console->win, ", (%s)", item->name);
+            }
+            wprintw(console->win, "\n");
+            items = g_slist_next(items);
+        }
+    } else {
+        cons_show("No service discovery items for %s", jid);
+    }
+}
+
+void
 cons_show_status(const char * const contact)
 {
     PContact pcontact = contact_list_get_contact(contact);
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c
index 5e71fa5b..fbd1b360 100644
--- a/src/xmpp/iq.c
+++ b/src/xmpp/iq.c
@@ -495,10 +495,10 @@ _iq_handle_discoitems_result(xmpp_conn_t * const conn, xmpp_stanza_t * const sta
     const char *stanza_name = NULL;
     const char *item_jid = NULL;
     const char *item_name = NULL;
+    GSList *items = NULL;
 
-    if (g_strcmp0(id, "confreq") == 0) {
+    if ((g_strcmp0(id, "confreq") == 0) || (g_strcmp0(id, "discoitemsreq") == 0)) {
         log_debug("Response to query: %s", id);
-        GSList *items = NULL;
         xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY);
 
         if (query != NULL) {
@@ -523,12 +523,15 @@ _iq_handle_discoitems_result(xmpp_conn_t * const conn, xmpp_stanza_t * const sta
                 child = xmpp_stanza_get_next(child);
             }
         }
+    }
 
+    if (g_strcmp0(id, "confreq") == 0) {
         prof_handle_room_list(items, from);
-        g_slist_free_full(items, free);
-    } else if ((id != NULL) && (g_strcmp0(id, "discoitemsreq") == 0)) {
-        cons_show("GOT DISO ITEMS RESULT");
+    } else if (g_strcmp0(id, "discoitemsreq") == 0) {
+        prof_handle_disco_items(items, from);
     }
 
+    g_slist_free_full(items, free);
+
     return 1;
 }