static gboolean price_parse_xml_sub_node(GNCPrice *p, xmlNodePtr sub_node, QofBook *book) { if (!p || !sub_node) return FALSE; gnc_price_begin_edit (p); if (g_strcmp0("price:id", (char*)sub_node->name) == 0) { GncGUID *c = dom_tree_to_guid(sub_node); if (!c) return FALSE; gnc_price_set_guid(p, c); g_free(c); } else if (g_strcmp0("price:commodity", (char*)sub_node->name) == 0) { gnc_commodity *c = dom_tree_to_commodity_ref(sub_node, book); if (!c) return FALSE; gnc_price_set_commodity(p, c); } else if (g_strcmp0("price:currency", (char*)sub_node->name) == 0) { gnc_commodity *c = dom_tree_to_commodity_ref(sub_node, book); if (!c) return FALSE; gnc_price_set_currency(p, c); } else if (g_strcmp0("price:time", (char*)sub_node->name) == 0) { Timespec t = dom_tree_to_timespec(sub_node); if (!dom_tree_valid_timespec(&t, sub_node->name)) return FALSE; gnc_price_set_time(p, t); } else if (g_strcmp0("price:source", (char*)sub_node->name) == 0) { char *text = dom_tree_to_text(sub_node); if (!text) return FALSE; gnc_price_set_source(p, text); g_free(text); } else if (g_strcmp0("price:type", (char*)sub_node->name) == 0) { char *text = dom_tree_to_text(sub_node); if (!text) return FALSE; gnc_price_set_typestr(p, text); g_free(text); } else if (g_strcmp0("price:value", (char*)sub_node->name) == 0) { gnc_numeric *value = dom_tree_to_gnc_numeric(sub_node); if (!value) return FALSE; gnc_price_set_value(p, *value); g_free(value); } gnc_price_commit_edit (p); return TRUE; }
static gboolean owner_type_handler (xmlNodePtr node, gpointer owner_pdata) { struct owner_pdata* pdata = static_cast<decltype (pdata)> (owner_pdata); char* txt = dom_tree_to_text (node); g_return_val_if_fail (txt, FALSE); if (!g_strcmp0 (txt, GNC_ID_CUSTOMER)) gncOwnerInitCustomer (pdata->owner, NULL); else if (!g_strcmp0 (txt, GNC_ID_JOB)) gncOwnerInitJob (pdata->owner, NULL); else if (!g_strcmp0 (txt, GNC_ID_VENDOR)) gncOwnerInitVendor (pdata->owner, NULL); else if (!g_strcmp0 (txt, GNC_ID_EMPLOYEE)) gncOwnerInitEmployee (pdata->owner, NULL); else { PWARN ("Unknown owner type: %s", txt); g_free (txt); return FALSE; } g_free (txt); return TRUE; }
gboolean equals_node_val_vs_string(xmlNodePtr node, const gchar* str) { gchar *cmp1; g_return_val_if_fail(node, FALSE); g_return_val_if_fail(str, FALSE); cmp1 = dom_tree_to_text(node); if (!cmp1) { return FALSE; } else if (g_strcmp0(cmp1, str) == 0) { g_free(cmp1); return TRUE; } else { printf("Differing types: node:`%s' vs string:`%s'\n", cmp1, str); g_free(cmp1); return FALSE; } }
static gboolean set_string (xmlNodePtr node, GncBillTerm *term, void (*func)(GncBillTerm *, const char *)) { char* txt = dom_tree_to_text(node); g_return_val_if_fail(txt, FALSE); func (term, txt); g_free(txt); return TRUE; }
static inline gboolean set_string (xmlNodePtr node, GncBudget* bgt, void (*func) (GncBudget* bgt, const gchar* txt)) { gchar* txt = dom_tree_to_text (node); g_return_val_if_fail (txt, FALSE); func (bgt, txt); g_free (txt); return TRUE; }
static gboolean sx_notify_handler( xmlNodePtr node, gpointer sx_pdata ) { struct sx_pdata *pdata = sx_pdata; SchedXaction *sx = pdata->sx; gchar *tmp = dom_tree_to_text( node ); sx->autoCreateNotify = (g_strcmp0( tmp, "y" ) == 0 ? TRUE : FALSE ); return TRUE; }
static gboolean taxtable_name_handler (xmlNodePtr node, gpointer taxtable_pdata) { struct taxtable_pdata *pdata = taxtable_pdata; char* txt = dom_tree_to_text(node); g_return_val_if_fail(txt, FALSE); gncTaxTableSetName (pdata->table, txt); g_free(txt); return TRUE; }
static inline gboolean set_string(xmlNodePtr node, GncEntry* entry, void (*func)(GncEntry *entry, const char *txt)) { char* txt = dom_tree_to_text(node); g_return_val_if_fail(txt, FALSE); func(entry, txt); g_free(txt); return TRUE; }
static void set_commodity_value(xmlNodePtr node, gnc_commodity* com) { if (g_strcmp0((char*) node->name, cmdty_fraction) == 0) { gint64 val; char *string; string = (char*) xmlNodeGetContent (node->xmlChildrenNode); if (string_to_gint64(string, &val)) { gnc_commodity_set_fraction(com, val); } xmlFree (string); } else if (g_strcmp0((char*)node->name, cmdty_get_quotes) == 0) { gnc_commodity_set_quote_flag(com, TRUE); } else if (g_strcmp0((char*)node->name, cmdty_quote_source) == 0) { gnc_quote_source *source; char *string; string = (char*) xmlNodeGetContent (node->xmlChildrenNode); source = gnc_quote_source_lookup_by_internal(string); if (!source) source = gnc_quote_source_add_new(string, FALSE); gnc_commodity_set_quote_source(com, source); xmlFree (string); } else if (g_strcmp0((char*)node->name, cmdty_slots) == 0) { /* We ignore the results here */ dom_tree_create_instance_slots(node, QOF_INSTANCE(com)); } else { struct com_char_handler *mark; for (mark = com_handlers; mark->tag; mark++) { if (g_strcmp0(mark->tag, (char*)node->name) == 0) { gchar* val = dom_tree_to_text(node); g_strstrip(val); (mark->func)(com, val); g_free(val); break; } } } }
static void test_bad_string (void) { const char* badstr = "foo\abar"; const char* sanitized = "foo?bar"; xmlNodePtr test_node = text_to_dom_tree ("test-string", badstr); char* backout = dom_tree_to_text (test_node); do_test_args (g_strcmp0 (backout, sanitized) == 0, "string sanitizing", __FILE__, __LINE__, "with string %s", badstr); }
static gboolean set_string(xmlNodePtr node, GncEmployee* employee, void (*func)(GncEmployee *employee, const char *txt)) { char* txt = dom_tree_to_text(node); g_return_val_if_fail(txt, FALSE); func(employee, txt); g_free(txt); return TRUE; }
static inline gboolean set_spl_string(xmlNodePtr node, Split *spl, void (*func)(Split *spl, const char *txt)) { gchar *tmp = dom_tree_to_text(node); g_return_val_if_fail(tmp, FALSE); func(spl, tmp); g_free(tmp); return TRUE; }
static gboolean sx_name_handler( xmlNodePtr node, gpointer sx_pdata ) { struct sx_pdata *pdata = sx_pdata; SchedXaction *sx = pdata->sx; gchar *tmp = dom_tree_to_text( node ); g_debug("sx named [%s]", tmp); g_return_val_if_fail( tmp, FALSE ); xaccSchedXactionSetName( sx, tmp ); g_free( tmp ); return TRUE; }
static gboolean set_string(xmlNodePtr node, GncAddress* addr, void (*func)(GncAddress *addr, const char *txt)) { gchar* txt = dom_tree_to_text(node); g_return_val_if_fail(txt, FALSE); func(addr, txt); g_free(txt); return TRUE; }
static gboolean set_string(xmlNodePtr node, GncCustomer* cust, void (*func)(GncCustomer *cust, const char *txt)) { char* txt = dom_tree_to_text(node); g_return_val_if_fail(txt, FALSE); func(cust, txt); g_free(txt); return TRUE; }
static gboolean spl_reconciled_state_handler(xmlNodePtr node, gpointer data) { struct split_pdata *pdata = data; gchar *tmp = dom_tree_to_text(node); g_return_val_if_fail(tmp, FALSE); xaccSplitSetReconcile(pdata->split, tmp[0]); g_free(tmp); return TRUE; }
static void test_string_converters (void) { int i; for (i = 0; test_strings[i]; ++i) { const char* mark = test_strings[i]; xmlNodePtr test_node = text_to_dom_tree ("test-string", mark); char* backout = dom_tree_to_text (test_node); do_test_args ( g_strcmp0 (backout, mark) == 0, "string converting", __FILE__, __LINE__, "with string %s", mark); } }
static inline gboolean set_tran_string(xmlNodePtr node, Transaction *trn, void (*func)(Transaction *trn, const char *txt)) { gchar *tmp; tmp = dom_tree_to_text(node); g_return_val_if_fail(tmp, FALSE); func(trn, tmp); g_free(tmp); return TRUE; }
static gboolean ttentry_type_handler (xmlNodePtr node, gpointer taxtable_pdata) { struct ttentry_pdata *pdata = taxtable_pdata; GncAmountType type; char *str; gboolean ret; str = dom_tree_to_text (node); g_return_val_if_fail (str, FALSE); ret = gncAmountStringToType (str, &type); g_free (str); if (ret) gncTaxTableEntrySetType (pdata->ttentry, type); return ret; }
static gboolean vendor_taxincluded_handler (xmlNodePtr node, gpointer vendor_pdata) { struct vendor_pdata* pdata = static_cast<decltype (pdata)> (vendor_pdata); GncTaxIncluded type; char* str; gboolean ret; str = dom_tree_to_text (node); g_return_val_if_fail (str, FALSE); ret = gncTaxIncludedStringToType (str, &type); g_free (str); if (ret) gncVendorSetTaxIncluded (pdata->vendor, type); return ret; }
static gboolean entry_idisctype_handler (xmlNodePtr node, gpointer entry_pdata) { struct entry_pdata* pdata = static_cast<decltype (pdata)> (entry_pdata); GncAmountType type; char* str; gboolean ret; str = dom_tree_to_text (node); g_return_val_if_fail (str, FALSE); ret = gncAmountStringToType (str, &type); g_free (str); if (ret) gncEntrySetInvDiscountType (pdata->entry, type); return ret; }
static gboolean entry_idischow_handler (xmlNodePtr node, gpointer entry_pdata) { struct entry_pdata *pdata = entry_pdata; GncDiscountHow how; char *str; gboolean ret; str = dom_tree_to_text (node); g_return_val_if_fail (str, FALSE); ret = gncEntryDiscountStringToHow (str, &how); g_free (str); if (ret) gncEntrySetInvDiscountHow(pdata->entry, how); return ret; }
static gboolean customer_taxincluded_handler (xmlNodePtr node, gpointer cust_pdata) { struct customer_pdata *pdata = cust_pdata; GncTaxIncluded type; char *str; gboolean ret; str = dom_tree_to_text (node); g_return_val_if_fail (str, FALSE); ret = gncTaxIncludedStringToType (str, &type); g_free (str); if (ret) gncCustomerSetTaxIncluded(pdata->customer, type); return ret; }
/* employee bills */ static gboolean entry_billpayment_handler (xmlNodePtr node, gpointer entry_pdata) { struct entry_pdata *pdata = entry_pdata; GncEntryPaymentType type; char *str; gboolean ret; str = dom_tree_to_text (node); g_return_val_if_fail (str, FALSE); ret = gncEntryPaymentStringToType (str, &type); g_free (str); if (ret) gncEntrySetBillPayment(pdata->entry, type); return ret; }
gboolean equals_node_val_vs_int(xmlNodePtr node, gint64 val) { gchar *text; gint64 test_val; g_return_val_if_fail(node, FALSE); text = dom_tree_to_text(node); if (!string_to_gint64(text, &test_val)) { g_free(text); return FALSE; } g_free(text); return val == test_val; }
static void test_dom_tree_to_text(void) { int i; for (i = 0; i < 20; i++) { gchar *test_string1; gchar *test_string2; xmlNodePtr test_node; test_node = xmlNewNode(NULL, BAD_CAST "test-node"); test_string1 = get_random_string(); xmlNodeAddContent(test_node, BAD_CAST test_string1); test_string2 = dom_tree_to_text(test_node); if (!test_string2) { failure_args("dom_tree_to_text", __FILE__, __LINE__, "null return from dom_tree_to_text"); xmlElemDump(stdout, NULL, test_node); } else if (g_strcmp0(test_string1, test_string2) == 0) { success_args("dom_tree_to_text", __FILE__, __LINE__, "with string %s", test_string1); } else { failure_args("dom_tree_to_text", __FILE__, __LINE__, "with string %s", test_string1); } xmlFreeNode(test_node); g_free(test_string1); if (test_string2) g_free(test_string2); } }
static gchar* node_and_account_equal (xmlNodePtr node, Account* act) { xmlNodePtr mark; while (g_strcmp0 ((char*)node->name, "text") == 0) { node = node->next; } if (!check_dom_tree_version (node, "2.0.0")) { return g_strdup ("version wrong. Not 2.0.0 or not there"); } if (!node->name || g_strcmp0 ((char*)node->name, "gnc:account")) { return g_strdup ("Name of toplevel node is bad"); } for (mark = node->xmlChildrenNode; mark; mark = mark->next) { if (g_strcmp0 ((char*)mark->name, "text") == 0) { } else if (g_strcmp0 ((char*)mark->name, "act:name") == 0) { if (!equals_node_val_vs_string (mark, xaccAccountGetName (act))) { return g_strdup ("names differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:id") == 0) { if (!equals_node_val_vs_guid (mark, xaccAccountGetGUID (act))) { return g_strdup ("ids differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:type") == 0) { gchar* txt; GNCAccountType type; txt = dom_tree_to_text (mark); if (!txt) { return g_strdup ("couldn't get type string"); } else if (!xaccAccountStringToType (txt, &type)) { g_free (txt); return g_strdup ("couldn't convert type string to int"); } else if (type != xaccAccountGetType (act)) { g_free (txt); return g_strdup ("types differ"); } else { g_free (txt); } } else if (g_strcmp0 ((char*)mark->name, "act:commodity") == 0) { /* This is somewhat BS, because if the commodity isn't a currency (and therefore built in) there isn't a corresponding currency in the XML, skip the test. jralls 2010-11-02 */ if (xaccAccountGetCommodity (act) == NULL) continue; if (!equals_node_val_vs_commodity ( mark, xaccAccountGetCommodity (act), gnc_account_get_book (act))) { return g_strdup ("commodities differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:code") == 0) { if (!equals_node_val_vs_string (mark, xaccAccountGetCode (act))) { return g_strdup ("codes differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:description") == 0) { if (!equals_node_val_vs_string ( mark, xaccAccountGetDescription (act))) { return g_strdup ("descriptions differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:slots") == 0) { /* xaccAccountDeleteOldData (act); */ if (!equals_node_val_vs_kvp_frame (mark, qof_instance_get_slots (QOF_INSTANCE (act)))) { return g_strdup ("slots differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:parent") == 0) { if (!equals_node_val_vs_guid ( mark, xaccAccountGetGUID (gnc_account_get_parent (act)))) { return g_strdup ("parent ids differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:commodity-scu") == 0) { if (!equals_node_val_vs_int (mark, xaccAccountGetCommoditySCU (act))) { return g_strdup ("commodity scus differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:hidden") == 0) { if (!equals_node_val_vs_boolean (mark, xaccAccountGetHidden (act))) { return g_strdup ("Hidden flags differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:placeholder") == 0) { if (!equals_node_val_vs_boolean (mark, xaccAccountGetPlaceholder (act))) { return g_strdup ("Placeholder flags differ"); } } else if (g_strcmp0 ((char*)mark->name, "act:security") == 0) { return NULL; // This tag is ignored. } else { return g_strdup_printf ("unknown node in dom tree: %s", mark->name); } } return NULL; }
static const char* node_and_commodity_equal (xmlNodePtr node, const gnc_commodity* com) { xmlNodePtr mark; while (g_strcmp0 ((char*)node->name, "text") == 0) node = node->next; if (!check_dom_tree_version (node, "2.0.0")) { return "version wrong. Not 2.0.0 or not there"; } if (!node->name || g_strcmp0 ((char*)node->name, "gnc:commodity")) { return "Name of toplevel node is bad"; } for (mark = node->xmlChildrenNode; mark; mark = mark->next) { if (g_strcmp0 ((char*)mark->name, "text") == 0) { } else if (g_strcmp0 ((char*)mark->name, "cmdty:space") == 0) { if (!equals_node_val_vs_string ( mark, gnc_commodity_get_namespace_compat (com))) { return "namespaces differ"; } } else if (g_strcmp0 ((char*)mark->name, "cmdty:id") == 0) { if (!equals_node_val_vs_string ( mark, gnc_commodity_get_mnemonic (com))) { return "mnemonic differ"; } } else if (g_strcmp0 ((char*)mark->name, "cmdty:name") == 0) { if (!equals_node_val_vs_string ( mark, gnc_commodity_get_fullname (com))) { return "names differ"; } } else if (g_strcmp0 ((char*)mark->name, "cmdty:xcode") == 0) { if (!equals_node_val_vs_string ( mark, gnc_commodity_get_cusip (com))) { return "exchange codes differ"; } } else if (g_strcmp0 ((char*)mark->name, "cmdty:fraction") == 0) { gchar* txt; gint64 type; txt = dom_tree_to_text (mark); if (!txt) { return "couldn't get fraction string"; } else if (!string_to_gint64 (txt, &type)) { g_free (txt); return "couldn't convert fraction string to int"; } else if (type != gnc_commodity_get_fraction (com)) { g_free (txt); return "fractions differ"; } else { g_free (txt); } } else if (g_strcmp0 ((char*)mark->name, "cmdty:slots") == 0) { if (!equals_node_val_vs_kvp_frame (mark, gnc_commodity_get_kvp_frame (com))) return "slots differ"; } /* Legitimate tags which we don't yet have tests */ else if (g_strcmp0 ((char*)mark->name, "cmdty:get_quotes") == 0 || g_strcmp0 ((char*)mark->name, "cmdty:quote_source") == 0 || g_strcmp0 ((char*)mark->name, "cmdty:quote_tz") == 0) { continue; } else { return "unknown node"; } } return NULL; }
static const char* equals_node_val_vs_split_internal (xmlNodePtr node, Split* spl) { xmlNodePtr mark; for (mark = node->children; mark != NULL; mark = mark->next) { if (g_strcmp0 ((char*)mark->name, "split:id") == 0) { GncGUID* id = dom_tree_to_guid (mark); if (!guid_equal (id, xaccSplitGetGUID (spl))) { g_free (id); return "ids differ"; } g_free (id); } else if (g_strcmp0 ((char*)mark->name, "split:memo") == 0) { char* memo = dom_tree_to_text (mark); if (g_strcmp0 (memo, xaccSplitGetMemo (spl)) != 0) { g_free (memo); return "memos differ"; } g_free (memo); } else if (g_strcmp0 ((char*)mark->name, "split:reconciled-state") == 0) { char* rs = dom_tree_to_text (mark); if (rs[0] != xaccSplitGetReconcile (spl)) { g_free (rs); return "states differ"; } g_free (rs); } else if (g_strcmp0 ((char*)mark->name, "split:value") == 0) { gnc_numeric* num = dom_tree_to_gnc_numeric (mark); gnc_numeric val = xaccSplitGetValue (spl); if (!gnc_numeric_equal (*num, val)) { g_free (num); return g_strdup_printf ("values differ: %" G_GINT64_FORMAT "/%" G_GINT64_FORMAT " v %" G_GINT64_FORMAT "/%" G_GINT64_FORMAT, (*num).num, (*num).denom, val.num, val.denom); } g_free (num); } else if (g_strcmp0 ((char*)mark->name, "split:quantity") == 0) { gnc_numeric* num = dom_tree_to_gnc_numeric (mark); gnc_numeric val = xaccSplitGetAmount (spl); if (!gnc_numeric_equal (*num, val)) { return g_strdup_printf ("quantities differ under _equal: %" G_GINT64_FORMAT "/%" G_GINT64_FORMAT " v %" G_GINT64_FORMAT "/%" G_GINT64_FORMAT, (*num).num, (*num).denom, val.num, val.denom); } if (!gnc_numeric_equal (*num, val)) { g_free (num); return g_strdup_printf ("quantities differ: %" G_GINT64_FORMAT "/%" G_GINT64_FORMAT " v %" G_GINT64_FORMAT "/%" G_GINT64_FORMAT, (*num).num, (*num).denom, val.num, val.denom); } g_free (num); } else if (g_strcmp0 ((char*)mark->name, "split:account") == 0) { GncGUID* id = dom_tree_to_guid (mark); Account* account = xaccSplitGetAccount (spl); if (!guid_equal (id, xaccAccountGetGUID (account))) { g_free (id); return "accounts differ"; } g_free (id); } } return NULL; }