Refactored roster add/update

This commit is contained in:
James Booth
2014-01-05 23:54:29 +00:00
parent 76484665fd
commit db973457d0
8 changed files with 103 additions and 105 deletions

View File

@@ -117,13 +117,6 @@ prof_run(const int disable_tls, char *log_level, char *account_name)
g_timer_destroy(timer);
}
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)
{

View File

@@ -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

View File

@@ -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) {
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);
}
added = TRUE;
if (contact != NULL) {
return FALSE;
}
return added;
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);
return TRUE;
}
char *

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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);