about summary refs log tree commit diff stats
path: root/src/xmpp/roster.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp/roster.c')
-rw-r--r--src/xmpp/roster.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c
index 15ac5621..2d66f4a0 100644
--- a/src/xmpp/roster.c
+++ b/src/xmpp/roster.c
@@ -79,6 +79,7 @@ _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
     }
 
     const char *jid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID);
+    const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME);
     const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION);
     if (g_strcmp0(sub, "remove") == 0) {
         roster_remove(jid);
@@ -91,7 +92,7 @@ _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
         pending_out = TRUE;
     }
 
-    roster_update_subscription(jid, sub, pending_out);
+    roster_update(jid, name, sub, pending_out);
 
     return 1;
 }
@@ -238,17 +239,36 @@ roster_contact_offline(const char * const barejid,
 }
 
 void
-roster_update_subscription(const char * const barejid,
+roster_change_handle(const char * const barejid, const char * const handle)
+{
+    PContact contact = g_hash_table_lookup(contacts, barejid);
+
+    if (contact != NULL) {
+        p_contact_set_name(contact, handle);
+    }
+
+    xmpp_conn_t * const conn = connection_get_conn();
+    xmpp_ctx_t * const ctx = connection_get_ctx();
+    xmpp_stanza_t *iq = stanza_create_roster_set(ctx, barejid, handle);
+    xmpp_send(conn, iq);
+    xmpp_stanza_release(iq);
+}
+
+void
+roster_update(const char * const barejid, const char * const name,
     const char * const subscription, gboolean pending_out)
 {
     PContact contact = g_hash_table_lookup(contacts, barejid);
 
     if (contact == NULL) {
-        contact = p_contact_new_subscription(barejid, subscription, pending_out);
+        contact = p_contact_new(barejid, name, subscription, NULL, pending_out);
         g_hash_table_insert(contacts, strdup(barejid), contact);
     } else {
         p_contact_set_subscription(contact, subscription);
         p_contact_set_pending_out(contact, pending_out);
+        if (name != NULL) {
+            p_contact_set_name(contact, name);
+        }
     }
 }