mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Handle presence received before roster
Presence of contact not found in roster are filtered out. But sometimes roster is received after a first few presences. We choose to store presences until we receive roster and then process this presences. Fixes #1050
This commit is contained in:
parent
3d3eabb63f
commit
973a05d15a
@ -115,6 +115,7 @@ sv_ev_roster_received(void)
|
|||||||
ui_show_roster();
|
ui_show_roster();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
roster_process_pending_presence();
|
||||||
char *account_name = session_get_account_name();
|
char *account_name = session_get_account_name();
|
||||||
|
|
||||||
#ifdef HAVE_LIBGPGME
|
#ifdef HAVE_LIBGPGME
|
||||||
|
@ -67,7 +67,15 @@ typedef struct prof_roster_t {
|
|||||||
GHashTable *group_count;
|
GHashTable *group_count;
|
||||||
} ProfRoster;
|
} ProfRoster;
|
||||||
|
|
||||||
|
typedef struct pending_presence {
|
||||||
|
char *barejid;
|
||||||
|
Resource *resource;
|
||||||
|
GDateTime *last_activity;
|
||||||
|
} ProfPendingPresence;
|
||||||
|
|
||||||
static ProfRoster *roster = NULL;
|
static ProfRoster *roster = NULL;
|
||||||
|
static gboolean roster_received = FALSE;
|
||||||
|
static GSList *roster_pending_presence = NULL;
|
||||||
|
|
||||||
static gboolean _key_equals(void *key1, void *key2);
|
static gboolean _key_equals(void *key1, void *key2);
|
||||||
static gboolean _datetimes_equal(GDateTime *dt1, GDateTime *dt2);
|
static gboolean _datetimes_equal(GDateTime *dt1, GDateTime *dt2);
|
||||||
@ -87,6 +95,9 @@ roster_create(void)
|
|||||||
roster->name_to_barejid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
roster->name_to_barejid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
||||||
roster->groups_ac = autocomplete_new();
|
roster->groups_ac = autocomplete_new();
|
||||||
roster->group_count = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
|
roster->group_count = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
|
||||||
|
|
||||||
|
roster_received = FALSE;
|
||||||
|
roster_pending_presence = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -114,6 +125,18 @@ roster_update_presence(const char *const barejid, Resource *resource, GDateTime
|
|||||||
assert(barejid != NULL);
|
assert(barejid != NULL);
|
||||||
assert(resource != NULL);
|
assert(resource != NULL);
|
||||||
|
|
||||||
|
if (!roster_received) {
|
||||||
|
ProfPendingPresence *presence = malloc(sizeof(ProfPendingPresence));
|
||||||
|
presence->barejid = strdup(barejid);
|
||||||
|
presence->resource = resource;
|
||||||
|
presence->last_activity = last_activity;
|
||||||
|
if (last_activity) {
|
||||||
|
g_date_time_ref(last_activity);
|
||||||
|
}
|
||||||
|
roster_pending_presence = g_slist_append(roster_pending_presence, presence);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
PContact contact = roster_get_contact(barejid);
|
PContact contact = roster_get_contact(barejid);
|
||||||
if (contact == NULL) {
|
if (contact == NULL) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -664,3 +687,23 @@ roster_compare_presence(PContact a, PContact b)
|
|||||||
return roster_compare_name(a, b);
|
return roster_compare_name(a, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
roster_process_pending_presence(void)
|
||||||
|
{
|
||||||
|
roster_received = TRUE;
|
||||||
|
|
||||||
|
GSList *iter;
|
||||||
|
for (iter = roster_pending_presence; iter != NULL; iter = iter->next) {
|
||||||
|
ProfPendingPresence *presence = iter->data;
|
||||||
|
roster_update_presence(presence->barejid, presence->resource, presence->last_activity);
|
||||||
|
free(presence->barejid);
|
||||||
|
/* seems like resource isn't free on the calling side */
|
||||||
|
if (presence->last_activity) {
|
||||||
|
g_date_time_unref(presence->last_activity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_free(roster_pending_presence);
|
||||||
|
roster_pending_presence = NULL;
|
||||||
|
}
|
||||||
|
@ -72,5 +72,6 @@ GSList* roster_get_contacts_by_presence(const char *const presence);
|
|||||||
char* roster_get_msg_display_name(const char *const barejid, const char *const resource);
|
char* roster_get_msg_display_name(const char *const barejid, const char *const resource);
|
||||||
gint roster_compare_name(PContact a, PContact b);
|
gint roster_compare_name(PContact a, PContact b);
|
||||||
gint roster_compare_presence(PContact a, PContact b);
|
gint roster_compare_presence(PContact a, PContact b);
|
||||||
|
void roster_process_pending_presence(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user