xmlNodePtr gnc_commodity_dom_tree_create(const gnc_commodity *com) { gnc_quote_source *source; const char *string; xmlNodePtr ret; gboolean currency = gnc_commodity_is_iso(com); xmlNodePtr slotsnode = qof_instance_slots_to_dom_tree(cmdty_slots, QOF_INSTANCE(com)); if (currency && !gnc_commodity_get_quote_flag(com) && !slotsnode) return NULL; ret = xmlNewNode(NULL, BAD_CAST gnc_commodity_string); xmlSetProp(ret, BAD_CAST "version", BAD_CAST commodity_version_string); xmlAddChild(ret, text_to_dom_tree(cmdty_namespace, gnc_commodity_get_namespace_compat(com))); xmlAddChild(ret, text_to_dom_tree(cmdty_id, gnc_commodity_get_mnemonic(com))); if (!currency) { if (gnc_commodity_get_fullname(com)) { xmlAddChild(ret, text_to_dom_tree(cmdty_name, gnc_commodity_get_fullname(com))); } if (gnc_commodity_get_cusip(com) && strlen(gnc_commodity_get_cusip(com)) > 0) { xmlAddChild(ret, text_to_dom_tree( cmdty_xcode, gnc_commodity_get_cusip(com))); } xmlAddChild(ret, int_to_dom_tree(cmdty_fraction, gnc_commodity_get_fraction(com))); } if (gnc_commodity_get_quote_flag(com)) { xmlNewChild(ret, NULL, BAD_CAST cmdty_get_quotes, NULL); source = gnc_commodity_get_quote_source(com); if (source) xmlAddChild(ret, text_to_dom_tree(cmdty_quote_source, gnc_quote_source_get_internal_name(source))); string = gnc_commodity_get_quote_tz(com); if (string) xmlAddChild(ret, text_to_dom_tree(cmdty_quote_tz, string)); } if (slotsnode) xmlAddChild(ret, slotsnode); return ret; }
xmlNodePtr commodity_ref_to_dom_tree(const char *tag, const gnc_commodity *c) { xmlNodePtr ret; g_return_val_if_fail(c, NULL); ret = xmlNewNode(NULL, BAD_CAST tag); if (!gnc_commodity_get_namespace(c) || !gnc_commodity_get_mnemonic(c)) { return NULL; } xmlNewTextChild(ret, NULL, BAD_CAST "cmdty:space", BAD_CAST gnc_commodity_get_namespace_compat(c)); xmlNewTextChild(ret, NULL, BAD_CAST "cmdty:id", BAD_CAST gnc_commodity_get_mnemonic(c)); return ret; }
xmlNodePtr commodity_ref_to_dom_tree(const char *tag, const gnc_commodity *c) { xmlNodePtr ret; gchar *name_space, *mnemonic; g_return_val_if_fail(c, NULL); ret = xmlNewNode(NULL, BAD_CAST tag); if (!gnc_commodity_get_namespace(c) || !gnc_commodity_get_mnemonic(c)) { return NULL; } name_space = g_strdup (gnc_commodity_get_namespace_compat(c)); mnemonic = g_strdup (gnc_commodity_get_mnemonic(c)); xmlNewTextChild(ret, NULL, BAD_CAST "cmdty:space", checked_char_cast (name_space)); xmlNewTextChild(ret, NULL, BAD_CAST "cmdty:id", checked_char_cast (mnemonic)); g_free (name_space); g_free (mnemonic); return ret; }
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; }