X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=trunk%2Fsrc%2Flp_json.c;fp=trunk%2Fsrc%2Flp_json.c;h=f6bbbcd5a295b2854c4fc67c8104e417cdd71824;hb=b19be7b6db9f737f9a9a22b3079abc774cc7583c;hp=0000000000000000000000000000000000000000;hpb=b19f912053682528d7efa15aa5641a1f055f3038;p=ppastats.git diff --git a/trunk/src/lp_json.c b/trunk/src/lp_json.c new file mode 100644 index 0000000..f6bbbcd --- /dev/null +++ b/trunk/src/lp_json.c @@ -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 + + +#include +#include + +#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; +}