aboutsummaryrefslogtreecommitdiff
path: root/src/mm-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-modem.c')
-rw-r--r--src/mm-modem.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/mm-modem.c b/src/mm-modem.c
index ca2afbd7..11934a20 100644
--- a/src/mm-modem.c
+++ b/src/mm-modem.c
@@ -19,6 +19,7 @@
#include "mm-modem.h"
#include "mm-errors.h"
#include "mm-callback-info.h"
+#include "mm-marshal.h"
static void impl_modem_enable (MMModem *modem, gboolean enable, DBusGMethodInvocation *context);
static void impl_modem_connect (MMModem *modem, const char *number, DBusGMethodInvocation *context);
@@ -57,9 +58,18 @@ mm_modem_enable (MMModem *self,
MMModemFn callback,
gpointer user_data)
{
+ MMModemState state;
+
g_return_if_fail (MM_IS_MODEM (self));
g_return_if_fail (callback != NULL);
+ state = mm_modem_get_state (self);
+ if (state >= MM_MODEM_STATE_ENABLED) {
+ /* Already enabled */
+ callback (self, NULL, user_data);
+ return;
+ }
+
if (MM_MODEM_GET_INTERFACE (self)->enable)
MM_MODEM_GET_INTERFACE (self)->enable (self, callback, user_data);
else
@@ -71,9 +81,18 @@ mm_modem_disable (MMModem *self,
MMModemFn callback,
gpointer user_data)
{
+ MMModemState state;
+
g_return_if_fail (MM_IS_MODEM (self));
g_return_if_fail (callback != NULL);
+ state = mm_modem_get_state (self);
+ if (state <= MM_MODEM_STATE_DISABLED) {
+ /* Already disabled */
+ callback (self, NULL, user_data);
+ return;
+ }
+
if (MM_MODEM_GET_INTERFACE (self)->disable)
MM_MODEM_GET_INTERFACE (self)->disable (self, callback, user_data);
else
@@ -381,11 +400,37 @@ mm_modem_get_device (MMModem *self)
return device;
}
+MMModemState
+mm_modem_get_state (MMModem *self)
+{
+ MMModemState state = MM_MODEM_STATE_UNKNOWN;
+
+ g_object_get (G_OBJECT (self), MM_MODEM_STATE, &state, NULL);
+ return state;
+}
+
+void
+mm_modem_set_state (MMModem *self,
+ MMModemState new_state,
+ MMModemStateReason reason)
+{
+ MMModemState old_state = MM_MODEM_STATE_UNKNOWN;
+
+ g_object_get (G_OBJECT (self), MM_MODEM_STATE, &old_state, NULL);
+
+ if (new_state != old_state) {
+ g_object_set (G_OBJECT (self), MM_MODEM_STATE, new_state, NULL);
+ g_signal_emit_by_name (G_OBJECT (self), "state-changed", new_state, old_state, reason);
+g_message ("%s: state %d -> %d", __func__, old_state, new_state);
+ }
+}
+
/*****************************************************************************/
static void
mm_modem_init (gpointer g_iface)
{
+ GType iface_type = G_TYPE_FROM_INTERFACE (g_iface);
static gboolean initialized = FALSE;
if (initialized)
@@ -450,6 +495,26 @@ mm_modem_init (gpointer g_iface)
FALSE,
G_PARAM_READABLE));
+ g_object_interface_install_property
+ (g_iface,
+ g_param_spec_uint (MM_MODEM_STATE,
+ "State",
+ "State",
+ MM_MODEM_STATE_UNKNOWN,
+ MM_MODEM_STATE_LAST,
+ MM_MODEM_STATE_UNKNOWN,
+ G_PARAM_READWRITE));
+
+ /* Signals */
+ g_signal_new ("state-changed",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (MMModem, state_changed),
+ NULL, NULL,
+ mm_marshal_VOID__UINT_UINT_UINT,
+ G_TYPE_NONE, 3,
+ G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT);
+
initialized = TRUE;
}