24 #define __EXTENSIONS__
29 #include "gnc-xml-helper.h"
32 #include "sixtp-dom-generators.h"
33 #include "sixtp-utils.h"
38 boolean_to_dom_tree(
const char* tag, gboolean val)
40 return text_to_dom_tree(tag, val ?
"TRUE" :
"FALSE");
44 text_to_dom_tree(
const char *tag,
const char *str)
47 gchar *newstr = g_strdup (str);
48 g_return_val_if_fail(tag, NULL);
49 g_return_val_if_fail(str, NULL);
50 result = xmlNewNode(NULL, BAD_CAST tag);
51 g_return_val_if_fail(result, NULL);
52 xmlNodeAddContent(result, checked_char_cast (newstr));
58 int_to_dom_tree(
const char *tag, gint64 val)
63 text = g_strdup_printf(
"%" G_GINT64_FORMAT, val);
64 g_return_val_if_fail(text, NULL);
65 result = text_to_dom_tree(tag, text);
71 guint_to_dom_tree(
const char *tag, guint an_int)
76 text = g_strdup_printf(
"%u", an_int );
77 g_return_val_if_fail(text, NULL);
78 result = text_to_dom_tree(tag, text);
85 guid_to_dom_tree(
const char *tag,
const GncGUID* gid)
90 ret = xmlNewNode(NULL, BAD_CAST tag);
92 xmlSetProp(ret, BAD_CAST
"type", BAD_CAST
"guid");
96 PERR(
"guid_to_string_buff failed\n");
100 xmlNodeAddContent(ret, BAD_CAST guid_str);
106 commodity_ref_to_dom_tree(
const char *tag,
const gnc_commodity *c)
109 gchar *name_space, *mnemonic;
111 g_return_val_if_fail(c, NULL);
113 ret = xmlNewNode(NULL, BAD_CAST tag);
121 xmlNewTextChild(ret, NULL, BAD_CAST
"cmdty:space",
122 checked_char_cast (name_space));
123 xmlNewTextChild(ret, NULL, BAD_CAST
"cmdty:id",
124 checked_char_cast (mnemonic));
135 timespec_sec_to_string(
const Timespec *ts)
141 g_return_val_if_fail (gdt != NULL, NULL);
142 time_string = g_date_time_format (gdt,
"%Y-%m-%d %H:%M:%S %z");
143 g_date_time_unref (gdt);
148 timespec_nsec_to_string(
const Timespec *ts)
150 return g_strdup_printf(
"%ld", ts->tv_nsec);
154 timespec_to_dom_tree(
const char *tag,
const Timespec *spec)
157 gchar *date_str = NULL;
158 gchar *ns_str = NULL;
160 g_return_val_if_fail(spec, NULL);
162 date_str = timespec_sec_to_string(spec);
169 ret = xmlNewNode(NULL, BAD_CAST tag);
171 xmlNewTextChild(ret, NULL, BAD_CAST
"ts:date",
172 checked_char_cast (date_str));
174 if (spec->tv_nsec > 0)
176 ns_str = timespec_nsec_to_string(spec);
179 xmlNewTextChild(ret, NULL, BAD_CAST
"ts:ns",
180 checked_char_cast (ns_str));
194 gdate_to_dom_tree(
const char *tag,
const GDate *date)
197 gchar *date_str = NULL;
199 g_return_val_if_fail(date, NULL);
200 date_str = g_new( gchar, 512 );
202 g_date_strftime( date_str, 512,
"%Y-%m-%d", date );
204 ret = xmlNewNode(NULL, BAD_CAST tag);
206 xmlNewTextChild(ret, NULL, BAD_CAST
"gdate", checked_char_cast (date_str));
214 gnc_numeric_to_dom_tree(
const char *tag,
const gnc_numeric *num)
219 g_return_val_if_fail(num, NULL);
222 g_return_val_if_fail(numstr, NULL);
224 ret = xmlNewNode(NULL, BAD_CAST tag);
226 xmlNodeAddContent(ret, checked_char_cast (numstr));
234 double_to_string(
double value)
237 numstr = g_strdup_printf (
"%24.18g", value);
246 return g_strstrip(numstr);
251 add_text_to_node(xmlNodePtr node, gchar *type, gchar *val)
253 gchar *newtype = g_strdup (type);
254 gchar *newval = g_strdup (val);
255 xmlSetProp(node, BAD_CAST
"type", checked_char_cast (type));
256 xmlNodeSetContent(node, checked_char_cast (val));
262 add_kvp_slot(
const char * key,
KvpValue* value, xmlNodePtr node);
265 add_kvp_value_node(xmlNodePtr node, gchar *tag,
KvpValue* val)
270 kvp_type = kvp_value_get_type(val);
275 val_node = xmlNewTextChild(node, NULL, BAD_CAST tag,
276 checked_char_cast (newstr));
284 val_node = gdate_to_dom_tree(tag, &d);
285 xmlAddChild (node, val_node);
288 val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, NULL);
290 switch (kvp_value_get_type(val))
293 add_text_to_node(val_node,
"integer",
294 g_strdup_printf(
"%" G_GINT64_FORMAT,
298 add_text_to_node(val_node,
"double",
299 double_to_string(kvp_value_get_double(val)));
302 add_text_to_node(val_node,
"numeric",
306 xmlSetProp(val_node, BAD_CAST
"type", BAD_CAST
"string");
312 add_text_to_node(val_node,
"guid", guidstr);
317 Timespec ts = kvp_value_get_timespec (val);
319 val_node = timespec_to_dom_tree (tag, &ts);
320 xmlSetProp (val_node, BAD_CAST
"type", BAD_CAST
"timespec");
321 xmlAddChild (node, val_node);
325 xmlSetProp(val_node, BAD_CAST
"type", BAD_CAST
"gdate");
331 xmlSetProp(val_node, BAD_CAST
"type", BAD_CAST
"list");
335 add_kvp_value_node(val_node,
"slot:value", val);
346 xmlSetProp(val_node, BAD_CAST
"type", BAD_CAST
"frame");
353 for (i = 0; keys[i]; ++i)
354 add_kvp_slot(keys[i], kvp_frame_get_value(frame, keys[i]), val_node);
364 add_kvp_slot(
const char * key,
KvpValue* value, xmlNodePtr node)
366 xmlNodePtr slot_node;
367 gchar *newkey = g_strdup ((gchar*)key);
368 slot_node = xmlNewChild(node, NULL, BAD_CAST
"slot", NULL);
370 xmlNewTextChild(slot_node, NULL, BAD_CAST
"slot:key",
371 checked_char_cast (newkey));
373 add_kvp_value_node(slot_node,
"slot:value", value);
377 kvp_frame_to_dom_tree(
const char *tag,
const KvpFrame *frame)
388 ret = xmlNewNode(NULL, BAD_CAST tag);
391 for (i = 0; keys[i]; ++i)
392 add_kvp_slot(keys[i], kvp_frame_get_value(frame, keys[i]), ret);
Date and Time handling routines.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
const char * gnc_commodity_get_namespace_compat(const gnc_commodity *cm)
Use a 64-bit unsigned int timespec.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
gchar * gnc_numeric_to_string(gnc_numeric n)
#define PERR(format, args...)
gint64 kvp_value_get_gint64(const KvpValue *value)
char * kvp_value_get_string(const KvpValue *value)
#define GUID_ENCODING_LENGTH
const char ** kvp_frame_get_keys(const KvpFrame *frame)
GList * kvp_value_get_glist(const KvpValue *value)
GncGUID * kvp_value_get_guid(const KvpValue *value)
GDateTime * gnc_g_date_time_new_from_timespec_local(Timespec tm)
Create a GDateTime from a Timespec.
struct KvpFrameImpl KvpFrame
GDate kvp_value_get_gdate(const KvpValue *value)
KvpFrame * kvp_value_get_frame(const KvpValue *value)
struct KvpValueImpl KvpValue
const gchar * QofLogModule