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:
@@ -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) {
|
||||||
|
@@ -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);
|
||||||
callback,
|
ctx->result = g_simple_async_result_new (G_OBJECT (connection),
|
||||||
user_data,
|
callback,
|
||||||
mmcli_get_modem);
|
user_data,
|
||||||
g_object_set_data_full (G_OBJECT (result),
|
mmcli_get_modem);
|
||||||
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,9 +257,12 @@ 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);
|
||||||
g_object_unref (manager);
|
|
||||||
|
if (o_manager)
|
||||||
|
*o_manager = manager;
|
||||||
|
else
|
||||||
|
g_object_unref (manager);
|
||||||
g_free (modem_path);
|
g_free (modem_path);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
@@ -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,12 +477,20 @@ 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);
|
||||||
g_object_unref (manager);
|
|
||||||
|
if (o_manager)
|
||||||
|
*o_manager = manager;
|
||||||
|
else
|
||||||
|
g_object_unref (manager);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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? */
|
||||||
|
Reference in New Issue
Block a user