[libgdata] core: Add helper function to work around Google RFC 3339 incompatibility
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata] core: Add helper function to work around Google RFC 3339 incompatibility
- Date: Fri, 25 Oct 2013 23:58:21 +0000 (UTC)
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]