Extend commit 25680305095bfcedaa46cb017182544183ab743b to the whole cpu object.
[monky] / src / ccurl_thread.c
index 9e2a003..0dbe88e 100644 (file)
@@ -1,10 +1,11 @@
 /* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*-
+ * vim: ts=4 sw=4 noet ai cindent syntax=c
  *
  * Conky, a system monitor, based on torsmo
  *
  * Please see COPYING for details
  *
- * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
+ * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al.
  *     (see AUTHORS)
  * All rights reserved.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
- * vim: ts=4 sw=4 noet ai cindent syntax=c
- *
  */
 
 #include "conky.h"
 #include "logging.h"
 #include "ccurl_thread.h"
+#include "text_object.h"
 
 #ifdef DEBUG
 #include <assert.h>
@@ -122,26 +122,35 @@ void ccurl_fetch_data(ccurl_location_t *curloc)
        chunk.memory = NULL;
        chunk.size = 0;
 
-       curl = curl_easy_init();
-       if (curl) {
-               DBGP("reading curl data from '%s'", curloc->uri);
-               curl_easy_setopt(curl, CURLOPT_URL, curloc->uri);
-               curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
-               curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ccurl_write_memory_callback);
-               curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk);
-               curl_easy_setopt(curl, CURLOPT_USERAGENT, "conky-curl/1.0");
-
-               res = curl_easy_perform(curl);
-               if (res == CURLE_OK && chunk.size) {
-                       timed_thread_lock(curloc->p_timed_thread);
-                       (*curloc->process_function)(curloc->result, chunk.memory);
-                       timed_thread_unlock(curloc->p_timed_thread);
-                       free(chunk.memory);
-               } else {
-                       NORM_ERR("curl: no data from server");
-               }
+       if (curl_global_init(CURL_GLOBAL_ALL) == 0) {
+               curl = curl_easy_init();
+               if (curl) {
+                       DBGP("reading curl data from '%s'", curloc->uri);
+                       curl_easy_setopt(curl, CURLOPT_URL, curloc->uri);
+                       curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
+                       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ccurl_write_memory_callback);
+                       curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk);
+                       curl_easy_setopt(curl, CURLOPT_USERAGENT, "conky-curl/1.0");
+
+                       res = curl_easy_perform(curl);
+                       if (res == CURLE_OK && chunk.size) {
+                               long http_status_code;
 
-               curl_easy_cleanup(curl);
+                               if(curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status_code) == CURLE_OK && http_status_code == 200) {
+                                       timed_thread_lock(curloc->p_timed_thread);
+                                       (*curloc->process_function)(curloc->result, chunk.memory);
+                                       timed_thread_unlock(curloc->p_timed_thread);
+                               } else {
+                                       NORM_ERR("curl: no data from server");
+                               }
+                               free(chunk.memory);
+                       } else {
+                               NORM_ERR("curl: no data from server");
+                       }
+
+                       curl_easy_cleanup(curl);
+               }
+               curl_global_cleanup();
        }
 }
 
@@ -184,6 +193,11 @@ void *ccurl_thread(void *arg)
  * This is where the $curl section begins.
  */
 
+struct curl_data {
+       char uri[128];
+       float interval;
+};
+
 /* internal location pointer for use by $curl, no touchy */
 static ccurl_location_t *ccurl_locations_head = 0;
 
@@ -194,7 +208,7 @@ void ccurl_free_info(void)
 }
 
 /* straight copy, used by $curl */
-void ccurl_parse_data(void *result, const char *data)
+static void ccurl_parse_data(void *result, const char *data)
 {
        strncpy(result, data, max_user_text);
 }
@@ -218,3 +232,40 @@ void ccurl_process_info(char *p, int p_max_size, char *uri, int interval)
        timed_thread_unlock(curloc->p_timed_thread);
 }
 
+void curl_parse_arg(struct text_object *obj, const char *arg)
+{
+       int argc;
+       struct curl_data *cd;
+       float interval = 0;
+
+       cd = malloc(sizeof(struct curl_data));
+       memset(cd, 0, sizeof(struct curl_data));
+
+       argc = sscanf(arg, "%127s %f", cd->uri, &interval);
+       if (argc < 1) {
+               free(cd);
+               NORM_ERR("wrong number of arguments for $curl");
+               return;
+       }
+       cd->interval = interval > 0 ? interval * 60 : 15*60;
+       obj->data.opaque = cd;
+}
+
+void curl_print(struct text_object *obj, char *p, int p_max_size)
+{
+       struct curl_data *cd = obj->data.opaque;
+
+       if (!cd || !cd->uri) {
+               NORM_ERR("error processing Curl data");
+               return;
+       }
+       ccurl_process_info(p, p_max_size, cd->uri, cd->interval);
+}
+
+void curl_obj_free(struct text_object *obj)
+{
+       if (obj->data.opaque) {
+               free(obj->data.opaque);
+               obj->data.opaque = NULL;
+       }
+}