aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-12-19 20:40:54 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:35 +0100
commit534aeb0c8ac83126048353b8f30128cd6f1cd92a (patch)
tree5a0c768b38ef761421765598428c353519cfb810
parentcd6caf61061e18736ecf0ddd4834c1ad1fbcb7c2 (diff)
cli: always keep a MMManager around
In order to receive signals in the GDBusObjects retrieved from the GDBusObjectManagerClient, we need to keep a reference of the client around.
-rw-r--r--cli/mmcli-bearer.c15
-rw-r--r--cli/mmcli-common.c146
-rw-r--r--cli/mmcli-common.h14
-rw-r--r--cli/mmcli-modem.c11
4 files changed, 134 insertions, 52 deletions
diff --git a/cli/mmcli-bearer.c b/cli/mmcli-bearer.c
index 382a0f8d..baeb2c8b 100644
--- a/cli/mmcli-bearer.c
+++ b/cli/mmcli-bearer.c
@@ -35,6 +35,8 @@
/* Context */
typedef struct {
+ MMManager *manager;
+ MMObject *object;
GCancellable *cancellable;
MMBearer *bearer;
} Context;
@@ -119,6 +121,10 @@ context_free (Context *ctx)
g_object_unref (ctx->cancellable);
if (ctx->bearer)
g_object_unref (ctx->bearer);
+ if (ctx->object)
+ g_object_unref (ctx->object);
+ if (ctx->manager)
+ g_object_unref (ctx->manager);
g_free (ctx);
}
@@ -264,7 +270,9 @@ get_bearer_ready (GObject *source,
GAsyncResult *result,
gpointer none)
{
- ctx->bearer = mmcli_get_bearer_finish (result);
+ ctx->bearer = mmcli_get_bearer_finish (result,
+ &ctx->manager,
+ &ctx->object);
if (info_flag)
g_assert_not_reached ();
@@ -317,7 +325,10 @@ mmcli_bearer_run_synchronous (GDBusConnection *connection)
/* Initialize context */
ctx = g_new0 (Context, 1);
- ctx->bearer = mmcli_get_bearer_sync (connection, bearer_str);
+ ctx->bearer = mmcli_get_bearer_sync (connection,
+ bearer_str,
+ &ctx->manager,
+ &ctx->object);
/* Request to get info from bearer? */
if (info_flag) {
diff --git a/cli/mmcli-common.c b/cli/mmcli-common.c
index 27c92800..0bb80473 100644
--- a/cli/mmcli-common.c
+++ b/cli/mmcli-common.c
@@ -49,6 +49,8 @@ manager_new_ready (GDBusConnection *connection,
g_debug ("ModemManager process found at '%s'", name_owner);
g_free (name_owner);
+
+
g_simple_async_result_set_op_res_gpointer (simple, manager, NULL);
g_simple_async_result_complete (simple);
g_object_unref (simple);
@@ -168,29 +170,58 @@ get_modem_path (const gchar *modem_str)
return modem_path;
}
-static void
-get_manager_ready (GDBusConnection *connection,
- GAsyncResult *res,
- GSimpleAsyncResult *simple)
-{
+typedef struct {
+ GSimpleAsyncResult *result;
+ GCancellable *cancellable;
+ gchar *modem_path;
MMManager *manager;
- MMObject *found;
- const gchar *modem_path;
+ MMObject *object;
+} GetModemContext;
- manager = mmcli_get_manager_finish (res);
- modem_path = g_object_get_data (G_OBJECT (simple), MODEM_PATH_TAG);
- found = find_modem (manager, modem_path);
- g_object_unref (manager);
+static void
+get_modem_context_free (GetModemContext *ctx)
+{
+ if (ctx->cancellable)
+ g_object_unref (ctx->cancellable);
+ if (ctx->manager)
+ g_object_unref (ctx->manager);
+ g_free (ctx->modem_path);
+ g_free (ctx);
+}
- g_simple_async_result_set_op_res_gpointer (simple, found, NULL);
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
+static void
+get_modem_context_complete (GetModemContext *ctx)
+{
+ g_simple_async_result_complete (ctx->result);
+ g_object_unref (ctx->result);
+ ctx->result = NULL;
}
MMObject *
-mmcli_get_modem_finish (GAsyncResult *res)
+mmcli_get_modem_finish (GAsyncResult *res,
+ MMManager **o_manager)
{
- return g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ GetModemContext *ctx;
+
+ ctx = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ if (o_manager)
+ *o_manager = g_object_ref (ctx->manager);
+
+ return g_object_ref (ctx->object);
+}
+
+static void
+get_manager_ready (GDBusConnection *connection,
+ GAsyncResult *res,
+ GetModemContext *ctx)
+{
+ ctx->manager = mmcli_get_manager_finish (res);
+ ctx->object = find_modem (ctx->manager, ctx->modem_path);
+ g_simple_async_result_set_op_res_gpointer (
+ ctx->result,
+ ctx,
+ (GDestroyNotify)get_modem_context_free);
+ get_modem_context_complete (ctx);
}
void
@@ -200,28 +231,25 @@ mmcli_get_modem (GDBusConnection *connection,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
- gchar *modem_path;
+ GetModemContext *ctx;
- modem_path = get_modem_path (modem_str);
- result = g_simple_async_result_new (G_OBJECT (connection),
- callback,
- user_data,
- mmcli_get_modem);
- g_object_set_data_full (G_OBJECT (result),
- MODEM_PATH_TAG,
- modem_path,
- g_free);
+ ctx = g_new0 (GetModemContext, 1);
+ ctx->modem_path = get_modem_path (modem_str);
+ ctx->result = g_simple_async_result_new (G_OBJECT (connection),
+ callback,
+ user_data,
+ mmcli_get_modem);
mmcli_get_manager (connection,
cancellable,
(GAsyncReadyCallback)get_manager_ready,
- result);
+ ctx);
}
MMObject *
mmcli_get_modem_sync (GDBusConnection *connection,
- const gchar *modem_str)
+ const gchar *modem_str,
+ MMManager **o_manager)
{
MMManager *manager;
MMObject *found;
@@ -229,9 +257,12 @@ mmcli_get_modem_sync (GDBusConnection *connection,
manager = mmcli_get_manager_sync (connection);
modem_path = get_modem_path (modem_str);
-
found = find_modem (manager, modem_path);
- g_object_unref (manager);
+
+ if (o_manager)
+ *o_manager = manager;
+ else
+ g_object_unref (manager);
g_free (modem_path);
return found;
@@ -264,28 +295,47 @@ typedef struct {
MMManager *manager;
GList *modems;
MMObject *current;
+ MMBearer *bearer;
} GetBearerContext;
static void
-get_bearer_context_complete_and_free (GetBearerContext *ctx)
+get_bearer_context_free (GetBearerContext *ctx)
{
- g_simple_async_result_complete (ctx->result);
if (ctx->current)
g_object_unref (ctx->current);
if (ctx->cancellable)
g_object_unref (ctx->cancellable);
if (ctx->manager)
g_object_unref (ctx->manager);
+ if (ctx->bearer)
+ g_object_unref (ctx->bearer);
g_list_foreach (ctx->modems, (GFunc)g_object_unref, NULL);
g_list_free (ctx->modems);
g_free (ctx->bearer_path);
+ g_free (ctx);
+}
+
+static void
+get_bearer_context_complete (GetBearerContext *ctx)
+{
+ g_simple_async_result_complete (ctx->result);
g_object_unref (ctx->result);
+ ctx->result = NULL;
}
MMBearer *
-mmcli_get_bearer_finish (GAsyncResult *res)
+mmcli_get_bearer_finish (GAsyncResult *res,
+ MMManager **o_manager,
+ MMObject **o_object)
{
- return g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ GetBearerContext *ctx;
+
+ ctx = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ if (o_manager)
+ *o_manager = g_object_ref (ctx->manager);
+ if (o_object)
+ *o_object = g_object_ref (ctx->current);
+ return g_object_ref (ctx->bearer);
}
static void look_for_bearer_in_modem (GetBearerContext *ctx);
@@ -296,7 +346,6 @@ list_bearers_ready (MMModem *modem,
GetBearerContext *ctx)
{
GList *bearers;
- MMBearer *bearer;
GError *error = NULL;
bearers = mm_modem_list_bearers_finish (modem, res, &error);
@@ -307,14 +356,17 @@ list_bearers_ready (MMModem *modem,
exit (EXIT_FAILURE);
}
- bearer = find_bearer_in_list (bearers, ctx->bearer_path);
+ ctx->bearer = find_bearer_in_list (bearers, ctx->bearer_path);
g_list_foreach (bearers, (GFunc)g_object_unref, NULL);
g_list_free (bearers);
/* Found! */
- if (bearer) {
- g_simple_async_result_set_op_res_gpointer (ctx->result, bearer, (GDestroyNotify)g_object_unref);
- get_bearer_context_complete_and_free (ctx);
+ if (ctx->bearer) {
+ g_simple_async_result_set_op_res_gpointer (
+ ctx->result,
+ ctx,
+ (GDestroyNotify)get_bearer_context_free);
+ get_bearer_context_complete (ctx);
return;
}
@@ -389,7 +441,9 @@ mmcli_get_bearer (GDBusConnection *connection,
MMBearer *
mmcli_get_bearer_sync (GDBusConnection *connection,
- const gchar *bearer_path)
+ const gchar *bearer_path,
+ MMManager **o_manager,
+ MMObject **o_object)
{
MMManager *manager;
GList *modems;
@@ -423,12 +477,20 @@ mmcli_get_bearer_sync (GDBusConnection *connection,
found = find_bearer_in_list (bearers, bearer_path);
g_list_foreach (bearers, (GFunc)g_object_unref, NULL);
g_list_free (bearers);
+
+ if (o_object)
+ *o_object = g_object_ref (object);
+
g_object_unref (modem);
}
g_list_foreach (modems, (GFunc)g_object_unref, NULL);
g_list_free (modems);
- g_object_unref (manager);
+
+ if (o_manager)
+ *o_manager = manager;
+ else
+ g_object_unref (manager);
return found;
}
diff --git a/cli/mmcli-common.h b/cli/mmcli-common.h
index 8ab1587f..a18b5076 100644
--- a/cli/mmcli-common.h
+++ b/cli/mmcli-common.h
@@ -32,18 +32,24 @@ void mmcli_get_modem (GDBusConnection *connection,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
-MMObject *mmcli_get_modem_finish (GAsyncResult *res);
+MMObject *mmcli_get_modem_finish (GAsyncResult *res,
+ MMManager **o_manager);
MMObject *mmcli_get_modem_sync (GDBusConnection *connection,
- const gchar *modem_str);
+ const gchar *modem_str,
+ MMManager **o_manager);
void mmcli_get_bearer (GDBusConnection *connection,
const gchar *bearer_path,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
-MMBearer *mmcli_get_bearer_finish (GAsyncResult *res);
+MMBearer *mmcli_get_bearer_finish (GAsyncResult *res,
+ MMManager **manager,
+ MMObject **object);
MMBearer *mmcli_get_bearer_sync (GDBusConnection *connection,
- const gchar *bearer_path);
+ const gchar *bearer_path,
+ MMManager **manager,
+ MMObject **object);
const gchar *mmcli_get_bearer_ip_method_string (MMBearerIpMethod method);
const gchar *mmcli_get_state_string (MMModemState state);
diff --git a/cli/mmcli-modem.c b/cli/mmcli-modem.c
index ce507af0..e5f6d879 100644
--- a/cli/mmcli-modem.c
+++ b/cli/mmcli-modem.c
@@ -35,6 +35,7 @@
/* Context */
typedef struct {
+ MMManager *manager;
GCancellable *cancellable;
MMObject *object;
MMModem *modem;
@@ -155,6 +156,8 @@ context_free (Context *ctx)
g_object_unref (ctx->modem);
if (ctx->object)
g_object_unref (ctx->object);
+ if (ctx->manager)
+ g_object_unref (ctx->manager);
g_free (ctx);
}
@@ -635,13 +638,13 @@ delete_bearer_ready (MMModem *modem,
}
static void
-state_changed (MMObject *modem,
+state_changed (MMModem *modem,
MMModemState old_state,
MMModemState new_state,
MMModemStateChangeReason reason)
{
g_print ("\t%s: State changed, '%s' --> '%s' (Reason: %s)\n",
- mm_object_get_path (modem),
+ mm_modem_get_path (modem),
mmcli_get_state_string (old_state),
mmcli_get_state_string (new_state),
mmcli_get_state_reason_string (reason));
@@ -653,7 +656,7 @@ get_modem_ready (GObject *source,
GAsyncResult *result,
gpointer none)
{
- ctx->object = mmcli_get_modem_finish (result);
+ ctx->object = mmcli_get_modem_finish (result, &ctx->manager);
ctx->modem = mm_object_get_modem (ctx->object);
if (info_flag)
@@ -807,7 +810,7 @@ mmcli_modem_run_synchronous (GDBusConnection *connection)
/* Initialize context */
ctx = g_new0 (Context, 1);
- ctx->object = mmcli_get_modem_sync (connection, modem_str);
+ ctx->object = mmcli_get_modem_sync (connection, modem_str, &ctx->manager);
ctx->modem = mm_object_get_modem (ctx->object);
/* Request to get info from modem? */