29 #include "gncBillTermP.h" 30 #include "gncVendorP.h" 31 #include "gncTaxTableP.h" 33 #include "gnc-xml-helper.h" 35 #include "sixtp-utils.h" 36 #include "sixtp-parsers.h" 37 #include "sixtp-utils.h" 38 #include "sixtp-dom-parsers.h" 39 #include "sixtp-dom-generators.h" 42 #include "io-gncxml-gen.h" 45 #include "gnc-vendor-xml-v2.h" 46 #include "gnc-address-xml-v2.h" 47 #include "xml-helpers.h" 48 #include "gnc-bill-term-xml-v2.h" 50 #define _GNC_MOD_NAME GNC_ID_VENDOR 52 static QofLogModule log_module = GNC_MOD_IO;
54 const gchar* vendor_version_string =
"2.0.0";
57 #define gnc_vendor_string "gnc:GncVendor" 58 #define vendor_name_string "vendor:name" 59 #define vendor_guid_string "vendor:guid" 60 #define vendor_id_string "vendor:id" 61 #define vendor_addr_string "vendor:addr" 62 #define vendor_notes_string "vendor:notes" 63 #define vendor_terms_string "vendor:terms" 64 #define vendor_taxincluded_string "vendor:taxincluded" 65 #define vendor_active_string "vendor:active" 66 #define vendor_currency_string "vendor:currency" 67 #define vendor_taxtable_string "vendor:taxtable" 68 #define vendor_taxtableoverride_string "vendor:use-tt" 69 #define vendor_slots_string "vendor:slots" 72 vendor_dom_tree_create (GncVendor* vendor)
78 ret = xmlNewNode (NULL, BAD_CAST gnc_vendor_string);
79 xmlSetProp (ret, BAD_CAST
"version", BAD_CAST vendor_version_string);
81 xmlAddChild (ret, guid_to_dom_tree (vendor_guid_string,
84 xmlAddChild (ret, text_to_dom_tree (vendor_name_string,
85 gncVendorGetName (vendor)));
87 xmlAddChild (ret, text_to_dom_tree (vendor_id_string,
88 gncVendorGetID (vendor)));
90 xmlAddChild (ret, gnc_address_to_dom_tree (vendor_addr_string,
91 gncVendorGetAddr (vendor)));
93 maybe_add_string (ret, vendor_notes_string, gncVendorGetNotes (vendor));
95 term = gncVendorGetTerms (vendor);
97 xmlAddChild (ret, guid_to_dom_tree (vendor_terms_string,
100 xmlAddChild (ret, text_to_dom_tree (vendor_taxincluded_string,
101 gncTaxIncludedTypeToString (
102 gncVendorGetTaxIncluded (vendor))));
104 xmlAddChild (ret, int_to_dom_tree (vendor_active_string,
105 gncVendorGetActive (vendor)));
109 commodity_ref_to_dom_tree (vendor_currency_string,
110 gncVendorGetCurrency (vendor)));
112 xmlAddChild (ret, int_to_dom_tree (vendor_taxtableoverride_string,
113 gncVendorGetTaxTableOverride (vendor)));
114 taxtable = gncVendorGetTaxTable (vendor);
116 xmlAddChild (ret, guid_to_dom_tree (vendor_taxtable_string,
120 xmlAddChild (ret, qof_instance_slots_to_dom_tree (vendor_slots_string,
121 QOF_INSTANCE (vendor)));
134 set_boolean (xmlNodePtr node, GncVendor* vendor,
135 void (*func) (GncVendor* vendor, gboolean b))
140 ret = dom_tree_to_integer (node, &val);
142 func (vendor, (gboolean)val);
148 vendor_name_handler (xmlNodePtr node, gpointer
vendor_pdata)
152 return apply_xmlnode_text (gncVendorSetName, pdata->vendor, node);
156 vendor_guid_handler (xmlNodePtr node, gpointer
vendor_pdata)
161 auto guid = dom_tree_to_guid (node);
162 g_return_val_if_fail (guid, FALSE);
163 vendor = gncVendorLookup (pdata->book, &*guid);
166 gncVendorDestroy (pdata->vendor);
167 pdata->vendor = vendor;
168 gncVendorBeginEdit (vendor);
172 gncVendorSetGUID (pdata->vendor, &*guid);
179 vendor_id_handler (xmlNodePtr node, gpointer
vendor_pdata)
183 return apply_xmlnode_text (gncVendorSetID, pdata->vendor, node);
187 vendor_notes_handler (xmlNodePtr node, gpointer
vendor_pdata)
191 return apply_xmlnode_text (gncVendorSetNotes, pdata->vendor, node);
195 vendor_terms_handler (xmlNodePtr node, gpointer
vendor_pdata)
200 auto guid = dom_tree_to_guid (node);
201 g_return_val_if_fail (guid, FALSE);
202 term = gnc_billterm_xml_find_or_create (pdata->book, &*guid);
204 gncVendorSetTerms (pdata->vendor, term);
210 vendor_addr_handler (xmlNodePtr node, gpointer
vendor_pdata)
214 return gnc_dom_tree_to_address (node, gncVendorGetAddr (pdata->vendor));
218 vendor_taxincluded_handler (xmlNodePtr node, gpointer
vendor_pdata)
221 auto set_taxincluded = [](GncVendor* vendor,
const char* str)
224 if (gncTaxIncludedStringToType (str, &type))
225 gncVendorSetTaxIncluded (vendor, type);
227 return apply_xmlnode_text (set_taxincluded, pdata->vendor, node);
231 vendor_active_handler (xmlNodePtr node, gpointer
vendor_pdata)
234 return set_boolean (node, pdata->vendor, gncVendorSetActive);
238 vendor_currency_handler (xmlNodePtr node, gpointer
vendor_pdata)
243 com = dom_tree_to_commodity_ref (node, pdata->book);
244 g_return_val_if_fail (com, FALSE);
246 gncVendorSetCurrency (pdata->vendor, com);
252 vendor_taxtable_handler (xmlNodePtr node, gpointer
vendor_pdata)
257 auto guid = dom_tree_to_guid (node);
258 g_return_val_if_fail (guid, FALSE);
259 taxtable = gncTaxTableLookup (pdata->book, &*guid);
262 taxtable = gncTaxTableCreate (pdata->book);
263 gncTaxTableBeginEdit (taxtable);
264 gncTaxTableSetGUID (taxtable, &*guid);
265 gncTaxTableCommitEdit (taxtable);
268 gncTaxTableDecRef (taxtable);
270 gncVendorSetTaxTable (pdata->vendor, taxtable);
275 vendor_taxtableoverride_handler (xmlNodePtr node, gpointer
vendor_pdata)
278 return set_boolean (node, pdata->vendor, gncVendorSetTaxTableOverride);
282 vendor_slots_handler (xmlNodePtr node, gpointer
vendor_pdata)
285 return dom_tree_create_instance_slots (node, QOF_INSTANCE (pdata->vendor));
291 { vendor_name_string, vendor_name_handler, 1, 0 },
292 { vendor_guid_string, vendor_guid_handler, 1, 0 },
293 { vendor_id_string, vendor_id_handler, 1, 0 },
294 { vendor_addr_string, vendor_addr_handler, 1, 0 },
295 { vendor_notes_string, vendor_notes_handler, 0, 0 },
296 { vendor_terms_string, vendor_terms_handler, 0, 0 },
297 { vendor_taxincluded_string, vendor_taxincluded_handler, 1, 0 },
298 { vendor_active_string, vendor_active_handler, 1, 0 },
299 { vendor_currency_string, vendor_currency_handler, 0, 0 },
300 {
"vendor:commodity", vendor_currency_handler, 0, 0 },
301 { vendor_taxtable_string, vendor_taxtable_handler, 0, 0 },
302 { vendor_taxtableoverride_string, vendor_taxtableoverride_handler, 0, 0 },
303 { vendor_slots_string, vendor_slots_handler, 0, 0 },
308 dom_tree_to_vendor (xmlNodePtr node, QofBook* book)
317 successful = dom_tree_generic_parse (node, vendor_handlers_v2,
324 PERR (
"failed to parse vendor tree");
333 gnc_vendor_end_handler (gpointer data_for_children,
334 GSList* data_from_children, GSList* sibling_data,
335 gpointer parent_data, gpointer global_data,
336 gpointer* result,
const gchar* tag)
339 xmlNodePtr tree = (xmlNodePtr)data_for_children;
340 gxpf_data* gdata = (gxpf_data*)global_data;
341 QofBook* book =
static_cast<decltype (book)
> (gdata->bookdata);
355 g_return_val_if_fail (tree, FALSE);
357 vendor = dom_tree_to_vendor (tree, book);
360 gdata->cb (tag, gdata->parsedata, vendor);
365 return vendor != NULL;
369 vendor_sixtp_parser_create (
void)
371 return sixtp_dom_parser_new (gnc_vendor_end_handler, NULL, NULL);
375 vendor_should_be_saved (GncVendor* vendor)
380 id = gncVendorGetID (vendor);
381 if (
id == NULL || *
id ==
'\0')
390 int* count =
static_cast<decltype (count)
> (count_p);
391 if (vendor_should_be_saved ((GncVendor*)vendor_p))
396 vendor_get_count (QofBook* book)
404 xml_add_vendor (
QofInstance* vendor_p, gpointer out_p)
407 GncVendor* vendor = (GncVendor*) vendor_p;
408 FILE* out =
static_cast<decltype (out)
> (out_p);
412 if (!vendor_should_be_saved (vendor))
415 node = vendor_dom_tree_create (vendor);
416 xmlElemDump (out, NULL, node);
418 if (ferror (out) || fprintf (out,
"\n") < 0)
423 vendor_write (FILE* out, QofBook* book)
427 return ferror (out) == 0;
431 vendor_ns (FILE* out)
433 g_return_val_if_fail (out, FALSE);
434 return gnc_xml2_write_namespace_decl (out,
"vendor");
438 gnc_vendor_xml_initialize (
void)
440 static GncXmlDataType_t be_data =
442 GNC_FILE_BACKEND_VERS,
444 vendor_sixtp_parser_create,
452 gnc_xml_register_backend(be_data);
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
GncTaxIncluded
How to interpret the TaxIncluded.
#define PERR(format, args...)
Log a serious error.
void qof_object_foreach_sorted(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
Invoke callback 'cb' on each instance in guid orted order.
api for GnuCash version 2 XML-based file format
void qof_object_foreach(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
Invoke the callback 'cb' on every instance ov a particular object type.
modtime is the internal date of the last modtime See libgnucash/engine/TaxTableBillTermImmutability.txt for an explanation of the following Code that handles refcount, parent, child, invisible and children is identical to that in ::GncBillTerm