xmlNodePtr gnc_transaction_dom_tree_create(Transaction *trn) { xmlNodePtr ret; gchar *str = NULL; ret = xmlNewNode(NULL, BAD_CAST "gnc:transaction"); xmlSetProp(ret, BAD_CAST "version", BAD_CAST transaction_version_string); xmlAddChild(ret, guid_to_dom_tree("trn:id", xaccTransGetGUID(trn))); xmlAddChild(ret, commodity_ref_to_dom_tree("trn:currency", xaccTransGetCurrency(trn))); str = g_strdup (xaccTransGetNum(trn)); if (str && (g_strcmp0(str, "") != 0)) { xmlNewTextChild(ret, NULL, BAD_CAST "trn:num", checked_char_cast (str)); } g_free (str); add_timespec(ret, "trn:date-posted", xaccTransRetDatePostedTS(trn), TRUE); add_timespec(ret, "trn:date-entered", xaccTransRetDateEnteredTS(trn), TRUE); str = g_strdup (xaccTransGetDescription(trn)); if (str) { xmlNewTextChild(ret, NULL, BAD_CAST "trn:description", checked_char_cast (str)); } g_free (str); { xmlNodePtr kvpnode = kvp_frame_to_dom_tree("trn:slots", xaccTransGetSlots(trn)); if (kvpnode) { xmlAddChild(ret, kvpnode); } } add_trans_splits(ret, trn); return ret; }
xmlNodePtr gnc_transaction_dom_tree_create (Transaction* trn) { xmlNodePtr ret; gchar* str = NULL; ret = xmlNewNode (NULL, BAD_CAST "gnc:transaction"); xmlSetProp (ret, BAD_CAST "version", BAD_CAST transaction_version_string); xmlAddChild (ret, guid_to_dom_tree ("trn:id", xaccTransGetGUID (trn))); xmlAddChild (ret, commodity_ref_to_dom_tree ("trn:currency", xaccTransGetCurrency (trn))); str = g_strdup (xaccTransGetNum (trn)); if (str && (g_strcmp0 (str, "") != 0)) { xmlNewTextChild (ret, NULL, BAD_CAST "trn:num", checked_char_cast (str)); } g_free (str); add_timespec (ret, "trn:date-posted", xaccTransRetDatePostedTS (trn), TRUE); add_timespec (ret, "trn:date-entered", xaccTransRetDateEnteredTS (trn), TRUE); str = g_strdup (xaccTransGetDescription (trn)); if (str) { xmlNewTextChild (ret, NULL, BAD_CAST "trn:description", checked_char_cast (str)); } g_free (str); /* xmlAddChild won't do anything with a NULL, so tests are superfluous. */ xmlAddChild (ret, qof_instance_slots_to_dom_tree ("trn:slots", QOF_INSTANCE (trn))); add_trans_splits (ret, trn); return ret; }
static const char* node_and_transaction_equal (xmlNodePtr node, Transaction* trn) { 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:transaction")) { 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, "trn:id") == 0) { if (!equals_node_val_vs_guid (mark, xaccTransGetGUID (trn))) { return "ids differ"; } } /* This test will fail for many splits where the transaction has * splits in different commodities -- eg, buying or selling a * stock. jralls 2010-11-02 */ else if (g_strcmp0 ((char*)mark->name, "trn:currency") == 0) { #if 0 if (!equals_node_val_vs_commodity ( mark, xaccTransGetCurrency (trn), xaccTransGetBook (trn))) { return g_strdup ("currencies differ"); } #endif } else if (g_strcmp0 ((char*)mark->name, "trn:num") == 0) { if (!equals_node_val_vs_string (mark, xaccTransGetNum (trn))) { return "nums differ"; } } else if (g_strcmp0 ((char*)mark->name, "trn:date-posted") == 0) { if (!equals_node_val_vs_date (mark, xaccTransRetDatePostedTS (trn))) { return "posted dates differ"; } } else if (g_strcmp0 ((char*)mark->name, "trn:date-entered") == 0) { if (!equals_node_val_vs_date (mark, xaccTransRetDateEnteredTS (trn))) { return "entered dates differ"; } } else if (g_strcmp0 ((char*)mark->name, "trn:description") == 0) { if (!equals_node_val_vs_string (mark, xaccTransGetDescription (trn))) { return "descriptions differ"; } } else if (g_strcmp0 ((char*)mark->name, "trn:slots") == 0) { if (!equals_node_val_vs_kvp_frame (mark, qof_instance_get_slots (QOF_INSTANCE (trn)))) { return "slots differ"; } } else if (g_strcmp0 ((char*)mark->name, "trn:splits") == 0) { const char* msg = equals_node_val_vs_splits (mark, trn); if (msg != NULL) { return msg; } } else { return "unknown node"; } } return NULL; }