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
52static QofLogModule log_module = GNC_MOD_IO;
54const 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"
72vendor_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)));
134set_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);
148vendor_name_handler (xmlNodePtr node, gpointer
vendor_pdata)
152 return apply_xmlnode_text (gncVendorSetName, pdata->vendor, node);
156vendor_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);
179vendor_id_handler (xmlNodePtr node, gpointer
vendor_pdata)
183 return apply_xmlnode_text (gncVendorSetID, pdata->vendor, node);
187vendor_notes_handler (xmlNodePtr node, gpointer
vendor_pdata)
191 return apply_xmlnode_text (gncVendorSetNotes, pdata->vendor, node);
195vendor_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);
210vendor_addr_handler (xmlNodePtr node, gpointer
vendor_pdata)
214 return gnc_dom_tree_to_address (node, gncVendorGetAddr (pdata->vendor));
218vendor_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);
231vendor_active_handler (xmlNodePtr node, gpointer
vendor_pdata)
234 return set_boolean (node, pdata->vendor, gncVendorSetActive);
238vendor_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);
252vendor_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);
275vendor_taxtableoverride_handler (xmlNodePtr node, gpointer
vendor_pdata)
278 return set_boolean (node, pdata->vendor, gncVendorSetTaxTableOverride);
282vendor_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 },
308dom_tree_to_vendor (xmlNodePtr node,
QofBook* book)
317 successful = dom_tree_generic_parse (node, vendor_handlers_v2,
324 PERR (
"failed to parse vendor tree");
333gnc_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;
369vendor_sixtp_parser_create (
void)
371 return sixtp_dom_parser_new (gnc_vendor_end_handler, NULL, NULL);
375vendor_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))
396vendor_get_count (
QofBook* book)
404xml_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)
423vendor_write (FILE* out,
QofBook* book)
427 return ferror (out) == 0;
433 g_return_val_if_fail (out, FALSE);
434 return gnc_xml2_write_namespace_decl (out,
"vendor");
438gnc_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.
#define PERR(format, args...)
Log a serious error.
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.
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.
GncTaxIncluded
How to interpret the TaxIncluded.
api for GnuCash version 2 XML-based file format
modtime is the internal date of the last modtime See libgnucash/engine/TaxTableBillTermImmutability....