X-Git-Url: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git;a=blobdiff_plain;f=src%2Frsensor.c;fp=src%2Frsensor.c;h=0000000000000000000000000000000000000000;hp=f42ab76f961f542fee08d4ee7b7ae96c3ec49fa1;hb=46d058bd1e0f43ea797d19c7e71464e5cf65e902;hpb=02611eef7107eba73945e0ad47edb129c6261cc2 diff --git a/src/rsensor.c b/src/rsensor.c deleted file mode 100644 index f42ab76..0000000 --- a/src/rsensor.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * 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 -#include -#include - -#include - -#include -#include -#include -#include - -struct ucontent { - char *data; - size_t len; -}; - -static CURL *curl; - -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; - struct ucontent *mem; - - realsize = size * nmemb; - mem = (struct ucontent *)userp; - - mem->data = realloc(mem->data, mem->len + realsize + 1); - - memcpy(&(mem->data[mem->len]), buffer, realsize); - mem->len += realsize; - mem->data[mem->len] = 0; - - return realsize; -} - -static char *create_api_1_1_sensors_url(const char *base_url) -{ - 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_1_SENSORS); - - free(nurl); - - return ret; -} - -void rsensor_init(void) -{ - curl = curl_easy_init(); -} - -void rsensor_cleanup(void) -{ - curl_easy_cleanup(curl); -} - -static json_object *get_json_object(const char *url) -{ - struct ucontent chunk; - json_object *obj; - - obj = NULL; - - if (!curl) - return NULL; - - chunk.data = malloc(1); - chunk.len = 0; - - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - 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 - log_err(_("%s: Fail to connect to: %s"), PROVIDER_NAME, url); - - free(chunk.data); - - return obj; -} - -struct psensor **get_remote_sensors(const char *server_url, - int values_max_length) -{ - struct psensor **sensors, *s; - char *url; - json_object *obj; - int i, n; - - sensors = NULL; - - url = create_api_1_1_sensors_url(server_url); - - obj = get_json_object(url); - - if (obj && !is_error(obj)) { - n = json_object_array_length(obj); - sensors = malloc((n + 1) * sizeof(struct psensor *)); - - for (i = 0; i < n; i++) { - s = psensor_new_from_json - (json_object_array_get_idx(obj, i), - url, - values_max_length); - sensors[i] = s; - } - - sensors[n] = NULL; - - json_object_put(obj); - } else { - log_err(_("%s: Invalid content: %s"), PROVIDER_NAME, url); - } - - free(url); - - if (!sensors) { - sensors = malloc(sizeof(struct psensor *)); - *sensors = NULL; - } - - return sensors; -} - -static void remote_psensor_update(struct psensor *s) -{ - json_object *obj; - - obj = get_json_object(get_url(s)); - - if (obj && !is_error(obj)) { - json_object *om; - - json_object_object_get_ex(obj, "last_measure", &om); - - if (!is_error(obj)) { - json_object *ov, *ot; - struct timeval tv; - - 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); - } - - json_object_put(obj); - } else { - log_err(_("%s: Invalid JSON: %s"), PROVIDER_NAME, get_url(s)); - } - -} - -void remote_psensor_list_update(struct psensor **sensors) -{ - struct psensor **cur; - - cur = sensors; - while (*cur) { - struct psensor *s = *cur; - - if (s->type & SENSOR_TYPE_REMOTE) - remote_psensor_update(s); - - cur++; - } -}