diff options
author | Tomasz Wasilczyk <twasilczyk@pidgin.im> | 2014-01-07 18:53:13 +0100 |
---|---|---|
committer | Tomasz Wasilczyk <twasilczyk@pidgin.im> | 2014-01-07 18:53:13 +0100 |
commit | 6918e618996683a01c6b85ad9a8ba168cf302f9c (patch) | |
tree | e32a5cd3ad65cb852071ec7049ca4c13cc831b42 /libpurple/request-datasheet.c | |
parent | 944e04da5f7ba9e8e20da6ae7a2acc17b07184b5 (diff) | |
download | pidgin-6918e618996683a01c6b85ad9a8ba168cf302f9c.tar.gz |
Make datasheet refresh easier with marking for removal routines
Diffstat (limited to 'libpurple/request-datasheet.c')
-rw-r--r-- | libpurple/request-datasheet.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/libpurple/request-datasheet.c b/libpurple/request-datasheet.c index 3c9683212c..97a5416d9f 100644 --- a/libpurple/request-datasheet.c +++ b/libpurple/request-datasheet.c @@ -38,6 +38,8 @@ struct _PurpleRequestDatasheet GList *record_list; GHashTable *record_li_by_key; + + GHashTable *marked_for_rem; }; struct _PurpleRequestDatasheetRecord @@ -112,6 +114,9 @@ purple_request_datasheet_free(PurpleRequestDatasheet *sheet) g_list_free_full(sheet->record_list, (GDestroyNotify)purple_request_datasheet_record_free); + if (sheet->marked_for_rem != NULL) + g_hash_table_destroy(sheet->marked_for_rem); + g_free(sheet); } @@ -333,8 +338,10 @@ purple_request_datasheet_record_add(PurpleRequestDatasheet *sheet, g_return_val_if_fail(sheet != NULL, NULL); rec = purple_request_datasheet_record_find(sheet, key); - if (rec != NULL) + if (rec != NULL) { + g_hash_table_remove(sheet->marked_for_rem, key); return rec; + } rec = purple_request_datasheet_record_new(); rec->sheet = sheet; @@ -386,6 +393,43 @@ purple_request_datasheet_record_remove_all(PurpleRequestDatasheet *sheet) purple_signal_emit(sheet, "record-changed", sheet, NULL); } +void +purple_request_datasheet_record_mark_all_for_rem(PurpleRequestDatasheet *sheet) +{ + const GList *it; + + if (sheet->marked_for_rem != NULL) + g_hash_table_destroy(sheet->marked_for_rem); + sheet->marked_for_rem = g_hash_table_new(g_direct_hash, g_direct_equal); + + it = purple_request_datasheet_get_records(sheet); + for (; it != NULL; it = g_list_next(it)) { + PurpleRequestDatasheetRecord *rec = it->data; + gpointer key = purple_request_datasheet_record_get_key(rec); + + g_hash_table_insert(sheet->marked_for_rem, key, key); + } +} + +void +purple_request_datasheet_record_remove_marked(PurpleRequestDatasheet *sheet) +{ + GHashTableIter it; + gpointer key; + GHashTable *rem; + + if (sheet->marked_for_rem == NULL) + return; + rem = sheet->marked_for_rem; + sheet->marked_for_rem = NULL; + + g_hash_table_iter_init(&it, rem); + while (g_hash_table_iter_next(&it, &key, NULL)) + purple_request_datasheet_record_remove(sheet, key); + + g_hash_table_destroy(rem); +} + static void purple_request_datasheet_record_set_common_data( PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *data) |