summaryrefslogtreecommitdiff
path: root/libpurple/request-datasheet.c
diff options
context:
space:
mode:
authorTomasz Wasilczyk <twasilczyk@pidgin.im>2014-01-07 18:53:13 +0100
committerTomasz Wasilczyk <twasilczyk@pidgin.im>2014-01-07 18:53:13 +0100
commit6918e618996683a01c6b85ad9a8ba168cf302f9c (patch)
treee32a5cd3ad65cb852071ec7049ca4c13cc831b42 /libpurple/request-datasheet.c
parent944e04da5f7ba9e8e20da6ae7a2acc17b07184b5 (diff)
downloadpidgin-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.c46
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)