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 ttentry_amount_handler (xmlNodePtr node, gpointer ttentry_pdata) { struct ttentry_pdata *pdata = ttentry_pdata; gnc_numeric* num = dom_tree_to_gnc_numeric(node); g_return_val_if_fail(num, FALSE); gncTaxTableEntrySetAmount (pdata->ttentry, *num); g_free(num); return TRUE; }
static gboolean invoice_tochargeamt_handler (xmlNodePtr node, gpointer invoice_pdata) { struct invoice_pdata* pdata = static_cast<decltype (pdata)> (invoice_pdata); gnc_numeric* num = dom_tree_to_gnc_numeric (node); g_return_val_if_fail (num, FALSE); gncInvoiceSetToChargeAmount (pdata->invoice, *num); g_free (num); return TRUE; }
static gboolean set_numeric (xmlNodePtr node, GncBillTerm *term, void (*func)(GncBillTerm *, gnc_numeric)) { gnc_numeric* num = dom_tree_to_gnc_numeric (node); g_return_val_if_fail (num, FALSE); func (term, *num); g_free (num); return TRUE; }
static inline gboolean set_numeric(xmlNodePtr node, GncEntry* entry, void (*func)(GncEntry *entry, gnc_numeric num)) { gnc_numeric* num = dom_tree_to_gnc_numeric(node); g_return_val_if_fail(num, FALSE); func(entry, *num); g_free(num); return TRUE; }
static gboolean employee_rate_handler (xmlNodePtr node, gpointer employee_pdata) { struct employee_pdata *pdata = employee_pdata; gnc_numeric *val; val = dom_tree_to_gnc_numeric(node); g_return_val_if_fail(val, FALSE); gncEmployeeSetRate(pdata->employee, *val); g_free(val); return TRUE; }
static inline gboolean set_spl_gnc_num(xmlNodePtr node, Split* spl, void (*func)(Split *spl, gnc_numeric gn)) { gnc_numeric *num = dom_tree_to_gnc_numeric(node); g_return_val_if_fail(num, FALSE); func(spl, *num); g_free(num); return FALSE; }
static gboolean customer_credit_handler (xmlNodePtr node, gpointer cust_pdata) { struct customer_pdata *pdata = cust_pdata; gnc_numeric *val; val = dom_tree_to_gnc_numeric(node); g_return_val_if_fail(val, FALSE); gncCustomerSetCredit(pdata->customer, *val); g_free (val); return TRUE; }
static gboolean customer_discount_handler (xmlNodePtr node, gpointer cust_pdata) { struct customer_pdata* pdata = static_cast<decltype (pdata)> (cust_pdata); gnc_numeric* val; val = dom_tree_to_gnc_numeric (node); g_return_val_if_fail (val, FALSE); gncCustomerSetDiscount (pdata->customer, *val); g_free (val); return TRUE; }
static xmlNodePtr find_appropriate_node (xmlNodePtr node, Split* spl) { xmlNodePtr mark; for (mark = node->xmlChildrenNode; mark; mark = mark->next) { gboolean account_guid_good = FALSE; gboolean amount_good = FALSE; xmlNodePtr mark2; for (mark2 = mark->xmlChildrenNode; mark2; mark2 = mark2->next) { if (g_strcmp0 ((char*)mark2->name, "split:value") == 0) { gnc_numeric* num = dom_tree_to_gnc_numeric (mark2); if (gnc_numeric_equal (*num, xaccSplitGetValue (spl))) { amount_good = TRUE; } g_free (num); } else if (g_strcmp0 ((char*)mark2->name, "split:account") == 0) { GncGUID* accid = dom_tree_to_guid (mark2); Account* account = xaccSplitGetAccount (spl); if (guid_equal (accid, xaccAccountGetGUID (account))) { account_guid_good = TRUE; } g_free (accid); } if (account_guid_good && amount_good) { return mark; } } } return NULL; }
static gchar * test_gnc_nums_internal(gnc_numeric to_test) { gchar *ret = NULL; gnc_numeric *to_compare = NULL; xmlNodePtr to_gen = NULL; to_gen = gnc_numeric_to_dom_tree("test-num", &to_test); if (!to_gen) { ret = "no dom tree created"; } else { to_compare = dom_tree_to_gnc_numeric(to_gen); if (!to_compare) { ret = "no gnc_numeric parsed"; } else { if (!gnc_numeric_equal(to_test, *to_compare)) { ret = "numerics compared different"; } } } if (to_compare) { g_free(to_compare); } if (to_gen) { xmlFreeNode(to_gen); } return ret; }
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; }