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 @@ -1323,6 +1323,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) { 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); } } - - 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"); } + if (g_strcmp0(id, "confreq") == 0) { + prof_handle_room_list(items, from); + } else if (g_strcmp0(id, "discoitemsreq") == 0) { + prof_handle_disco_items(items, from); + } + + g_slist_free_full(items, free); + return 1; }