summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2011-02-01 20:48:26 +0200
committerPekka Pessi <Pekka.Pessi@nokia.com>2011-02-01 21:21:07 +0200
commita2fa821e1b69b18904d79737fb26112a963a0f56 (patch)
treed3e787d95df9ca14d85ec959e31467a252bd00a4
parent02afe5741229a998a2a1c55c18c473e0662d1a20 (diff)
modem/sms: emit incoming-message and immediate-message signals
-rw-r--r--modem/sms-service.c110
-rw-r--r--modem/sms.h15
2 files changed, 109 insertions, 16 deletions
diff --git a/modem/sms-service.c b/modem/sms-service.c
index 2ae20db..af82b50 100644
--- a/modem/sms-service.c
+++ b/modem/sms-service.c
@@ -56,6 +56,8 @@ G_DEFINE_TYPE (ModemSMSService, modem_sms_service, MODEM_TYPE_OFACE)
/* Signals we emit */
enum
{
+ SIGNAL_INCOMING_MESSAGE,
+ SIGNAL_IMMEDIATE_MESSAGE,
#if nomore
SIGNAL_DELIVER,
SIGNAL_OUTGOING_COMPLETE,
@@ -104,6 +106,7 @@ static void modem_sms_incoming_deliver (ModemSMSService *self,
#endif
static void on_incoming_message (DBusGProxy *, char const *, GHashTable *, gpointer);
+static void on_immediate_message (DBusGProxy *, char const *, GHashTable *, gpointer);
static void on_manager_message_added (DBusGProxy *, char const *, GHashTable *,
gpointer);
static void on_manager_message_removed (DBusGProxy *, char const *, gpointer);
@@ -277,10 +280,7 @@ modem_sms_service_connect (ModemOface *_self)
dbus_g_proxy_add_signal (proxy, (name), ##signature); \
dbus_g_proxy_connect_signal (proxy, (name), G_CALLBACK (handler), self, NULL)
- /* XXX: SMS class 0. Does Ofono actually need a separate
- * signal for them instead of providing the class in the
- * properties dict? */
- CONNECT (on_incoming_message, "ImmediateMessage",
+ CONNECT (on_immediate_message, "ImmediateMessage",
G_TYPE_STRING, MODEM_TYPE_DBUS_DICT, G_TYPE_INVALID);
CONNECT (on_incoming_message, "IncomingMessage",
@@ -365,7 +365,7 @@ modem_sms_service_disconnect (ModemOface *_self)
priv->signals = FALSE;
dbus_g_proxy_disconnect_signal (proxy, "IncomingMessage",
- G_CALLBACK (on_incoming_message), self);
+ G_CALLBACK (on_immediate_message), self);
dbus_g_proxy_disconnect_signal (proxy, "ImmediateMessage",
G_CALLBACK (on_incoming_message), self);
dbus_g_proxy_disconnect_signal (proxy, "MessageAdded",
@@ -441,6 +441,26 @@ modem_sms_service_class_init (ModemSMSServiceClass *klass)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
+ signals[SIGNAL_IMMEDIATE_MESSAGE] =
+ g_signal_new ("immediate-message",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ _modem__marshal_VOID__STRING_BOXED,
+ G_TYPE_NONE, 2,
+ G_TYPE_STRING, G_TYPE_HASH_TABLE);
+
+ signals[SIGNAL_INCOMING_MESSAGE] =
+ g_signal_new ("incoming-message",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ _modem__marshal_VOID__STRING_BOXED,
+ G_TYPE_NONE, 2,
+ G_TYPE_STRING, G_TYPE_HASH_TABLE);
+
#if nomore
signals[SIGNAL_DELIVER] =
g_signal_new ("deliver",
@@ -508,6 +528,24 @@ modem_sms_connect_to_deliver (ModemSMSService *self,
}
#endif
+gulong
+modem_sms_connect_to_incoming_message (ModemSMSService *self,
+ ModemSMSMessageHandler *handler,
+ gpointer data)
+{
+ return g_signal_connect (self, "incoming-message",
+ G_CALLBACK (handler), data);
+}
+
+gulong
+modem_sms_connect_to_immediate_message (ModemSMSService *self,
+ ModemSMSMessageHandler *handler,
+ gpointer data)
+{
+ return g_signal_connect (self, "immediate-message",
+ G_CALLBACK (handler), data);
+}
+
/* ------------------------------------------------------------------------- */
/* modem_sms_service interface */
@@ -520,6 +558,18 @@ modem_sms_service_time_connected (ModemSMSService const *self)
return 0;
}
+gint64
+modem_sms_parse_time (gchar const *s)
+{
+ struct tm tm = { };
+ char *rest;
+
+ rest = strptime (s, "%Y-%m-%dT%H:%M:%S%z", &tm);
+
+ return (gint64) mktime (&tm);
+}
+
+
/* ------------------------------------------------------------------------- */
static void
@@ -579,17 +629,6 @@ dump_message_dict (GHashTable *dict)
}
}
-static void
-on_incoming_message (DBusGProxy *proxy,
- char const *message,
- GHashTable *dict,
- gpointer _self)
-{
- DEBUG ("message = \"%s\"", message);
-
- dump_message_dict (dict);
-}
-
#if nomore
static void
@@ -743,6 +782,45 @@ modem_sms_incoming_status_report (ModemSMSService *self,
}
#endif
+static void
+on_immediate_message (DBusGProxy *proxy,
+ char const *message,
+ GHashTable *dict,
+ gpointer _self)
+{
+ ModemSMSService *self = MODEM_SMS_SERVICE (_self);
+ ModemSMSServicePrivate *priv = self->priv;
+
+ if (!priv->connected)
+ return;
+
+ DEBUG ("immediate = \"%50s\"%s", message, strlen (message) > 50 ? "..." : "");
+ dump_message_dict (dict);
+
+ g_signal_emit (self, signals[SIGNAL_IMMEDIATE_MESSAGE], 0,
+ message, dict);
+}
+
+static void
+on_incoming_message (DBusGProxy *proxy,
+ char const *message,
+ GHashTable *dict,
+ gpointer _self)
+{
+ ModemSMSService *self = MODEM_SMS_SERVICE (_self);
+ ModemSMSServicePrivate *priv = self->priv;
+
+ if (!priv->connected)
+ return;
+
+ DEBUG ("incoming = \"%50s\"%s", message, strlen (message) > 50 ? "..." : "");
+ dump_message_dict (dict);
+
+ g_signal_emit (self, signals[SIGNAL_INCOMING_MESSAGE], 0,
+ message, dict);
+}
+
+
/* ---------------------------------------------------------------------- */
/* Sending */
diff --git a/modem/sms.h b/modem/sms.h
index 68ac36a..182dba8 100644
--- a/modem/sms.h
+++ b/modem/sms.h
@@ -76,6 +76,11 @@ typedef void ModemSMSDeliverHandler (ModemSMSService *,
SMSGDeliver *, gpointer);
#endif
+typedef void ModemSMSMessageHandler (ModemSMSService *self,
+ gchar const *message,
+ GHashTable *info,
+ gpointer user_data);
+
typedef void ModemSMSServiceReply (ModemSMSService *self,
ModemRequest *request,
GError const *error,
@@ -101,8 +106,18 @@ gulong modem_sms_connect_to_deliver (ModemSMSService *self,
gpointer user_data);
#endif
+gulong modem_sms_connect_to_incoming_message (ModemSMSService *self,
+ ModemSMSMessageHandler *handler,
+ gpointer data);
+
+gulong modem_sms_connect_to_immediate_message (ModemSMSService *self,
+ ModemSMSMessageHandler *handler,
+ gpointer data);
+
guint64 modem_sms_service_time_connected (ModemSMSService const *self);
+gint64 modem_sms_parse_time (gchar const *);
+
/* ---------------------------------------------------------------------- */
ModemRequest *modem_sms_set_sc_address (ModemSMSService *self,