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.
This commit is contained in:
Aleksander Morgado
2011-12-19 20:40:54 +01:00
parent cd6caf6106
commit 534aeb0c8a
4 changed files with 134 additions and 52 deletions

View File

@@ -35,6 +35,8 @@
/* Context */ /* Context */
typedef struct { typedef struct {
MMManager *manager;
MMObject *object;
GCancellable *cancellable; GCancellable *cancellable;
MMBearer *bearer; MMBearer *bearer;
} Context; } Context;
@@ -119,6 +121,10 @@ context_free (Context *ctx)
g_object_unref (ctx->cancellable); g_object_unref (ctx->cancellable);
if (ctx->bearer) if (ctx->bearer)
g_object_unref (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); g_free (ctx);
} }
@@ -264,7 +270,9 @@ get_bearer_ready (GObject *source,
GAsyncResult *result, GAsyncResult *result,
gpointer none) gpointer none)
{ {
ctx->bearer = mmcli_get_bearer_finish (result); ctx->bearer = mmcli_get_bearer_finish (result,
&ctx->manager,
&ctx->object);
if (info_flag) if (info_flag)
g_assert_not_reached (); g_assert_not_reached ();
@@ -317,7 +325,10 @@ mmcli_bearer_run_synchronous (GDBusConnection *connection)
/* Initialize context */ /* Initialize context */
ctx = g_new0 (Context, 1); 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? */ /* Request to get info from bearer? */
if (info_flag) { if (info_flag) {

View File

@@ -49,6 +49,8 @@ manager_new_ready (GDBusConnection *connection,
g_debug ("ModemManager process found at '%s'", name_owner); g_debug ("ModemManager process found at '%s'", name_owner);
g_free (name_owner); g_free (name_owner);
g_simple_async_result_set_op_res_gpointer (simple, manager, NULL); g_simple_async_result_set_op_res_gpointer (simple, manager, NULL);
g_simple_async_result_complete (simple); g_simple_async_result_complete (simple);
g_object_unref (simple); g_object_unref (simple);
@@ -168,29 +170,58 @@ get_modem_path (const gchar *modem_str)
return modem_path; return modem_path;
} }
static void typedef struct {
get_manager_ready (GDBusConnection *connection, GSimpleAsyncResult *result;
GAsyncResult *res, GCancellable *cancellable;
GSimpleAsyncResult *simple) gchar *modem_path;
{
MMManager *manager; MMManager *manager;
MMObject *found; MMObject *object;
const gchar *modem_path; } GetModemContext;
manager = mmcli_get_manager_finish (res); static void
modem_path = g_object_get_data (G_OBJECT (simple), MODEM_PATH_TAG); get_modem_context_free (GetModemContext *ctx)
found = find_modem (manager, modem_path); {
g_object_unref (manager); 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); static void
g_simple_async_result_complete (simple); get_modem_context_complete (GetModemContext *ctx)
g_object_unref (simple); {
g_simple_async_result_complete (ctx->result);
g_object_unref (ctx->result);
ctx->result = NULL;
} }
MMObject * 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 void
@@ -200,28 +231,25 @@ mmcli_get_modem (GDBusConnection *connection,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) gpointer user_data)
{ {
GSimpleAsyncResult *result; GetModemContext *ctx;
gchar *modem_path;
modem_path = get_modem_path (modem_str); ctx = g_new0 (GetModemContext, 1);
result = g_simple_async_result_new (G_OBJECT (connection), ctx->modem_path = get_modem_path (modem_str);
ctx->result = g_simple_async_result_new (G_OBJECT (connection),
callback, callback,
user_data, user_data,
mmcli_get_modem); mmcli_get_modem);
g_object_set_data_full (G_OBJECT (result),
MODEM_PATH_TAG,
modem_path,
g_free);
mmcli_get_manager (connection, mmcli_get_manager (connection,
cancellable, cancellable,
(GAsyncReadyCallback)get_manager_ready, (GAsyncReadyCallback)get_manager_ready,
result); ctx);
} }
MMObject * MMObject *
mmcli_get_modem_sync (GDBusConnection *connection, mmcli_get_modem_sync (GDBusConnection *connection,
const gchar *modem_str) const gchar *modem_str,
MMManager **o_manager)
{ {
MMManager *manager; MMManager *manager;
MMObject *found; MMObject *found;
@@ -229,8 +257,11 @@ mmcli_get_modem_sync (GDBusConnection *connection,
manager = mmcli_get_manager_sync (connection); manager = mmcli_get_manager_sync (connection);
modem_path = get_modem_path (modem_str); modem_path = get_modem_path (modem_str);
found = find_modem (manager, modem_path); found = find_modem (manager, modem_path);
if (o_manager)
*o_manager = manager;
else
g_object_unref (manager); g_object_unref (manager);
g_free (modem_path); g_free (modem_path);
@@ -264,28 +295,47 @@ typedef struct {
MMManager *manager; MMManager *manager;
GList *modems; GList *modems;
MMObject *current; MMObject *current;
MMBearer *bearer;
} GetBearerContext; } GetBearerContext;
static void 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) if (ctx->current)
g_object_unref (ctx->current); g_object_unref (ctx->current);
if (ctx->cancellable) if (ctx->cancellable)
g_object_unref (ctx->cancellable); g_object_unref (ctx->cancellable);
if (ctx->manager) if (ctx->manager)
g_object_unref (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_foreach (ctx->modems, (GFunc)g_object_unref, NULL);
g_list_free (ctx->modems); g_list_free (ctx->modems);
g_free (ctx->bearer_path); 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); g_object_unref (ctx->result);
ctx->result = NULL;
} }
MMBearer * 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); static void look_for_bearer_in_modem (GetBearerContext *ctx);
@@ -296,7 +346,6 @@ list_bearers_ready (MMModem *modem,
GetBearerContext *ctx) GetBearerContext *ctx)
{ {
GList *bearers; GList *bearers;
MMBearer *bearer;
GError *error = NULL; GError *error = NULL;
bearers = mm_modem_list_bearers_finish (modem, res, &error); bearers = mm_modem_list_bearers_finish (modem, res, &error);
@@ -307,14 +356,17 @@ list_bearers_ready (MMModem *modem,
exit (EXIT_FAILURE); 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_foreach (bearers, (GFunc)g_object_unref, NULL);
g_list_free (bearers); g_list_free (bearers);
/* Found! */ /* Found! */
if (bearer) { if (ctx->bearer) {
g_simple_async_result_set_op_res_gpointer (ctx->result, bearer, (GDestroyNotify)g_object_unref); g_simple_async_result_set_op_res_gpointer (
get_bearer_context_complete_and_free (ctx); ctx->result,
ctx,
(GDestroyNotify)get_bearer_context_free);
get_bearer_context_complete (ctx);
return; return;
} }
@@ -389,7 +441,9 @@ mmcli_get_bearer (GDBusConnection *connection,
MMBearer * MMBearer *
mmcli_get_bearer_sync (GDBusConnection *connection, mmcli_get_bearer_sync (GDBusConnection *connection,
const gchar *bearer_path) const gchar *bearer_path,
MMManager **o_manager,
MMObject **o_object)
{ {
MMManager *manager; MMManager *manager;
GList *modems; GList *modems;
@@ -423,11 +477,19 @@ mmcli_get_bearer_sync (GDBusConnection *connection,
found = find_bearer_in_list (bearers, bearer_path); found = find_bearer_in_list (bearers, bearer_path);
g_list_foreach (bearers, (GFunc)g_object_unref, NULL); g_list_foreach (bearers, (GFunc)g_object_unref, NULL);
g_list_free (bearers); g_list_free (bearers);
if (o_object)
*o_object = g_object_ref (object);
g_object_unref (modem); g_object_unref (modem);
} }
g_list_foreach (modems, (GFunc)g_object_unref, NULL); g_list_foreach (modems, (GFunc)g_object_unref, NULL);
g_list_free (modems); g_list_free (modems);
if (o_manager)
*o_manager = manager;
else
g_object_unref (manager); g_object_unref (manager);
return found; return found;

View File

@@ -32,18 +32,24 @@ void mmcli_get_modem (GDBusConnection *connection,
GCancellable *cancellable, GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data); 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, MMObject *mmcli_get_modem_sync (GDBusConnection *connection,
const gchar *modem_str); const gchar *modem_str,
MMManager **o_manager);
void mmcli_get_bearer (GDBusConnection *connection, void mmcli_get_bearer (GDBusConnection *connection,
const gchar *bearer_path, const gchar *bearer_path,
GCancellable *cancellable, GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data); 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, 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_bearer_ip_method_string (MMBearerIpMethod method);
const gchar *mmcli_get_state_string (MMModemState state); const gchar *mmcli_get_state_string (MMModemState state);

View File

@@ -35,6 +35,7 @@
/* Context */ /* Context */
typedef struct { typedef struct {
MMManager *manager;
GCancellable *cancellable; GCancellable *cancellable;
MMObject *object; MMObject *object;
MMModem *modem; MMModem *modem;
@@ -155,6 +156,8 @@ context_free (Context *ctx)
g_object_unref (ctx->modem); g_object_unref (ctx->modem);
if (ctx->object) if (ctx->object)
g_object_unref (ctx->object); g_object_unref (ctx->object);
if (ctx->manager)
g_object_unref (ctx->manager);
g_free (ctx); g_free (ctx);
} }
@@ -635,13 +638,13 @@ delete_bearer_ready (MMModem *modem,
} }
static void static void
state_changed (MMObject *modem, state_changed (MMModem *modem,
MMModemState old_state, MMModemState old_state,
MMModemState new_state, MMModemState new_state,
MMModemStateChangeReason reason) MMModemStateChangeReason reason)
{ {
g_print ("\t%s: State changed, '%s' --> '%s' (Reason: %s)\n", 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 (old_state),
mmcli_get_state_string (new_state), mmcli_get_state_string (new_state),
mmcli_get_state_reason_string (reason)); mmcli_get_state_reason_string (reason));
@@ -653,7 +656,7 @@ get_modem_ready (GObject *source,
GAsyncResult *result, GAsyncResult *result,
gpointer none) 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); ctx->modem = mm_object_get_modem (ctx->object);
if (info_flag) if (info_flag)
@@ -807,7 +810,7 @@ mmcli_modem_run_synchronous (GDBusConnection *connection)
/* Initialize context */ /* Initialize context */
ctx = g_new0 (Context, 1); 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); ctx->modem = mm_object_get_modem (ctx->object);
/* Request to get info from modem? */ /* Request to get info from modem? */