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,6 +194,7 @@ 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)) {
if (!force) {
g_simple_async_report_error_in_idle ( g_simple_async_report_error_in_idle (
G_OBJECT (self), G_OBJECT (self),
callback, callback,
@@ -203,7 +203,15 @@ mm_iface_modem_create_bearer (MMIfaceModem *self,
MM_CORE_ERROR_TOO_MANY, MM_CORE_ERROR_TOO_MANY,
"Cannot add new bearer: already reached maximum (%u)", "Cannot add new bearer: already reached maximum (%u)",
mm_bearer_list_get_count (list)); mm_bearer_list_get_count (list));
} else { 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 ( MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer (
self, self,
properties, properties,
@@ -212,8 +220,6 @@ mm_iface_modem_create_bearer (MMIfaceModem *self,
callback, callback,
user_data, user_data,
mm_iface_modem_create_bearer)); 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

@@ -325,10 +325,11 @@ gboolean mm_iface_modem_set_allowed_bands_finish (MMIfaceModem *self,
/* Allow creating bearers */ /* Allow creating bearers */
void mm_iface_modem_create_bearer (MMIfaceModem *self, void mm_iface_modem_create_bearer (MMIfaceModem *self,
gboolean force,
MMCommonBearerProperties *properties, MMCommonBearerProperties *properties,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data); gpointer user_data);
gchar *mm_iface_modem_create_bearer_finish (MMIfaceModem *self, MMBearer *mm_iface_modem_create_bearer_finish (MMIfaceModem *self,
GAsyncResult *res, GAsyncResult *res,
GError **error); GError **error);