Handle roomlist requests during connection

This commit is contained in:
mjentsch 2017-05-16 22:59:15 +02:00
parent 8c19fd44b9
commit 0c9fa0b230
3 changed files with 38 additions and 15 deletions

View file

@ -232,6 +232,8 @@ static void update_marked_read (struct tgl_state *TLS, int num, struct tgl_messa
static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int success, int size,
tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) {
info ("Fetched dialogue list of size: %d", size);
connection_data *conn = tls_get_data(TLS);
if (tgp_error_if_false (TLS, success, "Fetching dialogue list failed", TLS->error)) {
return;
}
@ -255,7 +257,12 @@ static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int suc
}
}
// now that the dialogue list is loaded, handle all pending chat joins
// handle pending roomlist request
if (conn->roomlist != NULL && purple_roomlist_get_in_progress (conn->roomlist)) {
tgp_chat_roomlist_populate (TLS);
}
// handle all pending chat joins
tls_get_data (TLS)->dialogues_ready = TRUE;
tgp_chat_join_all_pending (TLS);
}

View file

@ -400,7 +400,7 @@ char *tgprpl_get_chat_name (GHashTable * data) {
return g_strdup (g_hash_table_lookup (data, "subject"));
}
static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) {
static void tgp_chat_roomlist_add (tgl_peer_t *P, void *extra) {
connection_data *conn = extra;
if ((tgl_get_peer_type (P->id) == TGL_PEER_CHAT || tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL)
@ -422,6 +422,26 @@ static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) {
}
}
void tgp_chat_roomlist_populate (struct tgl_state *TLS) {
connection_data *conn = tls_get_data (TLS);
g_return_if_fail(purple_roomlist_get_in_progress (conn->roomlist));
GList *fields = NULL;
PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE);
fields = g_list_append (fields, f);
purple_roomlist_set_fields (conn->roomlist, fields);
tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_add, conn);
purple_roomlist_set_in_progress (conn->roomlist, FALSE);
}
PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) {
debug ("tgprpl_roomlist_get_list()");
connection_data *conn = gc_get_data (gc);
@ -429,21 +449,16 @@ PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) {
if (conn->roomlist) {
purple_roomlist_unref (conn->roomlist);
}
conn->roomlist = purple_roomlist_new (purple_connection_get_account (gc));
GList *fields = NULL;
PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE);
fields = g_list_append (fields, f);
purple_roomlist_set_fields (conn->roomlist, fields);
tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_it, conn);
purple_roomlist_set_in_progress (conn->roomlist, TRUE);
// spectrum2 calls this function when the account is still connection
// all roomlists in progress are being initialised by tgp_on_ready
if (conn->dialogues_ready) {
tgp_chat_roomlist_populate (conn->TLS);
}
return conn->roomlist;
}

View file

@ -52,6 +52,7 @@ void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data);
GList *tgprpl_chat_join_info (PurpleConnection *gc);
PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc);
void tgprpl_roomlist_cancel (PurpleRoomlist *list);
void tgp_chat_roomlist_populate (struct tgl_state *TLS);
GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_name);
void tgp_chat_join_all_pending (struct tgl_state *TLS);
void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who);