[libsoup/wip/xclaesse/xmlrpc: 3/10] xmlrpc: Add special GVariant representing a datatime



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 &lt;struct&gt;
  *  - "ay" are serialized as &lt;base64&gt;
  *  - tuples are serialized as &lt;array&gt;
- *
- * It is not currently possible to build &lt;dateTime.iso8601&gt; 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
+ *    &lt;dateTime.iso8601&gt;
  *
  * 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 &lt;@type&gt;
+ * 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 &lt;dateTime.iso8601&gt;
+ * 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]