iface-modem: explicitly disconnect bearer before removing it

https://bugs.freedesktop.org/show_bug.cgi?id=90408
This commit is contained in:
Aleksander Morgado
2015-12-03 12:01:00 +01:00
parent ea3cb005b8
commit 4c036eb8f9
3 changed files with 62 additions and 16 deletions

View File

@@ -105,15 +105,6 @@ mm_bearer_list_delete_bearer (MMBearerList *self,
{
GList *l;
if (!g_str_has_prefix (path, MM_DBUS_BEARER_PREFIX)) {
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_INVALID_ARGS,
"Cannot delete bearer: invalid path '%s'",
path);
return FALSE;
}
for (l = self->priv->bearers; l; l = g_list_next (l)) {
if (g_str_equal (path, mm_base_bearer_get_path (MM_BASE_BEARER (l->data)))) {
g_object_unref (l->data);
@@ -169,6 +160,20 @@ mm_bearer_list_find_by_properties (MMBearerList *self,
return NULL;
}
MMBaseBearer *
mm_bearer_list_find_by_path (MMBearerList *self,
const gchar *path)
{
GList *l;
for (l = self->priv->bearers; l; l = g_list_next (l)) {
if (g_str_equal (path, mm_base_bearer_get_path (MM_BASE_BEARER (l->data))))
return g_object_ref (l->data);
}
return NULL;
}
/*****************************************************************************/
typedef struct {

View File

@@ -74,6 +74,8 @@ void mm_bearer_list_foreach (MMBearerList *self,
MMBaseBearer *mm_bearer_list_find_by_properties (MMBearerList *self,
MMBearerProperties *properties);
MMBaseBearer *mm_bearer_list_find_by_path (MMBearerList *self,
const gchar *path);
void mm_bearer_list_disconnect_all_bearers (MMBearerList *self,
GAsyncReadyCallback callback,

View File

@@ -760,11 +760,14 @@ typedef struct {
MMIfaceModem *self;
MMBearerList *list;
gchar *bearer_path;
MMBaseBearer *bearer;
} HandleDeleteBearerContext;
static void
handle_delete_bearer_context_free (HandleDeleteBearerContext *ctx)
{
if (ctx->bearer)
g_object_unref (ctx->bearer);
g_object_unref (ctx->skeleton);
g_object_unref (ctx->invocation);
g_object_unref (ctx->self);
@@ -774,6 +777,26 @@ handle_delete_bearer_context_free (HandleDeleteBearerContext *ctx)
g_free (ctx);
}
static void
delete_bearer_disconnect_ready (MMBaseBearer *bearer,
GAsyncResult *res,
HandleDeleteBearerContext *ctx)
{
GError *error = NULL;
if (!mm_base_bearer_disconnect_finish (bearer, res, &error)) {
g_dbus_method_invocation_take_error (ctx->invocation, error);
handle_delete_bearer_context_free (ctx);
return;
}
if (!mm_bearer_list_delete_bearer (ctx->list, ctx->bearer_path, &error))
g_dbus_method_invocation_take_error (ctx->invocation, error);
else
mm_gdbus_modem_complete_delete_bearer (ctx->skeleton, ctx->invocation);
handle_delete_bearer_context_free (ctx);
}
static void
handle_delete_bearer_auth_ready (MMBaseModem *self,
GAsyncResult *res,
@@ -787,14 +810,30 @@ handle_delete_bearer_auth_ready (MMBaseModem *self,
return;
}
if (!ctx->list)
mm_gdbus_modem_complete_delete_bearer (ctx->skeleton, ctx->invocation);
else if (!mm_bearer_list_delete_bearer (ctx->list, ctx->bearer_path, &error))
g_dbus_method_invocation_take_error (ctx->invocation, error);
else
mm_gdbus_modem_complete_delete_bearer (ctx->skeleton, ctx->invocation);
if (!g_str_has_prefix (ctx->bearer_path, MM_DBUS_BEARER_PREFIX)) {
g_dbus_method_invocation_return_error (ctx->invocation,
MM_CORE_ERROR,
MM_CORE_ERROR_INVALID_ARGS,
"Cannot delete bearer: invalid path '%s'",
ctx->bearer_path);
handle_delete_bearer_context_free (ctx);
return;
}
handle_delete_bearer_context_free (ctx);
ctx->bearer = mm_bearer_list_find_by_path (ctx->list, ctx->bearer_path);
if (!ctx->bearer) {
g_dbus_method_invocation_return_error (ctx->invocation,
MM_CORE_ERROR,
MM_CORE_ERROR_INVALID_ARGS,
"Cannot delete bearer: no bearer found with path '%s'",
ctx->bearer_path);
handle_delete_bearer_context_free (ctx);
return;
}
mm_base_bearer_disconnect (ctx->bearer,
(GAsyncReadyCallback)delete_bearer_disconnect_ready,
ctx);
}
static gboolean