raster pushed a commit to branch master. http://git.enlightenment.org/enlightenment/modules/forecasts.git/commit/?id=d1486a92a0ef29e19c40d1ffcea0f6cafbc13c7d
commit d1486a92a0ef29e19c40d1ffcea0f6cafbc13c7d Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Sat Feb 20 20:16:38 2021 +0000 use ecore_on url - nuke warnings and use mouse up for popup --- src/e_mod_config.c | 14 +-- src/e_mod_main.c | 281 +++++++++++++++++------------------------------------ src/e_mod_main.h | 1 - 3 files changed, 94 insertions(+), 202 deletions(-) diff --git a/src/e_mod_config.c b/src/e_mod_config.c index d84c920..e13db6f 100644 --- a/src/e_mod_config.c +++ b/src/e_mod_config.c @@ -77,7 +77,7 @@ _create_data(E_Config_Dialog *cfd) } static void -_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +_free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) { if (!forecasts_config) return; @@ -102,7 +102,7 @@ _poll_time_slider_changed_cb(void *data, Evas_Object *obj, } static void -_radio_changed_cb(void *data, Evas_Object *obj, +_radio_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { E_Config_Dialog *cfd = data; @@ -123,7 +123,7 @@ _text_location_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) } static void -_item_location_del(void *data, Evas_Object *obj) +_item_location_del(void *data, Evas_Object *obj EINA_UNUSED) { Places_Location *location = data; @@ -131,7 +131,7 @@ _item_location_del(void *data, Evas_Object *obj) } static void -_locations_selected_cb(void *data, Evas_Object *obj, +_locations_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { E_Config_Dialog_Data *cfdata; @@ -186,8 +186,8 @@ _locations_fill(E_Config_Dialog_Data *cfdata) } static void -_categories_selected_cb(void *data, Evas_Object *obj, - void *event_info EINA_UNUSED) +_categories_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { E_Config_Dialog_Data *cfdata; Elm_Object_Item *it; @@ -206,7 +206,7 @@ _categories_selected_cb(void *data, Evas_Object *obj, } static void -_item_location_id_del(void *data, Evas_Object *obj) +_item_location_id_del(void *data, Evas_Object *obj EINA_UNUSED) { Places_Category *category = data; free(category); diff --git a/src/e_mod_main.c b/src/e_mod_main.c index e86493e..3e4bd73 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -2,8 +2,7 @@ #include "e_mod_main.h" #include <json-c/json.h> -#define _XOPEN_SOURCE -#include <time.h> +char *strptime(const char *s, const char *format, struct tm *tm); #define FORECASTS 2 #define KM_TO_MI 1.609344 @@ -42,10 +41,9 @@ struct _Instance Evas_Object *forecasts_obj; Forecasts *forecasts; Ecore_Timer *check_timer; - Ecore_Con_Server *server; - Ecore_Event_Handler *add_handler; - Ecore_Event_Handler *del_handler; - Ecore_Event_Handler *data_handler; + Ecore_Con_Url *url; + Ecore_Event_Handler *url_data_handler; + Ecore_Event_Handler *url_complete_handler; struct { @@ -99,17 +97,9 @@ struct _Forecasts Evas_Object *icon_obj; }; -struct -{ - const char *host; - int port; -} proxy = { - NULL, 0 -}; - /* Module Function Protos */ -static void _forecasts_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, - void *event_info); +static void _forecasts_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, + void *event_info); static void _forecasts_menu_cb_configure(void *data, E_Menu *m, E_Menu_Item *mi); static void _forecasts_menu_cb_post(void *data, E_Menu *m); @@ -117,10 +107,8 @@ static Eina_Bool _forecasts_cb_check(void *data); static Config_Item *_forecasts_config_item_get(const char *id); static Forecasts *_forecasts_new(Evas *evas); static void _forecasts_free(Forecasts *w); -static void _forecasts_get_proxy(void); -static Eina_Bool _forecasts_server_add(void *data, int type, void *event); -static Eina_Bool _forecasts_server_del(void *data, int type, void *event); -static Eina_Bool _forecasts_server_data(void *data, int type, void *event); +static Eina_Bool _forecasts_url_data(void *data, int type, void *event); +static Eina_Bool _forecasts_url_complete(void *data, int type, void *event); static int _forecasts_parse(void *data); static void _forecasts_converter(Instance *inst); static void _forecasts_convert_degrees(int *value, int dir); @@ -128,7 +116,7 @@ static void _forecasts_convert_distances(int *value, int dir); static void _forecasts_convert_pressures(float *value, int dir); static void _forecasts_display_set(Instance *inst, int ok); static void _forecasts_popup_content_create(Instance *inst); -static void _cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info); static Evas_Object *_forecasts_popup_icon_create(Evas *evas, const char *code); @@ -159,28 +147,24 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) inst->gcc = gcc; inst->popup = NULL; inst->forecasts_obj = o; - evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_DOWN, - _cb_mouse_down, inst); + evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_UP, + _cb_mouse_up, inst); evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_IN, _cb_mouse_in, inst); evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_OUT, _cb_mouse_out, inst); - if (!inst->add_handler) - inst->add_handler = - ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, - _forecasts_server_add, inst); - if (!inst->del_handler) - inst->del_handler = - ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, - _forecasts_server_del, inst); - if (!inst->data_handler) - inst->data_handler = - ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, - _forecasts_server_data, inst); - - evas_object_event_callback_add(w->forecasts_obj, EVAS_CALLBACK_MOUSE_DOWN, - _forecasts_cb_mouse_down, inst); + if (!inst->url_data_handler) + inst->url_data_handler = + ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, + _forecasts_url_data, inst); + if (!inst->url_complete_handler) + inst->url_complete_handler = + ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, + _forecasts_url_complete, inst); + + evas_object_event_callback_add(w->forecasts_obj, EVAS_CALLBACK_MOUSE_UP, + _forecasts_cb_mouse_up, inst); forecasts_config->instances = eina_list_append(forecasts_config->instances, inst); @@ -202,24 +186,22 @@ _gc_shutdown(E_Gadcon_Client *gcc) if (inst->popup) _forecasts_popup_destroy(inst); if (inst->check_timer) ecore_timer_del(inst->check_timer); - if (inst->add_handler) - ecore_event_handler_del(inst->add_handler); - if (inst->data_handler) - ecore_event_handler_del(inst->data_handler); - if (inst->del_handler) - ecore_event_handler_del(inst->del_handler); - if (inst->server) - ecore_con_server_del(inst->server); + if (inst->url_data_handler) + ecore_event_handler_del(inst->url_data_handler); + if (inst->url_complete_handler) + ecore_event_handler_del(inst->url_complete_handler); + if (inst->url) + ecore_con_url_free(inst->url); if (inst->area) eina_stringshare_del(inst->area); eina_strbuf_free(inst->buffer); - inst->server = NULL; + inst->url = NULL; forecasts_config->instances = eina_list_remove(forecasts_config->instances, inst); - evas_object_event_callback_del(w->forecasts_obj, EVAS_CALLBACK_MOUSE_DOWN, - _forecasts_cb_mouse_down); + evas_object_event_callback_del(w->forecasts_obj, EVAS_CALLBACK_MOUSE_UP, + _forecasts_cb_mouse_up); _forecasts_free(w); E_FREE(inst); @@ -249,13 +231,13 @@ _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient) } static const char * -_gc_label(const E_Gadcon_Client_Class *client_class) +_gc_label(const E_Gadcon_Client_Class *client_class EINA_UNUSED) { return D_("Forecasts"); } static Evas_Object * -_gc_icon(const E_Gadcon_Client_Class *client_class, Evas *evas) +_gc_icon(const E_Gadcon_Client_Class *client_class EINA_UNUSED, Evas *evas) { Evas_Object *o; char buf[4096]; @@ -268,7 +250,7 @@ _gc_icon(const E_Gadcon_Client_Class *client_class, Evas *evas) } static const char * -_gc_id_new(const E_Gadcon_Client_Class *client_class) +_gc_id_new(const E_Gadcon_Client_Class *client_class EINA_UNUSED) { Config_Item *ci; @@ -277,14 +259,14 @@ _gc_id_new(const E_Gadcon_Client_Class *client_class) } static void -_forecasts_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, - void *event_info) +_forecasts_cb_mouse_up(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) { - Instance *inst; - Evas_Event_Mouse_Down *ev; + Instance *inst = data; + Evas_Event_Mouse_Up *ev = event_info; - inst = data; - ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if ((ev->button == 3) && (!forecasts_config->menu)) { E_Menu *m; @@ -312,7 +294,7 @@ _forecasts_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, } static void -_forecasts_menu_cb_post(void *data, E_Menu *m) +_forecasts_menu_cb_post(void *data EINA_UNUSED, E_Menu *m EINA_UNUSED) { if (!forecasts_config->menu) return; @@ -321,7 +303,7 @@ _forecasts_menu_cb_post(void *data, E_Menu *m) } static void -_forecasts_menu_cb_configure(void *data, E_Menu *m, E_Menu_Item *mi) +_forecasts_menu_cb_configure(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED) { Instance *inst; @@ -367,7 +349,6 @@ _forecasts_config_item_get(const char *id) ci->id = eina_stringshare_add(id); ci->poll_time = 60.0; ci->degrees = DEGREES_C; - ci->host = eina_stringshare_add("www.enlightenment.org"); ci->lat = ci->lon = 0; ci->show_text = 1; ci->popup_on_hover = 1; @@ -385,6 +366,7 @@ E_API E_Module_Api e_modapi = { E_API void * e_modapi_init(E_Module *m) { + ecore_con_url_init(); bindtextdomain(PACKAGE, LOCALE_DIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); @@ -396,7 +378,6 @@ e_modapi_init(E_Module *m) E_CONFIG_VAL(D, T, id, STR); E_CONFIG_VAL(D, T, poll_time, DOUBLE); E_CONFIG_VAL(D, T, degrees, INT); - E_CONFIG_VAL(D, T, host, STR); E_CONFIG_VAL(D, T, show_text, INT); E_CONFIG_VAL(D, T, popup_on_hover, INT); E_CONFIG_VAL(D, T, location_id, INT); @@ -421,7 +402,6 @@ e_modapi_init(E_Module *m) ci = E_NEW(Config_Item, 1); ci->poll_time = 60.0; ci->degrees = DEGREES_C; - ci->host = eina_stringshare_add("www.enlightenment.org"); ci->lat = ci->lon = 0; ci->id = eina_stringshare_add("0"); ci->show_text = 1; @@ -429,7 +409,6 @@ e_modapi_init(E_Module *m) forecasts_config->items = eina_list_append(forecasts_config->items, ci); } - _forecasts_get_proxy(); forecasts_config->module = m; e_gadcon_provider_register(&_gadcon_class); @@ -437,7 +416,7 @@ e_modapi_init(E_Module *m) } E_API int -e_modapi_shutdown(E_Module *m) +e_modapi_shutdown(E_Module *m EINA_UNUSED) { forecasts_config->module = NULL; e_gadcon_provider_unregister(&_gadcon_class); @@ -458,8 +437,6 @@ e_modapi_shutdown(E_Module *m) ci = forecasts_config->items->data; if (ci->id) eina_stringshare_del(ci->id); - if (ci->host) - eina_stringshare_del(ci->host); if (ci->location) eina_stringshare_del(ci->location); @@ -472,11 +449,12 @@ e_modapi_shutdown(E_Module *m) E_FREE(forecasts_config); E_CONFIG_DD_FREE(conf_item_edd); E_CONFIG_DD_FREE(conf_edd); + ecore_con_url_shutdown(); return 1; } E_API int -e_modapi_save(E_Module *m) +e_modapi_save(E_Module *m EINA_UNUSED) { e_config_domain_save("module.forecasts", conf_edd, forecasts_config); return 1; @@ -529,101 +507,47 @@ _forecasts_free(Forecasts *w) w = NULL; } -static void -_forecasts_get_proxy(void) -{ - const char *env; - const char *host = NULL; - const char *p; - int port = 0; - - env = getenv("http_proxy"); - if ((!env) || (!*env)) env = getenv("HTTP_PROXY"); - if ((!env) || (!*env)) return; - if (strncmp(env, "http://", 7)) return; - - host = strchr(env, ':'); - host += 3; - p = strchr(host, ':'); - if (p) - { - if (sscanf(p + 1, "%d", &port) != 1) - port = 0; - } - if ((host) && (port)) - { - if (proxy.host) eina_stringshare_del(proxy.host); - proxy.host = eina_stringshare_add_length(host, p - host); - proxy.port = port; - } -} - static Eina_Bool _forecasts_cb_check(void *data) { - Instance *inst; - - /* check that data is valid */ - if (!(inst = data)) return EINA_FALSE; + Instance *inst = data; + char buf[256]; /* if we have a previous server, delete it */ - if (inst->server) ecore_con_server_del(inst->server); - - /* server deleted, set variable to NULL */ - inst->server = NULL; - - if (proxy.port != 0) - inst->server = - ecore_con_server_connect(ECORE_CON_REMOTE_NODELAY, - proxy.host, proxy.port, inst); - else - inst->server = - ecore_con_server_connect(ECORE_CON_REMOTE_NODELAY | ECORE_CON_USE_MIXED, inst->ci->host, 443, inst); - - if (!inst->server) return EINA_FALSE; + if (inst->url) ecore_con_url_free(inst->url); + snprintf(buf, sizeof(buf), + "https://www.enlightenment.org/weather.php?lat=%s&lon=%s", + inst->ci->lat, inst->ci->lon); + DEBUG("FC: URL: %s", buf); + inst->url = ecore_con_url_new(buf); + if (!inst->url) return EINA_FALSE; + ecore_con_url_http_version_set(inst->url, ECORE_CON_URL_HTTP_VERSION_1_0); + ecore_con_url_get(inst->url); return EINA_TRUE; } static Eina_Bool -_forecasts_server_add(void *data, int type, void *event) +_forecasts_url_data(void *data, int type EINA_UNUSED, void *event) { - Instance *inst; - Ecore_Con_Event_Server_Add *ev; - char buf[1024]; - char forecast[1024]; + Instance *inst = data; + Ecore_Con_Event_Url_Data *ev = event; - inst = data; - if (!inst) - return EINA_TRUE; - - ev = event; - if ((!inst->server) || (inst->server != ev->server)) - return EINA_TRUE; - - snprintf(forecast, sizeof(forecast), "/weather.php?lat=%s&lon=%s", inst->ci->lat, inst->ci->lon); - snprintf(buf, sizeof(buf)-strlen(forecast)-(strlen(inst->ci->host)*2), "GET https://%s%s HTTP/1.1\r\n" - "Host: %s\r\n" - "Connection: close\r\n\r\n", - inst->ci->host, forecast, inst->ci->host); - DEBUG("Server: %s", buf); - ecore_con_server_send(inst->server, buf, strlen(buf)); + if ((!inst->url) || (inst->url != ev->url_con)) return EINA_TRUE; + eina_strbuf_append_length(inst->buffer, (const char *)ev->data, ev->size); return EINA_FALSE; } static Eina_Bool -_forecasts_server_del(void *data, int type, void *event) +_forecasts_url_complete(void *data, int type EINA_UNUSED, void *event) { - Instance *inst; - Ecore_Con_Event_Server_Del *ev; + Instance *inst = data; + Ecore_Con_Event_Url_Complete *ev = event; int ret; - inst = data; - ev = event; - if ((!inst->server) || (inst->server != ev->server)) - return EINA_TRUE; - - ecore_con_server_del(inst->server); - inst->server = NULL; + if ((!inst->url) || (inst->url != ev->url_con)) return EINA_TRUE; + DEBUG("FC: status: %i %s", ev->status, eina_strbuf_string_get(inst->buffer)); + ecore_con_url_free(inst->url); + inst->url = NULL; eina_stringshare_replace(&inst->location, inst->ci->location); ret = _forecasts_parse(inst); @@ -631,22 +555,6 @@ _forecasts_server_del(void *data, int type, void *event) _forecasts_display_set(inst, ret); eina_strbuf_string_free(inst->buffer); - - return EINA_FALSE; -} - -static Eina_Bool -_forecasts_server_data(void *data, int type, void *event) -{ - Instance *inst; - Ecore_Con_Event_Server_Data *ev; - - inst = data; - ev = event; - - if ((!inst->server) || (inst->server != ev->server)) - return EINA_TRUE; - eina_strbuf_append_length(inst->buffer, ev->data, ev->size); return EINA_FALSE; } @@ -678,8 +586,8 @@ _epoch_days(struct tm *tm_in) static int _forecasts_parse(void *data) { - Instance *inst; - char *needle; + Instance *inst = data; + const char *result; const char *timestamp, *code; time_t now; struct tm *tm_local, *tm_data; @@ -695,11 +603,7 @@ _forecasts_parse(void *data) "Sat", }; - inst = data; - if (!inst) - return 0; - if (!inst->buffer) - return 0; + if (!inst->buffer) return 0; for (int i = 0; i < FORECASTS; i++) { @@ -710,11 +614,10 @@ _forecasts_parse(void *data) tm_local = localtime(&now); days_prev = _epoch_days(tm_local); - needle = strstr(eina_strbuf_string_get(inst->buffer), "\r\n\r\n"); - if (!needle) goto error; - needle += 4; + result = eina_strbuf_string_get(inst->buffer); + if (!result) goto error; - json_object *o_root = json_tokener_parse(needle); + json_object *o_root = json_tokener_parse(result); if (!o_root) goto error; json_object *o_properties = json_object_object_get(o_root, "properties"); if (!o_properties) goto error; @@ -805,7 +708,7 @@ _forecasts_parse(void *data) return 1; error: - fprintf(stderr, "ERROR: Couldn't parse info from %s\n", inst->ci->host); + printf("FC: ERROR: Couldn't parse info\n"); return 0; } @@ -871,13 +774,12 @@ _forecasts_convert_pressures(float *value, int dir) } static void -_forecasts_display_set(Instance *inst, int ok) +_forecasts_display_set(Instance *inst, int ok EINA_UNUSED) { char buf[4096]; char m[4096]; - if (!inst) - return; + if (!inst) return; snprintf(m, sizeof(m), "%s/forecasts.edj", e_module_dir_get(forecasts_config->module)); @@ -1175,13 +1077,12 @@ _forecasts_popup_destroy(Instance *inst) } static void -_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { - Instance *inst; - Evas_Event_Mouse_Down *ev; - - if (!(inst = data)) return; + Instance *inst = data; + Evas_Event_Mouse_Up *ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if (!inst->ci->popup_on_hover) { if (!inst->popup) _forecasts_popup_content_create(inst); @@ -1189,33 +1090,25 @@ _cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) return; } - ev = event_info; - if (ev->button == 1) - { - e_gadcon_popup_toggle_pinned(inst->popup); - } + if (ev->button == 1) e_gadcon_popup_toggle_pinned(inst->popup); } static void -_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info) +_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Instance *inst; + Instance *inst = data; - if (!(inst = data)) return; if (!inst->ci->popup_on_hover) return; - if (!inst->popup) _forecasts_popup_content_create(inst); e_gadcon_popup_show(inst->popup); } static void -_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info) +_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Instance *inst; + Instance *inst = data; - if (!(inst = data)) return; if (!(inst->popup)) return; - if (inst->popup->pinned) return; e_gadcon_popup_hide(inst->popup); } diff --git a/src/e_mod_main.h b/src/e_mod_main.h index 78dd1af..e867224 100644 --- a/src/e_mod_main.h +++ b/src/e_mod_main.h @@ -34,7 +34,6 @@ struct _Config_Item double poll_time; int degrees; - const char *host; int show_text; int popup_on_hover; --