From a8197a8c406ef21871c1cd2e0ba73c81e97dd133 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 11 Dec 2017 15:03:11 -0800 Subject: [PATCH] ecore_con: use Eina_Future for Efl.Net.Control.Technology. --- src/examples/ecore/efl_net_control_example.c | 39 ++++++++-------- .../efl_net_control_technology-connman.c | 45 +++++++++++-------- .../efl_net_control_technology-none.c | 7 +-- .../ecore_con/efl_net_control_technology.eo | 2 +- 4 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/examples/ecore/efl_net_control_example.c b/src/examples/ecore/efl_net_control_example.c index 35fc2b48ca..d13475cb85 100644 --- a/src/examples/ecore/efl_net_control_example.c +++ b/src/examples/ecore/efl_net_control_example.c @@ -698,22 +698,28 @@ _cmd_technology_show(Eo *ctl, size_t argc EINA_UNUSED, char **argv) _technology_print(tech); } -static void -_technology_scan_done(void *data, const Efl_Event *event EINA_UNUSED) +static Eina_Value +_technology_scan_done(void *data, const Eina_Value v, + const Eina_Future *dead EINA_UNUSED) { Eo *tech = data; - printf("INFO: technology '%s' finished scan.\n", - efl_net_control_technology_name_get(tech)); -} -static void -_technology_scan_error(void *data, const Efl_Event *event) -{ - Eo *tech = data; - Efl_Future_Event_Failure *f = event->info; - printf("INFO: technology '%s' could not scan: %s\n", - efl_net_control_technology_name_get(tech), - eina_error_msg_get(f->error)); + if (v.type == EINA_VALUE_TYPE_ERROR) + { + Eina_Error err = 0; + + eina_value_error_get(&v, &err); + printf("INFO: technology '%s' could not scan: %s\n", + efl_net_control_technology_name_get(tech), + eina_error_msg_get(err)); + } + else + { + printf("INFO: technology '%s' finished scan.\n", + efl_net_control_technology_name_get(tech)); + } + + return v; } static void @@ -722,11 +728,8 @@ _cmd_technology_scan(Eo *ctl, size_t argc EINA_UNUSED, char **argv) Eo *tech = _technology_find(ctl, argv[1]); if (!tech) return; printf("INFO: started scan on technology '%s'\n", argv[1]); - efl_future_then(efl_net_control_technology_scan(tech), - _technology_scan_done, - _technology_scan_error, - NULL, - tech); + eina_future_then(efl_net_control_technology_scan(tech), + _technology_scan_done, tech); } static void diff --git a/src/lib/ecore_con/efl_net_control_technology-connman.c b/src/lib/ecore_con/efl_net_control_technology-connman.c index 68c0f750b5..898000eab7 100644 --- a/src/lib/ecore_con/efl_net_control_technology-connman.c +++ b/src/lib/ecore_con/efl_net_control_technology-connman.c @@ -347,15 +347,14 @@ _efl_net_control_technology_type_get(Eo *o EINA_UNUSED, Efl_Net_Control_Technolo static void _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { - Efl_Promise *promise = data; - Eo *o = efl_parent_get(promise); + Eina_Promise *promise = data; + Eo *o = eldbus_pending_data_get(eina_promise_data_get(promise), ".object"); Efl_Net_Control_Technology_Data *pd = efl_data_scope_get(o, MY_CLASS); const char *err_name, *err_msg; EINA_SAFETY_ON_NULL_RETURN(pd); pd->pending = eina_list_remove(pd->pending, pending); - efl_key_data_set(promise, "eldbus_pending", NULL); if (eldbus_message_error_get(msg, &err_name, &err_msg)) { Eina_Error err = EINVAL; @@ -364,24 +363,28 @@ _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbu err = ENOTSUP; WRN("Could not Scan %p: %s=%s", o, err_name, err_msg); - efl_promise_failed_set(promise, err); + eina_promise_reject(promise, err); return; } - efl_promise_value_set(promise, o, NULL); - efl_del(promise); + eina_promise_resolve(promise, eina_value_object_init(o)); } static void -_efl_net_control_technology_scan_promise_del(void *data, const Efl_Event *event) +_efl_net_control_technology_scan_promise_del(void *data, const Eina_Promise *dead_ptr) { - Eldbus_Pending *p; - Eo *o = data; - Efl_Net_Control_Technology_Data *pd = efl_data_scope_get(o, MY_CLASS); + Eldbus_Pending *p = data; + Efl_Net_Control_Technology_Data *pd; + Eo *o; + + if (!p) return ; + + o = eldbus_pending_data_get(p, ".object"); + pd = efl_data_scope_get(o, MY_CLASS); EINA_SAFETY_ON_NULL_RETURN(pd); - p = efl_key_data_get(event->object, "eldbus_pending"); + p = eina_promise_data_get(dead_ptr); if (!p) return; /* already gone, nothing to do */ pd->pending = eina_list_remove(pd->pending, p); @@ -389,28 +392,32 @@ _efl_net_control_technology_scan_promise_del(void *data, const Efl_Event *event) eldbus_pending_cancel(p); } -EOLIAN static Efl_Future * +EOLIAN static Eina_Future * _efl_net_control_technology_scan(Eo *o, Efl_Net_Control_Technology_Data *pd) { Eldbus_Pending *p; - Efl_Promise *promise; + Eina_Promise *promise; + Eina_Future *f = NULL; - promise = efl_add(EFL_PROMISE_CLASS, o, - efl_event_callback_add(efl_added, EFL_EVENT_DEL, _efl_net_control_technology_scan_promise_del, o)); + promise = eina_promise_new(efl_loop_future_scheduler_get(o), + _efl_net_control_technology_scan_promise_del, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(promise, NULL); + f = eina_future_new(promise); + p = eldbus_proxy_call(pd->proxy, "Scan", _efl_net_control_technology_scan_cb, promise, -1.0, ""); EINA_SAFETY_ON_NULL_GOTO(p, error_dbus); pd->pending = eina_list_append(pd->pending, p); - efl_key_data_set(promise, "eldbus_pending", p); + eina_promise_data_set(promise, p); + eldbus_pending_data_set(p, ".object", o); - return efl_promise_future_get(promise); + return efl_future_Eina_FutureXXX_then(o, f); error_dbus: - efl_promise_failed_set(promise, ENOSYS); - return promise; + eina_promise_reject(promise, ENOSYS); + return efl_future_Eina_FutureXXX_then(o, f); } const char * diff --git a/src/lib/ecore_con/efl_net_control_technology-none.c b/src/lib/ecore_con/efl_net_control_technology-none.c index 3f1412fc12..e3fe22df7e 100644 --- a/src/lib/ecore_con/efl_net_control_technology-none.c +++ b/src/lib/ecore_con/efl_net_control_technology-none.c @@ -56,10 +56,11 @@ _efl_net_control_technology_type_get(Eo *obj EINA_UNUSED, Efl_Net_Control_Techno return 0; } -EOLIAN static Efl_Future * -_efl_net_control_technology_scan(Eo *obj EINA_UNUSED, Efl_Net_Control_Technology_Data *pd EINA_UNUSED) +EOLIAN static Eina_Future * +_efl_net_control_technology_scan(Eo *obj, Efl_Net_Control_Technology_Data *pd EINA_UNUSED) { - return NULL; + return eina_future_rejected(efl_loop_future_scheduler_get(obj), + EINA_ERROR_NOT_IMPLEMENTED); } #include "efl_net_control_technology.eo.c" diff --git a/src/lib/ecore_con/efl_net_control_technology.eo b/src/lib/ecore_con/efl_net_control_technology.eo index 7f2bdf19b0..f9c3e97ff5 100644 --- a/src/lib/ecore_con/efl_net_control_technology.eo +++ b/src/lib/ecore_con/efl_net_control_technology.eo @@ -96,7 +96,7 @@ class Efl.Net.Control.Technology (Efl.Loop_User) { state. Otherwise prefer to let the system passively do scans in a timely manner. ]] - return: future; [[Future return for finished background scan]] /* NOTE: This should be future */ + return: ptr(Eina.Future) @owned; [[Future return for finished background scan]] /* NOTE: This should be future */ } }