diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-02-27 12:47:56 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-16 14:53:16 +0100 |
commit | 1d1936e1ce1d7fc616b7bbe29fc1d73963eb6f4a (patch) | |
tree | db93122d3cce00ffbb7193d16263628ab783b07e /src | |
parent | eaa47892b582ebfc613822457ba201616f44706e (diff) |
iface-modem-3gpp-ussd: include policy authorization checks
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-iface-modem-3gpp-ussd.c | 251 |
1 files changed, 170 insertions, 81 deletions
diff --git a/src/mm-iface-modem-3gpp-ussd.c b/src/mm-iface-modem-3gpp-ussd.c index 8eff818c..a714b2d9 100644 --- a/src/mm-iface-modem-3gpp-ussd.c +++ b/src/mm-iface-modem-3gpp-ussd.c @@ -47,10 +47,10 @@ typedef struct { MmGdbusModem3gppUssd *skeleton; GDBusMethodInvocation *invocation; MMIfaceModem3gppUssd *self; -} DbusCallContext; +} HandleCancelContext; static void -dbus_call_context_free (DbusCallContext *ctx) +handle_cancel_context_free (HandleCancelContext *ctx) { g_object_unref (ctx->skeleton); g_object_unref (ctx->invocation); @@ -58,92 +58,120 @@ dbus_call_context_free (DbusCallContext *ctx) g_free (ctx); } -static DbusCallContext * -dbus_call_context_new (MmGdbusModem3gppUssd *skeleton, - GDBusMethodInvocation *invocation, - MMIfaceModem3gppUssd *self) +static void +handle_cancel_ready (MMIfaceModem3gppUssd *self, + GAsyncResult *res, + HandleCancelContext *ctx) { - DbusCallContext *ctx; + GError *error = NULL; - 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; -} + if (!MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel_finish (self, res, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else + mm_gdbus_modem3gpp_ussd_complete_cancel (ctx->skeleton, ctx->invocation); -/*****************************************************************************/ + handle_cancel_context_free (ctx); +} static void -cancel_ready (MMIfaceModem3gppUssd *self, - GAsyncResult *res, - DbusCallContext *ctx) +handle_cancel_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleCancelContext *ctx) { GError *error = NULL; - if (!MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel_finish (self, - res, - &error)) - g_dbus_method_invocation_take_error (ctx->invocation, - error); - else - mm_gdbus_modem3gpp_ussd_complete_cancel (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_cancel_context_free (ctx); + return; + } + + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel_finish != NULL); + + MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel ( + MM_IFACE_MODEM_3GPP_USSD (self), + (GAsyncReadyCallback)handle_cancel_ready, + ctx); } static gboolean handle_cancel (MmGdbusModem3gppUssd *skeleton, GDBusMethodInvocation *invocation, - const gchar *command, MMIfaceModem3gppUssd *self) { - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel != NULL); - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel_finish != NULL); + HandleCancelContext *ctx; - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel ( - self, - (GAsyncReadyCallback)cancel_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + ctx = g_new (HandleCancelContext, 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_USSD, + (GAsyncReadyCallback)handle_cancel_auth_ready, + ctx); return TRUE; } +/*****************************************************************************/ + +typedef struct { + MmGdbusModem3gppUssd *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem3gppUssd *self; + gchar *command; +} HandleRespondContext; + +static void +handle_respond_context_free (HandleRespondContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx->command); + g_free (ctx); +} + static void -respond_send_ready (MMIfaceModem3gppUssd *self, - GAsyncResult *res, - DbusCallContext *ctx) +handle_respond_ready (MMIfaceModem3gppUssd *self, + GAsyncResult *res, + HandleRespondContext *ctx) { GError *error = NULL; const gchar *reply; - reply = MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish (self, - res, - &error); + reply = MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish (self, res,&error); if (!reply) - g_dbus_method_invocation_take_error (ctx->invocation, - error); + g_dbus_method_invocation_take_error (ctx->invocation, error); else mm_gdbus_modem3gpp_ussd_complete_respond (ctx->skeleton, ctx->invocation, reply); - dbus_call_context_free (ctx); + handle_respond_context_free (ctx); } -static gboolean -handle_respond (MmGdbusModem3gppUssd *skeleton, - GDBusMethodInvocation *invocation, - const gchar *command, - MMIfaceModem3gppUssd *self) +static void +handle_respond_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleRespondContext *ctx) { + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_respond_context_free (ctx); + return; + } + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send != NULL); g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish != NULL); - switch (mm_gdbus_modem3gpp_ussd_get_state (skeleton)) { + switch (mm_gdbus_modem3gpp_ussd_get_state (ctx->skeleton)) { case MM_MODEM_3GPP_USSD_SESSION_STATE_ACTIVE: case MM_MODEM_3GPP_USSD_SESSION_STATE_IDLE: - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot respond USSD: " @@ -152,13 +180,11 @@ handle_respond (MmGdbusModem3gppUssd *skeleton, case MM_MODEM_3GPP_USSD_SESSION_STATE_USER_RESPONSE: MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send ( - self, - command, - (GAsyncReadyCallback)respond_send_ready, - dbus_call_context_new (skeleton, - invocation, - self)); - break; + MM_IFACE_MODEM_3GPP_USSD (self), + ctx->command, + (GAsyncReadyCallback)handle_respond_ready, + ctx); + return; case MM_MODEM_3GPP_USSD_SESSION_STATE_UNKNOWN: default: @@ -167,45 +193,88 @@ handle_respond (MmGdbusModem3gppUssd *skeleton, break; } + handle_respond_context_free (ctx); +} + +static gboolean +handle_respond (MmGdbusModem3gppUssd *skeleton, + GDBusMethodInvocation *invocation, + const gchar *command, + MMIfaceModem3gppUssd *self) +{ + HandleRespondContext *ctx; + + ctx = g_new (HandleRespondContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->command = g_strdup (command); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_USSD, + (GAsyncReadyCallback)handle_respond_auth_ready, + ctx); return TRUE; } /*****************************************************************************/ +typedef struct { + MmGdbusModem3gppUssd *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem3gppUssd *self; + gchar *command; +} HandleInitiateContext; + static void -initiate_send_ready (MMIfaceModem3gppUssd *self, - GAsyncResult *res, - DbusCallContext *ctx) +handle_initiate_context_free (HandleInitiateContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_free (ctx->command); + g_free (ctx); +} + +static void +handle_initiate_ready (MMIfaceModem3gppUssd *self, + GAsyncResult *res, + HandleInitiateContext *ctx) { GError *error = NULL; const gchar *reply; - reply = MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish (self, - res, - &error); + reply = MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish (self, res, &error); if (!reply) - g_dbus_method_invocation_take_error (ctx->invocation, - error); + g_dbus_method_invocation_take_error (ctx->invocation, error); else mm_gdbus_modem3gpp_ussd_complete_initiate (ctx->skeleton, ctx->invocation, reply); - dbus_call_context_free (ctx); + handle_initiate_context_free (ctx); } -static gboolean -handle_initiate (MmGdbusModem3gppUssd *skeleton, - GDBusMethodInvocation *invocation, - const gchar *command, - MMIfaceModem3gppUssd *self) +static void +handle_initiate_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleInitiateContext *ctx) { + GError *error = NULL; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_initiate_context_free (ctx); + return; + } + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send != NULL); g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish != NULL); - switch (mm_gdbus_modem3gpp_ussd_get_state (skeleton)) { + switch (mm_gdbus_modem3gpp_ussd_get_state (ctx->skeleton)) { case MM_MODEM_3GPP_USSD_SESSION_STATE_ACTIVE: case MM_MODEM_3GPP_USSD_SESSION_STATE_USER_RESPONSE: - g_dbus_method_invocation_return_error (invocation, + g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot initiate USSD: " @@ -214,13 +283,11 @@ handle_initiate (MmGdbusModem3gppUssd *skeleton, case MM_MODEM_3GPP_USSD_SESSION_STATE_IDLE: MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send ( - self, - command, - (GAsyncReadyCallback)initiate_send_ready, - dbus_call_context_new (skeleton, - invocation, - self)); - break; + MM_IFACE_MODEM_3GPP_USSD (self), + ctx->command, + (GAsyncReadyCallback)handle_initiate_ready, + ctx); + return; case MM_MODEM_3GPP_USSD_SESSION_STATE_UNKNOWN: default: @@ -229,6 +296,28 @@ handle_initiate (MmGdbusModem3gppUssd *skeleton, break; } + handle_initiate_context_free (ctx); +} + +static gboolean +handle_initiate (MmGdbusModem3gppUssd *skeleton, + GDBusMethodInvocation *invocation, + const gchar *command, + MMIfaceModem3gppUssd *self) +{ + HandleInitiateContext *ctx; + + ctx = g_new (HandleInitiateContext, 1); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->command = g_strdup (command); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_USSD, + (GAsyncReadyCallback)handle_initiate_auth_ready, + ctx); return TRUE; } |