aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-iface-modem.c711
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;
}