iface-modem: return a MMBearer reference when creating a new bearer

Not just the bearer path.
This commit is contained in:
Aleksander Morgado
2011-12-27 15:33:33 +01:00
parent b232cc4f11
commit 4ccc00fc6d
2 changed files with 45 additions and 37 deletions

View File

@@ -124,19 +124,19 @@ bearer_status_changed (MMBearer *bearer,
} }
} }
gchar * MMBearer *
mm_iface_modem_create_bearer_finish (MMIfaceModem *self, mm_iface_modem_create_bearer_finish (MMIfaceModem *self,
GAsyncResult *res, GAsyncResult *res,
GError **error) GError **error)
{ {
const gchar *path; MMBearer *bearer;
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
return NULL; 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 static void
@@ -168,11 +168,9 @@ create_bearer_ready (MMIfaceModem *self,
"notify::" MM_BEARER_STATUS, "notify::" MM_BEARER_STATUS,
(GCallback)bearer_status_changed, (GCallback)bearer_status_changed,
self); 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, g_simple_async_result_set_op_res_gpointer (simple,
(gchar *)mm_bearer_get_path (bearer), g_object_ref (bearer),
NULL); g_object_unref);
} }
g_object_unref (bearer); g_object_unref (bearer);
g_object_unref (list); g_object_unref (list);
@@ -184,6 +182,7 @@ create_bearer_ready (MMIfaceModem *self,
void void
mm_iface_modem_create_bearer (MMIfaceModem *self, mm_iface_modem_create_bearer (MMIfaceModem *self,
gboolean force,
MMCommonBearerProperties *properties, MMCommonBearerProperties *properties,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) gpointer user_data)
@@ -195,25 +194,32 @@ mm_iface_modem_create_bearer (MMIfaceModem *self,
NULL); NULL);
if (mm_bearer_list_get_count (list) == mm_bearer_list_get_max (list)) { if (mm_bearer_list_get_count (list) == mm_bearer_list_get_max (list)) {
g_simple_async_report_error_in_idle ( if (!force) {
G_OBJECT (self), g_simple_async_report_error_in_idle (
callback, G_OBJECT (self),
user_data, callback,
MM_CORE_ERROR, user_data,
MM_CORE_ERROR_TOO_MANY, MM_CORE_ERROR,
"Cannot add new bearer: already reached maximum (%u)", MM_CORE_ERROR_TOO_MANY,
mm_bearer_list_get_count (list)); "Cannot add new bearer: already reached maximum (%u)",
} else { mm_bearer_list_get_count (list));
MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer ( g_object_unref (list);
self, return;
properties, }
(GAsyncReadyCallback)create_bearer_ready,
g_simple_async_result_new (G_OBJECT (self), /* We are told to force the creation of the new bearer.
callback, * We'll remove all existing bearers, and then go on creating the new one */
user_data, mm_bearer_list_delete_all_bearers (list);
mm_iface_modem_create_bearer));
} }
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); g_object_unref (list);
} }
@@ -222,17 +228,17 @@ handle_create_bearer_ready (MMIfaceModem *self,
GAsyncResult *res, GAsyncResult *res,
DbusCallContext *ctx) DbusCallContext *ctx)
{ {
gchar *bearer_path; MMBearer *bearer;
GError *error = NULL; GError *error = NULL;
bearer_path = mm_iface_modem_create_bearer_finish (self, res, &error); bearer = mm_iface_modem_create_bearer_finish (self, res, &error);
if (!bearer_path) if (!bearer)
g_dbus_method_invocation_take_error (ctx->invocation, error); g_dbus_method_invocation_take_error (ctx->invocation, error);
else { else {
mm_gdbus_modem_complete_create_bearer (ctx->skeleton, mm_gdbus_modem_complete_create_bearer (ctx->skeleton,
ctx->invocation, ctx->invocation,
bearer_path); mm_bearer_get_path (bearer));
g_free (bearer_path); g_object_unref (bearer);
} }
dbus_call_context_free (ctx); dbus_call_context_free (ctx);
} }
@@ -252,6 +258,7 @@ handle_create_bearer (MmGdbusModem *skeleton,
} else { } else {
mm_iface_modem_create_bearer ( mm_iface_modem_create_bearer (
self, self,
FALSE, /* don't force when request comes from DBus */
properties, properties,
(GAsyncReadyCallback)handle_create_bearer_ready, (GAsyncReadyCallback)handle_create_bearer_ready,
dbus_call_context_new (skeleton, dbus_call_context_new (skeleton,

View File

@@ -324,12 +324,13 @@ gboolean mm_iface_modem_set_allowed_bands_finish (MMIfaceModem *self,
GError **error); GError **error);
/* Allow creating bearers */ /* Allow creating bearers */
void mm_iface_modem_create_bearer (MMIfaceModem *self, void mm_iface_modem_create_bearer (MMIfaceModem *self,
MMCommonBearerProperties *properties, gboolean force,
GAsyncReadyCallback callback, MMCommonBearerProperties *properties,
gpointer user_data); GAsyncReadyCallback callback,
gchar *mm_iface_modem_create_bearer_finish (MMIfaceModem *self, gpointer user_data);
GAsyncResult *res, MMBearer *mm_iface_modem_create_bearer_finish (MMIfaceModem *self,
GError **error); GAsyncResult *res,
GError **error);
#endif /* MM_IFACE_MODEM_H */ #endif /* MM_IFACE_MODEM_H */