diff --git a/src/modules/connman/E_Connman.h b/src/modules/connman/E_Connman.h index 272233b9f..3e58d4665 100644 --- a/src/modules/connman/E_Connman.h +++ b/src/modules/connman/E_Connman.h @@ -69,6 +69,7 @@ struct Connman_Service { Eldbus_Pending *connect; Eldbus_Pending *disconnect; + Eldbus_Pending *remov; void *data; } pending; }; @@ -93,6 +94,7 @@ typedef void (*Econnman_Simple_Cb)(void *data, const char *error); bool econnman_service_connect(struct Connman_Service *cs, Econnman_Simple_Cb cb, void *data); bool econnman_service_disconnect(struct Connman_Service *cs, Econnman_Simple_Cb cb, void *data); +bool econnman_service_remove(struct Connman_Service *cs, Econnman_Simple_Cb cb, void *data); void econnman_powered_set(struct Connman_Manager *cm, Eina_Bool powered); diff --git a/src/modules/connman/e_connman.c b/src/modules/connman/e_connman.c index 29649a904..b0113bdfc 100644 --- a/src/modules/connman/e_connman.c +++ b/src/modules/connman/e_connman.c @@ -247,6 +247,11 @@ static void _service_free(struct Connman_Service *cs) eldbus_pending_cancel(cs->pending.disconnect); free(cs->pending.data); } + if (cs->pending.remov) + { + eldbus_pending_cancel(cs->pending.remov); + free(cs->pending.data); + } free(cs->name); _eina_str_array_clean(cs->security); @@ -294,6 +299,7 @@ static void _service_connection_cb(void *data, const Eldbus_Message *msg, cd->cs->pending.connect = NULL; cd->cs->pending.disconnect = NULL; + cd->cs->pending.remov = NULL; cd->cs->pending.data = NULL; free(cd); @@ -306,10 +312,10 @@ bool econnman_service_connect(struct Connman_Service *cs, EINA_SAFETY_ON_NULL_RETURN_VAL(cs, false); - if (cs->pending.connect || cs->pending.disconnect) + if (cs->pending.connect || cs->pending.disconnect || cs->pending.remov) { - ERR("Pending connection: connect=%p disconnect=%p", cs->pending.connect, - cs->pending.disconnect); + ERR("Pending connection: connect=%p disconnect=%p remov=%p", cs->pending.connect, + cs->pending.disconnect, cs->pending.remov); return false; } @@ -336,10 +342,10 @@ bool econnman_service_disconnect(struct Connman_Service *cs, EINA_SAFETY_ON_NULL_RETURN_VAL(cs, false); - if (cs->pending.connect || cs->pending.disconnect) + if (cs->pending.connect || cs->pending.disconnect || cs->pending.remov) { - ERR("Pending connection: connect=%p disconnect=%p", cs->pending.connect, - cs->pending.disconnect); + ERR("Pending connection: connect=%p disconnect=%p remov=%p", cs->pending.connect, + cs->pending.disconnect, cs->pending.remov); return false; } @@ -359,6 +365,36 @@ fail: return false; } +bool econnman_service_remove(struct Connman_Service *cs, + Econnman_Simple_Cb cb, void *data) +{ + struct connection_data *cd; + + EINA_SAFETY_ON_NULL_RETURN_VAL(cs, false); + + if (cs->pending.connect || cs->pending.disconnect || cs->pending.remov) + { + ERR("Pending connection: connect=%p disconnect=%p remov=%p", cs->pending.connect, + cs->pending.disconnect, cs->pending.remov); + return false; + } + + cd = calloc(1, sizeof(*cd)); + EINA_SAFETY_ON_NULL_GOTO(cd, fail); + + cd->cs = cs; + cd->cb = cb; + cd->user_data = data; + + cs->pending.connect = eldbus_proxy_call(cs->service_iface, "Remove", + _service_connection_cb, cd, + -1, ""); + return true; + +fail: + return false; +} + static struct Connman_Service *_manager_find_service_stringshared( struct Connman_Manager *cm, const char *path) {