25 #define __EXTENSIONS__ 32 #include "gnc-xml-helper.h" 33 #include "sixtp-dom-generators.h" 34 #include "sixtp-utils.h" 36 #include <kvp-frame.hpp> 37 #include <gnc-datetime.hpp> 39 static QofLogModule log_module = GNC_MOD_IO;
42 boolean_to_dom_tree (
const char* tag, gboolean val)
44 return text_to_dom_tree (tag, val ?
"TRUE" :
"FALSE");
48 text_to_dom_tree (
const char* tag,
const char* str)
50 g_return_val_if_fail (tag, NULL);
51 g_return_val_if_fail (str, NULL);
53 xmlNodePtr result = xmlNewNode (NULL, BAD_CAST tag);
54 g_return_val_if_fail (result, NULL);
56 gchar* newstr = g_strdup (str);
57 xmlNodeAddContent (result, checked_char_cast (newstr));
64 int_to_dom_tree (
const char* tag, gint64 val)
69 text = g_strdup_printf (
"%" G_GINT64_FORMAT, val);
70 g_return_val_if_fail (text, NULL);
71 result = text_to_dom_tree (tag, text);
77 guint_to_dom_tree (
const char* tag, guint an_int)
82 text = g_strdup_printf (
"%u", an_int);
83 g_return_val_if_fail (text, NULL);
84 result = text_to_dom_tree (tag, text);
91 guid_to_dom_tree (
const char* tag,
const GncGUID* gid)
96 ret = xmlNewNode (NULL, BAD_CAST tag);
98 xmlSetProp (ret, BAD_CAST
"type", BAD_CAST
"guid");
102 PERR (
"guid_to_string_buff failed\n");
106 xmlNodeAddContent (ret, BAD_CAST guid_str);
112 commodity_ref_to_dom_tree (
const char* tag,
const gnc_commodity* c)
115 gchar* name_space, *mnemonic;
117 g_return_val_if_fail (c, NULL);
119 ret = xmlNewNode (NULL, BAD_CAST tag);
127 xmlNewTextChild (ret, NULL, BAD_CAST
"cmdty:space",
128 checked_char_cast (name_space));
129 xmlNewTextChild (ret, NULL, BAD_CAST
"cmdty:id",
130 checked_char_cast (mnemonic));
137 time64_to_dom_tree (
const char* tag,
const time64 time)
140 g_return_val_if_fail (time != INT64_MAX, NULL);
142 if (date_str.empty())
144 date_str +=
" +0000";
145 ret = xmlNewNode (NULL, BAD_CAST tag);
146 xmlNewTextChild (ret, NULL, BAD_CAST
"ts:date",
147 checked_char_cast (const_cast<char*>(date_str.c_str())));
152 gdate_to_dom_tree (
const char* tag,
const GDate* date)
155 gchar* date_str = NULL;
157 g_return_val_if_fail (date, NULL);
158 date_str = g_new (gchar, 512);
160 g_date_strftime (date_str, 512,
"%Y-%m-%d", date);
162 ret = xmlNewNode (NULL, BAD_CAST tag);
164 xmlNewTextChild (ret, NULL, BAD_CAST
"gdate", checked_char_cast (date_str));
172 gnc_numeric_to_dom_tree (
const char* tag,
const gnc_numeric* num)
177 g_return_val_if_fail (num, NULL);
180 g_return_val_if_fail (numstr, NULL);
182 ret = xmlNewNode (NULL, BAD_CAST tag);
184 xmlNodeAddContent (ret, checked_char_cast (numstr));
192 double_to_string (
double value)
195 numstr = g_strdup_printf (
"%24.18g", value);
204 return g_strstrip (numstr);
209 add_text_to_node (xmlNodePtr node,
const gchar* type, gchar* val)
211 xmlSetProp (node, BAD_CAST
"type", BAD_CAST type);
212 xmlNodeSetContent (node, checked_char_cast (val));
215 static void add_kvp_slot (
const char* key, KvpValue* value,
void* data);
218 add_kvp_value_node (xmlNodePtr node,
const gchar* tag, KvpValue* val)
222 switch (val->get_type ())
224 case KvpValue::Type::STRING:
226 auto newstr = g_strdup (val->get<
const char*> ());
227 val_node = xmlNewTextChild (node, NULL, BAD_CAST tag,
228 checked_char_cast (newstr));
232 case KvpValue::Type::TIME64:
235 case KvpValue::Type::GDATE:
237 auto d = val->get<GDate> ();
238 val_node = gdate_to_dom_tree (tag, &d);
239 xmlAddChild (node, val_node);
243 val_node = xmlNewTextChild (node, NULL, BAD_CAST tag, NULL);
247 switch (val->get_type ())
249 case KvpValue::Type::INT64:
251 char *int_str = g_strdup_printf (
"%" G_GINT64_FORMAT, val->get<int64_t> ());
252 add_text_to_node (val_node,
"integer", int_str);
256 case KvpValue::Type::DOUBLE:
258 char *dbl_str = double_to_string (val->get<
double> ());
259 add_text_to_node (val_node,
"double", dbl_str);
263 case KvpValue::Type::NUMERIC:
266 add_text_to_node (val_node,
"numeric", num_str);
270 case KvpValue::Type::STRING:
271 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"string");
273 case KvpValue::Type::GUID:
277 add_text_to_node (val_node,
"guid", guidstr);
283 case KvpValue::Type::TIME64:
285 auto t = val->get<
Time64> ();
286 val_node = time64_to_dom_tree (tag, t.t);
287 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"timespec");
288 xmlAddChild (node, val_node);
291 case KvpValue::Type::GDATE:
292 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"gdate");
294 case KvpValue::Type::GLIST:
295 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"list");
296 for (
auto cursor = val->get<GList*> (); cursor; cursor = cursor->next)
298 auto val =
static_cast<KvpValue*
> (cursor->data);
299 add_kvp_value_node (val_node,
"slot:value", val);
302 case KvpValue::Type::FRAME:
304 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"frame");
306 auto frame = val->get<KvpFrame*> ();
309 frame->for_each_slot_temp (&add_kvp_slot, val_node);
318 add_kvp_slot (
const char* key, KvpValue* value,
void* data)
320 auto newkey = g_strdup ((gchar*)key);
321 auto node =
static_cast<xmlNodePtr
> (data);
322 auto slot_node = xmlNewChild (node, NULL, BAD_CAST
"slot", NULL);
324 xmlNewTextChild (slot_node, NULL, BAD_CAST
"slot:key",
325 checked_char_cast (newkey));
327 add_kvp_value_node (slot_node,
"slot:value", value);
331 qof_instance_slots_to_dom_tree (
const char* tag,
const QofInstance* inst)
334 KvpFrame* frame = qof_instance_get_slots (inst);
335 if (!frame || frame->empty())
338 ret = xmlNewNode (
nullptr, BAD_CAST tag);
339 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.