Refactored roster add/update
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user