diff options
Diffstat (limited to 'src/lib/ecore_con')
-rw-r--r-- | src/lib/ecore_con/efl_net_control_technology-connman.c | 41 |
1 files changed, 22 insertions, 19 deletions
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 2ccec1d983..5b2af8c249 100644 --- a/src/lib/ecore_con/efl_net_control_technology-connman.c +++ b/src/lib/ecore_con/efl_net_control_technology-connman.c | |||
@@ -348,15 +348,11 @@ static void | |||
348 | _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) | 348 | _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) |
349 | { | 349 | { |
350 | Eina_Promise *promise = data; | 350 | Eina_Promise *promise = data; |
351 | Eo *o = eldbus_pending_data_get(eina_promise_data_get(promise), ".object"); | ||
352 | Efl_Net_Control_Technology_Data *pd = efl_data_scope_get(o, MY_CLASS); | ||
353 | const char *err_name, *err_msg; | 351 | const char *err_name, *err_msg; |
354 | 352 | ||
355 | EINA_SAFETY_ON_NULL_RETURN(pd); | ||
356 | |||
357 | pd->pending = eina_list_remove(pd->pending, pending); | ||
358 | if (eldbus_message_error_get(msg, &err_name, &err_msg)) | 353 | if (eldbus_message_error_get(msg, &err_name, &err_msg)) |
359 | { | 354 | { |
355 | Eo *o = eldbus_pending_data_get(pending, ".object"); | ||
360 | Eina_Error err = EINVAL; | 356 | Eina_Error err = EINVAL; |
361 | 357 | ||
362 | if (strcmp(err_name, "net.connman.Error.NotSupported") == 0) | 358 | if (strcmp(err_name, "net.connman.Error.NotSupported") == 0) |
@@ -370,24 +366,29 @@ _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbu | |||
370 | eina_promise_resolve(promise, EINA_VALUE_EMPTY); | 366 | eina_promise_resolve(promise, EINA_VALUE_EMPTY); |
371 | } | 367 | } |
372 | 368 | ||
369 | static Eina_Value | ||
370 | _efl_net_control_technology_scan_promise_cancel(Eo *o EINA_UNUSED, void *data, Eina_Error error) | ||
371 | { | ||
372 | Eldbus_Pending *p = data; | ||
373 | |||
374 | if (error == ECANCELED) | ||
375 | { | ||
376 | DBG("cancel pending scan %p", p); | ||
377 | eldbus_pending_cancel(p); | ||
378 | } | ||
379 | |||
380 | return eina_value_error_init(error); | ||
381 | } | ||
382 | |||
373 | static void | 383 | static void |
374 | _efl_net_control_technology_scan_promise_del(void *data EINA_UNUSED, Efl_Loop_Consumer *consumer EINA_UNUSED, const Eina_Promise *dead_ptr) | 384 | _efl_net_control_technology_scan_promise_del(Eo *o, void *data, const Eina_Future *dead_future EINA_UNUSED) |
375 | { | 385 | { |
376 | Eldbus_Pending *p; | 386 | Eldbus_Pending *p = data; |
377 | Efl_Net_Control_Technology_Data *pd; | 387 | Efl_Net_Control_Technology_Data *pd; |
378 | Eo *o; | ||
379 | 388 | ||
380 | p = eina_promise_data_get(dead_ptr); | ||
381 | if (!p) return; /* already gone, nothing to do */ | ||
382 | |||
383 | o = eldbus_pending_data_get(p, ".object"); | ||
384 | pd = efl_data_scope_get(o, MY_CLASS); | 389 | pd = efl_data_scope_get(o, MY_CLASS); |
385 | 390 | ||
386 | EINA_SAFETY_ON_NULL_RETURN(pd); | ||
387 | |||
388 | pd->pending = eina_list_remove(pd->pending, p); | 391 | pd->pending = eina_list_remove(pd->pending, p); |
389 | DBG("cancel pending scan %p", p); | ||
390 | eldbus_pending_cancel(p); | ||
391 | } | 392 | } |
392 | 393 | ||
393 | EOLIAN static Eina_Future * | 394 | EOLIAN static Eina_Future * |
@@ -397,7 +398,7 @@ _efl_net_control_technology_scan(Eo *o, Efl_Net_Control_Technology_Data *pd) | |||
397 | Eina_Promise *promise; | 398 | Eina_Promise *promise; |
398 | Eina_Future *f = NULL; | 399 | Eina_Future *f = NULL; |
399 | 400 | ||
400 | promise = efl_loop_promise_new(o, NULL, _efl_net_control_technology_scan_promise_del, NULL); | 401 | promise = efl_loop_promise_new(o, NULL, NULL, NULL); |
401 | EINA_SAFETY_ON_NULL_RETURN_VAL(promise, NULL); | 402 | EINA_SAFETY_ON_NULL_RETURN_VAL(promise, NULL); |
402 | 403 | ||
403 | f = eina_future_new(promise); | 404 | f = eina_future_new(promise); |
@@ -407,10 +408,12 @@ _efl_net_control_technology_scan(Eo *o, Efl_Net_Control_Technology_Data *pd) | |||
407 | EINA_SAFETY_ON_NULL_GOTO(p, error_dbus); | 408 | EINA_SAFETY_ON_NULL_GOTO(p, error_dbus); |
408 | 409 | ||
409 | pd->pending = eina_list_append(pd->pending, p); | 410 | pd->pending = eina_list_append(pd->pending, p); |
410 | eina_promise_data_set(promise, p); | ||
411 | eldbus_pending_data_set(p, ".object", o); | 411 | eldbus_pending_data_set(p, ".object", o); |
412 | 412 | ||
413 | return efl_future_then(o, f); | 413 | return efl_future_then(o, f, |
414 | .error = _efl_net_control_technology_scan_promise_cancel, | ||
415 | .free = _efl_net_control_technology_scan_promise_del, | ||
416 | .data = p); | ||
414 | 417 | ||
415 | error_dbus: | 418 | error_dbus: |
416 | eina_promise_reject(promise, ENOSYS); | 419 | eina_promise_reject(promise, ENOSYS); |