31 #include "qif-import-p.h"
32 #include "qif-objects-p.h"
34 static void qif_object_map_get_helper(gpointer key, gpointer value, gpointer listp);
41 ctx->object_lists = g_hash_table_new(g_str_hash, g_str_equal);
42 ctx->object_maps = g_hash_table_new(g_str_hash, g_str_equal);
56 for (node = ctx->files; node; node = temp)
60 qif_context_destroy(fctx);
66 if (ctx->handler && ctx->handler->end)
67 ctx->handler->end(ctx);
70 qif_object_list_destroy(ctx);
71 qif_object_map_destroy(ctx);
75 ctx->parent->files = g_list_remove(ctx->parent->files, ctx);
77 g_free(ctx->filename);
79 g_assert(ctx->files == NULL);
84 qif_context_get_foo_helper(
QifContext ctx, GFunc get_helper)
87 GList *node, *list = NULL;
90 g_return_val_if_fail(ctx, NULL);
91 g_return_val_if_fail(ctx->parsed, NULL);
92 g_return_val_if_fail(get_helper, NULL);
94 ht = g_hash_table_new(g_direct_hash, g_direct_equal);
96 for (node = ctx->files; node; node = node->next)
99 qif_object_list_foreach(fctx, QIF_O_TXN, get_helper, ht);
102 g_hash_table_foreach(ht, qif_object_map_get_helper, &list);
103 g_hash_table_destroy(ht);
109 qif_get_accts_helper(gpointer obj, gpointer htp)
113 GHashTable *ht = htp;
117 g_hash_table_insert(ht, txn->from_acct, txn->from_acct);
121 for (node = txn->splits; node; node = node->next)
124 if (split->cat.obj && split->cat_is_acct)
125 g_hash_table_insert(ht, split->cat.acct, split->cat.acct);
132 return qif_context_get_foo_helper(ctx, qif_get_accts_helper);
136 qif_get_cats_helper(gpointer obj, gpointer htp)
140 GHashTable *ht = htp;
145 for (node = txn->splits; node; node = node->next)
148 if (split->cat.obj && !split->cat_is_acct)
149 g_hash_table_insert(ht, split->cat.cat, split->cat.cat);
156 return qif_context_get_foo_helper(ctx, qif_get_cats_helper);
166 qif_object_map_count(
QifContext ctx,
const char *type)
170 g_return_val_if_fail(ctx, 0);
171 g_return_val_if_fail(ctx->object_maps, 0);
172 g_return_val_if_fail(type, 0);
174 ht = g_hash_table_lookup(ctx->object_maps, type);
178 return g_hash_table_size(ht);
182 qif_object_map_foreach(
QifContext ctx,
const char *type, GHFunc func, gpointer arg)
186 g_return_if_fail(ctx);
187 g_return_if_fail(ctx->object_maps);
188 g_return_if_fail(type);
190 ht = g_hash_table_lookup(ctx->object_maps, type);
192 g_hash_table_foreach(ht, func, arg);
200 g_return_if_fail(ctx);
201 g_return_if_fail(ctx->object_maps);
202 g_return_if_fail(key);
203 g_return_if_fail(obj);
204 g_return_if_fail(obj->type);
206 ht = g_hash_table_lookup(ctx->object_maps, obj->type);
209 ht = g_hash_table_new(g_str_hash, g_str_equal);
211 g_hash_table_insert(ctx->object_maps, (gpointer)obj->type, ht);
214 g_hash_table_insert(ht, (gpointer)key, obj);
218 qif_object_map_remove(
QifContext ctx,
const char *type,
const char *key)
222 g_return_if_fail(ctx);
223 g_return_if_fail(ctx->object_maps);
224 g_return_if_fail(type);
225 g_return_if_fail(key);
227 ht = g_hash_table_lookup(ctx->object_maps, type);
230 g_hash_table_remove(ht, key);
234 qif_object_map_lookup(
QifContext ctx,
const char *type,
const char *key)
238 g_return_val_if_fail(ctx, NULL);
239 g_return_val_if_fail(ctx->object_maps, NULL);
240 g_return_val_if_fail(type, NULL);
241 g_return_val_if_fail(key, NULL);
243 ht = g_hash_table_lookup(ctx->object_maps, type);
244 if (!ht)
return NULL;
246 return g_hash_table_lookup(ht, key);
252 qif_object_map_get_helper(gpointer key, gpointer value, gpointer arg)
255 g_return_if_fail(listp);
257 *listp = g_list_prepend(*listp, value);
261 qif_object_map_get(
QifContext ctx,
const char *type)
266 g_return_val_if_fail(ctx, NULL);
267 g_return_val_if_fail(ctx->object_maps, NULL);
268 g_return_val_if_fail(type, NULL);
270 ht = g_hash_table_lookup(ctx->object_maps, type);
274 g_hash_table_foreach(ht, qif_object_map_get_helper, &list);
280 qif_object_map_remove_each(gpointer key, gpointer value, gpointer arg)
288 qif_object_map_remove_all(gpointer key, gpointer value, gpointer arg)
290 GHashTable *ht = value;
292 g_hash_table_foreach_remove(ht, qif_object_map_remove_each, NULL);
293 g_hash_table_destroy(ht);
299 g_return_if_fail(ctx);
300 g_return_if_fail(ctx->object_maps);
302 g_hash_table_foreach_remove(ctx->object_maps, qif_object_map_remove_all, NULL);
303 g_hash_table_destroy(ctx->object_maps);
313 qif_object_list_reverse(
QifContext ctx,
const char *type)
317 g_return_if_fail(ctx);
318 g_return_if_fail(ctx->object_lists);
319 g_return_if_fail(type);
321 list = qif_object_list_get(ctx, type);
322 list = g_list_reverse(list);
323 g_hash_table_insert(ctx->object_lists, (gpointer)type, list);
327 qif_object_list_count(
QifContext ctx,
const char *type)
331 g_return_val_if_fail(ctx, 0);
332 g_return_val_if_fail(ctx->object_lists, 0);
333 g_return_val_if_fail(type, 0);
335 list = g_hash_table_lookup(ctx->object_lists, type);
336 return g_list_length(list);
340 qif_object_list_foreach(
QifContext ctx,
const char *type, GFunc func, gpointer arg)
344 g_return_if_fail(ctx);
345 g_return_if_fail(ctx->object_lists);
346 g_return_if_fail(type);
348 list = qif_object_list_get(ctx, type);
349 g_list_foreach(list, func, arg);
357 g_return_if_fail(ctx);
358 g_return_if_fail(ctx->object_lists);
359 g_return_if_fail(obj);
360 g_return_if_fail(obj->type && *obj->type);
362 list = g_hash_table_lookup(ctx->object_lists, obj->type);
363 list = g_list_prepend(list, obj);
364 g_hash_table_insert(ctx->object_lists, (gpointer)obj->type, list);
372 g_return_if_fail(ctx);
373 g_return_if_fail(ctx->object_lists);
374 g_return_if_fail(obj);
375 g_return_if_fail(obj->type && *obj->type);
377 list = g_hash_table_lookup(ctx->object_lists, obj->type);
378 list = g_list_remove(list, obj);
379 g_hash_table_insert(ctx->object_lists, (gpointer)obj->type, list);
383 qif_object_list_get(
QifContext ctx,
const char *type)
385 g_return_val_if_fail(ctx, NULL);
386 g_return_val_if_fail(ctx->object_lists, NULL);
387 g_return_val_if_fail(type, NULL);
389 return g_hash_table_lookup(ctx->object_lists, type);
393 qif_object_list_remove_all(gpointer key, gpointer value, gpointer arg)
399 for (node = list; node; node = node->next)
412 g_return_if_fail(ctx);
413 g_return_if_fail(ctx->object_lists);
415 g_hash_table_foreach_remove(ctx->object_lists, qif_object_list_remove_all, NULL);
416 g_hash_table_destroy(ctx->object_lists);