about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/contact_list.c10
-rw-r--r--src/contact_list.h1
-rw-r--r--src/jabber.c5
3 files changed, 15 insertions, 1 deletions
diff --git a/src/contact_list.c b/src/contact_list.c
index ddbe969c..5eb43324 100644
--- a/src/contact_list.c
+++ b/src/contact_list.c
@@ -72,6 +72,12 @@ contact_list_add(const char * const jid, const char * const name,
     return added;
 }
 
+void
+contact_list_remove(const char * const jid)
+{
+    g_hash_table_remove(contacts, jid);
+}
+
 gboolean
 contact_list_update_contact(const char * const jid, const char * const presence,
     const char * const status)
@@ -103,7 +109,9 @@ contact_list_update_subscription(const char * const jid,
     PContact contact = g_hash_table_lookup(contacts, jid);
 
     if (contact == NULL) {
-        return;
+        contact = p_contact_new(jid, NULL, "offline", NULL, subscription,
+            pending_out);
+        g_hash_table_insert(contacts, strdup(jid), contact);
     } else {
         p_contact_set_subscription(contact, subscription);
         p_contact_set_pending_out(contact, pending_out);
diff --git a/src/contact_list.h b/src/contact_list.h
index 44322048..062cfa65 100644
--- a/src/contact_list.h
+++ b/src/contact_list.h
@@ -30,6 +30,7 @@
 void contact_list_init(void);
 void contact_list_clear(void);
 void contact_list_reset_search_attempts(void);
+void contact_list_remove(const char * const jid);
 gboolean contact_list_add(const char * const jid, const char * const name,
     const char * const presence, const char * const status,
     const char * const subscription, gboolean pending_out);
diff --git a/src/jabber.c b/src/jabber.c
index 3dd4eb77..e03f1e2b 100644
--- a/src/jabber.c
+++ b/src/jabber.c
@@ -802,6 +802,11 @@ _iq_handler(xmpp_conn_t * const conn,
         const char *jid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID);
         const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION);
 
+        if (g_strcmp0(sub, "remove") == 0) {
+            contact_list_remove(jid);
+            return TRUE;
+        }
+
         gboolean pending_out = FALSE;
         const char *ask = xmpp_stanza_get_attribute(item, STANZA_ATTR_ASK);
         if ((ask != NULL) && (strcmp(ask, "subscribe") == 0)) {
89 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220