summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2010-11-04 22:33:51 +0200
committerPekka Pessi <Pekka.Pessi@nokia.com>2010-11-05 16:08:53 +0200
commita6f0222cca3e4293286fbff48511e63987bced78 (patch)
tree486705bc62cb202603a0ec4519e620a8b0a7df7e
parent88a2c660f42d41ab24ce0e5cd2432890a70cfc12 (diff)
modem/service: derive ModemService from ModemOface
Add new functions: - modem_service_find_by_imsi () - modem_service_find_by_imei () - modem_service_find_by_path () - modem_service_find_best () New signals: - "modem-powered" - "imei-added" - "imsi-added"
-rw-r--r--modem/service.c570
-rw-r--r--modem/service.h13
2 files changed, 406 insertions, 177 deletions
diff --git a/modem/service.c b/modem/service.c
index e6ed8db..48590d4 100644
--- a/modem/service.c
+++ b/modem/service.c
@@ -25,10 +25,15 @@
#include "debug.h"
+#include "modem/oface.h"
#include "modem/service.h"
#include "modem/request-private.h"
#include "modem/ofono.h"
#include "modem/errors.h"
+#include "modem/modem.h"
+#include "modem/sim.h"
+#include "modem/call.h"
+#include "modem/sms.h"
#include <dbus/dbus-glib.h>
#include <dbus/dbus.h>
@@ -49,11 +54,14 @@
/* ------------------------------------------------------------------------ */
-G_DEFINE_TYPE(ModemService, modem_service, G_TYPE_OBJECT);
+G_DEFINE_TYPE(ModemService, modem_service, MODEM_TYPE_OFACE);
enum {
SIGNAL_MODEM_ADDED,
+ SIGNAL_MODEM_POWERED,
SIGNAL_MODEM_REMOVED,
+ SIGNAL_IMEI_ADDED,
+ SIGNAL_IMSI_ADDED,
N_SIGNALS
};
@@ -61,22 +69,21 @@ static guint signals[N_SIGNALS] = {0};
struct _ModemServicePrivate
{
- ModemRequest *refresh;
-
- DBusGProxy *proxy;
-
GHashTable *modems;
- unsigned dispose_has_run:1, signals:1, subscribed:1;
+ unsigned signals:1, subscribed:1;
unsigned :0;
};
/* ------------------------------------------------------------------------ */
/* Local functions */
-static void reply_to_get_modems (gpointer _self, ModemRequest *request,
+static void reply_to_get_modems (ModemOface *_self, ModemRequest *request,
GPtrArray *modems, GError const *error, gpointer user_data);
static void on_modem_added (DBusGProxy *, char const *, GHashTable *, gpointer);
+static void on_modem_notify_imei (Modem *, GParamSpec *, ModemService *);
+static void on_modem_notify_powered (Modem *, GParamSpec *, ModemService *);
+static void on_modem_imsi_added (Modem *, char const *imsi, ModemService *);
static void on_modem_removed (DBusGProxy *, char const *, gpointer);
/* ------------------------------------------------------------------------ */
@@ -86,8 +93,8 @@ modem_service_init(ModemService *self)
{
DEBUG("enter");
- self->priv = G_TYPE_INSTANCE_GET_PRIVATE(
- self, MODEM_TYPE_SERVICE, ModemServicePrivate);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, MODEM_TYPE_SERVICE,
+ ModemServicePrivate);
self->priv->modems = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref);
@@ -96,59 +103,181 @@ modem_service_init(ModemService *self)
static void
modem_service_constructed(GObject *object)
{
+ if (G_OBJECT_CLASS(modem_service_parent_class)->constructed)
+ G_OBJECT_CLASS(modem_service_parent_class)->constructed(object);
+}
+
+static void
+modem_service_dispose(GObject *object)
+{
+ if (G_OBJECT_CLASS(modem_service_parent_class)->dispose)
+ G_OBJECT_CLASS(modem_service_parent_class)->dispose(object);
+}
+
+static void
+modem_service_finalize(GObject *object)
+{
ModemService *self = MODEM_SERVICE(object);
ModemServicePrivate *priv = self->priv;
- priv->proxy = modem_ofono_proxy("/", OFONO_IFACE_MANAGER);
+ DEBUG("enter");
- if (!priv->proxy) {
- g_error("Unable to proxy oFono");
- }
+ /* Free any data held directly by the object here */
+ g_hash_table_unref (priv->modems);
+
+ G_OBJECT_CLASS(modem_service_parent_class)->finalize(object);
}
+/* ------------------------------------------------------------------------- */
+/* ModemOface implementation */
+
static void
-modem_service_dispose(GObject *object)
+reply_to_get_modems (ModemOface *_self,
+ ModemRequest *request,
+ GPtrArray *modem_list,
+ GError const *error,
+ gpointer user_data)
{
- ModemService *self = MODEM_SERVICE(object);
+ DEBUG ("enter");
+
+ if (modem_list)
+ {
+ guint i;
+
+ for (i = 0; i < modem_list->len; i++)
+ {
+ GValueArray *va = g_ptr_array_index (modem_list, i);
+ char const *path = g_value_get_boxed (va->values + 0);
+ GHashTable *properties = g_value_get_boxed (va->values + 1);
+
+ on_modem_added (NULL, path, properties, _self);
+ }
+ }
+
+ modem_oface_check_connected (_self, request, error);
+}
+
+void
+modem_service_connect (ModemOface *_self)
+{
+ ModemService *self = MODEM_SERVICE (_self);
ModemServicePrivate *priv = self->priv;
- if (priv->dispose_has_run)
- return;
+ DEBUG("enter");
- priv->dispose_has_run = TRUE;
- priv->signals = FALSE;
+ if (!priv->signals)
+ {
+ DBusGProxy *proxy = modem_oface_dbus_proxy (_self);
+
+ priv->signals = TRUE;
- if (priv->refresh)
- modem_request_cancel (priv->refresh);
- priv->refresh = NULL;
+#define CONNECT(p, handler, name, signature...) \
+ dbus_g_proxy_add_signal (p, (name), ##signature); \
+ dbus_g_proxy_connect_signal (p, (name), G_CALLBACK (handler), self, NULL)
- g_object_run_dispose(G_OBJECT(priv->proxy));
+ CONNECT (proxy, on_modem_added, "ModemAdded",
+ DBUS_TYPE_G_OBJECT_PATH, MODEM_TYPE_DBUS_DICT, G_TYPE_INVALID);
- if (G_OBJECT_CLASS(modem_service_parent_class)->dispose)
- G_OBJECT_CLASS(modem_service_parent_class)->dispose(object);
+ CONNECT (proxy, on_modem_removed, "ModemRemoved",
+ DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
+
+#undef CONNECT
+ }
+
+ if (!priv->subscribed)
+ {
+ DBusConnection *bus = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
+
+ /* Pre-subscribe to all interesting signals */
+
+ if (bus)
+ {
+ priv->subscribed = 1;
+
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.Modem',"
+ "member='PropertyChanged'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.SimManager',"
+ "member='PropertyChanged'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.MessageManager',"
+ "member='PropertyChanged'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.MessageManager',"
+ "member='MessageAdded'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.MessageManager',"
+ "member='MessageRemoved'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.VoiceCallManager',"
+ "member='PropertyChanged'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.VoiceCallManager',"
+ "member='CallAdded'",
+ NULL);
+ dbus_bus_add_match (bus,
+ "type='signal',"
+ "sender='org.ofono',"
+ "interface='org.ofono.VoiceCallManager',"
+ "member='CallRemoved'",
+ NULL);
+ }
+ }
+
+ modem_oface_add_connect_request (_self,
+ modem_oface_request_managed (_self, "GetModems",
+ reply_to_get_modems, NULL));
}
-static void
-modem_service_finalize(GObject *object)
+void
+modem_service_disconnect (ModemOface *_self)
{
- ModemService *self = MODEM_SERVICE(object);
+ ModemService *self = MODEM_SERVICE (_self);
ModemServicePrivate *priv = self->priv;
DEBUG("enter");
- /* Free any data held directly by the object here */
+ if (priv->signals)
+ {
+ DBusGProxy *proxy = modem_oface_dbus_proxy (_self);
- g_object_unref (priv->proxy);
+ priv->signals = FALSE;
- g_hash_table_unref (priv->modems);
+ dbus_g_proxy_disconnect_signal (proxy, "ModemAdded",
+ G_CALLBACK (on_modem_added), self);
+ dbus_g_proxy_disconnect_signal (proxy, "ModemRemoved",
+ G_CALLBACK (on_modem_removed), self);
+ }
- G_OBJECT_CLASS(modem_service_parent_class)->finalize(object);
+ DEBUG("leave");
}
static void
modem_service_class_init(ModemServiceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ ModemOfaceClass *oface_class = MODEM_OFACE_CLASS (klass);
DEBUG("enter");
@@ -156,6 +285,9 @@ modem_service_class_init(ModemServiceClass *klass)
object_class->dispose = modem_service_dispose;
object_class->finalize = modem_service_finalize;
+ oface_class->connect = modem_service_connect;
+ oface_class->disconnect = modem_service_disconnect;
+
signals[SIGNAL_MODEM_ADDED] = g_signal_new ("modem-added",
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
@@ -164,6 +296,14 @@ modem_service_class_init(ModemServiceClass *klass)
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, MODEM_TYPE_MODEM);
+ signals[SIGNAL_MODEM_POWERED] = g_signal_new ("modem-powered",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, MODEM_TYPE_MODEM);
+
signals[SIGNAL_MODEM_REMOVED] = g_signal_new ("modem-removed",
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
@@ -172,6 +312,24 @@ modem_service_class_init(ModemServiceClass *klass)
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, MODEM_TYPE_MODEM);
+ signals[SIGNAL_IMEI_ADDED] = g_signal_new ("imei-added",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ _modem__marshal_VOID__OBJECT_STRING,
+ G_TYPE_NONE,
+ 2, MODEM_TYPE_MODEM, G_TYPE_STRING);
+
+ signals[SIGNAL_IMSI_ADDED] = g_signal_new ("imsi-added",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ _modem__marshal_VOID__OBJECT_STRING,
+ G_TYPE_NONE,
+ 2, MODEM_TYPE_MODEM, G_TYPE_STRING);
+
g_type_class_add_private(klass, sizeof (ModemServicePrivate));
dbus_g_object_register_marshaller (_modem__marshal_VOID__STRING_BOXED,
@@ -194,38 +352,119 @@ modem_service_class_init(ModemServiceClass *klass)
/* ------------------------------------------------------------------------ */
/* modem_service interface */
+/* -------------------------------------------------------------------------- */
+/* ModemOface factory */
+
+static GHashTable *modem_oface_types;
+
+void
+modem_service_register_oface (char const *interface,
+ GType type)
+{
+ static gsize once = 0;
+
+ if (g_once_init_enter (&once))
+ {
+ modem_oface_types = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, NULL);
+ g_once_init_leave (&once, 1);
+ }
+
+ g_hash_table_insert (modem_oface_types, g_strdup (interface), (gpointer)type);
+}
+
+
+GType
+modem_oface_type (char const *interface)
+{
+ gpointer type = g_hash_table_lookup (modem_oface_types, interface);
+
+ if (type != NULL)
+ return (GType) type;
+
+ return G_TYPE_INVALID;
+}
+
+ModemOface *
+modem_oface_new (char const *interface, char const *object_path)
+{
+ GType type;
+ DBusGProxy *proxy;
+
+ type = modem_oface_type (interface);
+ if (type == G_TYPE_INVALID)
+ {
+ return NULL;
+ }
+
+ proxy = modem_ofono_proxy (object_path, interface);
+
+ DEBUG("proxy %p for interface %s, type %d", proxy, interface, type);
+
+ if (proxy == NULL)
+ {
+ return NULL;
+ }
+
+ return g_object_new (type, "dbus-proxy", proxy, NULL);
+}
+
ModemService *modem_service (void)
{
static ModemService *service;
- if (!service)
- service = g_object_new (MODEM_TYPE_SERVICE, NULL);
+ if (!service) {
+ service = g_object_new (MODEM_TYPE_SERVICE,
+ "dbus-proxy", modem_ofono_proxy("/", OFONO_IFACE_MANAGER),
+ NULL);
+
+#define REG(iface, type) modem_service_register_oface (iface, type)
+
+ REG (OFONO_IFACE_MODEM, MODEM_TYPE_MODEM);
+ REG (OFONO_IFACE_SIM, MODEM_TYPE_SIM_SERVICE);
+ REG (OFONO_IFACE_SMS, MODEM_TYPE_SMS_SERVICE);
+ REG (OFONO_IFACE_CALL_MANAGER, MODEM_TYPE_CALL_SERVICE);
+
+#undef REG
+ }
return service;
}
-Modem *modem_service_find_modem (ModemService *self, char const *object_path)
+void
+modem_service_refresh (ModemService *self)
+{
+ modem_oface_connect (MODEM_OFACE (self));
+}
+
+Modem *
+modem_service_find_by_path (ModemService *self, char const *object_path)
+{
+ g_return_val_if_fail (MODEM_IS_SERVICE (self), NULL);
+
+ if (object_path)
+ return g_hash_table_lookup (self->priv->modems, object_path);
+ else
+ return NULL;
+}
+
+Modem *
+modem_service_find_best (ModemService *self)
{
- ModemServicePrivate *priv;
char *key;
Modem *modem;
GHashTableIter iter[1];
g_return_val_if_fail (MODEM_IS_SERVICE (self), NULL);
- priv = self->priv;
-
- if (object_path)
- return g_hash_table_lookup (priv->modems, object_path);
-
- for (g_hash_table_iter_init (iter, priv->modems);
+ for (g_hash_table_iter_init (iter, self->priv->modems);
g_hash_table_iter_next (iter, (gpointer)&key, (gpointer)&modem);)
{
if (modem_is_online (modem))
return modem;
}
- for (g_hash_table_iter_init (iter, priv->modems);
+ for (g_hash_table_iter_init (iter, self->priv->modems);
g_hash_table_iter_next (iter, (gpointer)&key, (gpointer)&modem);)
{
if (modem_is_powered (modem))
@@ -235,152 +474,71 @@ Modem *modem_service_find_modem (ModemService *self, char const *object_path)
return NULL;
}
-Modem **modem_service_get_modems(ModemService *self)
+Modem *
+modem_service_find_by_imsi (ModemService *self, char const *imsi)
{
- ModemServicePrivate *priv = self->priv;
- GPtrArray *array;
char *key;
Modem *modem;
GHashTableIter iter[1];
g_return_val_if_fail (MODEM_IS_SERVICE (self), NULL);
- priv = self->priv;
- array = g_ptr_array_sized_new (g_hash_table_size (priv->modems) + 1);
-
- for (g_hash_table_iter_init (iter, priv->modems);
+ for (g_hash_table_iter_init (iter, self->priv->modems);
g_hash_table_iter_next (iter, (gpointer)&key, (gpointer)&modem);)
{
- g_ptr_array_add(array, modem);
+ if (modem_has_imsi(modem, imsi))
+ return modem;
}
- g_ptr_array_add (array, NULL);
-
- return (Modem **)g_ptr_array_free (array, FALSE);
+ return NULL;
}
-void
-modem_service_refresh (ModemService *self)
+Modem *
+modem_service_find_by_imei (ModemService *self, char const *imei)
{
- ModemServicePrivate *priv = self->priv;
-
- DEBUG("enter");
-
- if (!priv->signals)
- {
- priv->signals = TRUE;
+ char *key;
+ Modem *modem = NULL;
+ GHashTableIter iter[1];
- dbus_g_proxy_add_signal (priv->proxy,
- "ModemAdded", DBUS_TYPE_G_OBJECT_PATH, MODEM_TYPE_DBUS_DICT,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->proxy,
- "ModemAdded", G_CALLBACK (on_modem_added), self, NULL);
-
- dbus_g_proxy_add_signal (priv->proxy,
- "ModemRemoved", DBUS_TYPE_G_OBJECT_PATH,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->proxy,
- "ModemRemoved", G_CALLBACK (on_modem_removed), self, NULL);
- }
+ g_return_val_if_fail (MODEM_IS_SERVICE (self), NULL);
- if (!priv->subscribed)
+ for (g_hash_table_iter_init (iter, self->priv->modems);
+ g_hash_table_iter_next (iter, (gpointer)&key, (gpointer)&modem);)
{
- DBusConnection *bus = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-
- /* Pre-subscribe to all interesting signals */
-
- if (bus)
- {
- priv->subscribed = 1;
-
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.Modem',"
- "member='PropertyChanged'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.SimManager',"
- "member='PropertyChanged'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.MessageManager',"
- "member='PropertyChanged'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.MessageManager',"
- "member='MessageAdded'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.MessageManager',"
- "member='MessageRemoved'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.VoiceCallManager',"
- "member='PropertyChanged'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.VoiceCallManager',"
- "member='CallAdded'",
- NULL);
- dbus_bus_add_match (bus,
- "type='signal',"
- "sender='org.ofono',"
- "interface='org.ofono.VoiceCallManager',"
- "member='CallRemoved'",
- NULL);
- }
+ if (modem_has_imei (modem, imei))
+ return modem;
}
- if (priv->refresh)
- return;
-
- priv->refresh = modem_ofono_request_descs (self,
- priv->proxy, "GetModems",
- reply_to_get_modems, NULL);
+ return NULL;
}
-static void
-reply_to_get_modems (gpointer _self,
- ModemRequest *request,
- GPtrArray *modem_list,
- GError const *error,
- gpointer user_data)
+Modem **
+modem_service_get_modems (ModemService *self)
{
- ModemService *self = MODEM_SERVICE (_self);
- ModemServicePrivate *priv = self->priv;
- guint i;
+ ModemServicePrivate *priv;
+ GPtrArray *array;
+ char *key;
+ Modem *modem;
+ GHashTableIter iter[1];
- DEBUG ("enter");
+ g_return_val_if_fail (MODEM_IS_SERVICE (self), NULL);
- priv->refresh = NULL;
+ priv = self->priv;
+ array = g_ptr_array_sized_new (g_hash_table_size (priv->modems) + 1);
- if (error)
- return;
+ for (g_hash_table_iter_init (iter, priv->modems);
+ g_hash_table_iter_next (iter, (gpointer)&key, (gpointer)&modem);)
+ {
+ g_ptr_array_add(array, modem);
+ }
- for (i = 0; i < modem_list->len; i++) {
- GValueArray *va = g_ptr_array_index (modem_list, i);
- char const *path = g_value_get_boxed (va->values + 0);
- GHashTable *properties = g_value_get_boxed (va->values + 1);
+ g_ptr_array_add (array, NULL);
- on_modem_added (priv->proxy, path, properties, self);
- }
+ return (Modem **)g_ptr_array_free (array, FALSE);
}
static void
-on_modem_added (DBusGProxy *proxy,
+on_modem_added (DBusGProxy *_dummy,
char const *object_path,
GHashTable *properties,
gpointer userdata)
@@ -388,12 +546,9 @@ on_modem_added (DBusGProxy *proxy,
ModemService *self = userdata;
ModemServicePrivate *priv = self->priv;
Modem *modem;
- GHashTableIter iter[1];
- char *name;
- GValue *value;
if (DEBUGGING)
- modem_ofono_debug_desc ("ModemAdded", object_path, properties);
+ modem_ofono_debug_managed ("ModemAdded", object_path, properties);
modem = g_hash_table_lookup (priv->modems, object_path);
if (modem)
@@ -402,22 +557,80 @@ on_modem_added (DBusGProxy *proxy,
return;
}
- modem = g_object_new (MODEM_TYPE_MODEM, "object-path", object_path, NULL);
- if (!modem)
- return;
-
- for (g_hash_table_iter_init (iter, properties);
- g_hash_table_iter_next (iter, (gpointer)&name, (gpointer)&value);)
+ modem = MODEM_MODEM (modem_oface_new (OFONO_IFACE_MODEM, object_path));
+ if (modem == NULL)
{
- char const *property = modem_property_name_by_ofono_name (name);
-
- if (property)
- g_object_set_property (G_OBJECT (modem), property, value);
+ DEBUG ("Cannot create modem object %s", object_path);
+ return;
}
g_hash_table_insert (priv->modems, g_strdup (object_path), modem);
+ modem_oface_update_properties (MODEM_OFACE (modem), properties);
+
+ g_signal_connect (modem, "notify::imei",
+ G_CALLBACK (on_modem_notify_imei), self);
+
+ g_signal_connect (modem, "notify::powered",
+ G_CALLBACK (on_modem_notify_powered), self);
+
+ g_signal_connect (modem, "imsi-added",
+ G_CALLBACK (on_modem_imsi_added), self);
+
+ modem_oface_connect (MODEM_OFACE (modem));
+
+ g_assert (modem_oface_is_connected (MODEM_OFACE (modem)));
+
g_signal_emit (self, signals[SIGNAL_MODEM_ADDED], 0, modem);
+
+ on_modem_notify_powered (modem, NULL, self);
+
+ on_modem_notify_imei (modem, NULL, self);
+}
+
+static void
+on_modem_notify_imei (Modem *modem,
+ GParamSpec *dummy,
+ ModemService *self)
+{
+ gchar *imei = NULL;
+
+ g_object_get(modem, "imei", &imei, NULL);
+
+ if (imei && strcmp (imei, ""))
+ {
+ DEBUG ("emitting \"%s\" with modem=%p (%s) imei=%s", "imei-added",
+ modem, modem_oface_object_path (MODEM_OFACE (modem)), imei);
+ g_signal_emit (self, signals[SIGNAL_IMEI_ADDED], 0, modem, imei);
+ }
+
+ g_free (imei);
+}
+
+static void
+on_modem_notify_powered (Modem *modem,
+ GParamSpec *dummy,
+ ModemService *self)
+{
+ gboolean powered;
+
+ g_object_get(modem, "powered", &powered, NULL);
+
+ if (powered) {
+ DEBUG ("emitting \"%s\" with modem=%p (%s)", "modem-powered",
+ modem, modem_oface_object_path (MODEM_OFACE (modem)));
+ g_signal_emit (self, signals[SIGNAL_MODEM_POWERED], 0, modem);
+ }
+}
+
+static void
+on_modem_imsi_added (Modem *modem,
+ char const *imsi,
+ ModemService *self)
+{
+ DEBUG ("emitting \"%s\" with modem=%p (%s) imsi=%s", "imsi-added",
+ modem, modem_oface_object_path (MODEM_OFACE (modem)), imsi);
+ g_signal_emit (self, signals[SIGNAL_IMSI_ADDED], 0, modem, imsi);
}
static void
@@ -435,7 +648,18 @@ on_modem_removed (DBusGProxy *proxy,
if (!modem)
return;
+ modem_oface_disconnect (MODEM_OFACE (modem));
+
g_signal_emit (self, signals[SIGNAL_MODEM_REMOVED], 0, modem);
+ g_signal_handlers_disconnect_by_func (modem,
+ G_CALLBACK (on_modem_imsi_added), self);
+
+ g_signal_handlers_disconnect_by_func (modem,
+ G_CALLBACK (on_modem_notify_imei), self);
+
+ g_signal_handlers_disconnect_by_func (modem,
+ G_CALLBACK (on_modem_notify_powered), self);
+
g_hash_table_remove (priv->modems, object_path);
}
diff --git a/modem/service.h b/modem/service.h
index ee04ece..8cb219a 100644
--- a/modem/service.h
+++ b/modem/service.h
@@ -24,6 +24,7 @@
#include <glib-object.h>
+#include <modem/oface.h>
#include <modem/modem.h>
G_BEGIN_DECLS
@@ -33,11 +34,11 @@ typedef struct _ModemServiceClass ModemServiceClass;
typedef struct _ModemServicePrivate ModemServicePrivate;
struct _ModemServiceClass {
- GObjectClass parent_class;
+ ModemOfaceClass parent_class;
};
struct _ModemService {
- GObject parent;
+ ModemOface parent;
ModemServicePrivate *priv;
};
@@ -67,9 +68,13 @@ GType modem_service_get_type(void);
ModemService *modem_service(void);
-void modem_service_refresh(ModemService *self);
+void modem_service_refresh (ModemService *self);
+
+Modem *modem_service_find_by_imsi (ModemService *self, char const *imsi);
+Modem *modem_service_find_by_imei (ModemService *self, char const *imei);
+Modem *modem_service_find_by_path (ModemService *self, char const *path);
+Modem *modem_service_find_best (ModemService *self);
-Modem *modem_service_find_modem(ModemService *self, char const *object_path);
Modem **modem_service_get_modems(ModemService *self);
G_END_DECLS