--- /dev/null
+/*
+ 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;
+}