about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/profanity.c7
-rw-r--r--src/profanity.h1
-rw-r--r--src/roster_list.c70
-rw-r--r--src/roster_list.h2
-rw-r--r--src/server_events.c7
-rw-r--r--src/server_events.h1
-rw-r--r--src/xmpp/roster.c12
7 files changed, 49 insertions, 51 deletions
diff --git a/src/profanity.c b/src/profanity.c
index 9178d056..dae91aea 100644
--- a/src/profanity.c
+++ b/src/profanity.c
@@ -118,13 +118,6 @@ prof_run(const int disable_tls, char *log_level, char *account_name)
 }
 
 void
-prof_handle_roster_add(const char * const barejid, const char * const name)
-{
-    ui_roster_add(barejid, name);
-    ui_current_page_off();
-}
-
-void
 prof_handle_idle(void)
 {
     jabber_conn_status_t status = jabber_get_connection_status();
diff --git a/src/profanity.h b/src/profanity.h
index 5e826fc4..c55e6c47 100644
--- a/src/profanity.h
+++ b/src/profanity.h
@@ -30,6 +30,5 @@ void prof_run(const int disable_tls, char *log_level, char *account_name);
 
 void prof_handle_idle(void);
 void prof_handle_activity(void);
-void prof_handle_roster_add(const char * const barejid, const char * const name);
 
 #endif
diff --git a/src/roster_list.c b/src/roster_list.c
index 7945101a..1341320f 100644
--- a/src/roster_list.c
+++ b/src/roster_list.c
@@ -30,7 +30,6 @@
 #include "contact.h"
 #include "jid.h"
 #include "tools/autocomplete.h"
-#include "profanity.h"
 
 // nicknames
 static Autocomplete name_ac;
@@ -201,60 +200,51 @@ roster_update(const char * const barejid, const char * const name,
     GSList *groups, const char * const subscription, gboolean pending_out)
 {
     PContact contact = g_hash_table_lookup(contacts, barejid);
+    assert(contact != NULL);
 
-    if (contact == NULL) {
-        roster_add(barejid, name, groups, subscription, pending_out, FALSE);
-    } else {
-        p_contact_set_subscription(contact, subscription);
-        p_contact_set_pending_out(contact, pending_out);
+    p_contact_set_subscription(contact, subscription);
+    p_contact_set_pending_out(contact, pending_out);
 
-        const char * const new_name = name;
-        const char * current_name = NULL;
-        if (p_contact_name(contact) != NULL) {
-            current_name = strdup(p_contact_name(contact));
-        }
+    const char * const new_name = name;
+    const char * current_name = NULL;
+    if (p_contact_name(contact) != NULL) {
+        current_name = strdup(p_contact_name(contact));
+    }
 
-        p_contact_set_name(contact, new_name);
-        p_contact_set_groups(contact, groups);
-        _replace_name(current_name, new_name, barejid);
+    p_contact_set_name(contact, new_name);
+    p_contact_set_groups(contact, groups);
+    _replace_name(current_name, new_name, barejid);
 
-        // add groups
-        while (groups != NULL) {
-            autocomplete_add(groups_ac, groups->data);
-            groups = g_slist_next(groups);
-        }
+    // add groups
+    while (groups != NULL) {
+        autocomplete_add(groups_ac, groups->data);
+        groups = g_slist_next(groups);
     }
 }
 
 gboolean
 roster_add(const char * const barejid, const char * const name, GSList *groups,
-    const char * const subscription, gboolean pending_out, gboolean from_initial)
+    const char * const subscription, gboolean pending_out)
 {
-    gboolean added = FALSE;
     PContact contact = g_hash_table_lookup(contacts, barejid);
+    if (contact != NULL) {
+        return FALSE;
+    }
 
-    if (contact == NULL) {
-        contact = p_contact_new(barejid, name, groups, subscription, NULL,
-            pending_out);
-
-        // add groups
-        while (groups != NULL) {
-            autocomplete_add(groups_ac, groups->data);
-            groups = g_slist_next(groups);
-        }
-
-        g_hash_table_insert(contacts, strdup(barejid), contact);
-        autocomplete_add(barejid_ac, barejid);
-        _add_name_and_barejid(name, barejid);
-
-        if (!from_initial) {
-            prof_handle_roster_add(barejid, name);
-        }
+    contact = p_contact_new(barejid, name, groups, subscription, NULL,
+        pending_out);
 
-        added = TRUE;
+    // add groups
+    while (groups != NULL) {
+        autocomplete_add(groups_ac, groups->data);
+        groups = g_slist_next(groups);
     }
 
-    return added;
+    g_hash_table_insert(contacts, strdup(barejid), contact);
+    autocomplete_add(barejid_ac, barejid);
+    _add_name_and_barejid(name, barejid);
+
+    return TRUE;
 }
 
 char *
diff --git a/src/roster_list.h b/src/roster_list.h
index a7198e5c..58490609 100644
--- a/src/roster_list.h
+++ b/src/roster_list.h
@@ -42,7 +42,7 @@ void roster_remove(const char * const name, const char * const barejid);
 void roster_update(const char * const barejid, const char * const name,
     GSList *groups, const char * const subscription, gboolean pending_out);
 gboolean roster_add(const char * const barejid, const char * const name, GSList *groups,
-    const char * const subscription, gboolean pending_out, gboolean from_initial);
+    const char * const subscription, gboolean pending_out);
 char * roster_barejid_from_name(const char * const name);
 GSList * roster_get_contacts(void);
 gboolean roster_has_pending_subscriptions(void);
diff --git a/src/server_events.c b/src/server_events.c
index cbf2de3c..ac940c86 100644
--- a/src/server_events.c
+++ b/src/server_events.c
@@ -366,3 +366,10 @@ handle_roster_remove(const char * const barejid)
     ui_roster_remove(barejid);
     ui_current_page_off();
 }
+
+void
+handle_roster_add(const char * const barejid, const char * const name)
+{
+    ui_roster_add(barejid, name);
+    ui_current_page_off();
+}
diff --git a/src/server_events.h b/src/server_events.h
index b79e9c7b..ce3c3b49 100644
--- a/src/server_events.h
+++ b/src/server_events.h
@@ -71,5 +71,6 @@ void handle_group_add(const char * const contact,
 void handle_group_remove(const char * const contact,
     const char * const group);
 void handle_roster_remove(const char * const barejid);
+void handle_roster_add(const char * const barejid, const char * const name);
 
 #endif
diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c
index 3da8c7d3..a70436e7 100644
--- a/src/xmpp/roster.c
+++ b/src/xmpp/roster.c
@@ -255,7 +255,15 @@ _roster_handle_push(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
         GSList *groups = _get_groups_from_item(item);
 
         // update the local roster
-        roster_update(barejid, name, groups, sub, pending_out);
+        PContact contact = roster_get_contact(barejid);
+        if (contact == NULL) {
+            gboolean added = roster_add(barejid, name, groups, sub, pending_out);
+            if (added) {
+                handle_roster_add(barejid, name);
+            }
+        } else {
+            roster_update(barejid, name, groups, sub, pending_out);
+        }
     }
 
     return 1;
@@ -289,7 +297,7 @@ _roster_handle_result(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
 
             GSList *groups = _get_groups_from_item(item);
 
-            gboolean added = roster_add(barejid, name, groups, sub, pending_out, TRUE);
+            gboolean added = roster_add(barejid, name, groups, sub, pending_out);
 
             if (!added) {
                 log_warning("Attempt to add contact twice: %s", barejid);