v0.0.6
[ppastats.git] / trunk / src / lp_json.c
diff --git a/trunk/src/lp_json.c b/trunk/src/lp_json.c
new file mode 100644 (file)
index 0000000..f6bbbcd
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+    Copyright (C) 2011 jeanfi@gmail.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301 USA
+*/
+
+#define _XOPEN_SOURCE
+#include <time.h>
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "lp_json.h"
+#include "lp_ws.h"
+
+struct binary_package_publishing_history *
+json_object_to_binary_package_publishing_history(json_object *o)
+{
+       const char *binary_package_name;
+       const char *binary_package_version;
+       const char *distro_arch_series_link;
+       const char *self_link;
+       int architecture_specific;
+
+       binary_package_name = json_object_get_string
+               (json_object_object_get(o, "binary_package_name"));
+
+       binary_package_version = json_object_get_string
+               (json_object_object_get(o, "binary_package_version"));
+
+       distro_arch_series_link = json_object_get_string
+               (json_object_object_get(o, "distro_arch_series_link"));
+
+       self_link = json_object_get_string
+               (json_object_object_get(o, "self_link"));
+
+       if (json_object_get_boolean
+           (json_object_object_get(o, "architecture_specific")))
+               architecture_specific = 1;
+       else
+               architecture_specific = 0;
+
+       return binary_package_publishing_history_new(binary_package_name,
+                                                    binary_package_version,
+                                                    distro_arch_series_link,
+                                                    self_link,
+                                                    architecture_specific);
+}
+
+struct distro_arch_series *json_object_to_distro_arch_series(json_object *o)
+{
+       const char *display_name;
+       const char *title;
+       const char *architecture_tag;
+       boolean is_nominated_arch_indep;
+       const char *distroseries_link;
+
+
+       display_name = json_object_get_string
+               (json_object_object_get(o, "display_name"));
+
+       title = json_object_get_string
+               (json_object_object_get(o, "title"));
+
+       architecture_tag = json_object_get_string
+               (json_object_object_get(o, "architecture_tag"));
+
+       distroseries_link = json_object_get_string
+               (json_object_object_get(o, "distroseries_link"));
+
+       is_nominated_arch_indep = json_object_get_boolean
+               (json_object_object_get(o, "is_nominated_arch_indep"));
+
+       return distro_arch_series_new(display_name,
+                                     title,
+                                     architecture_tag,
+                                     is_nominated_arch_indep,
+                                     distroseries_link);
+}
+
+struct distro_series *json_object_to_distro_series(json_object *o)
+{
+       const char *displayname;
+       const char *title;
+       const char *name;
+       const char *version;
+
+       displayname = json_object_get_string
+               (json_object_object_get(o, "displayname"));
+
+       title = json_object_get_string
+               (json_object_object_get(o, "title"));
+
+       version = json_object_get_string
+               (json_object_object_get(o, "version"));
+
+       name = json_object_get_string
+               (json_object_object_get(o, "name"));
+
+       return distro_series_new(name,
+                                version,
+                                title,
+                                displayname);
+}
+
+struct binary_package_publishing_history * *
+json_object_to_binary_package_publishing_history_list(json_object *o)
+{
+       json_object *o_entries;
+       int i, n, i2;
+       struct binary_package_publishing_history **entries;
+       struct binary_package_publishing_history *h;
+       const struct distro_arch_series *distro;
+
+       o_entries = json_object_object_get(o, "entries");
+
+       if (!o_entries)
+               return NULL;
+
+       n = json_object_array_length(o_entries);
+
+       entries = malloc
+               (sizeof(struct binary_package_publishing_history *)*(n+1));
+
+       for (i = 0, i2 = 0; i < n; i++) {
+               h = json_object_to_binary_package_publishing_history
+                       (json_object_array_get_idx(o_entries, i));
+
+               if (!h->architecture_specific) {
+                       distro = get_distro_arch_series
+                               (h->distro_arch_series_link);
+
+                       if (!distro->is_nominated_arch_indep) {
+                               binary_package_publishing_history_free(h);
+                               continue ;
+                       }
+               }
+
+               entries[i2] = h;
+               i2++;
+       }
+       entries[i2] = NULL;
+
+       return entries;
+}
+
+struct daily_download_total *
+json_object_to_daily_download_total(const char *d, json_object *o_c)
+{
+       struct daily_download_total *result;
+
+       result = malloc(sizeof(struct daily_download_total));
+       result->count = json_object_get_int(o_c);
+
+       strptime(d, "%FT%T%z", &result->date);
+
+       return result;
+}
+
+static int json_object_get_fields_count(json_object *o)
+{
+       int n = 0;
+       struct lh_entry *entry;
+
+       entry = json_object_get_object(o)->head;
+       while (entry) {
+               entry = entry->next;
+               n++;
+       }
+
+       return n;
+}
+
+struct daily_download_total * *
+json_object_to_daily_download_totals(json_object *o)
+{
+       int n, i;
+       struct daily_download_total **result;
+
+       n = json_object_get_fields_count(o);
+
+       result = malloc
+               (sizeof(struct daily_download_total *)*(n+1));
+
+       i = 0;
+       json_object_object_foreach(o, key, val) {
+               result[i] = json_object_to_daily_download_total(key, val);
+               i++;
+       }
+
+       result[n] = NULL;
+
+       return result;
+}