r3479 - in trunk/src/target/OM-2007.2/applications/openmoko-dialer2: . src/phone-kit
chris at sita.openmoko.org
chris at sita.openmoko.org
Thu Nov 22 19:47:15 CET 2007
Author: chris
Date: 2007-11-22 19:47:13 +0100 (Thu, 22 Nov 2007)
New Revision: 3479
Removed:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h
Modified:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/dialer-main.c
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-dbus.xml
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.c
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.h
Log:
* src/phone-kit/Makefile.am:
* src/phone-kit/dialer-main.c: (main):
* src/phone-kit/moko-dialer-dbus.xml:
* src/phone-kit/moko-dialer-sms-dbus.xml:
* src/phone-kit/moko-dialer-sms.c:
* src/phone-kit/moko-dialer-sms.h:
* src/phone-kit/moko-dialer.c: (moko_dialer_dial),
(moko_dialer_hang_up), (moko_dialer_hung_up),
(moko_dialer_rejected), (on_talking_accept_call),
(on_talking_reject_call), (on_talking_cancel_call),
(on_network_registered), (on_incoming_call), (on_incoming_clip),
(on_pin_requested), (on_call_progress_changed),
(moko_dialer_dispose), (moko_dialer_finalize),
(status_report_added_cb), (status_report_progress_cb), (store_sms),
(gsmd_eventhandler), (sms_msghandler), (net_msghandler),
(connection_source_prepare), (connection_source_check),
(connection_source_dispatch), (sms_store_opened_cb),
(dialer_init_gsmd), (moko_dialer_init), (moko_dialer_send_sms):
* src/phone-kit/moko-dialer.h:
Remove use of libmokogsmd, integrate SMS code with the rest of the
dialer code
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog 2007-11-22 18:47:13 UTC (rev 3479)
@@ -1,3 +1,27 @@
+2007-11-22 Chris Lord <chris at openedhand.com>
+
+ * src/phone-kit/Makefile.am:
+ * src/phone-kit/dialer-main.c: (main):
+ * src/phone-kit/moko-dialer-dbus.xml:
+ * src/phone-kit/moko-dialer-sms-dbus.xml:
+ * src/phone-kit/moko-dialer-sms.c:
+ * src/phone-kit/moko-dialer-sms.h:
+ * src/phone-kit/moko-dialer.c: (moko_dialer_dial),
+ (moko_dialer_hang_up), (moko_dialer_hung_up),
+ (moko_dialer_rejected), (on_talking_accept_call),
+ (on_talking_reject_call), (on_talking_cancel_call),
+ (on_network_registered), (on_incoming_call), (on_incoming_clip),
+ (on_pin_requested), (on_call_progress_changed),
+ (moko_dialer_dispose), (moko_dialer_finalize),
+ (status_report_added_cb), (status_report_progress_cb), (store_sms),
+ (gsmd_eventhandler), (sms_msghandler), (net_msghandler),
+ (connection_source_prepare), (connection_source_check),
+ (connection_source_dispatch), (sms_store_opened_cb),
+ (dialer_init_gsmd), (moko_dialer_init), (moko_dialer_send_sms):
+ * src/phone-kit/moko-dialer.h:
+ Remove use of libmokogsmd, integrate SMS code with the rest of the
+ dialer code
+
2007-11-21 Thomas Wood <thomas at openedhand.com>
* src/phone-kit/Makefile.am:
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am 2007-11-22 18:47:13 UTC (rev 3479)
@@ -11,7 +11,6 @@
moko-notify.c moko-notify.h \
moko-sound.c moko-sound.h \
moko-talking.c moko-talking.h \
- moko-dialer-sms.c moko-dialer-sms.h \
moko-pin.c \
moko-pin.h
@@ -21,7 +20,7 @@
%-glue.h: %-dbus.xml
$(LIBTOOL) --mode=execute $(DBUS_GLIB_BIN)/dbus-binding-tool --prefix=$(subst -,_,$*) --mode=glib-server --output=$@ $<
-BUILT_SOURCES = moko-dialer-glue.h moko-dialer-sms-glue.h
+BUILT_SOURCES = moko-dialer-glue.h
-EXTRA_DIST = moko-dialer-dbus.xml moko-dialer-sms-dbus.xml
+EXTRA_DIST = moko-dialer-dbus.xml
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/dialer-main.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/dialer-main.c 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/dialer-main.c 2007-11-22 18:47:13 UTC (rev 3479)
@@ -23,11 +23,9 @@
#include <moko-stock.h>
#include "moko-dialer.h"
-#include "moko-dialer-sms.h"
#define DIALER_NAMESPACE "org.openmoko.Dialer"
#define DIALER_OBJECT "/org/openmoko/Dialer"
-#define SMS_OBJECT "/org/openmoko/Dialer/SMS"
static gchar *number = NULL;
@@ -57,7 +55,6 @@
main (int argc, char **argv)
{
MokoDialer *dialer;
- MokoDialerSMS *sms;
DBusGConnection *connection;
DBusGProxy *proxy;
GError *error = NULL;
@@ -110,17 +107,13 @@
gtk_init (&argc, &argv);
moko_stock_register ();
- /* Create the MokoDialer/MokoDialerSMS objects */
+ /* Create the MokoDialer object */
dialer = moko_dialer_get_default ();
- sms = moko_dialer_sms_get_default ();
/* Add the objects onto the bus */
dbus_g_connection_register_g_object (connection,
DIALER_OBJECT,
G_OBJECT (dialer));
- dbus_g_connection_register_g_object (connection,
- SMS_OBJECT,
- G_OBJECT (sms));
/* application object */
g_set_application_name ("OpenMoko Dialer");
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-dbus.xml
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-dbus.xml 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-dbus.xml 2007-11-22 18:47:13 UTC (rev 3479)
@@ -14,6 +14,12 @@
<arg type="s" name="message" direction="in" />
</method>
+ <method name="SendSms">
+ <arg type="s" name="number" />
+ <arg type="s" name="message" />
+ <arg type="s" name="uid" direction="out" />
+ </method>
+
<signal name="IncomingCall">
<arg type="s" name="number"/>
</signal>
Deleted: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml 2007-11-22 18:47:13 UTC (rev 3479)
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<node name="/org/openmoko/Dialer/SMS">
-<interface name="org.openmoko.Dialer">
-<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="moko_dialer_sms"/>
- <method name="Send">
- <arg type="s" name="number" />
- <arg type="s" name="message" />
- <arg type="s" name="uid" direction="out" />
- </method>
-</interface>
-</node>
-
Deleted: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c 2007-11-22 18:47:13 UTC (rev 3479)
@@ -1,519 +0,0 @@
-
-#include "moko-dialer-sms.h"
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-bindings.h>
-#include <libgsmd/libgsmd.h>
-#include <libgsmd/event.h>
-#include <libgsmd/misc.h>
-#include <libgsmd/sms.h>
-#include <libjana/jana.h>
-#include <libjana-ecal/jana-ecal.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "moko-dialer-sms-glue.h"
-
-G_DEFINE_TYPE (MokoDialerSMS, moko_dialer_sms, G_TYPE_OBJECT)
-
-#define SMS_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_DIALER_TYPE_SMS, MokoDialerSMSPrivate))
-
-typedef struct _MokoDialerSMSPrivate MokoDialerSMSPrivate;
-
-typedef struct {
- GSource source;
- GPollFD pollfd;
- struct lgsm_handle *handle;
-} MokoDialerSMSSource;
-
-struct _MokoDialerSMSPrivate {
- struct lgsm_handle *handle;
- JanaStore *note_store;
- JanaNote *last_msg;
- MokoDialerSMSSource *source;
- gchar *own_number;
-};
-
-static void
-moko_dialer_sms_get_property (GObject *object, guint property_id,
- GValue *value, GParamSpec *pspec)
-{
- switch (property_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- }
-}
-
-static void
-moko_dialer_sms_set_property (GObject *object, guint property_id,
- const GValue *value, GParamSpec *pspec)
-{
- switch (property_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- }
-}
-
-static void
-moko_dialer_sms_dispose (GObject *object)
-{
- if (G_OBJECT_CLASS (moko_dialer_sms_parent_class)->dispose)
- G_OBJECT_CLASS (moko_dialer_sms_parent_class)->dispose (object);
-}
-
-static void
-moko_dialer_sms_finalize (GObject *object)
-{
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (object);
-
- if (priv->source) g_source_destroy ((GSource *)priv->source);
- g_free (priv->own_number);
- lgsm_exit (priv->handle);
-
- G_OBJECT_CLASS (moko_dialer_sms_parent_class)->finalize (object);
-}
-
-static void
-moko_dialer_sms_class_init (MokoDialerSMSClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (MokoDialerSMSPrivate));
-
- object_class->get_property = moko_dialer_sms_get_property;
- object_class->set_property = moko_dialer_sms_set_property;
- object_class->dispose = moko_dialer_sms_dispose;
- object_class->finalize = moko_dialer_sms_finalize;
-
- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
- &dbus_glib_moko_dialer_sms_object_info);
-}
-
-static void
-status_report_added_cb (JanaStoreView *view, GList *components, gchar *ref)
-{
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (
- moko_dialer_sms_get_default ());
-
- for (; components; components = components->next) {
- gchar *compref;
- JanaComponent *comp = JANA_COMPONENT (components->data);
-
- compref = jana_component_get_custom_prop (
- comp, "X-PHONEKIT-SMS-REF");
- if (compref && (strcmp (compref, ref) == 0)) {
- jana_utils_component_remove_category (comp, "Sending");
- jana_utils_component_insert_category (comp, "Sent", 0);
- jana_store_modify_component (priv->note_store, comp);
- g_debug ("Setting message status to confirmed sent");
- }
- g_free (ref);
- }
-}
-
-static void
-status_report_progress_cb (JanaStoreView *view, gint percent, gchar *ref)
-{
- if (percent != 100) return;
-
- g_object_unref (view);
- g_free (ref);
-}
-
-static void
-store_sms (MokoDialerSMS *dialer_sms, struct gsmd_sms_list *sms)
-{
- gchar *message;
-
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (dialer_sms);
-
- /* Ignore voicemail notifications */
- if (sms->payload.is_voicemail) return;
-
- /* TODO: Verify type of message for journal (sent/received) -
- * Assuming received for now, as messages sent with phone-kit
- * will be marked already.
- */
- message = NULL;
- switch (sms->payload.coding_scheme) {
- case ALPHABET_DEFAULT :
- g_debug ("Decoding 7-bit ASCII message");
- message = g_malloc0 (GSMD_SMS_DATA_MAXLEN);
- unpacking_7bit_character (
- &sms->payload, message);
- break;
- case ALPHABET_8BIT :
- /* TODO: Verify: Is this encoding just UTF-8? */
- g_debug ("Decoding UTF-8 message");
- message = g_strdup (sms->payload.data);
- break;
- case ALPHABET_UCS2 :
- g_debug ("Decoding UCS-2 message");
- message = g_utf16_to_utf8 ((const gunichar2 *)
- sms->payload.data, sms->payload.length,
- NULL, NULL, NULL);
- break;
- }
-
- /* Store message in the journal */
- if (message) {
- struct lgsm_sms_delete sms_del;
- gchar *author;
- JanaNote *note = jana_ecal_note_new ();
-
- g_debug ("Moving message to journal:\n\"%s\"", message);
-
- author = g_strconcat (((sms->addr.type &
- __GSMD_TOA_TON_MASK) ==
- GSMD_TOA_TON_INTERNATIONAL) ? "+" : "",
- sms->addr.number, NULL);
- jana_note_set_author (note, author);
- g_free (author);
-
- jana_note_set_recipient (note, priv->own_number);
-
- jana_note_set_body (note, message);
-
- /* TODO: Set creation time from SMS timestamp */
-
- /* Add SMS to store */
- jana_store_add_component (priv->note_store,
- JANA_COMPONENT (note));
-
- /* Delete SMS from internal storage */
- sms_del.index = sms->index;
- sms_del.delflg = LGSM_SMS_DELFLG_INDEX;
- lgsm_sms_delete (priv->handle, &sms_del);
-
- g_free (message);
- }
-}
-
-static int
-gsmd_eventhandler (struct lgsm_handle *lh, int evt_type,
- struct gsmd_evt_auxdata *aux)
-{
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (
- moko_dialer_sms_get_default ());
-
- /* TODO: Handle events that aren't in-line */
-
- switch (evt_type) {
- case GSMD_EVT_IN_SMS : /* Incoming SMS */
- /* TODO: Read UDH for multi-part messages */
- g_debug ("Received incoming SMS");
- if (aux->u.sms.inlined) {
- struct gsmd_sms_list * sms =
- (struct gsmd_sms_list *)aux->data;
- g_debug ("Message inline");
- store_sms (moko_dialer_sms_get_default (), sms);
- } else {
- g_debug ("Message stored on SIM, reading...");
- lgsm_sms_read (priv->handle, aux->u.sms.index);
- }
- break;
- case GSMD_EVT_IN_DS : /* SMS status report */
- if (aux->u.ds.inlined) {
- struct gsmd_sms_list *sms =
- (struct gsmd_sms_list *) aux->data;
-
- /* TODO: I'm not entirely sure of the spec when if
- * storing an unsent message means it failed?
- */
- if (sms->payload.coding_scheme == LGSM_SMS_STO_SENT) {
- gchar *ref = g_strdup_printf ("%d", sms->index);
- JanaStoreView *view = jana_store_get_view (
- priv->note_store);
- g_debug ("Received sent SMS status report");
- jana_store_view_add_match (view,
- JANA_STORE_VIEW_CATEGORY, "Sending");
- g_signal_connect (view, "added", G_CALLBACK (
- status_report_added_cb), ref);
- g_signal_connect (view, "progress", G_CALLBACK (
- status_report_progress_cb), ref);
- }
- } else {
- g_warning ("Not an in-line event, unhandled");
- }
- break;
- default :
- g_warning ("Unhandled gsmd event (%d)", evt_type);
- }
-
- return 0;
-}
-
-static int
-sms_msghandler (struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
-{
- MokoDialerSMS *sms = moko_dialer_sms_get_default ();
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (sms);
-
- /* Store sent messages */
- if ((gmh->msg_subtype == GSMD_SMS_SEND) && priv->last_msg) {
- int *result = (int *) ((void *) gmh + sizeof(*gmh));
- gchar *uid = jana_component_get_uid (
- JANA_COMPONENT (priv->last_msg));
-
- if (*result >= 0) {
- gchar *ref = g_strdup_printf ("%d", *result);
- jana_component_set_custom_prop (
- JANA_COMPONENT (priv->last_msg),
- "X-PHONEKIT-SMS-REF", ref);
- g_free (ref);
- g_debug ("Sent message accepted");
- } else {
- g_debug ("Sent message rejected");
- jana_utils_component_remove_category (
- JANA_COMPONENT(priv->last_msg), "Sending");
- jana_utils_component_insert_category (
- JANA_COMPONENT(priv->last_msg), "Rejected", 0);
- /* TODO: Add error codes? 42 = congestion? */
- }
- jana_store_modify_component (priv->note_store,
- JANA_COMPONENT (priv->last_msg));
-
- g_free (uid);
- g_object_unref (priv->last_msg);
- priv->last_msg = NULL;
- } else if ((gmh->msg_subtype == GSMD_SMS_LIST) ||
- (gmh->msg_subtype == GSMD_SMS_READ)) {
- struct gsmd_sms_list *sms_list = (struct gsmd_sms_list *)
- ((void *) gmh + sizeof(*gmh));
-
- g_debug ("Storing message on SIM");
- store_sms (sms, sms_list);
- } else {
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int
-net_msghandler (struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
-{
- MokoDialerSMS *sms = moko_dialer_sms_get_default ();
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (sms);
-
- const struct gsmd_own_number *num = (struct gsmd_own_number *)
- ((void *) gmh + sizeof(*gmh));
-
- if (gmh->msg_subtype != GSMD_NETWORK_GET_NUMBER) return -EINVAL;
-
- g_free (priv->own_number);
-
- /* TODO: Normalise number necessary? */
- priv->own_number = g_strdup (num->addr.number);
- g_debug ("Got phone number: %s", priv->own_number);
-
- return 0;
-}
-
-static gboolean
-connection_source_prepare (GSource* self, gint* timeout)
-{
- return FALSE;
-}
-
-static gboolean
-connection_source_check (GSource* source)
-{
- MokoDialerSMSSource *self = (MokoDialerSMSSource *)source;
- return self->pollfd.revents & G_IO_IN;
-}
-
-static gboolean
-connection_source_dispatch (GSource *source, GSourceFunc callback,
- gpointer data)
-{
- char buf[1025];
- int size;
-
- MokoDialerSMSSource *self = (MokoDialerSMSSource *)source;
-
- size = read (self->pollfd.fd, &buf, sizeof(buf));
- if (size < 0) {
- g_warning ("moko_gsmd_connection_source_dispatch:%s %s",
- "read error from libgsmd:", strerror (errno));
- } else {
- if (size == 0) /* EOF */
- return FALSE;
- lgsm_handle_packet (self->handle, buf, size);
- }
-
- return TRUE;
-}
-
-static void
-opened_cb (JanaStore *store, MokoDialerSMS *self)
-{
- static GSourceFuncs funcs = {
- connection_source_prepare,
- connection_source_check,
- connection_source_dispatch,
- NULL,
- };
-
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (self);
-
- g_debug ("Journal opened, connecting to gsmd");
-
- /* Initialise gsmd and connect event handler */
- if (!(priv->handle = lgsm_init (LGSMD_DEVICE_GSMD))) {
- g_warning ("Failed to connect to gsmd");
- return;
- } else {
- g_debug ("Connected to gsmd");
- lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_SMS,
- gsmd_eventhandler);
- lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_DS,
- gsmd_eventhandler);
- }
-
- /* Connect SMS message handler (to get sent message references) */
- lgsm_register_handler (priv->handle, GSMD_MSG_SMS, &sms_msghandler);
-
- /* Connect network message handler (to get phone number) */
- lgsm_register_handler (priv->handle, GSMD_MSG_NETWORK, &net_msghandler);
-
- /* Start polling for events */
- priv->source = (MokoDialerSMSSource *)
- g_source_new (&funcs, sizeof (MokoDialerSMSSource));
- priv->source->handle = priv->handle;
- priv->source->pollfd.fd = lgsm_fd (priv->handle);
- priv->source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
- priv->source->pollfd.revents = 0;
- g_source_add_poll ((GSource*)priv->source, &priv->source->pollfd);
- g_source_attach ((GSource*)priv->source, NULL);
-
- /* Get phone number */
- lgsm_get_subscriber_num (priv->handle);
-
- /* List all messages to move to journal */
- lgsm_sms_list (priv->handle, GSMD_SMS_ALL);
-}
-
-static void
-moko_dialer_sms_init (MokoDialerSMS *self)
-{
- static gboolean first_init = TRUE;
-
- MokoDialerSMSPrivate *priv = SMS_PRIVATE (self);
-
- /* We can only have one of these objects per process, as the gsmd
- * event handling callback does not allow for custom data...
- */
- if (!first_init)
- g_error ("MokoDialerSMS already created in this process");
- first_init = FALSE;
-
- /* Get the note store */
- priv->note_store = jana_ecal_store_new (JANA_COMPONENT_NOTE);
- g_signal_connect (priv->note_store, "opened",
- G_CALLBACK (opened_cb), self);
- jana_store_open (priv->note_store);
-}
-
-MokoDialerSMS*
-moko_dialer_sms_new (void)
-{
- return g_object_new (MOKO_DIALER_TYPE_SMS, NULL);
-}
-
-MokoDialerSMS*
-moko_dialer_sms_get_default (void)
-{
- static MokoDialerSMS *sms = NULL;
-
- if (sms) return sms;
-
- sms = moko_dialer_sms_new ();
-
- return sms;
-}
-
-gboolean
-moko_dialer_sms_send (MokoDialerSMS *self, const gchar *number,
- const gchar *message, gchar **uid, GError **error)
-{
- MokoDialerSMSPrivate *priv;
- struct lgsm_sms sms;
- gint msg_length, c;
- gboolean ascii;
- JanaNote *note;
-
- g_assert (self && number && message);
-
- priv = SMS_PRIVATE (self);
-
- if (!priv->handle) {
- /* Failed to connect to gsmd earlier */
- *error = g_error_new (PHONE_KIT_SMS_ERROR,
- PK_SMS_ERROR_GSMD, "Failed to connect to gsmd");
- return FALSE;
- }
-
- /* Ask for delivery report */
- sms.ask_ds = 1;
-
- /* Set destination number */
- if (strlen (number) > GSMD_ADDR_MAXLEN + 1) {
- *error = g_error_new (PHONE_KIT_SMS_ERROR,
- PK_SMS_ERROR_NO_TOOLONG, "Number too long");
- return FALSE;
- } else {
- strcpy (sms.addr, number);
- }
-
- /* Set message */
- /* Check if the text is ascii (and pack in 7 bits if so) */
- ascii = TRUE;
- for (c = 0; message[c] != '\0'; c++) {
- if (((guint8)message[c]) > 0x7F) {
- ascii = FALSE;
- break;
- }
- }
-
- /* TODO: Multi-part messages using UDH */
- msg_length = strlen (message);
- if ((ascii && (msg_length > 160)) || (msg_length > 140)) {
- *error = g_error_new (PHONE_KIT_SMS_ERROR,
- PK_SMS_ERROR_MSG_TOOLONG, "Message too long");
- return FALSE;
- }
- if (ascii) {
- packing_7bit_character (message, &sms);
- } else {
- sms.alpha = ALPHABET_8BIT;
- sms.length = strlen (message);
- strcpy ((gchar *)sms.data, message);
- }
-
- /* Send message */
- lgsm_sms_send (priv->handle, &sms);
-
- /* Store sent message in journal */
- note = jana_ecal_note_new ();
- jana_note_set_recipient (note, number);
- jana_note_set_author (note, priv->own_number);
-
- jana_note_set_body (note, message);
- jana_component_set_categories (JANA_COMPONENT (note),
- (const gchar *[]){ "Sending", NULL});
-
- jana_store_add_component (priv->note_store,
- JANA_COMPONENT (note));
- if (uid) *uid = jana_component_get_uid (JANA_COMPONENT (note));
-
- if (priv->last_msg) {
- g_warning ("Confirmation not received for last sent SMS, "
- "delivery report will be lost.");
- g_object_unref (priv->last_msg);
- priv->last_msg = NULL;
- }
- priv->last_msg = note;
-
- return TRUE;
-}
Deleted: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h 2007-11-22 18:47:13 UTC (rev 3479)
@@ -1,59 +0,0 @@
-#ifndef _MOKO_DIALER_SMS_H
-#define _MOKO_DIALER_SMS_H
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define MOKO_DIALER_TYPE_SMS moko_dialer_sms_get_type()
-
-#define MOKO_DIALER_SMS(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
- MOKO_DIALER_TYPE_SMS, MokoDialerSMS))
-
-#define MOKO_DIALER_SMS_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), \
- MOKO_DIALER_TYPE_SMS, MokoDialerSMSClass))
-
-#define MOKO_DIALER_IS_SMS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
- MOKO_DIALER_TYPE_SMS))
-
-#define MOKO_DIALER_IS_SMS_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), \
- MOKO_DIALER_TYPE_SMS))
-
-#define MOKO_DIALER_SMS_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), \
- MOKO_DIALER_TYPE_SMS, MokoDialerSMSClass))
-
-#define PHONE_KIT_SMS_ERROR g_quark_from_static_string("phone-kit-sms")
-
-typedef enum {
- PK_SMS_ERROR_NO_TOOLONG,
- PK_SMS_ERROR_MSG_TOOLONG,
- PK_SMS_ERROR_GSMD,
-} PhoneKitSMSError;
-
-typedef struct {
- GObject parent;
-} MokoDialerSMS;
-
-typedef struct {
- GObjectClass parent_class;
-} MokoDialerSMSClass;
-
-GType moko_dialer_sms_get_type (void);
-
-MokoDialerSMS * moko_dialer_sms_new (void);
-
-MokoDialerSMS * moko_dialer_sms_get_default (void);
-
-gboolean moko_dialer_sms_send (MokoDialerSMS *sms, const gchar *number,
- const gchar *message, gchar **uid,
- GError **error);
-
-G_END_DECLS
-
-#endif /* _MOKO_DIALER_SMS_H */
-
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.c 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.c 2007-11-22 18:47:13 UTC (rev 3479)
@@ -20,14 +20,23 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <unistd.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-bindings.h>
-#include <moko-gsmd-connection.h>
#include <moko-journal.h>
#include <moko-stock.h>
+#include <libgsmd/libgsmd.h>
+#include <libgsmd/event.h>
+#include <libgsmd/misc.h>
+#include <libgsmd/sms.h>
+#include <libgsmd/voicecall.h>
+
+#include <libjana/jana.h>
+#include <libjana-ecal/jana-ecal.h>
+
#include "moko-dialer.h"
#include "moko-contacts.h"
@@ -41,18 +50,33 @@
#define MOKO_DIALER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \
MOKO_TYPE_DIALER, MokoDialerPrivate))
+typedef struct {
+ GSource source;
+ GPollFD pollfd;
+ struct lgsm_handle *handle;
+} MokoDialerSource;
+
struct _MokoDialerPrivate
{
- gint status;
- gchar *incoming_clip;
+ gint status;
+ gchar *incoming_clip;
+ gchar *own_number;
/* handles user interaction */
GtkWidget *talking;
- /* Special objects */
- MokoGsmdConnection *connection;
+ /* gsmd connection variables */
+ struct lgsm_handle *handle;
+ MokoDialerSource *source;
+
+ /* Storage objects */
+ JanaStore *sms_store;
+ gboolean sms_store_open;
+ JanaNote *last_msg;
MokoJournal *journal;
MokoContacts *contacts;
+
+ /* Notification handling object */
MokoNotify *notify;
/* The shared MokoJournalEntry which is constantly created */
@@ -60,8 +84,8 @@
MokoTime *time;
/* Registration variables */
- MokoGsmdConnectionNetregType registered;
- MokoGSMLocation gsm_location;
+ enum lgsm_netreg_state registered;
+ MokoGSMLocation gsm_location;
};
enum
@@ -77,7 +101,7 @@
static guint dialer_signals[LAST_SIGNAL] = {0, };
-static MokoGsmdConnection * dialer_init_gsmd (MokoDialer *dialer);
+static void dialer_init_gsmd (MokoDialer *dialer);
/* DBus functions */
@@ -99,6 +123,7 @@
{
MokoDialerPrivate *priv;
+ struct lgsm_addr addr;
MokoContactEntry *entry = NULL;
g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
@@ -108,10 +133,9 @@
g_debug ("Received dial request: %s", number);
- if (!priv->connection)
- priv->connection = dialer_init_gsmd (dialer);
+ if (!priv->handle) dialer_init_gsmd (dialer);
- if (!priv->connection)
+ if (!priv->handle)
{
*error = g_error_new (PHONE_KIT_DIALER_ERROR, PK_DIALER_ERROR_GSMD, "Could not connect to gsmd");
return FALSE;
@@ -136,9 +160,9 @@
priv->status = DIALER_STATUS_DIALING;
/* check for network connection */
- if (priv->registered != MOKO_GSMD_CONNECTION_NETREG_HOME
- && priv->registered != MOKO_GSMD_CONNECTION_NETREG_ROAMING
- && priv->registered != MOKO_GSMD_CONNECTION_NETREG_DENIED)
+ if (priv->registered != GSMD_NETREG_REG_HOME
+ && priv->registered != GSMD_NETREG_REG_ROAMING
+ && priv->registered != GSMD_NETREG_DENIED)
{
gchar *strings[] = {
@@ -174,7 +198,12 @@
}
moko_talking_outgoing_call (MOKO_TALKING (priv->talking), number, entry);
- moko_gsmd_connection_voice_dial (MOKO_GSMD_CONNECTION (priv->connection), number);
+ /* TODO: No idea where '129' comes from, taken from libmokogsmd - refer to
+ * libgsmd.h in gsmd - It says "Refer to GSM 04.08 [8] subclause 10.5.4.7"
+ */
+ addr.type = 129;
+ g_stpcpy (&addr.addr[0], number);
+ lgsm_voice_out_init (priv->handle, &addr);
return TRUE;
}
@@ -188,10 +217,9 @@
g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
/* check for gsmd connection */
- if (!priv->connection)
- priv->connection = dialer_init_gsmd (dialer);
+ if (!priv->handle) dialer_init_gsmd (dialer);
- if (!priv->connection)
+ if (!priv->handle)
{
*error = g_error_new (PHONE_KIT_DIALER_ERROR, PK_DIALER_ERROR_GSMD, "Could not connect to gsmd");
return FALSE;
@@ -231,7 +259,7 @@
priv->status = DIALER_STATUS_NORMAL;
- moko_gsmd_connection_voice_hangup (priv->connection);
+ lgsm_voice_hangup (priv->handle);
g_signal_emit (G_OBJECT (dialer), dialer_signals[HUNG_UP], 0);
}
@@ -249,7 +277,7 @@
/* Stop the notification */
moko_notify_stop (priv->notify);
- moko_gsmd_connection_voice_hangup (priv->connection);
+ lgsm_voice_hangup (priv->handle);
g_signal_emit (G_OBJECT (dialer), dialer_signals[REJECTED], 0);
}
@@ -288,7 +316,7 @@
if (priv->status != DIALER_STATUS_INCOMING)
return;
- moko_gsmd_connection_voice_accept (priv->connection);
+ lgsm_voice_in_accept (priv->handle);
priv->status = DIALER_STATUS_TALKING;
/* Stop the notification */
@@ -306,7 +334,7 @@
g_return_if_fail (MOKO_IS_DIALER (dialer));
priv = dialer->priv;
- moko_gsmd_connection_voice_hangup (priv->connection);
+ lgsm_voice_hangup (priv->handle);
priv->status = DIALER_STATUS_NORMAL;
/* Finalise and add the journal entry */
@@ -334,7 +362,7 @@
g_return_if_fail (MOKO_IS_DIALER (dialer));
priv = dialer->priv;
- moko_gsmd_connection_voice_hangup (priv->connection);
+ lgsm_voice_hangup (priv->handle);
priv->status = DIALER_STATUS_NORMAL;
@@ -387,13 +415,12 @@
moko_gsmd_connection_voice_dtmf (priv->connection, digit);
}
#endif
-/* Callbacks for MokoGsmdConnection */
+/* Callbacks for gsmd events */
static void
-on_network_registered (MokoGsmdConnection *conn,
+on_network_registered (MokoDialer *dialer,
int type,
int lac,
- int cell,
- MokoDialer *dialer)
+ int cell)
{
MokoDialerPrivate *priv;
@@ -402,16 +429,16 @@
switch (type)
{
- case MOKO_GSMD_CONNECTION_NETREG_NONE:
- case MOKO_GSMD_CONNECTION_NETREG_SEARCHING:
+ case GSMD_NETREG_UNREG:
+ case GSMD_NETREG_UNREG_BUSY:
/* Do nothing */
g_debug ("Searching for network");
break;
- case MOKO_GSMD_CONNECTION_NETREG_DENIED:
+ case GSMD_NETREG_DENIED:
/* This may be a pin issue*/
break;
- case MOKO_GSMD_CONNECTION_NETREG_HOME:
- case MOKO_GSMD_CONNECTION_NETREG_ROAMING:
+ case GSMD_NETREG_REG_HOME:
+ case GSMD_NETREG_REG_ROAMING:
g_debug ("Network registered: LocationAreaCode: %x. CellID: %x.", lac, cell);
priv->gsm_location.lac = lac;
priv->gsm_location.cid = cell;
@@ -424,7 +451,7 @@
}
static void
-on_incoming_call (MokoGsmdConnection *conn, int type, MokoDialer *dialer)
+on_incoming_call (MokoDialer *dialer, int type)
{
MokoDialerPrivate *priv;
@@ -462,9 +489,7 @@
}
static void
-on_incoming_clip (MokoGsmdConnection *conn,
- const gchar *number,
- MokoDialer *dialer)
+on_incoming_clip (MokoDialer *dialer, const gchar *number)
{
MokoDialerPrivate *priv;
MokoContactEntry *entry;
@@ -495,7 +520,7 @@
}
static void
-on_pin_requested (MokoGsmdConnection *conn, int type, MokoDialer *dialer)
+on_pin_requested (MokoDialer *dialer, int type)
{
MokoDialerPrivate *priv;
gchar *pin;
@@ -507,14 +532,13 @@
pin = get_pin_from_user ();
if (!pin)
return;
- moko_gsmd_connection_send_pin (priv->connection, pin);
+
+ lgsm_pin (priv->handle, 1, pin, NULL);
g_free (pin);
}
static void
-on_call_progress_changed (MokoGsmdConnection *conn,
- int type,
- MokoDialer *dialer)
+on_call_progress_changed (MokoDialer *dialer, int type)
{
MokoDialerPrivate *priv;
@@ -523,8 +547,8 @@
switch (type)
{
- case MOKO_GSMD_PROG_DISCONNECT:
- case MOKO_GSMD_PROG_RELEASE:
+ case GSMD_CALLPROG_DISCONNECT:
+ case GSMD_CALLPROG_RELEASE:
/* Finalise and add the journal entry */
if (priv->journal && priv->entry)
{
@@ -553,12 +577,12 @@
g_debug ("mokogsmd disconnect");
break;
- case MOKO_GSMD_PROG_REJECT:
+ case GSMD_CALLPROG_REJECT:
moko_dialer_rejected (dialer);
g_debug ("mokogsmd reject");
break;
- case MOKO_GSMD_PROG_CONNECTED:
+ case GSMD_CALLPROG_CONNECTED:
if (priv->status != DIALER_STATUS_TALKING)
moko_dialer_talking (dialer);
moko_talking_accepted_call (MOKO_TALKING (priv->talking), NULL, NULL);
@@ -571,22 +595,22 @@
}
g_debug ("mokogsmd connected");
break;
- case MOKO_GSMD_PROG_SETUP:
+ case GSMD_CALLPROG_SETUP:
g_debug ("mokogsmd setup");
break;
- case MOKO_GSMD_PROG_ALERT:
+ case GSMD_CALLPROG_ALERT:
g_debug ("mokogsmd alert");
break;
- case MOKO_GSMD_PROG_CALL_PROCEED:
+ case GSMD_CALLPROG_CALL_PROCEED:
g_debug ("mokogsmd proceed");
break;
- case MOKO_GSMD_PROG_SYNC:
+ case GSMD_CALLPROG_SYNC:
g_debug ("mokogsmd sync");
break;
- case MOKO_GSMD_PROG_PROGRESS:
+ case GSMD_CALLPROG_PROGRESS:
g_debug ("mokogsmd progress");
break;
- case MOKO_GSMD_PROG_UNKNOWN:
+ case GSMD_CALLPROG_UNKNOWN:
default:
g_debug ("mokogsmd unknown");
break;
@@ -603,19 +627,43 @@
dialer = MOKO_DIALER (object);
priv = dialer->priv;
+ if (priv->handle) {
+ lgsm_exit (priv->handle);
+ priv->handle = NULL;
+ }
+
+ if (priv->source) {
+ g_source_destroy ((GSource *)priv->source);
+ priv->source = NULL;
+ }
+
+ if (priv->sms_store) {
+ g_object_unref (priv->sms_store);
+ priv->sms_store = NULL;
+ }
+
/* Close journal */
if (priv->journal)
{
moko_journal_write_to_storage (priv->journal);
moko_journal_close (priv->journal);
+ priv->journal = NULL;
}
G_OBJECT_CLASS (moko_dialer_parent_class)->dispose (object);
}
static void
-moko_dialer_finalize (GObject *dialer)
+moko_dialer_finalize (GObject *object)
{
- G_OBJECT_CLASS (moko_dialer_parent_class)->finalize (dialer);
+ MokoDialer *dialer;
+ MokoDialerPrivate *priv;
+
+ dialer = MOKO_DIALER (object);
+ priv = dialer->priv;
+
+ g_free (priv->own_number);
+
+ G_OBJECT_CLASS (moko_dialer_parent_class)->finalize (object);
}
#include "moko-dialer-glue.h"
@@ -682,53 +730,343 @@
}
static void
-dialer_display_error (GError *err)
+status_report_added_cb (JanaStoreView *view, GList *components, gchar *ref)
{
- if (!err)
- return;
- g_warning (err->message);
+ MokoDialerPrivate *priv = moko_dialer_get_default ()->priv;
+
+ for (; components; components = components->next) {
+ gchar *compref;
+ JanaComponent *comp = JANA_COMPONENT (components->data);
+
+ compref = jana_component_get_custom_prop (
+ comp, "X-PHONEKIT-SMS-REF");
+ if (compref && (strcmp (compref, ref) == 0)) {
+ jana_utils_component_remove_category (comp, "Sending");
+ jana_utils_component_insert_category (comp, "Sent", 0);
+ jana_store_modify_component (priv->sms_store, comp);
+ g_debug ("Setting message status to confirmed sent");
+ }
+ g_free (ref);
+ }
}
-static MokoGsmdConnection *
-dialer_init_gsmd (MokoDialer *dialer)
+static void
+status_report_progress_cb (JanaStoreView *view, gint percent, gchar *ref)
{
- GError *err = NULL;
- MokoGsmdConnection *conn;
- MokoDialerPrivate *priv;
- priv = dialer->priv = MOKO_DIALER_GET_PRIVATE (dialer);
+ if (percent != 100) return;
+
+ g_object_unref (view);
+ g_free (ref);
+}
- /* Init the gsmd connection, and power it up */
- conn = moko_gsmd_connection_new ();
- moko_gsmd_connection_set_antenna_power (conn, TRUE, &err);
+static void
+store_sms (MokoDialer *dialer, struct gsmd_sms_list *sms)
+{
+ gchar *message;
- dialer_display_error (err);
- if (err && err->code == MOKO_GSMD_ERROR_CONNECT)
- {
- g_object_unref (conn);
- return NULL;
+ MokoDialerPrivate *priv = dialer->priv;
+
+ /* Return if we haven't opened the journal yet - signals will be re-fired
+ * when the journal is opened anyway.
+ */
+ if (!priv->sms_store_open) return;
+
+ /* Ignore voicemail notifications */
+ if (sms->payload.is_voicemail) return;
+
+ /* TODO: Verify type of message for journal (sent/received) -
+ * Assuming received for now, as messages sent with phone-kit
+ * will be marked already.
+ */
+ message = NULL;
+ switch (sms->payload.coding_scheme) {
+ case ALPHABET_DEFAULT :
+ g_debug ("Decoding 7-bit ASCII message");
+ message = g_malloc0 (GSMD_SMS_DATA_MAXLEN);
+ unpacking_7bit_character (&sms->payload, message);
+ break;
+ case ALPHABET_8BIT :
+ /* TODO: Verify: Is this encoding just UTF-8? (it is on my Samsung phone) */
+ g_debug ("Decoding UTF-8 message");
+ message = g_strdup (sms->payload.data);
+ break;
+ case ALPHABET_UCS2 :
+ g_debug ("Decoding UCS-2 message");
+ message = g_utf16_to_utf8 ((const gunichar2 *)sms->payload.data,
+ sms->payload.length, NULL, NULL, NULL);
+ break;
}
+
+ /* Store message in the journal */
+ if (message) {
+ struct lgsm_sms_delete sms_del;
+ gchar *author;
+ JanaNote *note = jana_ecal_note_new ();
+
+ g_debug ("Moving message to journal:\n\"%s\"", message);
+
+ author = g_strconcat (((sms->addr.type & __GSMD_TOA_TON_MASK) ==
+ GSMD_TOA_TON_INTERNATIONAL) ? "+" : "",
+ sms->addr.number, NULL);
+ jana_note_set_author (note, author);
+ g_free (author);
+
+ jana_note_set_recipient (note, priv->own_number);
+
+ jana_note_set_body (note, message);
+
+ /* TODO: Set creation time from SMS timestamp */
+
+ /* Add SMS to store */
+ jana_store_add_component (priv->sms_store, JANA_COMPONENT (note));
+
+ /* Delete SMS from internal storage */
+ sms_del.index = sms->index;
+ sms_del.delflg = LGSM_SMS_DELFLG_INDEX;
+ lgsm_sms_delete (priv->handle, &sms_del);
+
+ g_free (message);
+ }
+}
- /* Connect to the gsmd signals */
- g_signal_connect (G_OBJECT (conn), "network-registration",
- G_CALLBACK (on_network_registered), (gpointer)dialer);
- g_signal_connect (G_OBJECT (conn), "incoming-call",
- G_CALLBACK (on_incoming_call), (gpointer)dialer);
- g_signal_connect (G_OBJECT (conn), "incoming-clip",
- G_CALLBACK (on_incoming_clip), (gpointer)dialer);
- g_signal_connect (G_OBJECT (conn), "pin-requested",
- G_CALLBACK (on_pin_requested), (gpointer)dialer);
- g_signal_connect (G_OBJECT (conn), "call-progress",
- G_CALLBACK (on_call_progress_changed), (gpointer)dialer);
+static int
+gsmd_eventhandler (struct lgsm_handle *lh, int evt_type,
+ struct gsmd_evt_auxdata *aux)
+{
+ MokoDialer *dialer = moko_dialer_get_default ();
+ MokoDialerPrivate *priv = dialer->priv;
+
+ switch (evt_type) {
+ case GSMD_EVT_IN_CALL :
+ on_incoming_call (dialer, aux->u.call.type);
+ break;
+ case GSMD_EVT_IN_SMS : /* Incoming SMS */
+ /* TODO: Read UDH for multi-part messages */
+ g_debug ("Received incoming SMS");
+ if (aux->u.sms.inlined) {
+ struct gsmd_sms_list * sms = (struct gsmd_sms_list *)aux->data;
+ g_debug ("Message inline");
+ store_sms (dialer, sms);
+ } else {
+ g_debug ("Message stored on SIM, reading...");
+ lgsm_sms_read (lh, aux->u.sms.index);
+ }
+ break;
+ case GSMD_EVT_IN_DS : /* SMS status report */
+ if (aux->u.ds.inlined) {
+ struct gsmd_sms_list *sms = (struct gsmd_sms_list *) aux->data;
+
+ /* TODO: I'm not entirely sure of the spec when if
+ * storing an unsent message means it failed?
+ */
+ if (sms->payload.coding_scheme == LGSM_SMS_STO_SENT) {
+ gchar *ref = g_strdup_printf ("%d", sms->index);
+ JanaStoreView *view = jana_store_get_view (priv->sms_store);
+
+ g_debug ("Received sent SMS status report");
+ jana_store_view_add_match (view, JANA_STORE_VIEW_CATEGORY, "Sending");
+ g_signal_connect (view, "added",
+ G_CALLBACK (status_report_added_cb), ref);
+ g_signal_connect (view, "progress",
+ G_CALLBACK (status_report_progress_cb), ref);
+ }
+ } else {
+ g_warning ("Not an in-line event, unhandled");
+ }
+ break;
+ case GSMD_EVT_IN_CLIP :
+ on_incoming_clip (dialer, aux->u.clip.addr.number);
+ break;
+ case GSMD_EVT_NETREG :
+ on_network_registered (dialer, aux->u.netreg.state,
+ aux->u.netreg.lac, aux->u.netreg.ci);
+ break;
+ case GSMD_EVT_PIN :
+ on_pin_requested (dialer, aux->u.pin.type);
+ break;
+ case GSMD_EVT_OUT_STATUS :
+ on_call_progress_changed (dialer, aux->u.call_status.prog);
+ break;
+ default :
+ g_warning ("Unhandled gsmd event (%d)", evt_type);
+ }
+
+ return 0;
+}
- /* FIXME:
- * moko_gsmd_connection_get_network_status always seems to return 0 here */
- priv->registered = MOKO_GSMD_CONNECTION_NETREG_SEARCHING;
- moko_gsmd_connection_network_register (conn);
+static int
+sms_msghandler (struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
+{
+ MokoDialer *dialer = moko_dialer_get_default ();
+ MokoDialerPrivate *priv = dialer->priv;
- return conn;
+ /* Store sent messages */
+ if ((gmh->msg_subtype == GSMD_SMS_SEND) && priv->last_msg) {
+ int *result = (int *) ((void *) gmh + sizeof(*gmh));
+ gchar *uid = jana_component_get_uid (
+ JANA_COMPONENT (priv->last_msg));
+
+ if (*result >= 0) {
+ gchar *ref = g_strdup_printf ("%d", *result);
+ jana_component_set_custom_prop (JANA_COMPONENT (priv->last_msg),
+ "X-PHONEKIT-SMS-REF", ref);
+ g_free (ref);
+ g_debug ("Sent message accepted");
+ } else {
+ g_debug ("Sent message rejected");
+ jana_utils_component_remove_category (JANA_COMPONENT(priv->last_msg),
+ "Sending");
+ jana_utils_component_insert_category (JANA_COMPONENT(priv->last_msg),
+ "Rejected", 0);
+ /* TODO: Add error codes? 42 = congestion? */
+ }
+ jana_store_modify_component (priv->sms_store,
+ JANA_COMPONENT (priv->last_msg));
+
+ g_free (uid);
+ g_object_unref (priv->last_msg);
+ priv->last_msg = NULL;
+ } else if ((gmh->msg_subtype == GSMD_SMS_LIST) ||
+ (gmh->msg_subtype == GSMD_SMS_READ)) {
+ struct gsmd_sms_list *sms_list = (struct gsmd_sms_list *)
+ ((void *) gmh + sizeof(*gmh));
+
+ g_debug ("Storing message on SIM");
+ store_sms (dialer, sms_list);
+ } else {
+ return -EINVAL;
+ }
+
+ return 0;
}
+static int
+net_msghandler (struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
+{
+ MokoDialer *dialer = moko_dialer_get_default ();
+ MokoDialerPrivate *priv = dialer->priv;
+
+ const struct gsmd_own_number *num = (struct gsmd_own_number *)
+ ((void *) gmh + sizeof(*gmh));
+
+ if (gmh->msg_subtype != GSMD_NETWORK_GET_NUMBER) return -EINVAL;
+
+ g_free (priv->own_number);
+
+ /* TODO: Normalise number necessary? */
+ priv->own_number = g_strdup (num->addr.number);
+ g_debug ("Got phone number: %s", priv->own_number);
+
+ return 0;
+}
+
+static gboolean
+connection_source_prepare (GSource* self, gint* timeout)
+{
+ return FALSE;
+}
+
+static gboolean
+connection_source_check (GSource* source)
+{
+ MokoDialerSource *self = (MokoDialerSource *)source;
+ return self->pollfd.revents & G_IO_IN;
+}
+
+static gboolean
+connection_source_dispatch (GSource *source, GSourceFunc callback,
+ gpointer data)
+{
+ char buf[1025];
+ int size;
+
+ MokoDialerSource *self = (MokoDialerSource *)source;
+
+ size = read (self->pollfd.fd, &buf, sizeof(buf));
+ if (size < 0) {
+ g_warning ("moko_gsmd_connection_source_dispatch:%s %s",
+ "read error from libgsmd:", strerror (errno));
+ } else {
+ if (size == 0) /* EOF */
+ return FALSE;
+ lgsm_handle_packet (self->handle, buf, size);
+ }
+
+ return TRUE;
+}
+
static void
+sms_store_opened_cb (JanaStore *store, MokoDialer *self)
+{
+ MokoDialerPrivate *priv = self->priv;
+ priv->sms_store_open = TRUE;
+
+ g_debug ("SMS store opened");
+
+ if (!priv->handle) return;
+
+ /* Register SMS handling callback */
+ lgsm_register_handler (priv->handle, GSMD_MSG_SMS, &sms_msghandler);
+
+ /* List all messages to move to journal */
+ lgsm_sms_list (priv->handle, GSMD_SMS_ALL);
+}
+
+static void
+dialer_init_gsmd (MokoDialer *dialer)
+{
+ static GSourceFuncs funcs = {
+ connection_source_prepare,
+ connection_source_check,
+ connection_source_dispatch,
+ NULL,
+ };
+
+ MokoDialerPrivate *priv;
+ priv = dialer->priv;
+
+ /* Get a gsmd handle */
+ if (!(priv->handle = lgsm_init (LGSMD_DEVICE_GSMD))) {
+ g_warning ("Error connecting to gsmd");
+ return;
+ }
+
+ /* Power the gsm modem up */
+ if (lgsm_phone_power (priv->handle, 1) == -1) {
+ g_warning ("Error powering up gsm modem");
+ lgsm_exit (priv->handle);
+ priv->handle = NULL;
+ return;
+ }
+
+ /* Add event handlers */
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_CALL, gsmd_eventhandler);
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_CLIP, gsmd_eventhandler);
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_SMS, gsmd_eventhandler);
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_DS, gsmd_eventhandler);
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_NETREG, gsmd_eventhandler);
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_OUT_STATUS, gsmd_eventhandler);
+ lgsm_register_handler (priv->handle, GSMD_MSG_NETWORK, &net_msghandler);
+
+ /* Register with network */
+ priv->registered = GSMD_NETREG_UNREG;
+ lgsm_netreg_register (priv->handle, "");
+
+ /* Get phone number */
+ lgsm_get_subscriber_num (priv->handle);
+
+ /* Start polling for events */
+ priv->source = (MokoDialerSource *)
+ g_source_new (&funcs, sizeof (MokoDialerSource));
+ priv->source->handle = priv->handle;
+ priv->source->pollfd.fd = lgsm_fd (priv->handle);
+ priv->source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
+ priv->source->pollfd.revents = 0;
+ g_source_add_poll ((GSource*)priv->source, &priv->source->pollfd);
+ g_source_attach ((GSource*)priv->source, NULL);
+}
+
+static void
moko_dialer_init (MokoDialer *dialer)
{
MokoDialerPrivate *priv;
@@ -744,7 +1082,7 @@
/* Initialise the contacts list */
//contact_init_contact_data (&(priv->data->g_contactlist));
- priv->connection = dialer_init_gsmd (dialer);
+ dialer_init_gsmd (dialer);
/* Set up the journal */
priv->journal = moko_journal_open_default ();
@@ -756,6 +1094,12 @@
else
g_debug ("Journal Loaded");
+ /* Get the SMS note store */
+ priv->sms_store = jana_ecal_store_new (JANA_COMPONENT_NOTE);
+ g_signal_connect (priv->sms_store, "opened",
+ G_CALLBACK (sms_store_opened_cb), dialer);
+ jana_store_open (priv->sms_store);
+
/* Load the contacts store */
priv->contacts = moko_contacts_get_default ();
@@ -791,3 +1135,95 @@
return dialer;
}
+
+gboolean
+moko_dialer_send_sms (MokoDialer *self, const gchar *number,
+ const gchar *message, gchar **uid, GError **error)
+{
+ MokoDialerPrivate *priv;
+ struct lgsm_sms sms;
+ gint msg_length, c;
+ gboolean ascii;
+ JanaNote *note;
+
+ g_assert (self && number && message);
+
+ priv = self->priv;
+
+ if (!priv->handle) {
+ /* Failed to connect to gsmd earlier */
+ *error = g_error_new (PHONE_KIT_DIALER_ERROR, PK_DIALER_ERROR_GSMD,
+ "Failed to connect to gsmd");
+ return FALSE;
+ }
+
+ if (!priv->sms_store_open) {
+ *error = g_error_new (PHONE_KIT_DIALER_ERROR, PK_DIALER_ERROR_SMS_STORE,
+ "SMS store not opened");
+ return FALSE;
+ }
+
+ /* Ask for delivery report */
+ sms.ask_ds = 1;
+
+ /* Set destination number */
+ if (strlen (number) > GSMD_ADDR_MAXLEN + 1) {
+ *error = g_error_new (PHONE_KIT_DIALER_ERROR, PK_DIALER_ERROR_NO_TOOLONG,
+ "Number too long");
+ return FALSE;
+ } else {
+ strcpy (sms.addr, number);
+ }
+
+ /* Set message */
+ /* Check if the text is ascii (and pack in 7 bits if so) */
+ ascii = TRUE;
+ for (c = 0; message[c] != '\0'; c++) {
+ if (((guint8)message[c]) > 0x7F) {
+ ascii = FALSE;
+ break;
+ }
+ }
+
+ /* TODO: Multi-part messages using UDH */
+ msg_length = strlen (message);
+ if ((ascii && (msg_length > 160)) || (msg_length > 140)) {
+ *error = g_error_new (PHONE_KIT_DIALER_ERROR, PK_DIALER_ERROR_SMS_TOOLONG,
+ "Message too long");
+ return FALSE;
+ }
+ if (ascii) {
+ packing_7bit_character (message, &sms);
+ } else {
+ sms.alpha = ALPHABET_8BIT;
+ sms.length = strlen (message);
+ strcpy ((gchar *)sms.data, message);
+ }
+
+ /* Send message */
+ lgsm_sms_send (priv->handle, &sms);
+
+ /* Store sent message in journal */
+ note = jana_ecal_note_new ();
+ jana_note_set_recipient (note, number);
+ jana_note_set_author (note, priv->own_number);
+
+ jana_note_set_body (note, message);
+ jana_component_set_categories (JANA_COMPONENT (note),
+ (const gchar *[]){ "Sending", NULL});
+
+ jana_store_add_component (priv->sms_store,
+ JANA_COMPONENT (note));
+ if (uid) *uid = jana_component_get_uid (JANA_COMPONENT (note));
+
+ if (priv->last_msg) {
+ g_warning ("Confirmation not received for last sent SMS, "
+ "delivery report will be lost.");
+ g_object_unref (priv->last_msg);
+ priv->last_msg = NULL;
+ }
+ priv->last_msg = note;
+
+ return TRUE;
+}
+
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.h 2007-11-22 15:51:30 UTC (rev 3478)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer.h 2007-11-22 18:47:13 UTC (rev 3479)
@@ -48,7 +48,10 @@
typedef enum {
PK_DIALER_ERROR_BUSY,
PK_DIALER_ERROR_GSMD,
- PK_DIALER_ERROR_NOT_CONNECTED
+ PK_DIALER_ERROR_NOT_CONNECTED,
+ PK_DIALER_ERROR_SMS_STORE,
+ PK_DIALER_ERROR_SMS_TOOLONG,
+ PK_DIALER_ERROR_NO_TOOLONG
} PhoneKitDialerError;
typedef struct _MokoDialer MokoDialer;
@@ -124,6 +127,10 @@
void
moko_dialer_rejected (MokoDialer *dialer);
+gboolean
+moko_dialer_send_sms (MokoDialer *self, const gchar *number,
+ const gchar *message, gchar **uid, GError **error);
+
G_END_DECLS
#endif /* _HAVE_MOKO_DIALER_H */
More information about the commitlog
mailing list