cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=cba58203a32d4c586570cf2bb47cbcc048d803d4
commit cba58203a32d4c586570cf2bb47cbcc048d803d4 Author: Cedric Bail <ced...@osg.samsung.com> Date: Wed Sep 13 18:03:05 2017 -0700 eio: move efl.io.manager.xattr.get to use the new Eina_Future. --- src/lib/eio/efl_io_manager.c | 54 ++++++++++++++++++---------------- src/lib/eio/efl_io_manager.eo | 2 +- src/tests/eio/eio_test_manager_xattr.c | 19 +----------- 3 files changed, 30 insertions(+), 45 deletions(-) diff --git a/src/lib/eio/efl_io_manager.c b/src/lib/eio/efl_io_manager.c index 6156abe853..b19f7e3476 100644 --- a/src/lib/eio/efl_io_manager.c +++ b/src/lib/eio/efl_io_manager.c @@ -89,22 +89,6 @@ EFL_CALLBACKS_ARRAY_DEFINE(promise_handling, { EFL_EVENT_DEL, _forced_shutdown }); static void -_file_done_data_cb(void *data, Eio_File *handler, const char *attr_data, unsigned int size) -{ - Efl_Promise *p = data; - Eina_Binbuf *buf; - - efl_event_callback_array_del(p, promise_handling(), handler); - - buf = eina_binbuf_new(); - eina_binbuf_append_length(buf, (const unsigned char*) attr_data, size); - - efl_promise_value_set(p, buf, EINA_FREE_CB(eina_binbuf_free)); - - efl_del(p); -} - -static void _file_error_cb(void *data, Eio_File *handler, int error) { Efl_Promise *p = data; @@ -443,6 +427,23 @@ _future_file_done_cb(void *data, Eio_File *handler) } static void +_future_file_done_data_cb(void *data, Eio_File *handler EINA_UNUSED, const char *attr_data, unsigned int size) +{ + Eina_Promise *p = data; + Eina_Value_Blob blob = { EINA_VALUE_BLOB_OPERATIONS_MALLOC, NULL, size }; + Eina_Value v = EINA_VALUE_EMPTY; + char *tmp; + + tmp = malloc(size); + memcpy(tmp, attr_data, size); + blob.memory = tmp; + + eina_value_setup(&v, EINA_VALUE_TYPE_BLOB); + eina_value_set(&v, &blob); + eina_promise_resolve(p, v); +} + +static void _future_file_error_cb(void *data, Eio_File *handler EINA_UNUSED, int error) @@ -491,31 +492,32 @@ _efl_io_manager_xattr_set(Eo *obj, return future; } -static Efl_Future * +static Eina_Future * _efl_io_manager_xattr_get(Eo *obj, Efl_Io_Manager_Data *pd EINA_UNUSED, const char *path, const char *attribute) { - Efl_Promise *p; + Eina_Promise *p; + Eina_Future *future; Eio_File *h; - Eo *loop = efl_loop_get(obj); - p = efl_add(EFL_PROMISE_CLASS, loop); + p = eina_promise_new(efl_loop_future_scheduler_get(obj), + _efl_io_manager_future_cancel, NULL); if (!p) return NULL; + future = eina_future_new(p); h = eio_file_xattr_get(path, attribute, - _file_done_data_cb, - _file_error_cb, + _future_file_done_data_cb, + _future_file_error_cb, p); if (!h) goto end; + eina_promise_data_set(p, h); - efl_event_callback_array_add(p, promise_handling(), h); - return efl_promise_future_get(p); + return efl_future_Eina_FutureXXX_then(obj, future); end: - efl_del(p); - return NULL; + return future; } static void diff --git a/src/lib/eio/efl_io_manager.eo b/src/lib/eio/efl_io_manager.eo index b1b5d85806..2d4abda082 100644 --- a/src/lib/eio/efl_io_manager.eo +++ b/src/lib/eio/efl_io_manager.eo @@ -66,7 +66,7 @@ class Efl.Io.Manager (Efl.Loop_User) return: own(ptr(Eina.Future)); [[Future for asynchronous set operation]] } get { - return: future<Eina.Binbuf>; [[Information]] + return: own(ptr(Eina.Future)); [[Information]] } keys { path: string; [[File path]] diff --git a/src/tests/eio/eio_test_manager_xattr.c b/src/tests/eio/eio_test_manager_xattr.c index bb2ddece02..15615ebb81 100644 --- a/src/tests/eio/eio_test_manager_xattr.c +++ b/src/tests/eio/eio_test_manager_xattr.c @@ -90,23 +90,6 @@ _done_get_cb(void *data EINA_UNUSED, const Efl_Event *ev) } static void -_done_set_cb(void *data, const Efl_Event *ev) -{ - Efl_Future_Event_Success *success = ev->info; - Eina_Accessor *ac = success->value; - int *placeholder; - int *num_of_attr = data; - int i = 0; - - EINA_ACCESSOR_FOREACH(ac, i, placeholder) - *num_of_attr += 1; - - fail_if(*num_of_attr != total_attributes); - - ecore_main_loop_quit(); -} - -static void _error_cb(void *data EINA_UNUSED, const Efl_Event *ev) { Efl_Future_Event_Failure *failure = ev->info; @@ -146,7 +129,7 @@ _future_all_cb(void *data, } } - fail_if(*num_of_attr != len); + fail_if(*num_of_attr != (int) len); return array; } --