X-Git-Url: https://git.wpitchoune.net/gitweb/?p=psensor.git;a=blobdiff_plain;f=src%2Frsensor.c;h=f42ab76f961f542fee08d4ee7b7ae96c3ec49fa1;hp=052afa151b3e17b875974afda689d00cc7eda6a0;hb=c1e20f2631a1249720e9c75d753eacfcb0f6c7b9;hpb=d2d694aef88fbdada5f2bf1bc9681e7014a06b87 diff --git a/src/rsensor.c b/src/rsensor.c index 052afa1..f42ab76 100644 --- a/src/rsensor.c +++ b/src/rsensor.c @@ -1,37 +1,35 @@ /* - Copyright (C) 2010-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 -*/ - + * Copyright (C) 2010-2016 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 + */ #include #include #define _(str) gettext(str) -#include "url.h" -#include "server/server.h" - #include #include #include #include -#include -#include "rsensor.h" +#include +#include +#include +#include struct ucontent { char *data; @@ -40,10 +38,20 @@ struct ucontent { static CURL *curl; -size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp) +static const char *PROVIDER_NAME = "rsensor"; + +static const char *get_url(struct psensor *s) +{ + return (char *)s->provider_data; +} + +static size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp) { - size_t realsize = size * nmemb; - struct ucontent *mem = (struct ucontent *)userp; + size_t realsize; + struct ucontent *mem; + + realsize = size * nmemb; + mem = (struct ucontent *)userp; mem->data = realloc(mem->data, mem->len + realsize + 1); @@ -54,65 +62,39 @@ size_t cbk_curl(void *buffer, size_t size, size_t nmemb, void *userp) return realsize; } -char *create_api_1_0_sensors_url(const char *base_url) +static char *create_api_1_1_sensors_url(const char *base_url) { - char *nurl = url_normalize(base_url); - int n = strlen(nurl) + strlen(URL_BASE_API_1_0_SENSORS) + 1; - char *ret = malloc(n); + char *nurl, *ret; + int n; + + nurl = url_normalize(base_url); + n = strlen(nurl) + strlen(URL_BASE_API_1_1_SENSORS) + 1; + ret = malloc(n); strcpy(ret, nurl); - strcat(ret, URL_BASE_API_1_0_SENSORS); + strcat(ret, URL_BASE_API_1_1_SENSORS); free(nurl); return ret; } -struct psensor *json_object_to_psensor(json_object * o, - const char *sensors_url, - int values_max_length) -{ - json_object *oid; - json_object *oname; - json_object *otype; - struct psensor *s; - char *eid; - char *url; - - oid = json_object_object_get(o, "id"); - oname = json_object_object_get(o, "name"); - otype = json_object_object_get(o, "type"); - - eid = url_encode(json_object_get_string(oid)); - url = malloc(strlen(sensors_url) + 1 + strlen(eid) + 1); - sprintf(url, "%s/%s", sensors_url, eid); - - s = psensor_create(strdup(url), - strdup(json_object_get_string(oname)), - json_object_get_int(otype) | SENSOR_TYPE_REMOTE, - values_max_length); - s->url = url; - - free(eid); - - return s; -} - -void rsensor_init() +void rsensor_init(void) { curl = curl_easy_init(); } -void rsensor_end() +void rsensor_cleanup(void) { curl_easy_cleanup(curl); } -json_object *get_json_object(const char *url) +static json_object *get_json_object(const char *url) { - struct ucontent chunk; - json_object *obj = NULL; + json_object *obj; + + obj = NULL; if (!curl) return NULL; @@ -125,10 +107,12 @@ json_object *get_json_object(const char *url) curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cbk_curl); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + log_fct("%s: HTTP request %s", PROVIDER_NAME, url); + if (curl_easy_perform(curl) == CURLE_OK) obj = json_tokener_parse(chunk.data); else - fprintf(stderr, _("ERROR: Fail to connect to: %s\n"), url); + log_err(_("%s: Fail to connect to: %s"), PROVIDER_NAME, url); free(chunk.data); @@ -138,24 +122,26 @@ json_object *get_json_object(const char *url) struct psensor **get_remote_sensors(const char *server_url, int values_max_length) { - struct psensor **sensors = NULL; + struct psensor **sensors, *s; char *url; json_object *obj; + int i, n; - url = create_api_1_0_sensors_url(server_url); + sensors = NULL; + + url = create_api_1_1_sensors_url(server_url); obj = get_json_object(url); if (obj && !is_error(obj)) { - int i; - int n = json_object_array_length(obj); + n = json_object_array_length(obj); sensors = malloc((n + 1) * sizeof(struct psensor *)); for (i = 0; i < n; i++) { - struct psensor *s = json_object_to_psensor - (json_object_array_get_idx(obj, i), - url, - values_max_length); + s = psensor_new_from_json + (json_object_array_get_idx(obj, i), + url, + values_max_length); sensors[i] = s; } @@ -163,7 +149,7 @@ struct psensor **get_remote_sensors(const char *server_url, json_object_put(obj); } else { - fprintf(stderr, _("ERROR: Invalid content: %s\n"), url); + log_err(_("%s: Invalid content: %s"), PROVIDER_NAME, url); } free(url); @@ -176,40 +162,43 @@ struct psensor **get_remote_sensors(const char *server_url, return sensors; } -void remote_psensor_update(struct psensor *s) +static void remote_psensor_update(struct psensor *s) { - json_object *obj = get_json_object(s->url); + json_object *obj; + + obj = get_json_object(get_url(s)); if (obj && !is_error(obj)) { json_object *om; - om = json_object_object_get(obj, "last_measure"); + json_object_object_get_ex(obj, "last_measure", &om); if (!is_error(obj)) { json_object *ov, *ot; struct timeval tv; - ov = json_object_object_get(om, "value"); - ot = json_object_object_get(om, "time"); + json_object_object_get_ex(om, "value", &ov); + json_object_object_get_ex(om, "time", &ot); tv.tv_sec = json_object_get_int(ot); tv.tv_usec = 0; psensor_set_current_measure - (s, json_object_get_double(ov), tv);; + (s, json_object_get_double(ov), tv); } json_object_put(obj); } else { - printf(_("ERROR: Invalid JSON: %s\n"), s->url); + log_err(_("%s: Invalid JSON: %s"), PROVIDER_NAME, get_url(s)); } } void remote_psensor_list_update(struct psensor **sensors) { - struct psensor **cur = sensors; + struct psensor **cur; + cur = sensors; while (*cur) { struct psensor *s = *cur;