29#include "gnc-xml-helper.h"
30#include "sixtp-dom-generators.h"
31#include "sixtp-utils.h"
33#include <kvp-frame.hpp>
34#include <gnc-datetime.hpp>
36static QofLogModule log_module = GNC_MOD_IO;
39boolean_to_dom_tree (
const char* tag, gboolean val)
41 return text_to_dom_tree (tag, val ?
"TRUE" :
"FALSE");
45text_to_dom_tree (
const char* tag,
const char* str)
47 g_return_val_if_fail (tag, NULL);
48 g_return_val_if_fail (str, NULL);
50 xmlNodePtr result = xmlNewNode (NULL, BAD_CAST tag);
51 g_return_val_if_fail (result, NULL);
53 gchar* newstr = g_strdup (str);
54 xmlNodeAddContent (result, checked_char_cast (newstr));
61int_to_dom_tree (
const char* tag, gint64 val)
66 text = g_strdup_printf (
"%" G_GINT64_FORMAT, val);
67 g_return_val_if_fail (text, NULL);
68 result = text_to_dom_tree (tag, text);
74guint_to_dom_tree (
const char* tag, guint an_int)
79 text = g_strdup_printf (
"%u", an_int);
80 g_return_val_if_fail (text, NULL);
81 result = text_to_dom_tree (tag, text);
88guid_to_dom_tree (
const char* tag,
const GncGUID* gid)
93 ret = xmlNewNode (NULL, BAD_CAST tag);
95 xmlSetProp (ret, BAD_CAST
"type", BAD_CAST
"guid");
99 PERR (
"guid_to_string_buff failed\n");
103 xmlNodeAddContent (ret, BAD_CAST guid_str);
109commodity_ref_to_dom_tree (
const char* tag,
const gnc_commodity* c)
112 gchar* name_space, *mnemonic;
114 g_return_val_if_fail (c, NULL);
116 ret = xmlNewNode (NULL, BAD_CAST tag);
124 xmlNewTextChild (ret, NULL, BAD_CAST
"cmdty:space",
125 checked_char_cast (name_space));
126 xmlNewTextChild (ret, NULL, BAD_CAST
"cmdty:id",
127 checked_char_cast (mnemonic));
134time64_to_dom_tree (
const char* tag,
const time64 time)
137 g_return_val_if_fail (time != INT64_MAX, NULL);
139 if (date_str.empty())
141 date_str +=
" +0000";
142 ret = xmlNewNode (NULL, BAD_CAST tag);
143 xmlNewTextChild (ret, NULL, BAD_CAST
"ts:date",
144 checked_char_cast (
const_cast<char*
>(date_str.c_str())));
149gdate_to_dom_tree (
const char* tag,
const GDate* date)
154 g_return_val_if_fail (date, NULL);
156 if (!g_date_strftime (date_str,
sizeof (date_str),
"%Y-%m-%d", date))
159 ret = xmlNewNode (NULL, BAD_CAST tag);
161 xmlNewTextChild (ret, NULL, BAD_CAST
"gdate", BAD_CAST date_str);
167gnc_numeric_to_dom_tree (
const char* tag,
const gnc_numeric* num)
172 g_return_val_if_fail (num, NULL);
175 g_return_val_if_fail (numstr, NULL);
177 ret = xmlNewNode (NULL, BAD_CAST tag);
179 xmlNodeAddContent (ret, checked_char_cast (numstr));
187double_to_string (
double value)
190 numstr = g_strdup_printf (
"%24.18g", value);
199 return g_strstrip (numstr);
204add_text_to_node (xmlNodePtr node,
const gchar* type, gchar* val)
206 xmlSetProp (node, BAD_CAST
"type", BAD_CAST type);
207 xmlNodeSetContent (node, checked_char_cast (val));
210static void add_kvp_slot (
const char* key, KvpValue* value,
void* data);
213add_kvp_value_node (xmlNodePtr node,
const gchar* tag, KvpValue* val)
217 switch (val->get_type ())
219 case KvpValue::Type::STRING:
221 auto newstr = g_strdup (val->get<
const char*> ());
222 val_node = xmlNewTextChild (node, NULL, BAD_CAST tag,
223 checked_char_cast (newstr));
227 case KvpValue::Type::TIME64:
230 case KvpValue::Type::GDATE:
232 auto d = val->get<GDate> ();
233 val_node = gdate_to_dom_tree (tag, &d);
234 xmlAddChild (node, val_node);
238 val_node = xmlNewTextChild (node, NULL, BAD_CAST tag, NULL);
242 switch (val->get_type ())
244 case KvpValue::Type::INT64:
246 char *int_str = g_strdup_printf (
"%" G_GINT64_FORMAT, val->get<int64_t> ());
247 add_text_to_node (val_node,
"integer", int_str);
251 case KvpValue::Type::DOUBLE:
253 char *dbl_str = double_to_string (val->get<
double> ());
254 add_text_to_node (val_node,
"double", dbl_str);
258 case KvpValue::Type::NUMERIC:
261 add_text_to_node (val_node,
"numeric", num_str);
265 case KvpValue::Type::STRING:
266 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"string");
268 case KvpValue::Type::GUID:
272 add_text_to_node (val_node,
"guid", guidstr);
278 case KvpValue::Type::TIME64:
280 auto t = val->get<
Time64> ();
281 val_node = time64_to_dom_tree (tag, t.t);
282 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"timespec");
283 xmlAddChild (node, val_node);
286 case KvpValue::Type::GDATE:
287 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"gdate");
289 case KvpValue::Type::GLIST:
290 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"list");
291 for (
auto cursor = val->get<GList*> (); cursor; cursor = cursor->next)
293 auto val =
static_cast<KvpValue*
> (cursor->data);
294 add_kvp_value_node (val_node,
"slot:value", val);
297 case KvpValue::Type::FRAME:
299 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"frame");
301 auto frame = val->get<KvpFrame*> ();
304 frame->for_each_slot_temp (&add_kvp_slot, val_node);
313add_kvp_slot (
const char* key, KvpValue* value,
void* data)
315 auto newkey = g_strdup ((gchar*)key);
316 auto node =
static_cast<xmlNodePtr
> (data);
317 auto slot_node = xmlNewChild (node, NULL, BAD_CAST
"slot", NULL);
319 xmlNewTextChild (slot_node, NULL, BAD_CAST
"slot:key",
320 checked_char_cast (newkey));
322 add_kvp_value_node (slot_node,
"slot:value", value);
326qof_instance_slots_to_dom_tree (
const char* tag,
const QofInstance* inst)
329 KvpFrame* frame = qof_instance_get_slots (inst);
330 if (!frame || frame->empty())
333 ret = xmlNewNode (
nullptr, BAD_CAST tag);
334 frame->for_each_slot_temp (&add_kvp_slot, ret);
std::string format_iso8601() const
Format the GncDateTime into a gnucash-style iso8601 string in UTC.
Date and Time handling routines.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
#define PERR(format, args...)
Log a serious error.
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string.
The type used to store guids in C.