[libsoup/wip/xclaesse/xmlrpc: 3/10] xmlrpc: Add special GVariant representing a datatime
- From: Xavier Claessens <xclaesse src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup/wip/xclaesse/xmlrpc: 3/10] xmlrpc: Add special GVariant representing a datatime
- Date: Tue, 23 Jun 2015 14:47:20 +0000 (UTC)
commit 1a552a73c8c2b72527d10636c3b8b815e4e62563
Author: Xavier Claessens <xavier claessens collabora com>
Date: Sat Jun 13 08:35:32 2015 -0400
xmlrpc: Add special GVariant representing a datatime
https://bugzilla.gnome.org/show_bug.cgi?id=746495
docs/reference/libsoup-2.4-sections.txt | 2 +
libsoup/libsoup-2.4.sym | 2 +
libsoup/soup-xmlrpc-variant.c | 66 ++++++++++++++++++++++++++++--
libsoup/soup-xmlrpc-variant.h | 5 ++-
tests/xmlrpc-variant-test.c | 2 +-
5 files changed, 70 insertions(+), 7 deletions(-)
---
diff --git a/docs/reference/libsoup-2.4-sections.txt b/docs/reference/libsoup-2.4-sections.txt
index 00163b9..391c0a1 100644
--- a/docs/reference/libsoup-2.4-sections.txt
+++ b/docs/reference/libsoup-2.4-sections.txt
@@ -832,6 +832,8 @@ soup_form_encode_urlencoded_list
<SUBSECTION>
soup_xmlrpc_build_request
soup_xmlrpc_message_new
+soup_xmlrpc_new_custom
+soup_xmlrpc_new_datetime
<SUBSECTION>
soup_xmlrpc_build_response
soup_xmlrpc_message_set_response
diff --git a/libsoup/libsoup-2.4.sym b/libsoup/libsoup-2.4.sym
index 5fe2e08..472f64f 100644
--- a/libsoup/libsoup-2.4.sym
+++ b/libsoup/libsoup-2.4.sym
@@ -553,6 +553,8 @@ soup_xmlrpc_fault_get_type
soup_xmlrpc_fault_quark
soup_xmlrpc_message_new
soup_xmlrpc_message_set_response
+soup_xmlrpc_new_custom
+soup_xmlrpc_new_datetime
soup_xmlrpc_params_free
soup_xmlrpc_params_parse
soup_xmlrpc_parse_method_call
diff --git a/libsoup/soup-xmlrpc-variant.c b/libsoup/soup-xmlrpc-variant.c
index 3aa6b5e..4f3756f 100644
--- a/libsoup/soup-xmlrpc-variant.c
+++ b/libsoup/soup-xmlrpc-variant.c
@@ -178,10 +178,26 @@ insert_value (xmlNode *parent, GVariant *value, GError **error)
break;
}
- case G_VARIANT_CLASS_TUPLE:
+ case G_VARIANT_CLASS_TUPLE: {
+ /* Special case for custom types */
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE ("(oss)"))) {
+ const gchar *path;
+ const gchar *type;
+ const gchar *v;
+
+ g_variant_get (value, "(&o&s&s)", &path, &type, &v);
+ if (g_str_equal (path, "/org/gnome/libsoup/ExtensionType")) {
+ xmlNewTextChild (xvalue, NULL,
+ (const xmlChar *)type,
+ (const xmlChar *)v);
+ break;
+ }
+ }
+
if (!insert_array (xvalue, value, error))
return FALSE;
break;
+ }
case G_VARIANT_CLASS_DICT_ENTRY: {
xmlNode *node;
@@ -234,10 +250,8 @@ fail:
* - "a{s*}" are serialized as <struct>
* - "ay" are serialized as <base64>
* - tuples are serialized as <array>
- *
- * It is not currently possible to build <dateTime.iso8601> values since
- * #GVariant does not have date/time type. If sending a date is required then
- * soup_xmlrpc_build_method_call() should be used instead.
+ * - variants created by soup_xmlrpc_new_datetime() are serialized as
+ * <dateTime.iso8601>
*
* If @params is floating, it is consumed.
*
@@ -1243,3 +1257,45 @@ fail:
xmlFreeDoc (doc);
return value ? g_variant_ref_sink (value) : NULL;
}
+
+/**
+ * soup_xmlrpc_new_custom:
+ * @type: name for the type node
+ * @value: value for the type node
+ *
+ * Construct a special #GVariant used to serialize a <@type>
+ * node containing @value. See soup_xmlrpc_build_request().
+ *
+ * Returns: a floating #GVariant.
+ */
+GVariant *
+soup_xmlrpc_new_custom (const gchar *type, const gchar *value)
+{
+ return g_variant_new ("(oss)", "/org/gnome/libsoup/ExtensionType",
+ type, value);
+}
+
+/**
+ * soup_xmlrpc_new_datetime:
+ * @timestamp: a unix timestamp
+ *
+ * Construct a special #GVariant used to serialize a <dateTime.iso8601>
+ * node. See soup_xmlrpc_build_request().
+ *
+ * Returns: a floating #GVariant.
+ */
+GVariant *
+soup_xmlrpc_new_datetime (time_t timestamp)
+{
+ SoupDate *date;
+ GVariant *variant;
+ gchar *str;
+
+ date = soup_date_new_from_time_t (timestamp);
+ str = soup_date_to_string (date, SOUP_DATE_ISO8601_XMLRPC);
+ variant = soup_xmlrpc_new_custom ("dateTime.iso8601", str);
+ soup_date_free (date);
+ g_free (str);
+
+ return variant;
+}
diff --git a/libsoup/soup-xmlrpc-variant.h b/libsoup/soup-xmlrpc-variant.h
index 38db959..a564133 100644
--- a/libsoup/soup-xmlrpc-variant.h
+++ b/libsoup/soup-xmlrpc-variant.h
@@ -45,7 +45,10 @@ gboolean soup_xmlrpc_message_set_response (SoupMessage *msg,
GVariant *value,
GError **error);
-
+/* Utils */
+GVariant *soup_xmlrpc_new_custom (const gchar *type,
+ const gchar *value);
+GVariant *soup_xmlrpc_new_datetime (time_t timestamp);
G_END_DECLS
diff --git a/tests/xmlrpc-variant-test.c b/tests/xmlrpc-variant-test.c
index 0d49dc8..ccbbc18 100644
--- a/tests/xmlrpc-variant-test.c
+++ b/tests/xmlrpc-variant-test.c
@@ -87,7 +87,7 @@ test_serializer (void)
"</params>");
verify_serialization (g_variant_new ("(@*)", soup_xmlrpc_new_datetime (1434161309)),
"<params>"
- "<param><value><dateTime.iso8601>2015-06-13T02:08:29Z</dateTime.iso8601></value></param>"
+ "<param><value><dateTime.iso8601>20150613T02:08:29</dateTime.iso8601></value></param>"
"</params>");
verify_serialization (g_variant_new ("(s)", "<>&"),
"<params>"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]