aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-iface-modem.c67
-rw-r--r--src/mm-iface-modem.h15
2 files changed, 45 insertions, 37 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index a14910bf..682981ff 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -124,19 +124,19 @@ bearer_status_changed (MMBearer *bearer,
}
}
-gchar *
+MMBearer *
mm_iface_modem_create_bearer_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error)
{
- const gchar *path;
+ MMBearer *bearer;
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
return NULL;
- path = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ bearer = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
- return g_strdup (path);
+ return g_object_ref (bearer);
}
static void
@@ -168,11 +168,9 @@ create_bearer_ready (MMIfaceModem *self,
"notify::" MM_BEARER_STATUS,
(GCallback)bearer_status_changed,
self);
- /* It is safe to set the static path here because we're not completing
- * in idle */
g_simple_async_result_set_op_res_gpointer (simple,
- (gchar *)mm_bearer_get_path (bearer),
- NULL);
+ g_object_ref (bearer),
+ g_object_unref);
}
g_object_unref (bearer);
g_object_unref (list);
@@ -184,6 +182,7 @@ create_bearer_ready (MMIfaceModem *self,
void
mm_iface_modem_create_bearer (MMIfaceModem *self,
+ gboolean force,
MMCommonBearerProperties *properties,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -195,25 +194,32 @@ mm_iface_modem_create_bearer (MMIfaceModem *self,
NULL);
if (mm_bearer_list_get_count (list) == mm_bearer_list_get_max (list)) {
- g_simple_async_report_error_in_idle (
- G_OBJECT (self),
- callback,
- user_data,
- MM_CORE_ERROR,
- MM_CORE_ERROR_TOO_MANY,
- "Cannot add new bearer: already reached maximum (%u)",
- mm_bearer_list_get_count (list));
- } else {
- MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer (
- self,
- properties,
- (GAsyncReadyCallback)create_bearer_ready,
- g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- mm_iface_modem_create_bearer));
+ if (!force) {
+ g_simple_async_report_error_in_idle (
+ G_OBJECT (self),
+ callback,
+ user_data,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_TOO_MANY,
+ "Cannot add new bearer: already reached maximum (%u)",
+ mm_bearer_list_get_count (list));
+ g_object_unref (list);
+ return;
+ }
+
+ /* We are told to force the creation of the new bearer.
+ * We'll remove all existing bearers, and then go on creating the new one */
+ mm_bearer_list_delete_all_bearers (list);
}
+ MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer (
+ self,
+ properties,
+ (GAsyncReadyCallback)create_bearer_ready,
+ g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ mm_iface_modem_create_bearer));
g_object_unref (list);
}
@@ -222,17 +228,17 @@ handle_create_bearer_ready (MMIfaceModem *self,
GAsyncResult *res,
DbusCallContext *ctx)
{
- gchar *bearer_path;
+ MMBearer *bearer;
GError *error = NULL;
- bearer_path = mm_iface_modem_create_bearer_finish (self, res, &error);
- if (!bearer_path)
+ bearer = mm_iface_modem_create_bearer_finish (self, res, &error);
+ if (!bearer)
g_dbus_method_invocation_take_error (ctx->invocation, error);
else {
mm_gdbus_modem_complete_create_bearer (ctx->skeleton,
ctx->invocation,
- bearer_path);
- g_free (bearer_path);
+ mm_bearer_get_path (bearer));
+ g_object_unref (bearer);
}
dbus_call_context_free (ctx);
}
@@ -252,6 +258,7 @@ handle_create_bearer (MmGdbusModem *skeleton,
} else {
mm_iface_modem_create_bearer (
self,
+ FALSE, /* don't force when request comes from DBus */
properties,
(GAsyncReadyCallback)handle_create_bearer_ready,
dbus_call_context_new (skeleton,
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index e5ab1b77..65bf4d1a 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -324,12 +324,13 @@ gboolean mm_iface_modem_set_allowed_bands_finish (MMIfaceModem *self,
GError **error);
/* Allow creating bearers */
-void mm_iface_modem_create_bearer (MMIfaceModem *self,
- MMCommonBearerProperties *properties,
- GAsyncReadyCallback callback,
- gpointer user_data);
-gchar *mm_iface_modem_create_bearer_finish (MMIfaceModem *self,
- GAsyncResult *res,
- GError **error);
+void mm_iface_modem_create_bearer (MMIfaceModem *self,
+ gboolean force,
+ MMCommonBearerProperties *properties,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+MMBearer *mm_iface_modem_create_bearer_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error);
#endif /* MM_IFACE_MODEM_H */