eio: Fixed Eio_Model monitor life cycle
authorLarry Jr <larry.olj@gmail.com>
Tue, 14 Jun 2016 22:33:41 +0000 (19:33 -0300)
committerFelipe Magno de Almeida <felipe@expertisesolutions.com.br>
Tue, 14 Jun 2016 23:57:00 +0000 (20:57 -0300)
src/lib/eio/eio_model.c
src/lib/eio/eio_model_private.h

index 29b83fc..7b8589f 100644 (file)
@@ -129,19 +129,47 @@ _eio_prop_set_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, in
      }
 }
 
-
 /**
  *  Callbacks
  *  Ecore Events
  */
 static Eina_Bool
-_efl_model_evt_added_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
+_efl_model_evt_added_ecore_cb(void *data, int type, void *event)
 {
-   Eio_Monitor_Event *evt = (Eio_Monitor_Event*)event;
+   Eio_Monitor_Event *evt = event;
    Eio_Model_Data *priv = data;
    Efl_Model_Children_Event cevt;
    Eina_Value path;
 
+   if (type != EIO_MONITOR_DIRECTORY_CREATED && type != EIO_MONITOR_FILE_CREATED)
+     return EINA_TRUE;
+
+   char *dir = ecore_file_dir_get(evt->filename);
+   if (strcmp(priv->path, dir) != 0)
+     {
+        free(dir);
+        return EINA_TRUE;
+     }
+   free(dir);
+
+   if (priv->children_list)
+     {
+        Eina_List* cur = priv->children_list;
+        Eina_Stringshare *spath = eina_stringshare_add(evt->filename);
+        int i;
+
+        for (i = 0; cur; ++i, cur = cur->next)
+          {
+             Eio_Model_Data *cur_priv = eo_data_scope_get(cur->data, MY_CLASS);
+             if(cur_priv->path == spath)
+               {
+                   eina_stringshare_del(spath);
+                   return EINA_TRUE;
+               }
+          }
+        eina_stringshare_del(spath);
+     }
+
    cevt.child = eo_add_ref(EIO_MODEL_CLASS, priv->obj, eio_model_path_set(eo_self, evt->filename));
    priv->children_list = eina_list_append(priv->children_list, cevt.child);
    cevt.index = eina_list_count(priv->children_list);
@@ -157,20 +185,24 @@ _efl_model_evt_added_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void
 }
 
 static Eina_Bool
-_efl_model_evt_deleted_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
+_efl_model_evt_deleted_ecore_cb(void *data, int type, void *event)
 {
-   Eio_Monitor_Event *evt = (Eio_Monitor_Event*)event;
+   Eio_Monitor_Event *evt = event;
    Eio_Model_Data *priv = data;
 
+   if (type != EIO_MONITOR_DIRECTORY_DELETED && type != EIO_MONITOR_FILE_DELETED)
+     return EINA_TRUE;
+
    if (priv->children_list)
      {
         Eina_List* cur = priv->children_list;
+        Eina_Stringshare *spath = eina_stringshare_add(evt->filename);
         int i;
 
         for (i = 0; cur; ++i, cur = cur->next)
           {
              Eio_Model_Data *cur_priv = eo_data_scope_get(cur->data, MY_CLASS);
-             if(strcmp(cur_priv->path, evt->filename) == 0)
+             if(cur_priv->path == spath)
                break;
           }
 
@@ -185,6 +217,8 @@ _efl_model_evt_deleted_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, vo
              priv->children_list = eina_list_remove_list(priv->children_list, cur);
              eo_unref(cevt.child);
           }
+
+        eina_stringshare_del(spath);
      }
 
    return EINA_TRUE;
@@ -270,8 +304,11 @@ _eio_model_efl_model_property_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, con
 
    if(strcmp(_eio_model_prop_names[EIO_MODEL_PROP_FILENAME], property) == 0)
      {
-        value = basename(priv->path);
+        char* tmp = strdup(priv->path);
+        char* basename_ = basename(tmp);
+        value = strdup(basename_);
         property_name = EIO_MODEL_PROP_FILENAME;
+        free(tmp);
      }
    else if(strcmp(_eio_model_prop_names[EIO_MODEL_PROP_PATH], property) == 0)
      {
@@ -347,19 +384,22 @@ _eio_model_efl_model_property_set(Eo *obj EINA_UNUSED,
         return;
      }
 
-   dest = eina_value_to_string(value);
+   eina_value_get(value, &dest);
    if (priv->path == NULL || !ecore_file_exists(priv->path))
      {
-        free(priv->path);
-        priv->path = dest;
+        eina_stringshare_replace(&priv->path, dest);
 
-        if (!ecore_file_exists(dest))
+        if (!ecore_file_exists(priv->path))
           {
              eina_promise_owner_error_set(promise, EFL_MODEL_ERROR_NOT_FOUND);
              return;
           }
 
-        INF("path '%s' with filename '%s'.", priv->path, basename(priv->path));
+        char* tmp = strdup(priv->path);
+        char* basename_ = basename(tmp);
+        INF("path '%s' with filename '%s'.", priv->path, basename_);
+        free(tmp);
+        (void)basename_;
 
         _eio_monitors_list_load(priv);
 
@@ -367,9 +407,8 @@ _eio_model_efl_model_property_set(Eo *obj EINA_UNUSED,
      }
    else
      {
-       priv->move_file = eio_file_move(priv->path, dest, _eio_progress_cb, _eio_move_done_cb, _eio_prop_set_error_cb, priv);
-       free(priv->path);
-       priv->path = dest;
+        priv->move_file = eio_file_move(priv->path, dest, _eio_progress_cb, _eio_move_done_cb, _eio_prop_set_error_cb, priv);
+        eina_stringshare_replace(&priv->path, dest);
      }
 
      eina_promise_owner_value_set(promise, &value, NULL);
@@ -399,11 +438,28 @@ _eio_model_efl_model_monitor_add(Eio_Model_Data *priv)
             ecore_event_handler_add(priv->mon.mon_event_child_add[i], _efl_model_evt_added_ecore_cb, priv);
 
         for (i = 0; priv->mon.mon_event_child_del[i] != EIO_MONITOR_ERROR ; ++i)
-          priv->mon.ecore_child_add_handler[i] =
+          priv->mon.ecore_child_del_handler[i] =
             ecore_event_handler_add(priv->mon.mon_event_child_del[i], _efl_model_evt_deleted_ecore_cb, priv);
      }
 }
 
+static void
+_eio_model_efl_model_monitor_del(Eio_Model_Data *priv)
+{
+   if (priv->monitor)
+     {
+        int i = 0;
+        for (i = 0; priv->mon.mon_event_child_add[i] != EIO_MONITOR_ERROR ; ++i)
+           ecore_event_handler_del(priv->mon.ecore_child_add_handler[i]);
+
+        for (i = 0; priv->mon.mon_event_child_del[i] != EIO_MONITOR_ERROR ; ++i)
+           ecore_event_handler_del(priv->mon.ecore_child_del_handler[i]);
+
+        eio_monitor_del(priv->monitor);
+        priv->monitor = NULL;
+     }
+}
+
 /*
  *  Callbacks
  *  Children Load
@@ -454,6 +510,8 @@ _eio_done_children_load_cb(void *data, Eio_File *handler EINA_UNUSED)
    priv->is_listed = EINA_TRUE;
    priv->is_listing = EINA_FALSE;
 
+   _eio_model_efl_model_monitor_add(priv);
+
    Eina_List* i;
    _Eio_Children_Slice_Promise* p;
    EINA_LIST_FOREACH(priv->children_promises, i, p)
@@ -561,8 +619,6 @@ _eio_model_efl_model_children_slice_get(Eo *obj EINA_UNUSED, Eio_Model_Data *pri
 
        priv->children_promises = eina_list_prepend(priv->children_promises, p);
 
-       _eio_model_efl_model_monitor_add(priv);
-
 
        if (priv->is_listing == EINA_FALSE)
          {
@@ -604,9 +660,7 @@ _eio_model_eo_base_constructor(Eo *obj, Eio_Model_Data *priv)
 static void
 _eio_model_path_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *path)
 {
-   priv->path = strdup(path);
-
-   priv->monitor = NULL;
+   priv->path = eina_stringshare_add(path);
    _eio_monitors_list_load(priv);
 }
 
@@ -614,10 +668,8 @@ static void
 _eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv)
 {
    Eo *child;
-   /* unsigned int i; */
 
-   if (priv->monitor)
-     eio_monitor_del(priv->monitor);
+   _eio_model_efl_model_monitor_del(priv);
 
    eina_spinlock_free(&priv->filter_lock);
 
@@ -627,7 +679,7 @@ _eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv)
    EINA_LIST_FREE(priv->children_list, child)
      eo_unref(child);
 
-   free(priv->path);
+   eina_stringshare_del(priv->path);
    eo_destructor(eo_super(obj, MY_CLASS));
 }
 
index 5641e8f..0fb4088 100644 (file)
@@ -55,7 +55,7 @@ typedef struct _Eio_Model_Data _Eio_Model_Data;
 struct _Eio_Model_Data
 {
    Eo *obj;
-   char *path;
+   Eina_Stringshare *path;
    Eina_Array *properties_name;
    Eina_Bool is_listed : 1;
    Eina_Bool is_listing : 1;