35 #include "gnc-xml-helper.h"
41 #include "TransactionP.h"
44 #include "gnc-pricedb-p.h"
48 #include "sixtp-dom-parsers.h"
49 #include "sixtp-stack.h"
50 #include "sixtp-parsers.h"
51 #include "sixtp-utils.h"
54 static sixtp* gnc_transaction_parser_new(
void);
57 static sixtp* gnc_account_parser_new(
void);
60 static sixtp* ledger_data_parser_new(
void);
63 static sixtp* commodity_restore_parser_new(
void);
66 static sixtp* generic_gnc_commodity_lookup_parser_new(
void);
72 static sixtp* kvp_frame_parser_new(
void);
75 static sixtp* gnc_pricedb_parser_new(
void);
81 GNC_PARSE_ERR_BAD_VERSION,
87 gboolean seen_version;
147 gnc_parser_configure_for_input_version(
GNCParseStatus *status, gint64 version)
150 status->version = version;
151 status->seen_version = TRUE;
156 status->error = GNC_PARSE_ERR_BAD_VERSION;
164 sixtp *ledger_data_pr = ledger_data_parser_new();
165 g_return_val_if_fail(ledger_data_pr, FALSE);
166 sixtp_add_sub_parser(status->gnc_parser,
"ledger-data", ledger_data_pr);
173 gnc_version_end_handler(gpointer data_for_children,
174 GSList *data_from_children, GSList *sibling_data,
175 gpointer parent_data, gpointer global_data,
176 gpointer *result,
const gchar *tag)
183 g_return_val_if_fail(pstatus, FALSE);
184 if (pstatus->seen_version)
return(FALSE);
186 txt = concatenate_child_result_chars(data_from_children);
187 g_return_val_if_fail(txt, FALSE);
189 ok = string_to_gint64(txt, &version);
191 g_return_val_if_fail(ok, FALSE);
193 if (!gnc_parser_configure_for_input_version(pstatus, version))
return(FALSE);
199 gnc_version_parser_new(
void)
201 return(simple_chars_only_parser_new(gnc_version_end_handler));
231 gnc_parser_before_child_handler(gpointer data_for_children,
232 GSList* data_from_children,
233 GSList* sibling_data,
234 gpointer parent_data,
235 gpointer global_data,
239 const gchar *child_tag)
243 g_return_val_if_fail(pstatus, FALSE);
245 if (strcmp(child_tag,
"ledger-data") == 0)
247 if (pstatus->root_account)
257 gnc_parser_after_child_handler(gpointer data_for_children,
258 GSList* data_from_children,
259 GSList* sibling_data,
260 gpointer parent_data,
261 gpointer global_data,
264 const gchar *child_tag,
268 g_return_val_if_fail(pstatus, FALSE);
270 if (strcmp(child_tag,
"ledger-data") == 0)
272 g_return_val_if_fail(child_result, FALSE);
273 g_return_val_if_fail(child_result->data, FALSE);
274 pstatus->root_account = (
Account *) child_result->data;
275 child_result->should_cleanup = FALSE;
284 return sixtp_set_any(
286 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
287 SIXTP_BEFORE_CHILD_HANDLER_ID, gnc_parser_before_child_handler,
288 SIXTP_AFTER_CHILD_HANDLER_ID, gnc_parser_after_child_handler,
289 SIXTP_NO_MORE_HANDLERS);
300 sixtp *gnc_version_pr;
305 top_level_pr = sixtp_new();
306 g_return_val_if_fail(top_level_pr, FALSE);
307 sixtp_set_chars(top_level_pr, allow_and_ignore_only_whitespace);
310 gnc_pr = gnc_parser_new();
313 sixtp_destroy(top_level_pr);
316 sixtp_add_sub_parser(top_level_pr,
"gnc", gnc_pr);
319 gnc_version_pr = gnc_version_parser_new();
322 sixtp_destroy(top_level_pr);
325 sixtp_add_sub_parser(gnc_pr,
"version", gnc_version_pr);
327 global_parse_status->seen_version = FALSE;
328 global_parse_status->gnc_parser = gnc_pr;
329 global_parse_status->root_account = NULL;
330 global_parse_status->pricedb = NULL;
332 global_parse_status->error = GNC_PARSE_ERR_NONE;
343 gpointer parse_result = NULL;
348 global_parse_status.book = book;
349 g_return_val_if_fail(book, FALSE);
350 g_return_val_if_fail(filename, FALSE);
352 xaccDisableDataScrubbing();
353 top_level_pr = gncxml_setup_for_read (&global_parse_status);
354 g_return_val_if_fail(top_level_pr, FALSE);
356 parse_ok = sixtp_parse_file(top_level_pr,
359 &global_parse_status,
362 sixtp_destroy(top_level_pr);
363 xaccEnableDataScrubbing();
367 if (!global_parse_status.root_account)
return FALSE;
369 root = global_parse_status.root_account;
370 gnc_book_set_root_account(book, root);
376 xaccAccountTreeScrubSplits (root);
391 if ((gnc_is_our_xml_file(filename, NULL)) == GNC_BOOK_XML1_FILE)
443 simple_kvp_value_parser_new(sixtp_end_handler end_handler)
445 return sixtp_set_any(sixtp_new(), FALSE,
446 SIXTP_CHARACTERS_HANDLER_ID,
447 generic_accumulate_chars,
448 SIXTP_END_HANDLER_ID, end_handler,
449 SIXTP_CLEANUP_RESULT_ID, kvp_value_result_cleanup,
450 SIXTP_CLEANUP_CHARS_ID, sixtp_child_free_data,
451 SIXTP_RESULT_FAIL_ID, kvp_value_result_cleanup,
452 SIXTP_CHARS_FAIL_ID, sixtp_child_free_data,
453 SIXTP_NO_MORE_HANDLERS);
475 #define KVP_CVT_VALUE(TYPE) \
482 txt = concatenate_child_result_chars(data_from_children); \
483 g_return_val_if_fail(txt, FALSE); \
485 ok = (gboolean) string_to_##TYPE(txt, &val); \
487 g_return_val_if_fail(ok, FALSE); \
489 kvpv = kvp_value_new_##TYPE(val); \
490 g_return_val_if_fail(kvpv, FALSE); \
498 gint64_kvp_value_end_handler(gpointer data_for_children,
499 GSList* data_from_children,
500 GSList* sibling_data,
501 gpointer parent_data,
502 gpointer global_data,
506 KVP_CVT_VALUE (gint64);
511 gint64_kvp_value_parser_new(
void)
513 return(simple_kvp_value_parser_new(gint64_kvp_value_end_handler));
517 double_kvp_value_end_handler(gpointer data_for_children,
518 GSList* data_from_children,
519 GSList* sibling_data,
520 gpointer parent_data,
521 gpointer global_data,
525 KVP_CVT_VALUE (
double);
529 double_kvp_value_parser_new(
void)
531 return(simple_kvp_value_parser_new(double_kvp_value_end_handler));
535 gnc_numeric_kvp_value_end_handler(gpointer data_for_children,
536 GSList* data_from_children,
537 GSList* sibling_data,
538 gpointer parent_data,
539 gpointer global_data,
547 gnc_numeric_kvp_value_parser_new(
void)
549 return(simple_kvp_value_parser_new(gnc_numeric_kvp_value_end_handler));
553 string_kvp_value_end_handler(gpointer data_for_children,
554 GSList* data_from_children,
555 GSList* sibling_data,
556 gpointer parent_data,
557 gpointer global_data,
564 txt = concatenate_child_result_chars(data_from_children);
565 g_return_val_if_fail(txt, FALSE);
567 kvpv = kvp_value_new_string(txt);
569 g_return_val_if_fail(kvpv, FALSE);
576 string_kvp_value_parser_new(
void)
578 return(simple_kvp_value_parser_new(string_kvp_value_end_handler));
584 guid_kvp_value_end_handler(gpointer data_for_children,
585 GSList* data_from_children,
586 GSList* sibling_data,
587 gpointer parent_data,
588 gpointer global_data,
597 txt = concatenate_child_result_chars(data_from_children);
598 g_return_val_if_fail(txt, FALSE);
603 g_return_val_if_fail(ok, FALSE);
605 kvpv = kvp_value_new_guid(&val);
606 g_return_val_if_fail(kvpv, FALSE);
613 guid_kvp_value_parser_new(
void)
615 return(simple_kvp_value_parser_new(guid_kvp_value_end_handler));
640 glist_kvp_value_end_handler(gpointer data_for_children,
641 GSList *data_from_children, GSList *sibling_data,
642 gpointer parent_data, gpointer global_data,
643 gpointer *result,
const gchar *tag)
650 for (lp = data_from_children; lp; lp = lp->next)
656 result_glist = g_list_prepend(result_glist, kvp);
657 cr->should_cleanup = FALSE;
665 *result = kvp_result;
670 #define KVP_TOKEN(NAME,TOK) \
671 child_pr = NAME##_kvp_value_parser_new(); \
672 g_return_val_if_fail(child_pr, FALSE); \
673 sixtp_add_sub_parser(p, TOK, child_pr);
678 add_all_kvp_value_parsers_as_sub_nodes(
sixtp *p,
679 sixtp *kvp_frame_parser,
684 g_return_val_if_fail(p, FALSE);
685 g_return_val_if_fail(kvp_frame_parser, FALSE);
687 KVP_TOKEN(gint64,
"gint64");
688 KVP_TOKEN(
double,
"double");
690 KVP_TOKEN(
string,
"string");
691 KVP_TOKEN(guid,
"guid");
693 sixtp_add_sub_parser(p,
"glist", glist_parser);
694 sixtp_add_sub_parser(p,
"frame", kvp_frame_parser);
700 glist_kvp_value_parser_new(
sixtp *kvp_frame_parser)
702 sixtp *top_level = sixtp_set_any(
704 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
705 SIXTP_END_HANDLER_ID, glist_kvp_value_end_handler,
706 SIXTP_CLEANUP_RESULT_ID, kvp_value_result_cleanup,
707 SIXTP_RESULT_FAIL_ID, kvp_value_result_cleanup,
708 SIXTP_NO_MORE_HANDLERS);
714 if (!add_all_kvp_value_parsers_as_sub_nodes(top_level,
718 sixtp_destroy(top_level);
757 kvp_frame_slot_end_handler(gpointer data_for_children,
758 GSList *data_from_children, GSList *sibling_data,
759 gpointer parent_data, gpointer global_data,
760 gpointer *result,
const gchar *tag)
764 guint64 key_node_count;
768 gboolean delete_value = FALSE;
770 g_return_val_if_fail(f, FALSE);
772 if (g_slist_length(data_from_children) != 2)
return(FALSE);
775 lp = data_from_children;
777 for (lp = data_from_children; lp; lp = lp->next)
781 if (is_child_result_from_node_named(cr,
"k"))
783 key = (
char *) cr->data;
788 if (is_child_result_from_node_named(cr,
"frame"))
791 value = kvp_value_new_frame (frame);
797 delete_value = FALSE;
804 if (key_node_count != 1)
return(FALSE);
806 value_cr->should_cleanup = TRUE;
814 kvp_frame_slot_parser_new(
sixtp *kvp_frame_parser)
820 g_return_val_if_fail(kvp_frame_parser, NULL);
822 if (!(top_level = sixtp_set_any(
824 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
825 SIXTP_END_HANDLER_ID, kvp_frame_slot_end_handler,
826 SIXTP_NO_MORE_HANDLERS)))
831 child_pr = simple_chars_only_parser_new(NULL);
834 sixtp_destroy(top_level);
837 sixtp_add_sub_parser(top_level,
"k", child_pr);
839 glist_pr = glist_kvp_value_parser_new(kvp_frame_parser);
842 sixtp_destroy(top_level);
846 if (!add_all_kvp_value_parsers_as_sub_nodes(top_level,
850 sixtp_destroy(top_level);
876 kvp_frame_start_handler(GSList* sibling_data, gpointer parent_data,
877 gpointer global_data, gpointer *data_for_children,
878 gpointer *result,
const gchar *tag, gchar **attrs)
881 g_return_val_if_fail(f, FALSE);
882 *data_for_children = f;
887 kvp_frame_end_handler(gpointer data_for_children,
888 GSList *data_from_children, GSList *sibling_data,
889 gpointer parent_data, gpointer global_data,
890 gpointer *result,
const gchar *tag)
893 g_return_val_if_fail(f, FALSE);
899 kvp_frame_fail_handler(gpointer data_for_children,
900 GSList* data_from_children,
901 GSList* sibling_data,
902 gpointer parent_data,
903 gpointer global_data,
919 kvp_frame_parser_new(
void)
923 if (!(top_level = sixtp_set_any(
925 SIXTP_START_HANDLER_ID, kvp_frame_start_handler,
926 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
927 SIXTP_END_HANDLER_ID, kvp_frame_end_handler,
928 SIXTP_CLEANUP_RESULT_ID, kvp_frame_result_cleanup,
929 SIXTP_RESULT_FAIL_ID, kvp_frame_result_cleanup,
930 SIXTP_FAIL_HANDLER_ID, kvp_frame_fail_handler,
931 SIXTP_NO_MORE_HANDLERS)))
936 if (!(sixtp_add_some_sub_parsers(
938 "s", kvp_frame_slot_parser_new(top_level),
971 ledger_data_start_handler(GSList* sibling_data, gpointer parent_data,
972 gpointer global_data, gpointer *data_for_children,
973 gpointer *result,
const gchar *tag, gchar **attrs)
982 g_return_val_if_fail(ra, FALSE);
984 *data_for_children = ra;
989 ledger_data_after_child_handler(gpointer data_for_children,
990 GSList* data_from_children,
991 GSList* sibling_data,
992 gpointer parent_data,
993 gpointer global_data,
996 const gchar *child_tag,
999 if (!child_result)
return(TRUE);
1002 if (child_result->type != SIXTP_CHILD_RESULT_NODE)
return(TRUE);
1003 if (strcmp(child_result->tag,
"pricedb") == 0)
1008 g_return_val_if_fail(pdb, FALSE);
1009 g_return_val_if_fail(status, FALSE);
1011 if (status->pricedb)
1013 PERR(
"hit pricedb twice in data file.");
1016 status->pricedb = pdb;
1017 child_result->should_cleanup = FALSE;
1023 ledger_data_end_handler(gpointer data_for_children,
1024 GSList *data_from_children, GSList *sibling_data,
1025 gpointer parent_data, gpointer global_data,
1026 gpointer *result,
const gchar *tag)
1032 g_return_val_if_fail(ra, FALSE);
1039 g_list_free(descendants);
1048 ledger_data_fail_handler(gpointer data_for_children,
1049 GSList* data_from_children,
1050 GSList* sibling_data,
1051 gpointer parent_data,
1052 gpointer global_data,
1077 ledger_data_parser_new(
void)
1082 if (!(top_level = sixtp_set_any(
1084 SIXTP_START_HANDLER_ID, ledger_data_start_handler,
1085 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
1086 SIXTP_AFTER_CHILD_HANDLER_ID, ledger_data_after_child_handler,
1087 SIXTP_END_HANDLER_ID, ledger_data_end_handler,
1088 SIXTP_CLEANUP_RESULT_ID, ledger_data_result_cleanup,
1089 SIXTP_FAIL_HANDLER_ID, ledger_data_fail_handler,
1090 SIXTP_RESULT_FAIL_ID, ledger_data_result_cleanup,
1091 SIXTP_NO_MORE_HANDLERS)))
1096 if (!sixtp_add_some_sub_parsers(
1098 "commodity", commodity_restore_parser_new(),
1099 "pricedb", gnc_pricedb_parser_new(),
1100 "account", gnc_account_parser_new(),
1101 "transaction", gnc_transaction_parser_new(),
1143 account_start_handler(GSList* sibling_data,
1144 gpointer parent_data,
1145 gpointer global_data,
1146 gpointer *data_for_children,
1152 *data_for_children = parent_data;
1178 account_restore_start_handler(GSList* sibling_data,
1179 gpointer parent_data,
1180 gpointer global_data,
1181 gpointer *data_for_children,
1189 g_return_val_if_fail(acc, FALSE);
1192 *data_for_children = acc;
1199 account_restore_end_handler(gpointer data_for_children,
1200 GSList *data_from_children, GSList *sibling_data,
1201 gpointer parent_data, gpointer global_data,
1202 gpointer *result,
const gchar *tag)
1207 g_return_val_if_fail((parent && acc), FALSE);
1228 account_restore_after_child_handler(gpointer data_for_children,
1229 GSList* data_from_children,
1230 GSList* sibling_data,
1231 gpointer parent_data,
1232 gpointer global_data,
1235 const gchar *child_tag,
1241 g_return_val_if_fail(a, FALSE);
1243 if (!child_result)
return(TRUE);
1244 if (child_result->type != SIXTP_CHILD_RESULT_NODE)
return(TRUE);
1245 if (strcmp(child_result->tag,
"slots") == 0)
1248 g_return_val_if_fail(f, FALSE);
1250 a->inst.kvp_data = f;
1251 child_result->should_cleanup = FALSE;
1253 else if (strcmp(child_result->tag,
"currency") == 0)
1256 g_return_val_if_fail(com, FALSE);
1261 else if (strcmp(child_result->tag,
"security") == 0)
1264 g_return_val_if_fail(com, FALSE);
1274 account_restore_fail_handler(gpointer data_for_children,
1275 GSList* data_from_children,
1276 GSList* sibling_data,
1277 gpointer parent_data,
1278 gpointer global_data,
1309 acc_restore_name_end_handler(gpointer data_for_children,
1310 GSList *data_from_children, GSList *sibling_data,
1311 gpointer parent_data, gpointer global_data,
1312 gpointer *result,
const gchar *tag)
1317 g_return_val_if_fail(acc, FALSE);
1319 name = concatenate_child_result_chars(data_from_children);
1320 g_return_val_if_fail(name, FALSE);
1347 acc_restore_guid_end_handler(gpointer data_for_children,
1348 GSList *data_from_children, GSList *sibling_data,
1349 gpointer parent_data, gpointer global_data,
1350 gpointer *result,
const gchar *tag)
1358 g_return_val_if_fail(acc, FALSE);
1360 txt = concatenate_child_result_chars(data_from_children);
1361 g_return_val_if_fail(txt, FALSE);
1366 g_return_val_if_fail(ok, FALSE);
1373 xaccAccountSetGUID(acc, &gid);
1397 acc_restore_type_end_handler(gpointer data_for_children,
1398 GSList *data_from_children, GSList *sibling_data,
1399 gpointer parent_data, gpointer global_data,
1400 gpointer *result,
const gchar *tag)
1407 g_return_val_if_fail(acc, FALSE);
1409 txt = concatenate_child_result_chars(data_from_children);
1410 g_return_val_if_fail(txt, FALSE);
1415 g_return_val_if_fail(ok, FALSE);
1441 acc_restore_code_end_handler(gpointer data_for_children,
1442 GSList *data_from_children, GSList *sibling_data,
1443 gpointer parent_data, gpointer global_data,
1444 gpointer *result,
const gchar *tag)
1449 g_return_val_if_fail(acc, FALSE);
1451 txt = concatenate_child_result_chars(data_from_children);
1452 g_return_val_if_fail(txt, FALSE);
1480 acc_restore_description_end_handler(gpointer data_for_children,
1481 GSList *data_from_children, GSList *sibling_data,
1482 gpointer parent_data, gpointer global_data,
1483 gpointer *result,
const gchar *tag)
1488 g_return_val_if_fail(acc, FALSE);
1490 txt = concatenate_child_result_chars(data_from_children);
1491 g_return_val_if_fail(txt, FALSE);
1518 acc_restore_notes_end_handler(gpointer data_for_children,
1519 GSList *data_from_children, GSList *sibling_data,
1520 gpointer parent_data, gpointer global_data,
1521 gpointer *result,
const gchar *tag)
1526 g_return_val_if_fail(acc, FALSE);
1528 txt = concatenate_child_result_chars(data_from_children);
1529 g_return_val_if_fail(txt, FALSE);
1559 acc_restore_parent_end_handler(gpointer data_for_children,
1560 GSList *data_from_children, GSList *sibling_data,
1561 gpointer parent_data, gpointer global_data,
1562 gpointer *result,
const gchar *tag)
1570 g_return_val_if_fail(acc, FALSE);
1572 if (g_slist_length(data_from_children) != 1)
1577 if (!is_child_result_from_node_named(child_result,
"guid"))
1581 gid = *((
GncGUID *) child_result->data);
1585 g_return_val_if_fail(parent, FALSE);
1593 parent_lookup_parser_new(
void)
1595 return sixtp_set_any(sixtp_new(), TRUE,
1596 SIXTP_CHARACTERS_HANDLER_ID,
1597 allow_and_ignore_only_whitespace,
1598 SIXTP_END_HANDLER_ID,
1599 acc_restore_parent_end_handler,
1600 SIXTP_NO_MORE_HANDLERS);
1604 gnc_account_parser_new(
void)
1610 if (!(ret = sixtp_set_any(
1612 SIXTP_START_HANDLER_ID, account_start_handler,
1613 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
1614 SIXTP_NO_MORE_HANDLERS)))
1621 sixtp_set_any(sixtp_new(), FALSE,
1622 SIXTP_START_HANDLER_ID, account_restore_start_handler,
1623 SIXTP_END_HANDLER_ID, account_restore_end_handler,
1624 SIXTP_FAIL_HANDLER_ID, account_restore_fail_handler,
1625 SIXTP_AFTER_CHILD_HANDLER_ID,
1626 account_restore_after_child_handler,
1627 SIXTP_NO_MORE_HANDLERS)))
1634 if (!sixtp_add_some_sub_parsers(
1636 "name", restore_char_generator(acc_restore_name_end_handler),
1637 "guid", restore_char_generator(acc_restore_guid_end_handler),
1638 "type", restore_char_generator(acc_restore_type_end_handler),
1639 "code", restore_char_generator(acc_restore_code_end_handler),
1641 restore_char_generator(acc_restore_description_end_handler),
1642 "notes", restore_char_generator(acc_restore_notes_end_handler),
1644 "currency", generic_gnc_commodity_lookup_parser_new(),
1646 "security", generic_gnc_commodity_lookup_parser_new(),
1648 "parent", sixtp_add_some_sub_parsers(
1649 parent_lookup_parser_new(), TRUE,
1650 "guid", generic_guid_parser_new(),
1652 "slots", kvp_frame_parser_new(),
1659 sixtp_add_sub_parser(ret,
"restore", restore_pr);
1717 gboolean seen_fraction;
1722 commodity_restore_start_handler(GSList* sibling_data, gpointer parent_data,
1723 gpointer global_data,
1724 gpointer *data_for_children, gpointer *result,
1725 const gchar *tag, gchar **attrs)
1730 g_return_val_if_fail(cpi, FALSE);
1732 *data_for_children = cpi;
1737 #define COMMOD_TOKEN(NAME) \
1738 if(strcmp(child_result->tag, #NAME) == 0) { \
1739 if(cpi->NAME) return(FALSE); \
1740 cpi->NAME = (gchar *) child_result->data; \
1741 child_result->should_cleanup = FALSE; \
1747 commodity_restore_after_child_handler(gpointer data_for_children,
1748 GSList* data_from_children,
1749 GSList* sibling_data,
1750 gpointer parent_data,
1751 gpointer global_data,
1754 const gchar *child_tag,
1759 g_return_val_if_fail(cpi, FALSE);
1760 g_return_val_if_fail(child_result, FALSE);
1766 if (strcmp(child_result->tag, "fraction") == 0)
1770 if (cpi->seen_fraction)
return(FALSE);
1771 string_to_gint64((gchar *) child_result->data, &frac);
1772 cpi->fraction = frac;
1773 cpi->seen_fraction = TRUE;
1774 child_result->should_cleanup = TRUE;
1786 commodity_restore_end_handler(gpointer data_for_children,
1787 GSList *data_from_children, GSList *sibling_data,
1788 gpointer parent_data, gpointer global_data,
1789 gpointer *result,
const gchar *tag)
1793 gboolean ok = FALSE;
1796 g_return_val_if_fail(cpi, FALSE);
1798 if (cpi->seen_fraction)
1802 if (!cpi->space) cpi->space = g_strdup(
"");
1803 if (!cpi->id) cpi->id = g_strdup(
"");
1804 if (!cpi->name) cpi->name = g_strdup(
"");
1805 if (!cpi->xcode) cpi->xcode = g_strdup(
"");
1840 commodity_restore_parser_new(
void)
1845 top_level = sixtp_new();
1846 g_return_val_if_fail(top_level, NULL);
1848 if (!(restore_pr = sixtp_set_any(
1850 SIXTP_START_HANDLER_ID, commodity_restore_start_handler,
1851 SIXTP_END_HANDLER_ID, commodity_restore_end_handler,
1852 SIXTP_FAIL_HANDLER_ID, generic_free_data_for_children,
1853 SIXTP_AFTER_CHILD_HANDLER_ID, commodity_restore_after_child_handler,
1854 SIXTP_NO_MORE_HANDLERS)))
1856 sixtp_destroy(top_level);
1859 sixtp_add_sub_parser(top_level,
"restore", restore_pr);
1861 if (!sixtp_add_some_sub_parsers(
1863 "space", simple_chars_only_parser_new(NULL),
1864 "id", simple_chars_only_parser_new(NULL),
1865 "name", simple_chars_only_parser_new(NULL),
1866 "xcode", simple_chars_only_parser_new(NULL),
1867 "fraction", simple_chars_only_parser_new(NULL),
1920 generic_gnc_commodity_lookup_start_handler(
1921 GSList* sibling_data, gpointer parent_data, gpointer global_data,
1922 gpointer *data_for_children, gpointer *result,
const gchar *tag,
1926 g_return_val_if_fail(cpi, FALSE);
1927 *data_for_children = cpi;
1932 generic_gnc_commodity_lookup_after_child_handler(gpointer data_for_children,
1933 GSList* data_from_children,
1934 GSList* sibling_data,
1935 gpointer parent_data,
1936 gpointer global_data,
1939 const gchar *child_tag,
1945 g_return_val_if_fail(cpi, FALSE);
1946 g_return_val_if_fail(child_result, FALSE);
1947 if (child_result->type != SIXTP_CHILD_RESULT_NODE)
return(FALSE);
1949 if (strcmp(child_result->tag,
"space") == 0)
1951 if (cpi->name_space)
return(FALSE);
1952 cpi->name_space = (gchar *) child_result->data;
1953 child_result->should_cleanup = FALSE;
1955 else if (strcmp(child_result->tag,
"id") == 0)
1957 if (cpi->id)
return(FALSE);
1958 cpi->id = (gchar *) child_result->data;
1959 child_result->should_cleanup = FALSE;
1971 generic_gnc_commodity_lookup_end_handler(gpointer data_for_children,
1972 GSList *data_from_children, GSList *sibling_data,
1973 gpointer parent_data, gpointer global_data,
1974 gpointer *result,
const gchar *tag)
1979 gboolean ok = FALSE;
1981 g_return_val_if_fail(cpi, FALSE);
1983 if (cpi->name_space && cpi->id)
1990 com = gnc_commodity_table_lookup(table, cpi->name_space, cpi->id);
1999 g_free(cpi->name_space);
2008 generic_gnc_commodity_lookup_parser_new(
void)
2012 if (!(top_level = sixtp_set_any(
2014 SIXTP_START_HANDLER_ID, generic_gnc_commodity_lookup_start_handler,
2015 SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
2016 SIXTP_END_HANDLER_ID, generic_gnc_commodity_lookup_end_handler,
2017 SIXTP_FAIL_HANDLER_ID, generic_free_data_for_children,
2018 SIXTP_AFTER_CHILD_HANDLER_ID,
2019 generic_gnc_commodity_lookup_after_child_handler,
2020 SIXTP_NO_MORE_HANDLERS)))
2025 if (!sixtp_add_some_sub_parsers(
2027 "space", simple_chars_only_parser_new(NULL),
2028 "id", simple_chars_only_parser_new(NULL),
2069 transaction_start_handler(GSList* sibling_data, gpointer parent_data,
2070 gpointer global_data, gpointer *data_for_children,
2071 gpointer *result,
const gchar *tag, gchar **attrs)
2074 *data_for_children = parent_data;
2113 txn_restore_start_handler(GSList* sibling_data, gpointer parent_data,
2114 gpointer global_data, gpointer *data_for_children,
2115 gpointer *result,
const gchar *tag, gchar **attrs)
2120 g_return_val_if_fail(trans, FALSE);
2123 *data_for_children = trans;
2129 txn_restore_end_handler(gpointer data_for_children,
2130 GSList *data_from_children, GSList *sibling_data,
2131 gpointer parent_data, gpointer global_data,
2132 gpointer *result,
const gchar *tag)
2137 g_return_val_if_fail(trans, FALSE);
2160 txn_restore_after_child_handler(gpointer data_for_children,
2161 GSList* data_from_children,
2162 GSList* sibling_data,
2163 gpointer parent_data,
2164 gpointer global_data,
2167 const gchar *child_tag,
2171 g_return_val_if_fail(trans, FALSE);
2172 if (!child_result)
return(TRUE);
2173 if (child_result->type != SIXTP_CHILD_RESULT_NODE)
return(TRUE);
2174 if (strcmp(child_result->tag,
"slots") == 0)
2177 g_return_val_if_fail(f, FALSE);
2178 qof_instance_set_slots(QOF_INSTANCE(trans), f);
2179 child_result->should_cleanup = FALSE;
2185 txn_restore_fail_handler(gpointer data_for_children,
2186 GSList* data_from_children,
2187 GSList* sibling_data,
2188 gpointer parent_data,
2189 gpointer global_data,
2223 txn_restore_guid_end_handler(gpointer data_for_children,
2224 GSList *data_from_children, GSList *sibling_data,
2225 gpointer parent_data, gpointer global_data,
2226 gpointer *result,
const gchar *tag)
2234 g_return_val_if_fail(t, FALSE);
2236 txt = concatenate_child_result_chars(data_from_children);
2237 g_return_val_if_fail(txt, FALSE);
2242 g_return_val_if_fail(ok, FALSE);
2249 xaccTransSetGUID(t, &gid);
2275 txn_restore_num_end_handler(gpointer data_for_children,
2276 GSList *data_from_children, GSList *sibling_data,
2277 gpointer parent_data, gpointer global_data,
2278 gpointer *result,
const gchar *tag)
2283 g_return_val_if_fail(t, FALSE);
2285 txt = concatenate_child_result_chars(data_from_children);
2286 g_return_val_if_fail(txt, FALSE);
2315 txn_restore_description_end_handler(gpointer data_for_children,
2316 GSList *data_from_children, GSList *sibling_data,
2317 gpointer parent_data, gpointer global_data,
2318 gpointer *result,
const gchar *tag)
2323 g_return_val_if_fail(t, FALSE);
2325 txt = concatenate_child_result_chars(data_from_children);
2326 g_return_val_if_fail(txt, FALSE);
2345 txn_rest_date_posted_end_handler(gpointer data_for_children,
2346 GSList *data_from_children, GSList *sibling_data,
2347 gpointer parent_data, gpointer global_data,
2348 gpointer *result,
const gchar *tag)
2353 g_return_val_if_fail(info, FALSE);
2354 if (!t || !timespec_parse_ok(info))
2377 txn_rest_date_entered_end_handler(gpointer data_for_children,
2378 GSList *data_from_children, GSList *sibling_data,
2379 gpointer parent_data, gpointer global_data,
2380 gpointer *result,
const gchar *tag)
2385 g_return_val_if_fail(info, FALSE);
2386 if (!t || !timespec_parse_ok(info))
2424 txn_restore_split_start_handler(GSList* sibling_data, gpointer parent_data,
2425 gpointer global_data,
2426 gpointer *data_for_children, gpointer *result,
2427 const gchar *tag, gchar **attrs)
2431 g_return_val_if_fail(s, FALSE);
2432 *data_for_children = s;
2437 txn_restore_split_end_handler(gpointer data_for_children,
2438 GSList *data_from_children, GSList *sibling_data,
2439 gpointer parent_data, gpointer global_data,
2440 gpointer *result,
const gchar *tag)
2445 g_return_val_if_fail(s, FALSE);
2464 txn_restore_split_after_child_handler(gpointer data_for_children,
2465 GSList* data_from_children,
2466 GSList* sibling_data,
2467 gpointer parent_data,
2468 gpointer global_data,
2471 const gchar *child_tag,
2475 g_return_val_if_fail(s, FALSE);
2476 if (!child_result)
return(TRUE);
2477 if (child_result->type != SIXTP_CHILD_RESULT_NODE)
return(TRUE);
2479 if (strcmp(child_result->tag,
"slots") == 0)
2482 g_return_val_if_fail(f, FALSE);
2484 s->inst.kvp_data = f;
2485 child_result->should_cleanup = FALSE;
2487 else if (strcmp(child_result->tag,
"quantity") == 0)
2490 g_return_val_if_fail(n, FALSE);
2494 else if (strcmp(child_result->tag,
"value") == 0)
2497 g_return_val_if_fail(n, FALSE);
2506 txn_restore_split_fail_handler(gpointer data_for_children,
2507 GSList* data_from_children,
2508 GSList* sibling_data,
2509 gpointer parent_data,
2510 gpointer global_data,
2540 txn_restore_split_guid_end_handler(gpointer data_for_children,
2541 GSList *data_from_children, GSList *sibling_data,
2542 gpointer parent_data, gpointer global_data,
2543 gpointer *result,
const gchar *tag)
2551 g_return_val_if_fail(s, FALSE);
2553 txt = concatenate_child_result_chars(data_from_children);
2554 g_return_val_if_fail(txt, FALSE);
2559 g_return_val_if_fail(ok, FALSE);
2566 xaccSplitSetGUID(s, &gid);
2592 txn_restore_split_memo_end_handler(gpointer data_for_children,
2593 GSList *data_from_children, GSList *sibling_data,
2594 gpointer parent_data, gpointer global_data,
2595 gpointer *result,
const gchar *tag)
2600 g_return_val_if_fail(s, FALSE);
2602 txt = concatenate_child_result_chars(data_from_children);
2603 g_return_val_if_fail(txt, FALSE);
2632 txn_restore_split_action_end_handler(gpointer data_for_children,
2633 GSList *data_from_children, GSList *sibling_data,
2634 gpointer parent_data, gpointer global_data,
2635 gpointer *result,
const gchar *tag)
2640 g_return_val_if_fail(s, FALSE);
2642 txt = concatenate_child_result_chars(data_from_children);
2643 g_return_val_if_fail(txt, FALSE);
2672 txn_restore_split_reconcile_state_end_handler(gpointer data_for_children,
2673 GSList *data_from_children, GSList *sibling_data,
2674 gpointer parent_data, gpointer global_data,
2675 gpointer *result,
const gchar *tag)
2680 g_return_val_if_fail(s, FALSE);
2682 txt = concatenate_child_result_chars(data_from_children);
2683 g_return_val_if_fail(txt, FALSE);
2685 if (strlen(txt) != 1)
2708 txn_restore_split_reconcile_date_end_handler(gpointer data_for_children,
2709 GSList *data_from_children, GSList *sibling_data,
2710 gpointer parent_data, gpointer global_data,
2711 gpointer *result,
const gchar *tag)
2716 g_return_val_if_fail(info, FALSE);
2717 if (!s || !timespec_parse_ok(info))
2750 txn_restore_split_account_end_handler(gpointer data_for_children,
2751 GSList *data_from_children, GSList *sibling_data,
2752 gpointer parent_data, gpointer global_data,
2753 gpointer *result,
const gchar *tag)
2762 g_return_val_if_fail(s, FALSE);
2764 txt = concatenate_child_result_chars(data_from_children);
2765 g_return_val_if_fail(txt, FALSE);
2770 g_return_val_if_fail(ok, FALSE);
2773 g_return_val_if_fail(acct, FALSE);
2786 gnc_txn_restore_split_parser_new(
void)
2791 sixtp_set_any(sixtp_new(), FALSE,
2792 SIXTP_START_HANDLER_ID, txn_restore_split_start_handler,
2793 SIXTP_CHARACTERS_HANDLER_ID,
2794 allow_and_ignore_only_whitespace,
2795 SIXTP_END_HANDLER_ID, txn_restore_split_end_handler,
2796 SIXTP_FAIL_HANDLER_ID, txn_restore_split_fail_handler,
2797 SIXTP_AFTER_CHILD_HANDLER_ID,
2798 txn_restore_split_after_child_handler,
2799 SIXTP_NO_MORE_HANDLERS)))
2804 if (!sixtp_add_some_sub_parsers(
2806 "guid", restore_char_generator(txn_restore_split_guid_end_handler),
2807 "memo", restore_char_generator(txn_restore_split_memo_end_handler),
2809 restore_char_generator(txn_restore_split_action_end_handler),
2811 restore_char_generator(txn_restore_split_account_end_handler),
2813 restore_char_generator(txn_restore_split_reconcile_state_end_handler),
2815 generic_timespec_parser_new(
2816 txn_restore_split_reconcile_date_end_handler),
2817 "quantity", generic_gnc_numeric_parser_new(),
2818 "value", generic_gnc_numeric_parser_new(),
2819 "slots", kvp_frame_parser_new(),
2831 gnc_transaction_parser_new(
void)
2837 sixtp_set_any(sixtp_new(), FALSE,
2838 SIXTP_START_HANDLER_ID, transaction_start_handler,
2839 SIXTP_CHARACTERS_HANDLER_ID,
2840 allow_and_ignore_only_whitespace,
2841 SIXTP_AFTER_CHILD_HANDLER_ID,
2842 txn_restore_after_child_handler,
2843 SIXTP_NO_MORE_HANDLERS)))
2850 sixtp_set_any(sixtp_new(), FALSE,
2851 SIXTP_START_HANDLER_ID, txn_restore_start_handler,
2852 SIXTP_END_HANDLER_ID, txn_restore_end_handler,
2853 SIXTP_FAIL_HANDLER_ID, txn_restore_fail_handler,
2854 SIXTP_AFTER_CHILD_HANDLER_ID,
2855 txn_restore_after_child_handler,
2856 SIXTP_NO_MORE_HANDLERS)))
2858 sixtp_destroy(top_level);
2861 sixtp_add_sub_parser(top_level,
"restore", restore_pr);
2863 if (!(sixtp_add_some_sub_parsers(
2865 "guid", restore_char_generator(txn_restore_guid_end_handler),
2866 "num", restore_char_generator(txn_restore_num_end_handler),
2868 restore_char_generator(txn_restore_description_end_handler),
2870 generic_timespec_parser_new(txn_rest_date_posted_end_handler),
2872 generic_timespec_parser_new(txn_rest_date_entered_end_handler),
2873 "slots", kvp_frame_parser_new(),
2874 "split", gnc_txn_restore_split_parser_new(),
2877 sixtp_destroy(top_level);
2933 price_parse_xml_sub_node(
GNCPrice *p, xmlNodePtr sub_node,
QofBook *book)
2935 if (!p || !sub_node)
return FALSE;
2937 gnc_price_begin_edit (p);
2939 if (g_strcmp0(
"price:id", (
char*)sub_node->name) == 0)
2941 GncGUID *c = dom_tree_to_guid(sub_node);
2942 if (!c)
return FALSE;
2943 gnc_price_set_guid(p, c);
2946 else if (g_strcmp0(
"price:commodity", (
char*)sub_node->name) == 0)
2948 gnc_commodity *c = dom_tree_to_commodity_ref(sub_node, book);
2949 if (!c)
return FALSE;
2950 gnc_price_set_commodity(p, c);
2952 else if (g_strcmp0(
"price:currency", (
char*)sub_node->name) == 0)
2954 gnc_commodity *c = dom_tree_to_commodity_ref(sub_node, book);
2955 if (!c)
return FALSE;
2956 gnc_price_set_currency(p, c);
2958 else if (g_strcmp0(
"price:time", (
char*)sub_node->name) == 0)
2960 Timespec t = dom_tree_to_timespec(sub_node);
2961 if (!dom_tree_valid_timespec(&t, sub_node->name))
return FALSE;
2962 gnc_price_set_time(p, t);
2964 else if (g_strcmp0(
"price:source", (
char*)sub_node->name) == 0)
2966 char *text = dom_tree_to_text(sub_node);
2967 if (!text)
return FALSE;
2968 gnc_price_set_source(p, text);
2971 else if (g_strcmp0(
"price:type", (
char*)sub_node->name) == 0)
2973 char *text = dom_tree_to_text(sub_node);
2974 if (!text)
return FALSE;
2975 gnc_price_set_typestr(p, text);
2978 else if (g_strcmp0(
"price:value", (
char*)sub_node->name) == 0)
2980 gnc_numeric *value = dom_tree_to_gnc_numeric(sub_node);
2981 if (!value)
return FALSE;
2982 gnc_price_set_value(p, *value);
2985 gnc_price_commit_edit (p);
2990 price_parse_xml_end_handler(gpointer data_for_children,
2991 GSList* data_from_children,
2992 GSList* sibling_data,
2993 gpointer parent_data,
2994 gpointer global_data,
2999 xmlNodePtr price_xml = (xmlNodePtr) data_for_children;
3005 if (parent_data)
return TRUE;
3009 if (!price_xml)
return FALSE;
3010 if (price_xml->next)
3013 goto cleanup_and_exit;
3015 if (price_xml->prev)
3018 goto cleanup_and_exit;
3020 if (!price_xml->xmlChildrenNode)
3023 goto cleanup_and_exit;
3030 goto cleanup_and_exit;
3033 for (child = price_xml->xmlChildrenNode; child; child = child->next)
3035 switch (child->type)
3037 case XML_COMMENT_NODE:
3040 case XML_ELEMENT_NODE:
3041 if (!price_parse_xml_sub_node(p, child, pstatus->book))
3044 goto cleanup_and_exit;
3048 PERR(
"Unknown node type (%d) while parsing gnc-price xml.", child->type);
3051 goto cleanup_and_exit;
3066 xmlFreeNode(price_xml);
3077 gnc_price_parser_new (
void)
3079 return sixtp_dom_parser_new(price_parse_xml_end_handler,
3102 pricedb_start_handler(GSList* sibling_data,
3103 gpointer parent_data,
3104 gpointer global_data,
3105 gpointer *data_for_children,
3112 g_return_val_if_fail(db, FALSE);
3118 pricedb_after_child_handler(gpointer data_for_children,
3119 GSList* data_from_children,
3120 GSList* sibling_data,
3121 gpointer parent_data,
3122 gpointer global_data,
3125 const gchar *child_tag,
3130 g_return_val_if_fail(db, FALSE);
3133 if (!child_result)
return(FALSE);
3134 if (child_result->type != SIXTP_CHILD_RESULT_NODE)
return(FALSE);
3136 if (strcmp(child_result->tag,
"price") == 0)
3140 g_return_val_if_fail(p, FALSE);
3158 result->data = NULL;
3163 gnc_pricedb_parser_new(
void)
3166 sixtp *price_parser;
3169 sixtp_set_any(sixtp_new(), TRUE,
3170 SIXTP_START_HANDLER_ID, pricedb_start_handler,
3171 SIXTP_AFTER_CHILD_HANDLER_ID, pricedb_after_child_handler,
3172 SIXTP_CHARACTERS_HANDLER_ID,
3173 allow_and_ignore_only_whitespace,
3174 SIXTP_RESULT_FAIL_ID, pricedb_cleanup_result_handler,
3175 SIXTP_CLEANUP_RESULT_ID, pricedb_cleanup_result_handler,
3176 SIXTP_NO_MORE_HANDLERS);
3178 if (!top_level)
return NULL;
3180 price_parser = gnc_price_parser_new();
3184 sixtp_destroy(top_level);
3188 sixtp_add_sub_parser(top_level,
"price", price_parser);
void xaccAccountSetType(Account *acc, GNCAccountType tip)
void xaccSplitSetValue(Split *s, gnc_numeric amt)
gnc_commodity * gnc_commodity_table_insert(gnc_commodity_table *table, gnc_commodity *comm)
Account * gnc_account_get_parent(const Account *acc)
GNCPrice * gnc_price_create(QofBook *book)
#define xaccTransAppendSplit(t, s)
gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book)
Transaction * xaccMallocTransaction(QofBook *book)
void xaccSplitSetAction(Split *split, const char *actn)
void kvp_frame_set_slot(KvpFrame *frame, const gchar *key, KvpValue *value)
void gnc_account_append_child(Account *new_parent, Account *child)
void xaccAccountTreeScrubCommodities(Account *acc)
gnc_commodity * DxaccAccountGetCurrency(const Account *acc)
void xaccAccountSetNotes(Account *acc, const char *str)
a simple price database for gnucash
gboolean xaccSplitDestroy(Split *split)
void gnc_price_unref(GNCPrice *p)
void xaccLogDisable(void)
gboolean string_to_guid(const gchar *string, GncGUID *guid)
gboolean gnc_pricedb_add_price(GNCPriceDB *db, GNCPrice *p)
void xaccAccountSetCode(Account *acc, const char *str)
void xaccTransSetDescription(Transaction *trans, const char *desc)
void xaccTransSetNum(Transaction *trans, const char *xnum)
Use a 64-bit unsigned int timespec.
void xaccSplitSetReconcile(Split *split, char recn)
#define PERR(format, args...)
api for Version 1 XML-based file format
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
void kvp_frame_delete(KvpFrame *frame)
void xaccTransSetDateEnteredTS(Transaction *trans, const Timespec *ts)
void xaccTransDestroy(Transaction *trans)
void xaccAccountDestroy(Account *acc)
Transaction * xaccTransLookup(const GncGUID *guid, QofBook *book)
convert single-entry accounts to clean double-entry
Split * xaccSplitLookup(const GncGUID *guid, QofBook *book)
void xaccSplitSetAmount(Split *s, gnc_numeric amt)
Account handling public routines.
void xaccSplitSetMemo(Split *split, const char *memo)
void gnc_pricedb_destroy(GNCPriceDB *db)
gnc_commodity * gnc_commodity_new(QofBook *book, const char *fullname, const char *name_space, const char *mnemonic, const char *cusip, int fraction)
void kvp_glist_delete(GList *list)
gboolean xaccAccountStringToType(const char *str, GNCAccountType *type)
void xaccTransCommitEdit(Transaction *trans)
#define xaccSplitGetGUID(X)
void xaccTransBeginEdit(Transaction *trans)
Split * xaccMallocSplit(QofBook *book)
#define xaccTransGetGUID(X)
GList * gnc_account_get_descendants(const Account *account)
API for the transaction logger.
KvpValue * kvp_value_new_glist_nc(GList *lst)
void xaccAccountBeginEdit(Account *acc)
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
#define xaccAccountInsertSplit(acc, s)
gboolean qof_session_load_from_xml_file(QofBook *, const char *filename)
struct KvpFrameImpl KvpFrame
Account * xaccMallocAccount(QofBook *book)
void xaccSplitSetDateReconciledTS(Split *split, Timespec *ts)
KvpFrame * kvp_frame_new(void)
void xaccAccountSetDescription(Account *acc, const char *str)
void DxaccAccountSetCurrency(Account *acc, gnc_commodity *currency)
void kvp_value_delete(KvpValue *value)
API for Transactions and Splits (journal entries)
void xaccAccountCommitEdit(Account *acc)
struct KvpValueImpl KvpValue
void xaccAccountSetName(Account *acc, const char *str)
void gnc_commodity_destroy(gnc_commodity *cm)
gboolean gnc_is_xml_data_file(const gchar *name)
const gchar * QofLogModule
void xaccTransSetDatePostedTS(Transaction *trans, const Timespec *ts)
void xaccAccountSetCommodity(Account *acc, gnc_commodity *com)
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)