raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=bec15a79320b307be4fa8ed7f32b84f6d7256769

commit bec15a79320b307be4fa8ed7f32b84f6d7256769
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Wed Jan 6 14:08:30 2021 +0000

    e icon - handle url's for e icons.
    
    new feature which makes it useful for music-control art url's that are
    realurls and not local files.
    
    @feat
---
 src/bin/e_icon.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 183 insertions(+), 17 deletions(-)

diff --git a/src/bin/e_icon.c b/src/bin/e_icon.c
index 342ea11f3..9aa5462f1 100644
--- a/src/bin/e_icon.c
+++ b/src/bin/e_icon.c
@@ -6,22 +6,27 @@ typedef struct _Cache        Cache;
 
 struct _E_Smart_Data
 {
-   Evas_Coord    x, y, w, h;
-   Evas_Object  *obj;
-   Evas_Object  *eventarea;
-   const char   *fdo;
-   Ecore_Timer  *guessing_animation;
-   Ecore_Timer  *timer, *fdo_reload_timer;
-   double        last_resize;
-   int           size;
-   int           frame, frame_count;
-   unsigned char fill_inside E_BITFIELD;
-   unsigned char scale_up E_BITFIELD;
-   unsigned char preload E_BITFIELD;
-   unsigned char loading E_BITFIELD;
-   unsigned char animated E_BITFIELD;
-   unsigned char invalid E_BITFIELD;
-   Eina_Bool     edje E_BITFIELD;
+   Evas_Coord     x, y, w, h;
+   Evas_Object   *obj;
+   Evas_Object   *eventarea;
+   const char    *fdo;
+   const char    *url;
+   const char    *tmp_file;
+   Ecore_Con_Url       *con_url;
+   Ecore_Event_Handler *url_hand;
+   Ecore_Timer   *guessing_animation;
+   Ecore_Timer   *timer, *fdo_reload_timer;
+   double         last_resize;
+   int            size;
+   int            frame, frame_count;
+   int            tmp_fd;
+   unsigned char  fill_inside E_BITFIELD;
+   unsigned char  scale_up E_BITFIELD;
+   unsigned char  preload E_BITFIELD;
+   unsigned char  loading E_BITFIELD;
+   unsigned char  animated E_BITFIELD;
+   unsigned char  invalid E_BITFIELD;
+   unsigned char  edje E_BITFIELD;
 };
 
 struct _Cache_Item
@@ -137,6 +142,19 @@ _handle_anim(E_Smart_Data *sd)
    return 1;
 }
 
+static Eina_Bool
+_url_complete_cb(void *data, int type EINA_UNUSED, void *event_info)
+{
+   Evas_Object *obj = data;
+   E_Smart_Data *sd = evas_object_smart_data_get(obj);
+   Ecore_Con_Event_Url_Complete *ev = event_info;
+
+   if (!sd) return EINA_TRUE;
+   if (ev->url_con != sd->con_url) return EINA_TRUE;
+   e_icon_file_set(obj, sd->tmp_file);
+   return EINA_FALSE;
+}
+
 E_API void
 e_icon_file_set(Evas_Object *obj, const char *file)
 {
@@ -163,6 +181,36 @@ e_icon_file_set(Evas_Object *obj, const char *file)
         eina_stringshare_del(sd->fdo);
         sd->fdo = NULL;
      }
+   if (sd->url)
+     {
+        eina_stringshare_del(sd->url);
+        sd->url = NULL;
+     }
+   if (sd->con_url)
+     {
+        ecore_con_url_free(sd->con_url);
+        sd->con_url = NULL;
+     }
+   if (sd->tmp_file)
+     {
+        if (!!strcmp(file, sd->tmp_file))
+          {
+             // if we set a file that is not the tmp file - delete tmp file
+             ecore_file_unlink(sd->tmp_file);
+             eina_stringshare_del(sd->tmp_file);
+             sd->tmp_file = NULL;
+          }
+     }
+   if (sd->tmp_fd >= 0)
+     {
+        close(sd->tmp_fd);
+        sd->tmp_fd = -1;
+     }
+   if (sd->url_hand)
+     {
+        ecore_event_handler_del(sd->url_hand);
+        sd->url_hand = NULL;
+     }
 
    if (sd->timer) ecore_timer_del(sd->timer);
    sd->timer = NULL;
@@ -179,7 +227,37 @@ e_icon_file_set(Evas_Object *obj, const char *file)
 
    if (sd->preload)
      evas_object_image_load_head_skip_set(sd->obj, EINA_TRUE);
-   evas_object_image_file_set(sd->obj, file, NULL);
+   if ((!strncasecmp(file, "http://";, 7)) ||
+       (!strncasecmp(file, "https://";, 8)))
+     {
+        char buf[4096];
+
+        snprintf(buf, sizeof(buf), "/tmp/.e-icon-tmp-XXXXXX");
+        sd->tmp_fd = mkstemp(buf);
+        if (sd->tmp_fd >= 0)
+          {
+             sd->url = eina_stringshare_add(file);
+             sd->tmp_file = eina_stringshare_add(buf);
+             sd->con_url = ecore_con_url_new(file);
+             ecore_con_url_fd_set(sd->con_url, sd->tmp_fd);
+             if (!ecore_con_url_get(sd->con_url))
+               {
+                  ecore_file_unlink(buf);
+                  close(sd->tmp_fd);
+                  ecore_con_url_free(sd->con_url);
+                  sd->tmp_fd = -1;
+                  sd->con_url = NULL;
+               }
+             else
+               {
+                  sd->url_hand = ecore_event_handler_add
+                    (ECORE_CON_EVENT_URL_COMPLETE, _url_complete_cb, obj);
+               }
+          }
+        return;
+     }
+   else
+     evas_object_image_file_set(sd->obj, file, NULL);
 //   if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
 //     return EINA_FALSE;
 
@@ -213,6 +291,32 @@ e_icon_file_key_set(Evas_Object *obj, const char *file, 
const char *key)
         eina_stringshare_del(sd->fdo);
         sd->fdo = NULL;
      }
+   if (sd->url)
+     {
+        eina_stringshare_del(sd->url);
+        sd->url = NULL;
+     }
+   if (sd->con_url)
+     {
+        ecore_con_url_free(sd->con_url);
+        sd->con_url = NULL;
+     }
+   if (sd->tmp_file)
+     {
+        ecore_file_unlink(sd->tmp_file);
+        eina_stringshare_del(sd->tmp_file);
+        sd->tmp_file = NULL;
+     }
+   if (sd->tmp_fd >= 0)
+     {
+        close(sd->tmp_fd);
+        sd->tmp_fd = -1;
+     }
+   if (sd->url_hand)
+     {
+        ecore_event_handler_del(sd->url_hand);
+        sd->url_hand = NULL;
+     }
 
    if (sd->timer) ecore_timer_del(sd->timer);
    sd->timer = NULL;
@@ -261,6 +365,32 @@ e_icon_edje_object_set(Evas_Object *obj, Evas_Object *edje)
         eina_stringshare_del(sd->fdo);
         sd->fdo = NULL;
      }
+   if (sd->url)
+     {
+        eina_stringshare_del(sd->url);
+        sd->url = NULL;
+     }
+   if (sd->con_url)
+     {
+        ecore_con_url_free(sd->con_url);
+        sd->con_url = NULL;
+     }
+   if (sd->tmp_file)
+     {
+        ecore_file_unlink(sd->tmp_file);
+        eina_stringshare_del(sd->tmp_file);
+        sd->tmp_file = NULL;
+     }
+   if (sd->tmp_fd >= 0)
+     {
+        close(sd->tmp_fd);
+        sd->tmp_fd = -1;
+     }
+   if (sd->url_hand)
+     {
+        ecore_event_handler_del(sd->url_hand);
+        sd->url_hand = NULL;
+     }
 
    if (sd->timer) ecore_timer_del(sd->timer);
    sd->timer = NULL;
@@ -304,6 +434,32 @@ e_icon_file_edje_set(Evas_Object *obj, const char *file, 
const char *part)
         eina_stringshare_del(sd->fdo);
         sd->fdo = NULL;
      }
+   if (sd->url)
+     {
+        eina_stringshare_del(sd->url);
+        sd->url = NULL;
+     }
+   if (sd->con_url)
+     {
+        ecore_con_url_free(sd->con_url);
+        sd->con_url = NULL;
+     }
+   if (sd->tmp_file)
+     {
+        ecore_file_unlink(sd->tmp_file);
+        eina_stringshare_del(sd->tmp_file);
+        sd->tmp_file = NULL;
+     }
+   if (sd->tmp_fd >= 0)
+     {
+        close(sd->tmp_fd);
+        sd->tmp_fd = -1;
+     }
+   if (sd->url_hand)
+     {
+        ecore_event_handler_del(sd->url_hand);
+        sd->url_hand = NULL;
+     }
 
    if (sd->timer) ecore_timer_del(sd->timer);
    sd->timer = NULL;
@@ -772,6 +928,7 @@ _e_icon_smart_add(Evas_Object *obj)
    sd->scale_up = 1;
    sd->size = 64;
    sd->preload = 0;
+   sd->tmp_fd = -1;
    evas_object_smart_member_add(sd->obj, obj);
    evas_object_smart_data_set(obj, sd);
 }
@@ -788,6 +945,15 @@ _e_icon_smart_del(Evas_Object *obj)
    if (sd->fdo_reload_timer) ecore_timer_del(sd->fdo_reload_timer);
    if (sd->timer) ecore_timer_del(sd->timer);
    if (sd->guessing_animation) ecore_timer_del(sd->guessing_animation);
+   if (sd->url) eina_stringshare_del(sd->url);
+   if (sd->con_url) ecore_con_url_free(sd->con_url);
+   if (sd->tmp_file)
+     {
+        ecore_file_unlink(sd->tmp_file);
+        eina_stringshare_del(sd->tmp_file);
+     }
+   if (sd->tmp_fd >= 0) close(sd->tmp_fd);
+   if (sd->url_hand) ecore_event_handler_del(sd->url_hand);
    evas_object_smart_data_set(obj, NULL);
    memset(sd, 0, sizeof(*sd));
    free(sd);

-- 


Reply via email to