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_string (xmlNodePtr node, GncVendor* vendor,
135 void (*func) (GncVendor* vendor,
const char* txt))
137 char* txt = dom_tree_to_text (node);
138 g_return_val_if_fail (txt, FALSE);
148 set_boolean (xmlNodePtr node, GncVendor* vendor,
149 void (*func) (GncVendor* vendor, gboolean b))
154 ret = dom_tree_to_integer (node, &val);
156 func (vendor, (gboolean)val);
162 vendor_name_handler (xmlNodePtr node, gpointer
vendor_pdata)
166 return set_string (node, pdata->vendor, gncVendorSetName);
170 vendor_guid_handler (xmlNodePtr node, gpointer
vendor_pdata)
176 guid = dom_tree_to_guid (node);
177 g_return_val_if_fail (guid, FALSE);
178 vendor = gncVendorLookup (pdata->book, guid);
181 gncVendorDestroy (pdata->vendor);
182 pdata->vendor = vendor;
183 gncVendorBeginEdit (vendor);
187 gncVendorSetGUID (pdata->vendor, guid);
196 vendor_id_handler (xmlNodePtr node, gpointer
vendor_pdata)
200 return set_string (node, pdata->vendor, gncVendorSetID);
204 vendor_notes_handler (xmlNodePtr node, gpointer
vendor_pdata)
208 return set_string (node, pdata->vendor, gncVendorSetNotes);
212 vendor_terms_handler (xmlNodePtr node, gpointer
vendor_pdata)
218 guid = dom_tree_to_guid (node);
219 g_return_val_if_fail (guid, FALSE);
220 term = gnc_billterm_xml_find_or_create (pdata->book, guid);
223 gncVendorSetTerms (pdata->vendor, term);
229 vendor_addr_handler (xmlNodePtr node, gpointer
vendor_pdata)
233 return gnc_dom_tree_to_address (node, gncVendorGetAddr (pdata->vendor));
237 vendor_taxincluded_handler (xmlNodePtr node, gpointer
vendor_pdata)
244 str = dom_tree_to_text (node);
245 g_return_val_if_fail (str, FALSE);
247 ret = gncTaxIncludedStringToType (str, &type);
251 gncVendorSetTaxIncluded (pdata->vendor, type);
257 vendor_active_handler (xmlNodePtr node, gpointer
vendor_pdata)
260 return set_boolean (node, pdata->vendor, gncVendorSetActive);
264 vendor_currency_handler (xmlNodePtr node, gpointer
vendor_pdata)
269 com = dom_tree_to_commodity_ref (node, pdata->book);
270 g_return_val_if_fail (com, FALSE);
272 gncVendorSetCurrency (pdata->vendor, com);
278 vendor_taxtable_handler (xmlNodePtr node, gpointer
vendor_pdata)
284 guid = dom_tree_to_guid (node);
285 g_return_val_if_fail (guid, FALSE);
286 taxtable = gncTaxTableLookup (pdata->book, guid);
289 taxtable = gncTaxTableCreate (pdata->book);
290 gncTaxTableBeginEdit (taxtable);
291 gncTaxTableSetGUID (taxtable, guid);
292 gncTaxTableCommitEdit (taxtable);
295 gncTaxTableDecRef (taxtable);
297 gncVendorSetTaxTable (pdata->vendor, taxtable);
303 vendor_taxtableoverride_handler (xmlNodePtr node, gpointer
vendor_pdata)
306 return set_boolean (node, pdata->vendor, gncVendorSetTaxTableOverride);
310 vendor_slots_handler (xmlNodePtr node, gpointer
vendor_pdata)
313 return dom_tree_create_instance_slots (node, QOF_INSTANCE (pdata->vendor));
319 { vendor_name_string, vendor_name_handler, 1, 0 },
320 { vendor_guid_string, vendor_guid_handler, 1, 0 },
321 { vendor_id_string, vendor_id_handler, 1, 0 },
322 { vendor_addr_string, vendor_addr_handler, 1, 0 },
323 { vendor_notes_string, vendor_notes_handler, 0, 0 },
324 { vendor_terms_string, vendor_terms_handler, 0, 0 },
325 { vendor_taxincluded_string, vendor_taxincluded_handler, 1, 0 },
326 { vendor_active_string, vendor_active_handler, 1, 0 },
327 { vendor_currency_string, vendor_currency_handler, 0, 0 },
328 {
"vendor:commodity", vendor_currency_handler, 0, 0 },
329 { vendor_taxtable_string, vendor_taxtable_handler, 0, 0 },
330 { vendor_taxtableoverride_string, vendor_taxtableoverride_handler, 0, 0 },
331 { vendor_slots_string, vendor_slots_handler, 0, 0 },
336 dom_tree_to_vendor (xmlNodePtr node, QofBook* book)
345 successful = dom_tree_generic_parse (node, vendor_handlers_v2,
352 PERR (
"failed to parse vendor tree");
361 gnc_vendor_end_handler (gpointer data_for_children,
362 GSList* data_from_children, GSList* sibling_data,
363 gpointer parent_data, gpointer global_data,
364 gpointer* result,
const gchar* tag)
367 xmlNodePtr tree = (xmlNodePtr)data_for_children;
368 gxpf_data* gdata = (gxpf_data*)global_data;
369 QofBook* book =
static_cast<decltype (book)
> (gdata->bookdata);
383 g_return_val_if_fail (tree, FALSE);
385 vendor = dom_tree_to_vendor (tree, book);
388 gdata->cb (tag, gdata->parsedata, vendor);
393 return vendor != NULL;
397 vendor_sixtp_parser_create (
void)
399 return sixtp_dom_parser_new (gnc_vendor_end_handler, NULL, NULL);
403 vendor_should_be_saved (GncVendor* vendor)
408 id = gncVendorGetID (vendor);
409 if (
id == NULL || *
id ==
'\0')
418 int* count =
static_cast<decltype (count)
> (count_p);
419 if (vendor_should_be_saved ((GncVendor*)vendor_p))
424 vendor_get_count (QofBook* book)
432 xml_add_vendor (
QofInstance* vendor_p, gpointer out_p)
435 GncVendor* vendor = (GncVendor*) vendor_p;
436 FILE* out =
static_cast<decltype (out)
> (out_p);
440 if (!vendor_should_be_saved (vendor))
443 node = vendor_dom_tree_create (vendor);
444 xmlElemDump (out, NULL, node);
446 if (ferror (out) || fprintf (out,
"\n") < 0)
451 vendor_write (FILE* out, QofBook* book)
455 return ferror (out) == 0;
459 vendor_ns (FILE* out)
461 g_return_val_if_fail (out, FALSE);
462 return gnc_xml2_write_namespace_decl (out,
"vendor");
466 gnc_vendor_xml_initialize (
void)
468 static GncXmlDataType_t be_data =
470 GNC_FILE_BACKEND_VERS,
472 vendor_sixtp_parser_create,
480 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.
The type used to store guids in C.
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