summaryrefslogtreecommitdiff
path: root/modem
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2010-11-04 22:36:38 +0200
committerPekka Pessi <Pekka.Pessi@nokia.com>2010-11-05 16:08:53 +0200
commit53dd8dfa5ddf2573a744675cbfcacf56c13be98c (patch)
tree270fee4829a9cff20d7d5bd1868bf0f02948e35c /modem
parent138edf050b3ab1623184a8f17aabcd1a98d1b9ea (diff)
modem/sim: derive ModemSIMService from ModemOface
Diffstat (limited to 'modem')
-rw-r--r--modem/sim-service.c261
-rw-r--r--modem/sim.h10
2 files changed, 66 insertions, 205 deletions
diff --git a/modem/sim-service.c b/modem/sim-service.c
index 7a95506..aa48d4f 100644
--- a/modem/sim-service.c
+++ b/modem/sim-service.c
@@ -45,7 +45,7 @@
/* ------------------------------------------------------------------------ */
-G_DEFINE_TYPE (ModemSIMService, modem_sim_service, G_TYPE_OBJECT);
+G_DEFINE_TYPE (ModemSIMService, modem_sim_service, MODEM_TYPE_OFACE);
/* Signals we send */
enum
@@ -61,7 +61,6 @@ static guint signals[N_SIGNALS] = {0};
enum
{
PROP_NONE,
- PROP_OBJECT_PATH,
PROP_STATUS,
PROP_IMSI,
LAST_PROPERTY
@@ -72,12 +71,9 @@ struct _ModemSIMServicePrivate
{
guint state;
char *imsi;
- char *object_path;
GQueue queue[1];
- DBusGProxy *proxy;
-
unsigned dispose_has_run:1, connected:1, signals:1, disconnected:1;
unsigned connection_error:1;
unsigned :0;
@@ -86,11 +82,6 @@ struct _ModemSIMServicePrivate
/* ------------------------------------------------------------------------ */
/* Local functions */
-static void on_sim_property_changed (DBusGProxy *,
- char const *, GValue const *, gpointer);
-
-static ModemOfonoPropsReply reply_to_sim_get_properties;
-
/* ------------------------------------------------------------------------ */
static void
@@ -113,10 +104,6 @@ modem_sim_service_get_property (GObject *object,
switch (property_id)
{
- case PROP_OBJECT_PATH:
- g_value_set_string (value, priv->object_path);
- break;
-
case PROP_STATUS:
g_value_set_uint (value, priv->state);
break;
@@ -143,10 +130,6 @@ modem_sim_service_set_property (GObject *object,
switch (property_id)
{
- case PROP_OBJECT_PATH:
- priv->object_path = g_value_dup_string (value);
- break;
-
case PROP_STATUS:
priv->state = g_value_get_uint (value);
break;
@@ -166,10 +149,11 @@ modem_sim_service_set_property (GObject *object,
static void
modem_sim_service_constructed (GObject *object)
{
- ModemSIMService *self = MODEM_SIM_SERVICE (object);
- ModemSIMServicePrivate *priv = self->priv;
+ if (G_OBJECT_CLASS (modem_sim_service_parent_class)->constructed)
+ G_OBJECT_CLASS (modem_sim_service_parent_class)->constructed (object);
- priv->proxy = modem_ofono_proxy (priv->object_path, OFONO_IFACE_SIM);
+ if (modem_oface_dbus_proxy (MODEM_OFACE (object)) == NULL)
+ g_warning("object created without dbus-proxy set");
}
static void
@@ -190,8 +174,6 @@ modem_sim_service_dispose (GObject *object)
while (!g_queue_is_empty (priv->queue))
modem_request_cancel (g_queue_pop_head (priv->queue));
- g_object_run_dispose (G_OBJECT (priv->proxy));
-
if (G_OBJECT_CLASS (modem_sim_service_parent_class)->dispose)
G_OBJECT_CLASS (modem_sim_service_parent_class)->dispose (object);
}
@@ -206,17 +188,68 @@ modem_sim_service_finalize (GObject *object)
/* Free any data held directly by the object here */
g_free (priv->imsi);
- g_free (priv->object_path);
- g_object_unref (priv->proxy);
G_OBJECT_CLASS (modem_sim_service_parent_class)->finalize (object);
}
+/* ------------------------------------------------------------------------- */
+/* ModemOface interface */
+
+static char const *
+modem_sim_service_property_mapper (char const *name)
+{
+ if (!strcmp (name, "SubscriberIdentity"))
+ return "imsi";
+ if (!strcmp(name, "Present"))
+ return NULL;
+ if (!strcmp (name, "CardIdentifier"))
+ return NULL;
+ if (!strcmp (name, "MobileCountryCode"))
+ return NULL;
+ if (!strcmp (name, "MobileNetworkCode"))
+ return NULL;
+ if (!strcmp (name, "SubscriberNumbers"))
+ return NULL;
+ if (!strcmp (name, "ServiceNumbers"))
+ return NULL;
+ if (!strcmp (name, "PinRequired"))
+ return NULL;
+ if (!strcmp (name, "LockedPins"))
+ return NULL;
+ if (!strcmp (name, "FixedDialing"))
+ return NULL;
+ if (!strcmp (name, "BarredDialing"))
+ return NULL;
+ return NULL;
+}
+
+static void
+modem_sim_service_connect (ModemOface *_self)
+{
+ DEBUG ("(%p): enter", _self);
+
+ modem_oface_connect_properties (_self, TRUE);
+}
+
+static void
+modem_sim_service_connected (ModemOface *_self)
+{
+ DEBUG ("(%p): enter", _self);
+}
+
+static void
+modem_sim_service_disconnect (ModemOface *_self)
+{
+ DEBUG ("(%p): enter", _self);
+
+ modem_oface_disconnect_properties (_self);
+}
static void
modem_sim_service_class_init (ModemSIMServiceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ ModemOfaceClass *oface_class = MODEM_OFACE_CLASS (klass);
DEBUG ("enter");
@@ -226,14 +259,12 @@ modem_sim_service_class_init (ModemSIMServiceClass *klass)
object_class->dispose = modem_sim_service_dispose;
object_class->finalize = modem_sim_service_finalize;
- g_object_class_install_property (object_class, PROP_OBJECT_PATH,
- g_param_spec_string ("object-path",
- "Modem object path",
- "D-Bus object path used to identify the modem",
- "/", /* default value */
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_STATIC_STRINGS));
+ oface_class->property_mapper = modem_sim_service_property_mapper;
+ oface_class->connect = modem_sim_service_connect;
+ oface_class->connected = modem_sim_service_connected;
+ oface_class->disconnect = modem_sim_service_disconnect;
+ /* Properties */
g_object_class_install_property (object_class, PROP_STATUS,
g_param_spec_uint ("state",
"SIM Status",
@@ -252,15 +283,6 @@ modem_sim_service_class_init (ModemSIMServiceClass *klass)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
- signals[SIGNAL_CONNECTED] =
- g_signal_new ("connected",
- G_OBJECT_CLASS_TYPE (klass),
- G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
signals[SIGNAL_STATUS] =
g_signal_new ("state",
G_OBJECT_CLASS_TYPE (klass),
@@ -276,169 +298,12 @@ modem_sim_service_class_init (ModemSIMServiceClass *klass)
modem_error_domain_prefix (0); /* Init errors */
}
-
-/* -------------------------------------------------------------------------- */
-/* modem_sim_service interface */
-
-/* Connect to SIM service */
-gboolean
-modem_sim_service_connect (ModemSIMService *self)
-{
- ModemSIMServicePrivate *priv = self->priv;
-
- DEBUG ("enter");
-
- if (self->priv->connected)
- {
- DEBUG ("already connected");
- return TRUE;
- }
-
- if (self->priv->disconnected)
- {
- DEBUG ("already disconnected");
- return TRUE;
- }
-
- modem_ofono_proxy_connect_to_property_changed (priv->proxy,
- on_sim_property_changed, self);
-
- priv->signals = TRUE;
- priv->connection_error = FALSE;
-
- g_queue_push_tail (priv->queue,
- modem_ofono_proxy_request_properties (priv->proxy,
- reply_to_sim_get_properties, self, NULL));
-
- DEBUG ("connecting");
-
- return TRUE;
-}
-
-
-static void
-modem_sim_check_connected (ModemSIMService *self,
- ModemRequest *request,
- GError const **error)
-{
- ModemSIMServicePrivate *priv = self->priv;
-
- if (g_queue_find (priv->queue, request))
- {
- g_queue_remove (priv->queue, request);
-
- if (*error)
- {
- GError const *e = *error;
-
- modem_critical (MODEM_SERVICE_SIM, GERROR_MSG_FMT,
- GERROR_MSG_CODE (e));
-
- /* We are 'connected' even if the SIM is not ready */
- if (e->domain == DBUS_GERROR &&
- e->code != DBUS_GERROR_REMOTE_EXCEPTION)
- priv->connection_error = TRUE;
- }
-
- if (g_queue_is_empty (priv->queue))
- {
- DEBUG ("got connected (error = %d), emitting",
- priv->connection_error);
- self->priv->connected = TRUE;
- g_signal_emit (self, signals[SIGNAL_CONNECTED], 0);
- }
- }
-}
-
-gboolean
-modem_sim_service_is_connected (ModemSIMService *self)
-{
- return MODEM_IS_SIM_SERVICE (self) && self->priv->connected &&
- !self->priv->connection_error;
-}
-
-gboolean
-modem_sim_service_is_connecting (ModemSIMService *self)
-{
- return MODEM_IS_SIM_SERVICE (self) &&
- !g_queue_is_empty (self->priv->queue);
-}
-
-void
-modem_sim_service_disconnect (ModemSIMService *self)
-{
- ModemSIMServicePrivate *priv = self->priv;
- int was_connected = priv->connected;
-
- if (priv->disconnected)
- return;
-
- DEBUG ("enter");
-
- priv->disconnected = TRUE;
- priv->connected = FALSE;
-
- g_object_set (self, "state", MODEM_SIM_STATE_UNKNOWN, NULL);
-
- if (priv->signals)
- {
- priv->signals = FALSE;
- modem_ofono_proxy_disconnect_from_property_changed (priv->proxy,
- on_sim_property_changed, self);
- }
-
- while (!g_queue_is_empty (priv->queue))
- modem_request_cancel (g_queue_pop_head (priv->queue));
-
- if (was_connected)
- g_signal_emit (self, signals[SIGNAL_CONNECTED], 0);
-}
-
-/* ---------------------------------------------------------------------- */
-
-static void
-reply_to_sim_get_properties (gpointer _self,
- ModemRequest *request,
- GHashTable *properties,
- GError const *error,
- gpointer user_data)
-{
- ModemSIMService *self = MODEM_SIM_SERVICE (_self);
-
- DEBUG ("enter");
-
- if (!error)
- {
- GValue *value;
-
- value = g_hash_table_lookup (properties, "SubscriberIdentity");
- if (value)
- g_object_set_property (G_OBJECT (self), "imsi", value);
- }
-
- modem_sim_check_connected (self, request, &error);
-}
-
-static void
-on_sim_property_changed (DBusGProxy *proxy,
- char const *property,
- GValue const *value,
- gpointer _self)
-{
- ModemSIMService *self = MODEM_SIM_SERVICE (_self);
-
- if (!strcmp (property, "SubscriberIdentity"))
- g_object_set_property (G_OBJECT (self), "imsi", value);
-}
-
ModemSIMState
modem_sim_get_state (ModemSIMService const *self)
{
return MODEM_IS_SIM_SERVICE (self) ? self->priv->state : 0;
}
-/* ---------------------------------------------------------------------- */
-
char const *
modem_sim_get_imsi (ModemSIMService const *self)
{
diff --git a/modem/sim.h b/modem/sim.h
index 8469d60..96f2155 100644
--- a/modem/sim.h
+++ b/modem/sim.h
@@ -24,6 +24,7 @@
#include <glib-object.h>
#include <modem/request.h>
+#include <modem/oface.h>
G_BEGIN_DECLS
@@ -34,12 +35,12 @@ typedef enum _ModemSIMState ModemSIMState;
struct _ModemSIMServiceClass
{
- GObjectClass parent_class;
+ ModemOfaceClass parent_class;
};
struct _ModemSIMService
{
- GObject parent;
+ ModemOface parent;
ModemSIMServicePrivate *priv;
};
@@ -79,11 +80,6 @@ enum _ModemSIMState
/* ---------------------------------------------------------------------- */
-gboolean modem_sim_service_connect (ModemSIMService *self);
-gboolean modem_sim_service_is_connected (ModemSIMService *self);
-gboolean modem_sim_service_is_connecting (ModemSIMService *self);
-void modem_sim_service_disconnect (ModemSIMService *self);
-
typedef void ModemSIMStringReply (ModemSIMService *self,
ModemRequest *request,
char *reply,