diff options
-rw-r--r-- | src/mm-iface-modem.c | 711 |
1 files changed, 510 insertions, 201 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index ce47f58c..e1b70647 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -72,37 +72,6 @@ mm_iface_modem_bind_simple_status (MMIfaceModem *self, /*****************************************************************************/ -typedef struct { - MmGdbusModem *skeleton; - GDBusMethodInvocation *invocation; - MMIfaceModem *self; -} DbusCallContext; - -static void -dbus_call_context_free (DbusCallContext *ctx) -{ - g_object_unref (ctx->skeleton); - g_object_unref (ctx->invocation); - g_object_unref (ctx->self); - g_free (ctx); -} - -static DbusCallContext * -dbus_call_context_new (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - MMIfaceModem *self) -{ - DbusCallContext *ctx; - - ctx = g_new (DbusCallContext, 1); - ctx->skeleton = g_object_ref (skeleton); - ctx->invocation = g_object_ref (invocation); - ctx->self = g_object_ref (self); - return ctx; -} - -/*****************************************************************************/ - static MMModemState get_current_consolidated_state (MMIfaceModem *self); typedef struct { @@ -257,10 +226,27 @@ mm_iface_modem_create_bearer (MMIfaceModem *self, g_object_unref (list); } +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + GVariant *dictionary; +} HandleCreateBearerContext; + +static void +handle_create_bearer_context_free (HandleCreateBearerContext *ctx) +{ + g_variant_unref (ctx->dictionary); + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx); +} + static void handle_create_bearer_ready (MMIfaceModem *self, GAsyncResult *res, - DbusCallContext *ctx) + HandleCreateBearerContext *ctx) { MMBearer *bearer; GError *error = NULL; @@ -274,7 +260,37 @@ handle_create_bearer_ready (MMIfaceModem *self, mm_bearer_get_path (bearer)); g_object_unref (bearer); } - dbus_call_context_free (ctx); + + handle_create_bearer_context_free (ctx); +} + +static void +handle_create_bearer_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleCreateBearerContext *ctx) +{ + MMCommonBearerProperties *properties; + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_create_bearer_context_free (ctx); + return; + } + + properties = mm_common_bearer_properties_new_from_dictionary (ctx->dictionary, &error); + if (!properties) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_create_bearer_context_free (ctx); + return; + } + + mm_iface_modem_create_bearer ( + ctx->self, + properties, + (GAsyncReadyCallback)handle_create_bearer_ready, + ctx); + g_object_unref (properties); } static gboolean @@ -283,30 +299,46 @@ handle_create_bearer (MmGdbusModem *skeleton, GVariant *dictionary, MMIfaceModem *self) { - GError *error = NULL; - MMCommonBearerProperties *properties; + HandleCreateBearerContext *ctx; - properties = mm_common_bearer_properties_new_from_dictionary (dictionary, &error); - if (!properties) { - g_dbus_method_invocation_take_error (invocation, error); - } else { - mm_iface_modem_create_bearer ( - self, - properties, - (GAsyncReadyCallback)handle_create_bearer_ready, - dbus_call_context_new (skeleton, - invocation, - self)); - g_object_unref (properties); - } + ctx = g_new (HandleCreateBearerContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->dictionary = g_variant_ref (dictionary); + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_create_bearer_auth_ready, + ctx); return TRUE; } +/*****************************************************************************/ + +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + gchar *cmd; + guint timeout; +} HandleCommandContext; + +static void +handle_command_context_free (HandleCommandContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx->cmd); + g_free (ctx); +} + static void -command_done (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) +command_ready (MMIfaceModem *self, + GAsyncResult *res, + HandleCommandContext *ctx) { GError *error = NULL; const gchar *result; @@ -315,66 +347,134 @@ command_done (MMIfaceModem *self, res, &error); if (error) - g_dbus_method_invocation_take_error (ctx->invocation, - error); + g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_command (ctx->skeleton, - ctx->invocation, - result); - dbus_call_context_free (ctx); + mm_gdbus_modem_complete_command (ctx->skeleton, ctx->invocation, result); + + handle_command_context_free (ctx); } -static gboolean -handle_command (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - const gchar *cmd, - guint timeout, - MMIfaceModem *self) +static void +handle_command_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleCommandContext *ctx) { + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_command_context_free (ctx); + return; + } /* If command is not implemented, report an error */ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->command || !MM_IFACE_MODEM_GET_INTERFACE (self)->command_finish) { - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, "Cannot send AT command to modem: " "operation not supported"); - return TRUE; + handle_command_context_free (ctx); + return; } - MM_IFACE_MODEM_GET_INTERFACE (self)->command (self, - cmd, - timeout, - (GAsyncReadyCallback)command_done, - dbus_call_context_new (skeleton, - invocation, - self)); + MM_IFACE_MODEM_GET_INTERFACE (self)->command (ctx->self, + ctx->cmd, + ctx->timeout, + (GAsyncReadyCallback)command_ready, + ctx); +} +static gboolean +handle_command (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + const gchar *cmd, + guint timeout, + MMIfaceModem *self) +{ + HandleCommandContext *ctx; + + ctx = g_new (HandleCommandContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->cmd = g_strdup (cmd); + ctx->timeout = timeout; + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_command_auth_ready, + ctx); return TRUE; } /*****************************************************************************/ -static gboolean -handle_delete_bearer (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - const gchar *arg_bearer, - MMIfaceModem *self) +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + gchar *bearer_path; +} HandleDeleteBearerContext; + +static void +handle_delete_bearer_context_free (HandleDeleteBearerContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx->bearer_path); + g_free (ctx); +} + +static void +handle_delete_bearer_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleDeleteBearerContext *ctx) { MMBearerList *list = NULL; GError *error = NULL; + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_delete_bearer_context_free (ctx); + return; + } + g_object_get (self, MM_IFACE_MODEM_BEARER_LIST, &list, NULL); - if (!mm_bearer_list_delete_bearer (list, arg_bearer, &error)) - g_dbus_method_invocation_take_error (invocation, error); + if (!mm_bearer_list_delete_bearer (list, ctx->bearer_path, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_delete_bearer (skeleton, invocation); + mm_gdbus_modem_complete_delete_bearer (ctx->skeleton, ctx->invocation); g_object_unref (list); + handle_delete_bearer_context_free (ctx); +} + +static gboolean +handle_delete_bearer (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + const gchar *bearer, + MMIfaceModem *self) +{ + HandleDeleteBearerContext *ctx; + + ctx = g_new (HandleDeleteBearerContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->bearer_path = g_strdup (bearer); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_delete_bearer_auth_ready, + ctx); return TRUE; } @@ -1028,92 +1128,155 @@ mm_iface_modem_update_subsystem_state (MMIfaceModem *self, /*****************************************************************************/ +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + gboolean enable; +} HandleEnableContext; + +static void +handle_enable_context_free (HandleEnableContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx); +} + +static void +enable_ready (MMBaseModem *self, + GAsyncResult *res, + HandleEnableContext *ctx) +{ + GError *error = NULL; + + if (ctx->enable) { + if (!MM_BASE_MODEM_GET_CLASS (self)->enable_finish (self, res, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else + mm_gdbus_modem_complete_enable (ctx->skeleton, ctx->invocation); + } else { + if (!MM_BASE_MODEM_GET_CLASS (self)->disable_finish (self, res, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else + mm_gdbus_modem_complete_enable (ctx->skeleton, ctx->invocation); + } + + handle_enable_context_free (ctx); +} + static void -enable_disable_ready (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) +handle_enable_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleEnableContext *ctx) { GError *error = NULL; - if (!MM_BASE_MODEM_GET_CLASS (self)->enable_finish (MM_BASE_MODEM (self), - res, - &error)) - g_dbus_method_invocation_take_error (ctx->invocation, - error); - else - mm_gdbus_modem_complete_enable (ctx->skeleton, - ctx->invocation); - dbus_call_context_free (ctx); + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_enable_context_free (ctx); + return; + } + + if (ctx->enable) { + g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable != NULL); + g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable_finish != NULL); + + MM_BASE_MODEM_GET_CLASS (self)->enable ( + self, + NULL, /* cancellable */ + (GAsyncReadyCallback)enable_ready, + ctx); + } else { + g_assert (MM_BASE_MODEM_GET_CLASS (self)->disable != NULL); + g_assert (MM_BASE_MODEM_GET_CLASS (self)->disable_finish != NULL); + + MM_BASE_MODEM_GET_CLASS (self)->disable ( + self, + NULL, /* cancellable */ + (GAsyncReadyCallback)enable_ready, + ctx); + } } static gboolean handle_enable (MmGdbusModem *skeleton, GDBusMethodInvocation *invocation, - gboolean arg_enable, + gboolean enable, MMIfaceModem *self) { - MMModemState modem_state; - - g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable != NULL); - g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable_finish != NULL); + HandleEnableContext *ctx; - modem_state = MM_MODEM_STATE_UNKNOWN; - g_object_get (self, - MM_IFACE_MODEM_STATE, &modem_state, - NULL); + ctx = g_new (HandleEnableContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->enable = enable; - if (arg_enable) - MM_BASE_MODEM_GET_CLASS (self)->enable (MM_BASE_MODEM (self), - NULL, /* cancellable */ - (GAsyncReadyCallback)enable_disable_ready, - dbus_call_context_new (skeleton, - invocation, - self)); - else - MM_BASE_MODEM_GET_CLASS (self)->disable (MM_BASE_MODEM (self), - NULL, /* cancellable */ - (GAsyncReadyCallback)enable_disable_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_enable_auth_ready, + ctx); return TRUE; } /*****************************************************************************/ +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; +} HandleResetContext; + +static void +handle_reset_context_free (HandleResetContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx); +} + static void -reset_ready (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) +handle_reset_ready (MMIfaceModem *self, + GAsyncResult *res, + HandleResetContext *ctx) { GError *error = NULL; - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->reset_finish (self, - res, - &error)) - g_dbus_method_invocation_take_error (ctx->invocation, - error); + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->reset_finish (self, res, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_reset (ctx->skeleton, - ctx->invocation); - dbus_call_context_free (ctx); + mm_gdbus_modem_complete_reset (ctx->skeleton, ctx->invocation); + + handle_reset_context_free (ctx); } -static gboolean -handle_reset (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - MMIfaceModem *self) +static void +handle_reset_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleResetContext *ctx) { MMModemState modem_state; + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_reset_context_free (ctx); + return; + } /* If reseting is not implemented, report an error */ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->reset || !MM_IFACE_MODEM_GET_INTERFACE (self)->reset_finish) { - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, "Cannot reset the modem: operation not supported"); - return TRUE; + handle_reset_context_free (ctx); + return; } modem_state = MM_MODEM_STATE_UNKNOWN; @@ -1124,11 +1287,12 @@ handle_reset (MmGdbusModem *skeleton, switch (modem_state) { case MM_MODEM_STATE_UNKNOWN: case MM_MODEM_STATE_LOCKED: - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot reset modem: not initialized/unlocked yet"); - break; + handle_reset_context_free (ctx); + return; case MM_MODEM_STATE_DISABLED: case MM_MODEM_STATE_DISABLING: @@ -1139,54 +1303,92 @@ handle_reset (MmGdbusModem *skeleton, case MM_MODEM_STATE_DISCONNECTING: case MM_MODEM_STATE_CONNECTING: case MM_MODEM_STATE_CONNECTED: - MM_IFACE_MODEM_GET_INTERFACE (self)->reset (self, - (GAsyncReadyCallback)reset_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + MM_IFACE_MODEM_GET_INTERFACE (self)->reset (MM_IFACE_MODEM (self), + (GAsyncReadyCallback)handle_reset_ready, + ctx); break; } +} + +static gboolean +handle_reset (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + MMIfaceModem *self) +{ + HandleResetContext *ctx; + + ctx = g_new (HandleResetContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_reset_auth_ready, + ctx); return TRUE; } /*****************************************************************************/ +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + gchar *code; +} HandleFactoryResetContext; + static void -factory_reset_ready (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) +handle_factory_reset_context_free (HandleFactoryResetContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx->code); + g_free (ctx); +} + +static void +handle_factory_reset_ready (MMIfaceModem *self, + GAsyncResult *res, + HandleFactoryResetContext *ctx) { GError *error = NULL; - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->factory_reset_finish (self, - res, - &error)) - g_dbus_method_invocation_take_error (ctx->invocation, - error); + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->factory_reset_finish (self, res, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_factory_reset (ctx->skeleton, - ctx->invocation); - dbus_call_context_free (ctx); + mm_gdbus_modem_complete_factory_reset (ctx->skeleton, ctx->invocation); + + handle_factory_reset_context_free (ctx); } -static gboolean -handle_factory_reset (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - const gchar *arg_code, - MMIfaceModem *self) +static void +handle_factory_reset_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleFactoryResetContext *ctx) { MMModemState modem_state; + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_factory_reset_context_free (ctx); + return; + } /* If reseting is not implemented, report an error */ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->factory_reset || !MM_IFACE_MODEM_GET_INTERFACE (self)->factory_reset_finish) { - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, "Cannot reset the modem to factory defaults: " "operation not supported"); - return TRUE; + handle_factory_reset_context_free (ctx); + return; } modem_state = MM_MODEM_STATE_UNKNOWN; @@ -1197,12 +1399,13 @@ handle_factory_reset (MmGdbusModem *skeleton, switch (modem_state) { case MM_MODEM_STATE_UNKNOWN: case MM_MODEM_STATE_LOCKED: - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot reset the modem to factory defaults: " "not initialized/unlocked yet"); - break; + handle_factory_reset_context_free (ctx); + return; case MM_MODEM_STATE_DISABLED: case MM_MODEM_STATE_DISABLING: @@ -1213,14 +1416,33 @@ handle_factory_reset (MmGdbusModem *skeleton, case MM_MODEM_STATE_DISCONNECTING: case MM_MODEM_STATE_CONNECTING: case MM_MODEM_STATE_CONNECTED: - MM_IFACE_MODEM_GET_INTERFACE (self)->factory_reset (self, - arg_code, - (GAsyncReadyCallback)factory_reset_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + MM_IFACE_MODEM_GET_INTERFACE (self)->factory_reset (MM_IFACE_MODEM (self), + ctx->code, + (GAsyncReadyCallback)handle_factory_reset_ready, + ctx); break; } +} + +static gboolean +handle_factory_reset (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + const gchar *code, + MMIfaceModem *self) +{ + HandleFactoryResetContext *ctx; + + ctx = g_new (HandleFactoryResetContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->code = g_strdup (code); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_factory_reset_auth_ready, + ctx); return TRUE; } @@ -1386,29 +1608,53 @@ mm_iface_modem_set_bands (MMIfaceModem *self, g_array_unref (supported_bands_array); } +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + GVariant *bands; +} HandleSetBandsContext; + +static void +handle_set_bands_context_free (HandleSetBandsContext *ctx) +{ + g_variant_unref (ctx->bands); + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx); +} + static void handle_set_bands_ready (MMIfaceModem *self, GAsyncResult *res, - DbusCallContext *ctx) + HandleSetBandsContext *ctx) { GError *error = NULL; if (!mm_iface_modem_set_bands_finish (self, res, &error)) g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_set_bands (ctx->skeleton, - ctx->invocation); - dbus_call_context_free (ctx); + mm_gdbus_modem_complete_set_bands (ctx->skeleton, ctx->invocation); + + handle_set_bands_context_free (ctx); } -static gboolean -handle_set_bands (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - GVariant *bands_variant, - MMIfaceModem *self) +static void +handle_set_bands_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleSetBandsContext *ctx) { - MMModemState modem_state = MM_MODEM_STATE_UNKNOWN; + MMModemState modem_state; + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_bands_context_free (ctx); + return; + } + modem_state = MM_MODEM_STATE_UNKNOWN; g_object_get (self, MM_IFACE_MODEM_STATE, &modem_state, NULL); @@ -1416,12 +1662,13 @@ handle_set_bands (MmGdbusModem *skeleton, switch (modem_state) { case MM_MODEM_STATE_UNKNOWN: case MM_MODEM_STATE_LOCKED: - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot set allowed bands: " "not initialized/unlocked yet"); - break; + handle_set_bands_context_free (ctx); + return; case MM_MODEM_STATE_DISABLED: case MM_MODEM_STATE_DISABLING: @@ -1434,18 +1681,36 @@ handle_set_bands (MmGdbusModem *skeleton, case MM_MODEM_STATE_CONNECTED: { GArray *bands_array; - bands_array = mm_common_bands_variant_to_garray (bands_variant); - mm_iface_modem_set_bands (self, + bands_array = mm_common_bands_variant_to_garray (ctx->bands); + mm_iface_modem_set_bands (MM_IFACE_MODEM (self), bands_array, (GAsyncReadyCallback)handle_set_bands_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + ctx); g_array_unref (bands_array); break; } } +} +static gboolean +handle_set_bands (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + GVariant *bands_variant, + MMIfaceModem *self) +{ + HandleSetBandsContext *ctx; + + ctx = g_new (HandleSetBandsContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->bands = g_variant_ref (bands_variant); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_set_bands_auth_ready, + ctx); return TRUE; } @@ -1586,30 +1851,53 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, ctx); } +typedef struct { + MmGdbusModem *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem *self; + MMModemMode allowed; + MMModemMode preferred; +} HandleSetAllowedModesContext; + +static void +handle_set_allowed_modes_context_free (HandleSetAllowedModesContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx); +} + static void handle_set_allowed_modes_ready (MMIfaceModem *self, GAsyncResult *res, - DbusCallContext *ctx) + HandleSetAllowedModesContext *ctx) { GError *error = NULL; if (!mm_iface_modem_set_allowed_modes_finish (self, res, &error)) g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_set_allowed_modes (ctx->skeleton, - ctx->invocation); - dbus_call_context_free (ctx); + mm_gdbus_modem_complete_set_allowed_modes (ctx->skeleton, ctx->invocation); + + handle_set_allowed_modes_context_free (ctx); } -static gboolean -handle_set_allowed_modes (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - guint modes, - guint preferred, - MMIfaceModem *self) +static void +handle_set_allowed_modes_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleSetAllowedModesContext *ctx) { - MMModemState modem_state = MM_MODEM_STATE_UNKNOWN; + MMModemState modem_state; + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_allowed_modes_context_free (ctx); + return; + } + modem_state = MM_MODEM_STATE_UNKNOWN; g_object_get (self, MM_IFACE_MODEM_STATE, &modem_state, NULL); @@ -1617,12 +1905,13 @@ handle_set_allowed_modes (MmGdbusModem *skeleton, switch (modem_state) { case MM_MODEM_STATE_UNKNOWN: case MM_MODEM_STATE_LOCKED: - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot set allowed modes: " "not initialized/unlocked yet"); - break; + handle_set_allowed_modes_context_free (ctx); + return; case MM_MODEM_STATE_DISABLED: case MM_MODEM_STATE_DISABLING: @@ -1633,16 +1922,36 @@ handle_set_allowed_modes (MmGdbusModem *skeleton, case MM_MODEM_STATE_DISCONNECTING: case MM_MODEM_STATE_CONNECTING: case MM_MODEM_STATE_CONNECTED: - mm_iface_modem_set_allowed_modes (self, - modes, - preferred, + mm_iface_modem_set_allowed_modes (MM_IFACE_MODEM (self), + ctx->allowed, + ctx->preferred, (GAsyncReadyCallback)handle_set_allowed_modes_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + ctx); break; } +} + +static gboolean +handle_set_allowed_modes (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + guint allowed, + guint preferred, + MMIfaceModem *self) +{ + HandleSetAllowedModesContext *ctx; + + ctx = g_new (HandleSetAllowedModesContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->allowed = allowed; + ctx->preferred = preferred; + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_set_allowed_modes_auth_ready, + ctx); return TRUE; } |