diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-27 15:33:33 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:38 +0100 |
commit | 4ccc00fc6d333e16683f50941ed708acee56d36f (patch) | |
tree | ab5e268f49ac93ef6deb74f3b64f3648bf07711e | |
parent | b232cc4f111ac449aca33c41d47789344cd5dcbd (diff) |
iface-modem: return a MMBearer reference when creating a new bearer
Not just the bearer path.
-rw-r--r-- | src/mm-iface-modem.c | 67 | ||||
-rw-r--r-- | src/mm-iface-modem.h | 15 |
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 */ |