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> 36 static QofLogModule log_module = GNC_MOD_IO;
39 boolean_to_dom_tree (
const char* tag, gboolean val)
41 return text_to_dom_tree (tag, val ?
"TRUE" :
"FALSE");
45 text_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));
61 int_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);
74 guint_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);
88 guid_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);
109 commodity_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));
134 time64_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())));
149 gdate_to_dom_tree (
const char* tag,
const GDate* date)
152 gchar* date_str = NULL;
154 g_return_val_if_fail (date, NULL);
155 date_str = g_new (gchar, 512);
157 g_date_strftime (date_str, 512,
"%Y-%m-%d", date);
159 ret = xmlNewNode (NULL, BAD_CAST tag);
161 xmlNewTextChild (ret, NULL, BAD_CAST
"gdate", checked_char_cast (date_str));
169 gnc_numeric_to_dom_tree (
const char* tag,
const gnc_numeric* num)
174 g_return_val_if_fail (num, NULL);
177 g_return_val_if_fail (numstr, NULL);
179 ret = xmlNewNode (NULL, BAD_CAST tag);
181 xmlNodeAddContent (ret, checked_char_cast (numstr));
189 double_to_string (
double value)
192 numstr = g_strdup_printf (
"%24.18g", value);
201 return g_strstrip (numstr);
206 add_text_to_node (xmlNodePtr node,
const gchar* type, gchar* val)
208 xmlSetProp (node, BAD_CAST
"type", BAD_CAST type);
209 xmlNodeSetContent (node, checked_char_cast (val));
212 static void add_kvp_slot (
const char* key, KvpValue* value,
void* data);
215 add_kvp_value_node (xmlNodePtr node,
const gchar* tag, KvpValue* val)
219 switch (val->get_type ())
221 case KvpValue::Type::STRING:
223 auto newstr = g_strdup (val->get<
const char*> ());
224 val_node = xmlNewTextChild (node, NULL, BAD_CAST tag,
225 checked_char_cast (newstr));
229 case KvpValue::Type::TIME64:
232 case KvpValue::Type::GDATE:
234 auto d = val->get<GDate> ();
235 val_node = gdate_to_dom_tree (tag, &d);
236 xmlAddChild (node, val_node);
240 val_node = xmlNewTextChild (node, NULL, BAD_CAST tag, NULL);
244 switch (val->get_type ())
246 case KvpValue::Type::INT64:
248 char *int_str = g_strdup_printf (
"%" G_GINT64_FORMAT, val->get<int64_t> ());
249 add_text_to_node (val_node,
"integer", int_str);
253 case KvpValue::Type::DOUBLE:
255 char *dbl_str = double_to_string (val->get<
double> ());
256 add_text_to_node (val_node,
"double", dbl_str);
260 case KvpValue::Type::NUMERIC:
263 add_text_to_node (val_node,
"numeric", num_str);
267 case KvpValue::Type::STRING:
268 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"string");
270 case KvpValue::Type::GUID:
274 add_text_to_node (val_node,
"guid", guidstr);
280 case KvpValue::Type::TIME64:
282 auto t = val->get<
Time64> ();
283 val_node = time64_to_dom_tree (tag, t.t);
284 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"timespec");
285 xmlAddChild (node, val_node);
288 case KvpValue::Type::GDATE:
289 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"gdate");
291 case KvpValue::Type::GLIST:
292 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"list");
293 for (
auto cursor = val->get<GList*> (); cursor; cursor = cursor->next)
295 auto val =
static_cast<KvpValue*
> (cursor->data);
296 add_kvp_value_node (val_node,
"slot:value", val);
299 case KvpValue::Type::FRAME:
301 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"frame");
303 auto frame = val->get<KvpFrame*> ();
306 frame->for_each_slot_temp (&add_kvp_slot, val_node);
315 add_kvp_slot (
const char* key, KvpValue* value,
void* data)
317 auto newkey = g_strdup ((gchar*)key);
318 auto node =
static_cast<xmlNodePtr
> (data);
319 auto slot_node = xmlNewChild (node, NULL, BAD_CAST
"slot", NULL);
321 xmlNewTextChild (slot_node, NULL, BAD_CAST
"slot:key",
322 checked_char_cast (newkey));
324 add_kvp_value_node (slot_node,
"slot:value", value);
328 qof_instance_slots_to_dom_tree (
const char* tag,
const QofInstance* inst)
331 KvpFrame* frame = qof_instance_get_slots (inst);
332 if (!frame || frame->empty())
335 ret = xmlNewNode (
nullptr, BAD_CAST tag);
336 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_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
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...
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string.
#define PERR(format, args...)
Log a serious error.
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
The type used to store guids in C.