r1744 - trunk/src/target/OM-2007/openmoko-libs/libmokogsmd

mickey at sita.openmoko.org mickey at sita.openmoko.org
Sat Apr 14 00:43:12 CEST 2007


Author: mickey
Date: 2007-04-14 00:43:12 +0200 (Sat, 14 Apr 2007)
New Revision: 1744

Modified:
   trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.c
   trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.h
Log:
libmokogsmd: create first object signals.
NOTE: getting e.g. the gsm signal strength in an applet is now down to 2 lines:
   MokoGsmdConnection* gsm = moko_gsmd_connection_new();
   g_signal_connect( G_OBJECT(gsm), "signal-strength-changed", G_CALLBACK(<showit>), 0 );


Modified: trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.c
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.c	2007-04-13 22:31:20 UTC (rev 1743)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.c	2007-04-13 22:43:12 UTC (rev 1744)
@@ -19,6 +19,9 @@
 
 #include <libgsmd/libgsmd.h>
 
+#include <string.h>
+#include <errno.h>
+
 #undef DEBUG_THIS_FILE
 #define DEBUG_THIS_FILE
 
@@ -28,25 +31,66 @@
 #define moko_debug(fmt,...)
 #endif
 
-G_DEFINE_TYPE (MokoGsmdConnection, moko_gsmd_connection, G_TYPE_OBJECT);
+G_DEFINE_TYPE (MokoGsmdConnection, moko_gsmd_connection, G_TYPE_OBJECT)
 
 #define GSMD_CONNECTION_GET_PRIVATE(o)   (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_GSMD_CONNECTION, MokoGsmdConnectionPrivate))
 
+/* ugly temp. hack until libgsmd features a user_data pointer for its callbacks
+   Note that this effectively means you can only have one MokoGsmdConnection object
+   per process (which should be ok anyway...) :M: */
+static MokoGsmdConnection* moko_gsmd_connection_instance = 0;
+
+typedef struct _MokoGsmdConnectionSource
+{
+    GSource source;
+    GPollFD pollfd;
+    struct lgsm_handle* handle;
+} MokoGsmdConnectionSource;
+
 typedef struct _MokoGsmdConnectionPrivate
 {
     struct lgsm_handle* handle;
-    GPollFD fd;
+    MokoGsmdConnectionSource* source;
 } MokoGsmdConnectionPrivate;
 
+/* signals */
+enum {
+    SIGNAL_GSMD_EVT_IN_CALL        = 1,    /* Incoming call */
+    SIGNAL_GSMD_EVT_IN_SMS         = 2,    /* Incoming SMS */
+    SIGNAL_GSMD_EVT_IN_GPRS        = 3,    /* Network initiated GPRS */
+    SIGNAL_GSMD_EVT_IN_CLIP        = 4,    /* Incoming CLIP */
+    SIGNAL_GSMD_EVT_NETREG         = 5,    /* Network (un)registration event */
+    SIGNAL_GSMD_EVT_SIGNAL         = 6,    /* Signal quality event */
+    SIGNAL_GSMD_EVT_PIN            = 7,    /* Modem is waiting for some PIN/PUK */
+    SIGNAL_GSMD_EVT_OUT_STATUS     = 8,    /* Outgoing call status */
+    SIGNAL_GSMD_EVT_OUT_COLP       = 9,    /* Outgoing COLP */
+    SIGNAL_GSMD_EVT_CALL_WAIT      = 10,   /* Call Waiting */
+    SIGNAL_GSMD_EVT_TIMEZONE       = 11,   /* Timezone change */
+    SIGNAL_GSMD_EVT_SUBSCRIPTIONS  = 12,   /* To which events are we subscribed to */
+    SIGNAL_GSMD_EVT_CIPHER         = 13,   /* Chiphering Information */
+    LAST_SIGNAL,
+};
+static guint moko_gsmd_connection_signals[LAST_SIGNAL] = { 0 };
+
 /* parent class pointer */
 GObjectClass* parent_class = NULL;
 
 /* forward declarations */
-/* ... */
+static gboolean _moko_gsmd_connection_source_prepare( MokoGsmdConnectionSource* self, gint* timeout );
+static gboolean _moko_gsmd_connection_source_check( MokoGsmdConnectionSource* self );
+static gboolean _moko_gsmd_connection_source_check( MokoGsmdConnectionSource* self );
+static int _moko_gsmd_connection_eventhandler(struct lgsm_handle *lh, int evt_type, struct gsmd_evt_auxdata *aux);
 
+/* class definition */
+
 static void
 moko_gsmd_connection_dispose(GObject* object)
 {
+    moko_debug( "dispose" );
+    MokoGsmdConnectionPrivate* priv = GSMD_CONNECTION_GET_PRIVATE( MOKO_GSMD_CONNECTION( object ) );
+    g_source_destroy( (GSource*) priv->source );
+    lgsm_exit( priv->handle );
+    // call parent destructor
     if (G_OBJECT_CLASS (moko_gsmd_connection_parent_class)->dispose)
         G_OBJECT_CLASS (moko_gsmd_connection_parent_class)->dispose (object);
 }
@@ -55,7 +99,6 @@
 moko_gsmd_connection_finalize(GObject* object)
 {
     moko_debug( "finalize" );
-    //TODO remove source from mainloop and cleanup w/ libgsmd
     G_OBJECT_CLASS (moko_gsmd_connection_parent_class)->finalize (object);
 }
 
@@ -73,6 +116,36 @@
     object_class->dispose = moko_gsmd_connection_dispose;
     object_class->finalize = moko_gsmd_connection_finalize;
 
+    /* register signals */
+    moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_CALL] = g_signal_new
+        ("incoming-call",
+        G_TYPE_FROM_CLASS (klass),
+        G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+        NULL,
+        NULL,
+        NULL,
+        g_cclosure_marshal_VOID__INT,
+        G_TYPE_NONE,
+        1,
+        G_TYPE_INT,
+        NULL );
+
+    //TODO add SIGNAL_GSMD_EVT_IN_SMS once libgsmd has it
+    //TODO add SIGNAL_GSMD_EVT_IN_GPRS once libgsmd has it
+
+    moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_SIGNAL] = g_signal_new
+        ("signal-strength-changed",
+        G_TYPE_FROM_CLASS (klass),
+        G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+        NULL,
+        NULL,
+        NULL,
+        g_cclosure_marshal_VOID__INT,
+        G_TYPE_NONE,
+        1,
+        G_TYPE_INT,
+        NULL);
+
     /* virtual methods */
 
     /* install properties */
@@ -84,10 +157,75 @@
     return g_object_new(MOKO_TYPE_GSMD_CONNECTION, NULL);
 }
 
+gboolean _moko_gsmd_connection_source_prepare( MokoGsmdConnectionSource* self, gint* timeout )
+{
+    moko_debug( "moko_gsmd_connection_source_prepare" );
+    return FALSE;
+}
+
+gboolean _moko_gsmd_connection_source_check( MokoGsmdConnectionSource* self )
+{
+    moko_debug( "moko_gsmd_connection_source_check" );
+    return self->pollfd.revents & G_IO_IN;
+}
+
+gboolean _moko_gsmd_connection_source_dispatch( MokoGsmdConnectionSource* self, GSourceFunc callback, gpointer data )
+{
+    moko_debug( "moko_gsmd_connection_source_dispatch" );
+    char buf[1025];
+    int size = read( self->pollfd.fd, &buf, sizeof( buf ) );
+    if ( size < 0 )
+        g_warning( "moko_gsmd_connection_source_dispatch: read error from libgsmd: %s", strerror( errno ) );
+    else
+        lgsm_handle_packet( self->handle, buf, size );
+    return TRUE;
+}
+
+int _moko_gsmd_connection_eventhandler(struct lgsm_handle *lh, int evt_type, struct gsmd_evt_auxdata *aux)
+{
+    moko_debug( "moko_gsmd_connection_eventhandler type = %d", evt_type );
+    MokoGsmdConnection* self = moko_gsmd_connection_instance; // temporary (see note above)
+    switch(evt_type)
+    {
+        case GSMD_EVT_IN_CALL:
+            g_signal_emit( G_OBJECT(self), moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_CALL], 0 ); break;
+        case GSMD_EVT_IN_SMS:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_SMS]; break;
+        case GSMD_EVT_IN_GPRS:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_GPRS]; break;
+        case GSMD_EVT_IN_CLIP:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_CLIP]; break;
+        case GSMD_EVT_NETREG:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_NETREG]; break;
+        case GSMD_EVT_SIGNAL:
+            moko_debug( "-- signal strength = %d", aux->u.signal.sigq.rssi );
+            g_signal_emit( G_OBJECT(self), moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_SIGNAL], 0, aux->u.signal.sigq.rssi ); break;
+        case GSMD_EVT_PIN:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_PIN]; break;
+        case GSMD_EVT_OUT_STATUS:
+            //emit = moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_OUT_STATUS]; break;
+        case GSMD_EVT_OUT_COLP:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_OUT_COLP]; break;
+        case GSMD_EVT_CALL_WAIT:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_CALL_WAIT]; break;
+        case GSMD_EVT_TIMEZONE:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_TIMEZONE]; break;
+        case GSMD_EVT_SUBSCRIPTIONS:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_SUBSCRIPTIONS]; break;
+        case GSMD_EVT_CIPHER:
+            //moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_CIPHER]; break;
+        default: g_assert( FALSE ); // fail here on unknown event
+    }
+    return 0;
+}
+
 static void
 moko_gsmd_connection_init(MokoGsmdConnection* self)
 {
-    moko_debug( "moko_gsmd_connection_init()" );
+    moko_debug( "moko_gsmd_connection_init" );
+    g_assert( !moko_gsmd_connection_instance); // fail here on more than one MokoGsmdConnection object per process
+    moko_gsmd_connection_instance = self;
+
     MokoGsmdConnectionPrivate* priv = GSMD_CONNECTION_GET_PRIVATE(self);
 
     priv->handle = lgsm_init( LGSMD_DEVICE_GSMD );
@@ -99,4 +237,28 @@
     {
         moko_debug( "-- connected to gsmd (socketfd = %d)", lgsm_fd( priv->handle ) );
     }
+
+    static GSourceFuncs funcs = {
+        _moko_gsmd_connection_source_prepare,
+        _moko_gsmd_connection_source_check,
+        _moko_gsmd_connection_source_dispatch,
+        NULL,
+    };
+
+    priv->source = (MokoGsmdConnectionSource*) g_source_new( &funcs, sizeof( MokoGsmdConnectionSource) );
+    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( priv->source, &priv->source->pollfd );
+    g_source_attach( priv->source, NULL );
+
+    int rc = 0;
+    for ( int i = GSMD_EVT_IN_CALL; i < __NUM_GSMD_EVT; ++i )
+    {
+        rc |= lgsm_evt_handler_register( priv->handle, i, _moko_gsmd_connection_eventhandler );
+        moko_debug( "-- registered for event %d, return code %d", i, rc );
+    }
+
 }
+

Modified: trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.h
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.h	2007-04-13 22:31:20 UTC (rev 1743)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokogsmd/moko-gsmd-connection.h	2007-04-13 22:43:12 UTC (rev 1744)
@@ -40,6 +40,10 @@
 GType moko_gsmd_connection_get_type();
 MokoGsmdConnection* moko_gsmd_connection_new();
 
+/* signals */
+void moko_gsmd_connection_incoming_call(MokoGsmdConnection* self, int type);
+void moko_gsmd_connection_signal_strength_changed(MokoGsmdConnection* self, int strength);
+
 G_END_DECLS
 
 #endif // _MOKO_GSMD_CONNECTION_H_





More information about the commitlog mailing list