about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2021-06-30 10:42:36 +0200
committerMichael Vetter <jubalh@iodoru.org>2021-06-30 10:45:59 +0200
commitef96bea82e945d2c00426cac21b6578fdce62eb2 (patch)
treeac1223e030696800020fc2ed91785f439144e200
parent2f5aa124cacae454e4b49c2ecbc7ca72bdf63d1c (diff)
downloadprofani-tty-ef96bea82e945d2c00426cac21b6578fdce62eb2.tar.gz
XEP-0157: Print contact addresses
-rw-r--r--src/ui/console.c14
-rw-r--r--src/ui/ui.h1
-rw-r--r--src/xmpp/iq.c19
-rw-r--r--src/xmpp/stanza.c13
-rw-r--r--src/xmpp/stanza.h2
5 files changed, 29 insertions, 20 deletions
diff --git a/src/ui/console.c b/src/ui/console.c
index ad13f0cc..f3993424 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -837,6 +837,20 @@ cons_show_disco_items(GSList* items, const char* const jid)
     cons_alert(NULL);
 }
 
+static void _cons_print_contact_information_item(gpointer key, gpointer value, gpointer userdata)
+{
+    cons_show("%s: %s", (char*)key, (char*)value);
+}
+
+void
+cons_show_disco_contact_information(GHashTable* addresses)
+{
+    cons_show("");
+    cons_show("Server contact information:");
+
+    g_hash_table_foreach(addresses, _cons_print_contact_information_item, NULL);
+}
+
 void
 cons_show_status(const char* const barejid)
 {
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 0c58b09c..441c9adf 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -276,6 +276,7 @@ void cons_show_bookmarks(const GList* list);
 void cons_show_bookmarks_ignore(gchar** list, gsize len);
 void cons_show_disco_items(GSList* items, const char* const jid);
 void cons_show_disco_info(const char* from, GSList* identities, GSList* features);
+void cons_show_disco_contact_information(GHashTable* addresses);
 void cons_show_room_invite(const char* const invitor, const char* const room, const char* const reason);
 void cons_check_version(gboolean not_available_msg);
 void cons_show_typing(const char* const barejid);
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c
index 7af477e6..19b620e2 100644
--- a/src/xmpp/iq.c
+++ b/src/xmpp/iq.c
@@ -2343,22 +2343,9 @@ _disco_info_response_id_handler(xmpp_stanza_t* const stanza, void* const userdat
                     }
                 }
             } else if (g_strcmp0(child_type, STANZA_TYPE_RESULT) == 0) {
-                /*
-                DataForm* form = form_create(child);
-                ProfConfWin* confwin = (ProfConfWin*)wins_new_config(from, form, NULL, NULL, NULL);
-                confwin_handle_configuration(confwin, form);
-                */
-                /*g_hash_table_new () with field var='security-addresses' as key
-                 * a list of  <value>xmpp:security@shakespeare.lit</value> as value
-                 */
-                stanza_get_service_contact_addresses(connection_get_ctx(), child);
-                    /*
-                char* text;
-                size_t text_size;
-                xmpp_stanza_to_text(child, &text, &text_size);
-                cons_show(text);
-                free(text);
-                */
+                GHashTable *adr = stanza_get_service_contact_addresses(connection_get_ctx(), child);
+                cons_show_disco_contact_information(adr);
+                g_hash_table_destroy(adr);
             }
 
             child = xmpp_stanza_get_next(child);
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index 96c47dc7..27e6d647 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -2839,9 +2839,11 @@ stanza_create_muc_register_nick(xmpp_ctx_t* ctx, const char* const id, const cha
     return iq;
 }
 
-void
+GHashTable*
 stanza_get_service_contact_addresses(xmpp_ctx_t* ctx, xmpp_stanza_t* stanza)
 {
+    GHashTable* addresses = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
     xmpp_stanza_t* fields = xmpp_stanza_get_children(stanza);
     while (fields) {
         const char* child_name = xmpp_stanza_get_name(fields);
@@ -2850,22 +2852,27 @@ stanza_get_service_contact_addresses(xmpp_ctx_t* ctx, xmpp_stanza_t* stanza)
         if (g_strcmp0(child_name, STANZA_NAME_FIELD) == 0 && g_strcmp0(child_type, STANZA_TYPE_LIST_MULTI) == 0) {
             // key
             const char* var = xmpp_stanza_get_attribute(fields, STANZA_ATTR_VAR );
-            var = var;
 
             // values
             xmpp_stanza_t* values = xmpp_stanza_get_children(fields);
-            if (values) {
+            while (values) {
                 const char* value_name = xmpp_stanza_get_name(values);
                 if (value_name && (g_strcmp0(value_name, STANZA_NAME_VALUE) == 0)) {
                     char* value_text = xmpp_stanza_get_text(values);
                     if (value_text) {
                         //add to list
+                        g_hash_table_insert(addresses, g_strdup(var), g_strdup(value_text));
+
                         xmpp_free(ctx, value_text);
                     }
                 }
+
+                values = xmpp_stanza_get_next(values);
             }
         }
 
         fields = xmpp_stanza_get_next(fields);
     }
+
+    return addresses;
 }
diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h
index 7856a739..aeddf6a2 100644
--- a/src/xmpp/stanza.h
+++ b/src/xmpp/stanza.h
@@ -389,7 +389,7 @@ char* stanza_get_muc_destroy_reason(xmpp_stanza_t* stanza);
 const char* stanza_get_actor(xmpp_stanza_t* stanza);
 char* stanza_get_reason(xmpp_stanza_t* stanza);
 
-void stanza_get_service_contact_addresses(xmpp_ctx_t* ctx, xmpp_stanza_t* stanza);
+GHashTable* stanza_get_service_contact_addresses(xmpp_ctx_t* ctx, xmpp_stanza_t* stanza);
 
 Resource* stanza_resource_from_presence(XMPPPresence* presence);
 XMPPPresence* stanza_parse_presence(xmpp_stanza_t* stanza, int* err);