aboutsummaryrefslogtreecommitdiff
path: root/src/mm-iface-modem-3gpp-ussd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-iface-modem-3gpp-ussd.c')
-rw-r--r--src/mm-iface-modem-3gpp-ussd.c61
1 files changed, 58 insertions, 3 deletions
diff --git a/src/mm-iface-modem-3gpp-ussd.c b/src/mm-iface-modem-3gpp-ussd.c
index fd902142..bcb5b8ce 100644
--- a/src/mm-iface-modem-3gpp-ussd.c
+++ b/src/mm-iface-modem-3gpp-ussd.c
@@ -20,6 +20,7 @@
#include <ModemManager.h>
#include <libmm-common.h>
+#include "mm-iface-modem.h"
#include "mm-iface-modem-3gpp.h"
#include "mm-iface-modem-3gpp-ussd.h"
#include "mm-base-modem.h"
@@ -43,6 +44,57 @@ mm_iface_modem_3gpp_ussd_bind_simple_status (MMIfaceModem3gppUssd *self,
/*****************************************************************************/
+static gboolean
+ensure_enabled (MMBaseModem *self,
+ GError **error)
+{
+ MMModemState modem_state;
+
+ modem_state = MM_MODEM_STATE_UNKNOWN;
+ g_object_get (self,
+ MM_IFACE_MODEM_STATE, &modem_state,
+ NULL);
+
+ switch (modem_state) {
+ case MM_MODEM_STATE_FAILED:
+ case MM_MODEM_STATE_UNKNOWN:
+ case MM_MODEM_STATE_LOCKED:
+ /* We should never have such request (interface wasn't exported yet) */
+ g_assert_not_reached ();
+ return FALSE;
+
+ case MM_MODEM_STATE_INITIALIZING:
+ case MM_MODEM_STATE_ENABLING:
+ case MM_MODEM_STATE_DISABLED:
+ g_set_error (error,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_WRONG_STATE,
+ "Cannot perform USSD action: "
+ "device not enabled yet");
+ return FALSE;
+
+ case MM_MODEM_STATE_DISABLING:
+ g_set_error (error,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_WRONG_STATE,
+ "Cannot perform USSD action: "
+ "currently being disabled");
+ return FALSE;
+
+ case MM_MODEM_STATE_ENABLED:
+ case MM_MODEM_STATE_SEARCHING:
+ case MM_MODEM_STATE_REGISTERED:
+ case MM_MODEM_STATE_DISCONNECTING:
+ case MM_MODEM_STATE_CONNECTING:
+ case MM_MODEM_STATE_CONNECTED:
+ break;
+ }
+
+ return TRUE;
+}
+
+/*****************************************************************************/
+
typedef struct {
MmGdbusModem3gppUssd *skeleton;
GDBusMethodInvocation *invocation;
@@ -80,7 +132,8 @@ handle_cancel_auth_ready (MMBaseModem *self,
{
GError *error = NULL;
- if (!mm_base_modem_authorize_finish (self, res, &error)) {
+ if (!mm_base_modem_authorize_finish (self, res, &error) ||
+ !ensure_enabled (self, &error)) {
g_dbus_method_invocation_take_error (ctx->invocation, error);
handle_cancel_context_free (ctx);
return;
@@ -159,7 +212,8 @@ handle_respond_auth_ready (MMBaseModem *self,
{
GError *error = NULL;
- if (!mm_base_modem_authorize_finish (self, res, &error)) {
+ if (!mm_base_modem_authorize_finish (self, res, &error) ||
+ !ensure_enabled (self, &error)) {
g_dbus_method_invocation_take_error (ctx->invocation, error);
handle_respond_context_free (ctx);
return;
@@ -262,7 +316,8 @@ handle_initiate_auth_ready (MMBaseModem *self,
{
GError *error = NULL;
- if (!mm_base_modem_authorize_finish (self, res, &error)) {
+ if (!mm_base_modem_authorize_finish (self, res, &error) ||
+ !ensure_enabled (self, &error)) {
g_dbus_method_invocation_take_error (ctx->invocation, error);
handle_initiate_context_free (ctx);
return;