[libgdata] core: Add helper function to work around Google RFC 3339 incompatibility



commit 76ea0e7dc549e4abfbab6caca87fa834245a3b88
Author: Peteris Krisjanis <pecisk gmail com>
Date:   Sat Oct 12 16:17:17 2013 +0300

    core: Add helper function to work around Google RFC 3339 incompatibility
    
    In Google Tasks API it isn't supported to provide date/time in
    RFC 3339/ISO 8601 format without providing time in miliseconds. As
    gdata_parser_int64_to_iso8601() returns a properly formatted string, helper
    function replaces last character 'Z' with '.000001+00:00' to fit Google’s
    supported format.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=657539

 gdata/gdata-entry.c                     |    2 +-
 gdata/gdata-parser.c                    |   17 +++++++++++++++++
 gdata/gdata-parser.h                    |    1 +
 gdata/services/tasks/gdata-tasks-task.c |    9 ++-------
 gdata/tests/general.c                   |    2 +-
 5 files changed, 22 insertions(+), 9 deletions(-)
---
diff --git a/gdata/gdata-entry.c b/gdata/gdata-entry.c
index c393980..9121555 100644
--- a/gdata/gdata-entry.c
+++ b/gdata/gdata-entry.c
@@ -652,7 +652,7 @@ get_json (GDataParsable *parsable, JsonBuilder *builder)
        }
 
        if (priv->updated != -1) {
-               gchar *updated = gdata_parser_int64_to_iso8601 (priv->updated);
+               gchar *updated = gdata_parser_int64_to_json_iso8601 (priv->updated);
                json_builder_set_member_name (builder, "updated");
                json_builder_add_string_value (builder, updated);
                g_free (updated);
diff --git a/gdata/gdata-parser.c b/gdata/gdata-parser.c
index 1bb926b..53203b7 100644
--- a/gdata/gdata-parser.c
+++ b/gdata/gdata-parser.c
@@ -248,6 +248,23 @@ gdata_parser_int64_to_iso8601 (gint64 _time)
        return g_time_val_to_iso8601 (&time_val);
 }
 
+/* FIXME: Work around for Google's incorrect ISO 8601 implementation. */
+gchar *
+gdata_parser_int64_to_json_iso8601 (gint64 _time)
+{
+       gchar *iso8601;
+       gchar **date_time_components;
+       gchar *retval;
+
+       iso8601 = gdata_parser_int64_to_iso8601 (_time);
+
+       date_time_components = g_strsplit (iso8601, "Z", 2);
+       retval = g_strjoinv (".000001+00:00", date_time_components);
+       g_strfreev (date_time_components);
+
+       return retval;
+}
+
 gboolean
 gdata_parser_int64_from_iso8601 (const gchar *date, gint64 *_time)
 {
diff --git a/gdata/gdata-parser.h b/gdata/gdata-parser.h
index 2c5ad2f..d6bcea7 100644
--- a/gdata/gdata-parser.h
+++ b/gdata/gdata-parser.h
@@ -42,6 +42,7 @@ gboolean gdata_parser_error_not_iso8601_format_json (JsonReader *reader, const g
 gboolean gdata_parser_int64_from_date (const gchar *date, gint64 *_time);
 gchar *gdata_parser_date_from_int64 (gint64 _time) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
 gchar *gdata_parser_int64_to_iso8601 (gint64 _time) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
+gchar *gdata_parser_int64_to_json_iso8601 (gint64 _time) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
 gboolean gdata_parser_int64_from_iso8601 (const gchar *date, gint64 *_time);
 
 /*
diff --git a/gdata/services/tasks/gdata-tasks-task.c b/gdata/services/tasks/gdata-tasks-task.c
index 7dcb438..24e812f 100644
--- a/gdata/services/tasks/gdata-tasks-task.c
+++ b/gdata/services/tasks/gdata-tasks-task.c
@@ -315,11 +315,6 @@ parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GEr
        return TRUE;
 }
 
-static gchar*
-iso8601_to_google (gchar* datetime_string) {
-       return g_strjoinv (".000001+00:00", g_strsplit ((const gchar*) datetime_string, "Z", -1));
-}
-
 static void
 get_json (GDataParsable *parsable, JsonBuilder *builder)
 {
@@ -350,13 +345,13 @@ get_json (GDataParsable *parsable, JsonBuilder *builder)
                json_builder_add_string_value (builder, priv->status);
        }
        if (priv->due != -1) {
-               due = iso8601_to_google (gdata_parser_int64_to_iso8601 (priv->due));
+               due = gdata_parser_int64_to_json_iso8601 (priv->due);
                json_builder_set_member_name (builder, "due");
                json_builder_add_string_value (builder, due);
                g_free (due);
        }
        if (priv->completed != -1) {
-               completed = iso8601_to_google (gdata_parser_int64_to_iso8601 (priv->completed));
+               completed = gdata_parser_int64_to_json_iso8601 (priv->completed);
                json_builder_set_member_name (builder, "completed");
                json_builder_add_string_value (builder, completed);
                g_free (completed);
diff --git a/gdata/tests/general.c b/gdata/tests/general.c
index 6d8ec5b..8a19563 100644
--- a/gdata/tests/general.c
+++ b/gdata/tests/general.c
@@ -576,7 +576,7 @@ test_entry_parse_json (void)
                "{"
                        "\"title\":\"A title\","
                        "\"id\":\"some-id\","
-                       "\"updated\":\"2009-01-25T14:07:37Z\","
+                       "\"updated\":\"2009-01-25T14:07:37.000001+00:00\","
                        "\"etag\":\"some-etag\","
                        "\"selfLink\":\"http://example.com/\",";
                        "\"kind\":\"kind#kind\","


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]