r3866 - in trunk/src/target/OM-2007.2/applications/openmoko-dialer2: . src/phone-kit

chris at sita.openmoko.org chris at sita.openmoko.org
Thu Jan 17 15:46:11 CET 2008


Author: chris
Date: 2008-01-17 15:46:10 +0100 (Thu, 17 Jan 2008)
New Revision: 3866

Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.c
Log:
        * src/phone-kit/moko-network.c: (moko_network_dispose), (io_func),
        (network_init_gsmd):
        Use GIOChannel instead of GSource for polling (simplifies code)


Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog	2008-01-17 12:39:04 UTC (rev 3865)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog	2008-01-17 14:46:10 UTC (rev 3866)
@@ -1,5 +1,11 @@
 2008-01-17  Chris Lord  <chris at openedhand.com>
 
+	* src/phone-kit/moko-network.c: (moko_network_dispose), (io_func),
+	(network_init_gsmd):
+	Use GIOChannel instead of GSource for polling (simplifies code)
+
+2008-01-17  Chris Lord  <chris at openedhand.com>
+
 	* src/phone-kit/moko-talking.c: (moko_talking_init):
 	Make the volume slider control the 'Headphone' mixer, fixes bug #394
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.c	2008-01-17 12:39:04 UTC (rev 3865)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.c	2008-01-17 14:46:10 UTC (rev 3866)
@@ -59,12 +59,6 @@
 
 static guint signals[LAST_SIGNAL] = {0, };
 
-typedef struct {
-  GSource source;
-  GPollFD pollfd;
-  struct lgsm_handle *handle;
-} MokoNetworkSource;
-
 struct _MokoNetworkPrivate
 {
   gchar                     *own_number;
@@ -80,8 +74,8 @@
   gint                      retry_imsi_n;
 
   /* gsmd connection variables */
+  GIOChannel                *channel;
   struct lgsm_handle        *handle;
-  MokoNetworkSource         *source;
   int                       lac;
   
   /* Registration variables */
@@ -333,16 +327,17 @@
 
   stop_retrying (MOKO_NETWORK (object));
 
+  if (priv->channel) {
+    g_io_channel_shutdown (priv->channel, FALSE, NULL);
+    g_io_channel_unref (priv->channel);
+    priv->channel = NULL;
+  }
+
   if (priv->handle) {
     lgsm_exit (priv->handle);
     priv->handle = NULL;
   }
 
-  if (priv->source) {
-    g_source_destroy ((GSource *)priv->source);
-    priv->source = NULL;
-  }
-
   G_OBJECT_CLASS (moko_network_parent_class)->dispose (object);
 }
 
@@ -687,37 +682,43 @@
   return 0;
 }
 
-static gboolean 
-connection_source_prepare (GSource* self, gint* timeout)
-{
-    return FALSE;
-}
-
 static gboolean
-connection_source_check (GSource* source)
+io_func (GIOChannel *source, GIOCondition condition, MokoNetwork *self)
 {
-  MokoNetworkSource *self = (MokoNetworkSource *)source;
-  return self->pollfd.revents & G_IO_IN;
-}
+  gchar buf[1025];
+  gsize length;
 
-static gboolean 
-connection_source_dispatch (GSource *source, GSourceFunc callback,
-                            gpointer data)
-{
-  char buf[1025];
-  int size;
+  MokoNetworkPrivate *priv = self->priv;
+  GError *error = NULL;
+  
+  g_debug ("Start IO");
+  
+  switch (condition) {
+    case G_IO_IN :
+      if (g_io_channel_read_chars (source, buf, sizeof (buf), &length, &error)
+          == G_IO_STATUS_NORMAL) {
+        lgsm_handle_packet (priv->handle, buf, length);
+      } else {
+        g_warning ("Error reading from source: %s", error->message);
+        g_error_free (error);
+      }
+      break;
 
-  MokoNetworkSource *self = (MokoNetworkSource *)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 */
+    case G_IO_ERR :
+    case G_IO_NVAL :
+      g_warning ("Encountered an error, stopping IO watch");
       return FALSE;
-    lgsm_handle_packet (self->handle, buf, size);
+    
+    case G_IO_HUP :
+      g_warning ("Gsmd hung up - TODO: Reconnect/restart gsmd?");
+      return FALSE;
+
+    default :
+      g_warning ("Unhandled IO condition");
+      break;
   }
+    
+  g_debug ("End IO");
 
   return TRUE;
 }
@@ -725,14 +726,8 @@
 static void
 network_init_gsmd (MokoNetwork *network)
 {
-  static GSourceFuncs funcs = {
-    connection_source_prepare,
-    connection_source_check,
-    connection_source_dispatch,
-    NULL,
-  };
-
   MokoNetworkPrivate *priv;
+  
   priv = network->priv;
   
   /* Add ourselves as an event listener */
@@ -764,14 +759,11 @@
   lgsm_phone_power (priv->handle, 1);
 
   /* Start polling for events */
-  priv->source = (MokoNetworkSource *)
-    g_source_new (&funcs, sizeof (MokoNetworkSource));
-  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);
+  priv->channel = g_io_channel_unix_new (lgsm_fd (priv->handle));
+  g_io_channel_set_encoding (priv->channel, NULL, NULL);
+  g_io_channel_set_buffered (priv->channel, FALSE);
+  g_io_add_watch (priv->channel, G_IO_IN | G_IO_ERR | G_IO_NVAL | G_IO_HUP,
+                  (GIOFunc)io_func, network);
 }
 
 static void





More information about the commitlog mailing list