+ while (*ddts) {
+ ddt = *ddts;
+
+ json_ddt = json_object_new_object();
+ json_object_object_add(json_ddt,
+ "value",
+ json_object_new_int(ddt->count));
+ json_object_object_add(json_ddt,
+ "time",
+ date_to_json(&ddt->date));
+
+ json_object_array_add(json_ddts, json_ddt);
+
+ ddts++;
+ }
+}
+
+static char *pkg_to_json(struct ppa_stats *ppa, struct package_stats *pkg)
+{
+ json_object *json, *json_versions;
+ char *ret;
+ struct version_stats **versions;
+
+ json = json_object_new_object();
+
+ json_object_object_add(json,
+ "ppa_name", json_object_new_string(ppa->name));
+ json_object_object_add(json,
+ "ppa_owner",
+ json_object_new_string(ppa->owner));
+
+ json_object_object_add(json,
+ "name", json_object_new_string(pkg->name));
+
+ json_versions = json_object_new_array();
+ json_object_object_add(json, "versions", json_versions);
+ versions = pkg->versions;
+ while (*versions) {
+ json_object_array_add
+ (json_versions,
+ json_object_new_string((*versions)->version));
+
+ versions++;
+ }
+
+ json_add_ddts(json, pkg->daily_download_totals);
+
+ ret = strdup(json_object_to_json_string(json));
+
+ json_object_put(json);
+
+ return ret;
+}
+
+static char *version_to_json(struct ppa_stats *ppa,
+ struct package_stats *pkg,
+ struct version_stats *ver)
+{
+ char *ret;
+ struct distro_stats **distros, *distro;
+ json_object *json, *json_distros, *json_distro, *json_archs, *json_arch;
+ struct arch_stats **archs;
+
+ json = json_object_new_object();
+
+ json_object_object_add(json,
+ "ppa_name", json_object_new_string(ppa->name));
+ json_object_object_add(json,
+ "ppa_owner",
+ json_object_new_string(ppa->owner));
+
+ json_object_object_add(json,
+ "pkg_name", json_object_new_string(pkg->name));
+
+ json_object_object_add(json,
+ "name", json_object_new_string(ver->version));
+
+ json_add_ddts(json, ver->daily_download_totals);
+
+ distros = ver->distros;
+ json_distros = json_object_new_array();
+ json_object_object_add(json, "distros", json_distros);
+ while (*distros) {
+ distro = *distros;
+ json_distro = json_object_new_object();
+
+ json_object_array_add(json_distros, json_distro);
+
+ json_object_object_add(json_distro,
+ "name",
+ json_object_new_string(distro->name));
+
+ archs = distro->archs;
+ json_archs = json_object_new_array();
+ json_object_object_add(json_distro, "archs", json_archs);
+ while (*archs) {
+ json_arch = json_object_new_object();
+
+ json_object_object_add
+ (json_arch,
+ "name",
+ json_object_new_string((*archs)->name));
+
+ json_object_object_add
+ (json_arch,
+ "count",
+ json_object_new_int((*archs)->download_count));
+
+ json_object_array_add(json_archs, json_arch);
+ archs++;
+ }
+
+ distros++;
+ }
+
+ ret = strdup(json_object_to_json_string(json));
+
+ json_object_put(json);
+
+ return ret;
+}
+
+static void
+pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir)
+{
+ char *path;
+ FILE *f;
+ char *json;
+
+ path = get_path(dir, pkg->name);
+ f = fopen(path, "w");
+
+ if (!f) {
+ fprintf(stderr, "ERROR: failed to open: %s\n", path);
+ return ;