summaryrefslogtreecommitdiff
path: root/src/lib/eio/eio_model.c
diff options
context:
space:
mode:
authorLarry Jr <larry.olj@gmail.com>2016-06-14 19:33:41 -0300
committerFelipe Magno de Almeida <felipe@expertisesolutions.com.br>2016-06-14 20:57:00 -0300
commit3f1466b77d804b6a47dd5e092615d8d3c91a2b5c (patch)
tree2d36cb7eae0b0d5411a6550a83de4d9a9aff34b2 /src/lib/eio/eio_model.c
parent6c0d51322b6ae3fd006153c5384dc754e3d709d6 (diff)
eio: Fixed Eio_Model monitor life cycle
Diffstat (limited to 'src/lib/eio/eio_model.c')
-rw-r--r--src/lib/eio/eio_model.c102
1 files changed, 77 insertions, 25 deletions
diff --git a/src/lib/eio/eio_model.c b/src/lib/eio/eio_model.c
index 29b83fc..7b8589f 100644
--- a/src/lib/eio/eio_model.c
+++ b/src/lib/eio/eio_model.c
@@ -129,19 +129,47 @@ _eio_prop_set_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, in
129 } 129 }
130} 130}
131 131
132
133/** 132/**
134 * Callbacks 133 * Callbacks
135 * Ecore Events 134 * Ecore Events
136 */ 135 */
137static Eina_Bool 136static Eina_Bool
138_efl_model_evt_added_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) 137_efl_model_evt_added_ecore_cb(void *data, int type, void *event)
139{ 138{
140 Eio_Monitor_Event *evt = (Eio_Monitor_Event*)event; 139 Eio_Monitor_Event *evt = event;
141 Eio_Model_Data *priv = data; 140 Eio_Model_Data *priv = data;
142 Efl_Model_Children_Event cevt; 141 Efl_Model_Children_Event cevt;
143 Eina_Value path; 142 Eina_Value path;
144 143
144 if (type != EIO_MONITOR_DIRECTORY_CREATED && type != EIO_MONITOR_FILE_CREATED)
145 return EINA_TRUE;
146
147 char *dir = ecore_file_dir_get(evt->filename);
148 if (strcmp(priv->path, dir) != 0)
149 {
150 free(dir);
151 return EINA_TRUE;
152 }
153 free(dir);
154
155 if (priv->children_list)
156 {
157 Eina_List* cur = priv->children_list;
158 Eina_Stringshare *spath = eina_stringshare_add(evt->filename);
159 int i;
160
161 for (i = 0; cur; ++i, cur = cur->next)
162 {
163 Eio_Model_Data *cur_priv = eo_data_scope_get(cur->data, MY_CLASS);
164 if(cur_priv->path == spath)
165 {
166 eina_stringshare_del(spath);
167 return EINA_TRUE;
168 }
169 }
170 eina_stringshare_del(spath);
171 }
172
145 cevt.child = eo_add_ref(EIO_MODEL_CLASS, priv->obj, eio_model_path_set(eo_self, evt->filename)); 173 cevt.child = eo_add_ref(EIO_MODEL_CLASS, priv->obj, eio_model_path_set(eo_self, evt->filename));
146 priv->children_list = eina_list_append(priv->children_list, cevt.child); 174 priv->children_list = eina_list_append(priv->children_list, cevt.child);
147 cevt.index = eina_list_count(priv->children_list); 175 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
157} 185}
158 186
159static Eina_Bool 187static Eina_Bool
160_efl_model_evt_deleted_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) 188_efl_model_evt_deleted_ecore_cb(void *data, int type, void *event)
161{ 189{
162 Eio_Monitor_Event *evt = (Eio_Monitor_Event*)event; 190 Eio_Monitor_Event *evt = event;
163 Eio_Model_Data *priv = data; 191 Eio_Model_Data *priv = data;
164 192
193 if (type != EIO_MONITOR_DIRECTORY_DELETED && type != EIO_MONITOR_FILE_DELETED)
194 return EINA_TRUE;
195
165 if (priv->children_list) 196 if (priv->children_list)
166 { 197 {
167 Eina_List* cur = priv->children_list; 198 Eina_List* cur = priv->children_list;
199 Eina_Stringshare *spath = eina_stringshare_add(evt->filename);
168 int i; 200 int i;
169 201
170 for (i = 0; cur; ++i, cur = cur->next) 202 for (i = 0; cur; ++i, cur = cur->next)
171 { 203 {
172 Eio_Model_Data *cur_priv = eo_data_scope_get(cur->data, MY_CLASS); 204 Eio_Model_Data *cur_priv = eo_data_scope_get(cur->data, MY_CLASS);
173 if(strcmp(cur_priv->path, evt->filename) == 0) 205 if(cur_priv->path == spath)
174 break; 206 break;
175 } 207 }
176 208
@@ -185,6 +217,8 @@ _efl_model_evt_deleted_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, vo
185 priv->children_list = eina_list_remove_list(priv->children_list, cur); 217 priv->children_list = eina_list_remove_list(priv->children_list, cur);
186 eo_unref(cevt.child); 218 eo_unref(cevt.child);
187 } 219 }
220
221 eina_stringshare_del(spath);
188 } 222 }
189 223
190 return EINA_TRUE; 224 return EINA_TRUE;
@@ -270,8 +304,11 @@ _eio_model_efl_model_property_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, con
270 304
271 if(strcmp(_eio_model_prop_names[EIO_MODEL_PROP_FILENAME], property) == 0) 305 if(strcmp(_eio_model_prop_names[EIO_MODEL_PROP_FILENAME], property) == 0)
272 { 306 {
273 value = basename(priv->path); 307 char* tmp = strdup(priv->path);
308 char* basename_ = basename(tmp);
309 value = strdup(basename_);
274 property_name = EIO_MODEL_PROP_FILENAME; 310 property_name = EIO_MODEL_PROP_FILENAME;
311 free(tmp);
275 } 312 }
276 else if(strcmp(_eio_model_prop_names[EIO_MODEL_PROP_PATH], property) == 0) 313 else if(strcmp(_eio_model_prop_names[EIO_MODEL_PROP_PATH], property) == 0)
277 { 314 {
@@ -347,19 +384,22 @@ _eio_model_efl_model_property_set(Eo *obj EINA_UNUSED,
347 return; 384 return;
348 } 385 }
349 386
350 dest = eina_value_to_string(value); 387 eina_value_get(value, &dest);
351 if (priv->path == NULL || !ecore_file_exists(priv->path)) 388 if (priv->path == NULL || !ecore_file_exists(priv->path))
352 { 389 {
353 free(priv->path); 390 eina_stringshare_replace(&priv->path, dest);
354 priv->path = dest;
355 391
356 if (!ecore_file_exists(dest)) 392 if (!ecore_file_exists(priv->path))
357 { 393 {
358 eina_promise_owner_error_set(promise, EFL_MODEL_ERROR_NOT_FOUND); 394 eina_promise_owner_error_set(promise, EFL_MODEL_ERROR_NOT_FOUND);
359 return; 395 return;
360 } 396 }
361 397
362 INF("path '%s' with filename '%s'.", priv->path, basename(priv->path)); 398 char* tmp = strdup(priv->path);
399 char* basename_ = basename(tmp);
400 INF("path '%s' with filename '%s'.", priv->path, basename_);
401 free(tmp);
402 (void)basename_;
363 403
364 _eio_monitors_list_load(priv); 404 _eio_monitors_list_load(priv);
365 405
@@ -367,9 +407,8 @@ _eio_model_efl_model_property_set(Eo *obj EINA_UNUSED,
367 } 407 }
368 else 408 else
369 { 409 {
370 priv->move_file = eio_file_move(priv->path, dest, _eio_progress_cb, _eio_move_done_cb, _eio_prop_set_error_cb, priv); 410 priv->move_file = eio_file_move(priv->path, dest, _eio_progress_cb, _eio_move_done_cb, _eio_prop_set_error_cb, priv);
371 free(priv->path); 411 eina_stringshare_replace(&priv->path, dest);
372 priv->path = dest;
373 } 412 }
374 413
375 eina_promise_owner_value_set(promise, &value, NULL); 414 eina_promise_owner_value_set(promise, &value, NULL);
@@ -399,11 +438,28 @@ _eio_model_efl_model_monitor_add(Eio_Model_Data *priv)
399 ecore_event_handler_add(priv->mon.mon_event_child_add[i], _efl_model_evt_added_ecore_cb, priv); 438 ecore_event_handler_add(priv->mon.mon_event_child_add[i], _efl_model_evt_added_ecore_cb, priv);
400 439
401 for (i = 0; priv->mon.mon_event_child_del[i] != EIO_MONITOR_ERROR ; ++i) 440 for (i = 0; priv->mon.mon_event_child_del[i] != EIO_MONITOR_ERROR ; ++i)
402 priv->mon.ecore_child_add_handler[i] = 441 priv->mon.ecore_child_del_handler[i] =
403 ecore_event_handler_add(priv->mon.mon_event_child_del[i], _efl_model_evt_deleted_ecore_cb, priv); 442 ecore_event_handler_add(priv->mon.mon_event_child_del[i], _efl_model_evt_deleted_ecore_cb, priv);
404 } 443 }
405} 444}
406 445
446static void
447_eio_model_efl_model_monitor_del(Eio_Model_Data *priv)
448{
449 if (priv->monitor)
450 {
451 int i = 0;
452 for (i = 0; priv->mon.mon_event_child_add[i] != EIO_MONITOR_ERROR ; ++i)
453 ecore_event_handler_del(priv->mon.ecore_child_add_handler[i]);
454
455 for (i = 0; priv->mon.mon_event_child_del[i] != EIO_MONITOR_ERROR ; ++i)
456 ecore_event_handler_del(priv->mon.ecore_child_del_handler[i]);
457
458 eio_monitor_del(priv->monitor);
459 priv->monitor = NULL;
460 }
461}
462
407/* 463/*
408 * Callbacks 464 * Callbacks
409 * Children Load 465 * Children Load
@@ -454,6 +510,8 @@ _eio_done_children_load_cb(void *data, Eio_File *handler EINA_UNUSED)
454 priv->is_listed = EINA_TRUE; 510 priv->is_listed = EINA_TRUE;
455 priv->is_listing = EINA_FALSE; 511 priv->is_listing = EINA_FALSE;
456 512
513 _eio_model_efl_model_monitor_add(priv);
514
457 Eina_List* i; 515 Eina_List* i;
458 _Eio_Children_Slice_Promise* p; 516 _Eio_Children_Slice_Promise* p;
459 EINA_LIST_FOREACH(priv->children_promises, i, p) 517 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
561 619
562 priv->children_promises = eina_list_prepend(priv->children_promises, p); 620 priv->children_promises = eina_list_prepend(priv->children_promises, p);
563 621
564 _eio_model_efl_model_monitor_add(priv);
565
566 622
567 if (priv->is_listing == EINA_FALSE) 623 if (priv->is_listing == EINA_FALSE)
568 { 624 {
@@ -604,9 +660,7 @@ _eio_model_eo_base_constructor(Eo *obj, Eio_Model_Data *priv)
604static void 660static void
605_eio_model_path_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *path) 661_eio_model_path_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *path)
606{ 662{
607 priv->path = strdup(path); 663 priv->path = eina_stringshare_add(path);
608
609 priv->monitor = NULL;
610 _eio_monitors_list_load(priv); 664 _eio_monitors_list_load(priv);
611} 665}
612 666
@@ -614,10 +668,8 @@ static void
614_eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv) 668_eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv)
615{ 669{
616 Eo *child; 670 Eo *child;
617 /* unsigned int i; */
618 671
619 if (priv->monitor) 672 _eio_model_efl_model_monitor_del(priv);
620 eio_monitor_del(priv->monitor);
621 673
622 eina_spinlock_free(&priv->filter_lock); 674 eina_spinlock_free(&priv->filter_lock);
623 675
@@ -627,7 +679,7 @@ _eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv)
627 EINA_LIST_FREE(priv->children_list, child) 679 EINA_LIST_FREE(priv->children_list, child)
628 eo_unref(child); 680 eo_unref(child);
629 681
630 free(priv->path); 682 eina_stringshare_del(priv->path);
631 eo_destructor(eo_super(obj, MY_CLASS)); 683 eo_destructor(eo_super(obj, MY_CLASS));
632} 684}
633 685