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

olv at sita.openmoko.org olv at sita.openmoko.org
Thu Mar 6 16:47:00 CET 2008


Author: olv
Date: 2008-03-06 16:46:47 +0100 (Thu, 06 Mar 2008)
New Revision: 4176

Added:
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-marshal.list
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.c
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.h
Removed:
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms-marshal.list
Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.c
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.h
   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-listener.c
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.h
   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.h
   trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms.c
Log:
2008-03-06  Chia-I Wu  <olv at openmoko.com>

	Preliminary support for phonebook.  Sync phonebook from the SIM card
	on start up.  This is not a "perfect" solution.  See bug #1238.

	* src/phone-kit/moko-listener.c, src/phone-kit/moko-listener.h
	(moko_listener_on_read_phonebook): New function to listen to phonebook
	messages.

	* src/phone-kit/moko-pb.c, src/phone-kit/moko-pb.h: Preliminary
	phonebook support, MokoPb.

	* src/phone-kit/moko-network.c, src/phone-kit/moko-network.h: Listen
	to GSMD_MSG_PHONEBOOK messages.
	Add a new status, PK_NETWORK_POWERDOWN.  MokoNetwork is initially in
	this status.
	(phone_msghandler): Emit status change on receiving
	GSMD_PHONE_POWERUP.

	* src/common/moko-contacts.c, src/common/moko-contacts.h
	(moko_contacts_get_backend): New function to return the backend,
	EBook.

	* src/phone-kit/dialer-main.c: Sync phonebook from the SIM card on
	start up.

	* src/phone-kit/moko-sms-marshal.list: Renamed to ...

 	* src/phone-kit/moko-marshal.list: ... this.

	* src/phone-kit/moko-sms.c, src/phone-kit/Makefile.am: Updated.


Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog	2008-03-06 15:46:47 UTC (rev 4176)
@@ -1,3 +1,35 @@
+2008-03-06  Chia-I Wu  <olv at openmoko.com>
+
+	Preliminary support for phonebook.  Sync phonebook from the SIM card
+	on start up.  This is not a "perfect" solution.  See bug #1238.
+
+	* src/phone-kit/moko-listener.c, src/phone-kit/moko-listener.h
+	(moko_listener_on_read_phonebook): New function to listen to phonebook
+	messages.
+
+	* src/phone-kit/moko-pb.c, src/phone-kit/moko-pb.h: Preliminary
+	phonebook support, MokoPb.
+
+	* src/phone-kit/moko-network.c, src/phone-kit/moko-network.h: Listen
+	to GSMD_MSG_PHONEBOOK messages.
+	Add a new status, PK_NETWORK_POWERDOWN.  MokoNetwork is initially in
+	this status.
+	(phone_msghandler): Emit status change on receiving
+	GSMD_PHONE_POWERUP.
+
+	* src/common/moko-contacts.c, src/common/moko-contacts.h
+	(moko_contacts_get_backend): New function to return the backend,
+	EBook.
+
+	* src/phone-kit/dialer-main.c: Sync phonebook from the SIM card on
+	start up.
+
+	* src/phone-kit/moko-sms-marshal.list: Renamed to ...
+
+ 	* src/phone-kit/moko-marshal.list: ... this.
+
+	* src/phone-kit/moko-sms.c, src/phone-kit/Makefile.am: Updated.
+
 2008-03-03  Chris Lord  <chris at openedhand.com>
 
 	* src/phone-kit/moko-sms.c: (on_incoming_sms):

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.c	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.c	2008-03-06 15:46:47 UTC (rev 4176)
@@ -420,7 +420,6 @@
   EBook *book;
   EBookView *view;
   EBookQuery *query;
-  GList *contact, *c;
 
   priv = contacts->priv = MOKO_CONTACTS_GET_PRIVATE (contacts);
 
@@ -444,17 +443,6 @@
     g_warning ("Failed to open system book\n");
     return;
   }
-  if (!e_book_get_contacts (book, query, &contact, NULL))
-  {
-    g_warning ("Failed to get contacts from system book\n");
-    return;
-  }
-  
-  /* Go through the contacts, creating the contact structs, and entry structs*/
-  for (c = contact; c != NULL; c = c->next)
-  {
-    moko_contacts_add_contact (contacts, E_CONTACT (c->data));
-  }
 
   /* Connect to the ebookviews signals */
   if (e_book_get_book_view (book, query, NULL, 0, &view, NULL))
@@ -465,7 +453,10 @@
                     G_CALLBACK (on_ebook_contacts_changed), (gpointer)contacts);
     g_signal_connect (G_OBJECT (view), "contacts-removed",
                     G_CALLBACK (on_ebook_contacts_removed), (gpointer)contacts);
+
+    e_book_view_start (view);
   }
+  e_book_query_unref(query);
 }
 
 MokoContacts*
@@ -479,3 +470,11 @@
 
   return contacts;
 }
+
+gpointer
+moko_contacts_get_backend (MokoContacts *contacts)
+{
+  MokoContactsPrivate *priv = MOKO_CONTACTS_GET_PRIVATE (contacts);
+
+  return (gpointer) priv->book;
+}

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.h	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/common/moko-contacts.h	2008-03-06 15:46:47 UTC (rev 4176)
@@ -88,6 +88,9 @@
 MokoContacts*
 moko_contacts_get_default (void);
 
+gpointer
+moko_contacts_get_backend (MokoContacts *contacts);
+
 MokoContactEntry*
 moko_contacts_lookup (MokoContacts *contacts, const gchar *number);
 

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	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am	2008-03-06 15:46:47 UTC (rev 4176)
@@ -18,6 +18,7 @@
 	moko-talking.c moko-talking.h \
 	moko-alsa-volume-control.c moko-alsa-volume-control.h \
 	moko-alsa-volume-scale.c moko-alsa-volume-scale.h \
+	moko-pb.c moko-pb.h \
 	moko-pin.c moko-pin.h \
 	moko-mcc-dc.h \
 	$(BUILT_SOURCES)
@@ -29,32 +30,32 @@
 	$(LIBTOOL) --mode=execute $(DBUS_GLIB_BIN)/dbus-binding-tool --prefix=$(subst -,_,$*) --mode=glib-server --output=$@ $<
 	
 BUILT_SOURCES = moko-dialer-glue.h moko-sms-glue.h moko-network-glue.h \
-	moko-sms-marshal.h moko-sms-marshal.c
+	moko-marshal.h moko-marshal.c
 
-STAMP_FILES = stamp-moko-sms-marshal.h
+STAMP_FILES = stamp-moko-marshal.h
 
-moko-sms-marshal.h: stamp-moko-sms-marshal.h
+moko-marshal.h: stamp-moko-marshal.h
 	@true
-stamp-moko-sms-marshal.h: Makefile moko-sms-marshal.list
+stamp-moko-marshal.h: Makefile moko-marshal.list
 	$(GLIB_GENMARSHAL) \
-		--prefix=_moko_sms_marshal \
+		--prefix=_moko_marshal \
 		--header \
-	$(srcdir)/moko-sms-marshal.list > xgen-tmh && \
-	(cmp -s xgen-tmh moko-sms-marshal.h || \
-		cp -f xgen-tmh moko-sms-marshal.h) && \
+	$(srcdir)/moko-marshal.list > xgen-tmh && \
+	(cmp -s xgen-tmh moko-marshal.h || \
+		cp -f xgen-tmh moko-marshal.h) && \
 	rm -f xgen-tmh && \
 	echo timestamp > $(@F)
 
-moko-sms-marshal.c: Makefile moko-sms-marshal.list
-	(echo "#include \"moko-sms-marshal.h\"" ; \
+moko-marshal.c: Makefile moko-marshal.list
+	(echo "#include \"moko-marshal.h\"" ; \
 	 $(GLIB_GENMARSHAL) \
-		--prefix=_moko_sms_marshal \
+		--prefix=_moko_marshal \
 		--body \
-	 $(srcdir)/moko-sms-marshal.list ) > xgen-tmc && \
-	cp -f xgen-tmc moko-sms-marshal.c && \
+	 $(srcdir)/moko-marshal.list ) > xgen-tmc && \
+	cp -f xgen-tmc moko-marshal.c && \
 	rm -f xgen-tmc
 
 CLEANFILES = $(STAMP_FILES) $(BUILT_SOURCES)
 
-EXTRA_DIST = moko-dialer-dbus.xml moko-sms-dbus.xml moko-network-dbus.xml moko-sms-marshal.list
+EXTRA_DIST = moko-dialer-dbus.xml moko-sms-dbus.xml moko-network-dbus.xml moko-marshal.list
 

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	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/dialer-main.c	2008-03-06 15:46:47 UTC (rev 4176)
@@ -25,17 +25,23 @@
 #include <dbus/dbus-glib-bindings.h>
 #include <glib-object.h>
 #include <libnotify/notify.h>
+#include <libebook/e-book.h>
 
 #include "moko-network.h"
 #include "moko-dialer.h"
 #include "moko-sms.h"
+#include "moko-pb.h"
 
+#include "moko-contacts.h"
+
 #define PHONEKIT_NAMESPACE "org.openmoko.PhoneKit"
 #define NETWORK_PATH "/org/openmoko/PhoneKit/Network"
 #define DIALER_PATH "/org/openmoko/PhoneKit/Dialer"
 #define SMS_PATH "/org/openmoko/PhoneKit/Sms"
 #define DIALER_INTERFACE "org.openmoko.PhoneKit.Dialer"
 
+#define PK_X_PBENTRY "X-PHONEKIT-PBENTRY"
+
 static gchar *number = NULL;
 
 static void
@@ -60,17 +66,291 @@
 
 }
 
+static EContact *
+ebook_find (EBook *book, EContactField field, const gchar *val)
+{
+  EBookQuery *query;
+  GList *list;
+  EContact *contact = NULL;
+
+  query = e_book_query_field_test(field, E_BOOK_QUERY_IS, val);
+
+  if (!e_book_get_contacts (book, query, &list, NULL)) {
+    e_book_query_unref(query);
+
+    return NULL;
+  }
+
+  if (list) {
+    contact = list->data;
+    g_list_free(list);
+  }
+
+  e_book_query_unref(query);
+
+  return contact;
+}
+
+/*
+ * XXX EBook signals contacts-changed for imported phonebook entries.
+ *
+ * Keep a record of imported phonebook entries and do not remove PK_X_PBENTRY
+ * from them.
+ */
+static void
+ebook_pb_session_begin (EBook *book)
+{
+}
+
+static void
+ebook_pb_session_end (EBook *book)
+{
+}
+
+static void
+ebook_pb_session_add (EBook *book, const gchar *id)
+{
+  GHashTable *table;
+
+  table = g_object_get_data (G_OBJECT (book), "pk-newly-added");
+  if (!table) {
+    table = g_hash_table_new_full (g_str_hash, g_str_equal,
+	g_free, NULL);
+
+    g_object_set_data_full (G_OBJECT (book),
+	"pk-newly-added", table, (GDestroyNotify) g_hash_table_destroy);
+  }
+
+  g_hash_table_insert (table, g_strdup (id), GINT_TO_POINTER(1));
+}
+
+static gboolean
+ebook_pb_session_remove (EBook *book, const gchar *id)
+{
+  GHashTable *table;
+
+  table = g_object_get_data (G_OBJECT (book), "pk-newly-added");
+  if (!table)
+    return FALSE;
+
+  return g_hash_table_remove (table, id);
+}
+
+static void
+ebook_commit_contact(EBook *book, EBookStatus status, const char *id, gpointer data)
+{
+  EContact *contact;
+
+  e_book_get_contact (book, id, &contact, NULL);
+
+  if (contact) {
+    ebook_pb_session_add (book, id);
+    e_book_async_commit_contact (book, contact, NULL, NULL);
+  }
+}
+
+static void
+on_ebook_changed (EBookView  *view,
+                  GList      *contacts,
+		  EBook      *book)
+{
+  EVCard *evc;
+  EVCardAttribute *attr;
+  const gchar *uid;
+
+  for (; contacts; contacts = contacts->next) {
+    evc = E_VCARD (contacts->data);
+    attr = e_vcard_get_attribute (evc, PK_X_PBENTRY);
+
+    uid = e_contact_get_const (E_CONTACT (evc), E_CONTACT_UID);
+    if (ebook_pb_session_remove (book, uid))
+      continue;
+
+    if (attr) {
+      e_vcard_remove_attribute (evc, attr);
+      e_book_async_commit_contact (book, E_CONTACT (evc),
+	  NULL, NULL);
+    }
+  }
+}
+
+static void
+ebook_clear_pb (EBook *book)
+{
+  EBookQuery *query;
+  GList *contacts, *tmp_list;
+
+  query = e_book_query_vcard_field_exists (PK_X_PBENTRY);
+
+  if (!e_book_get_contacts (book, query, &contacts, NULL)) {
+    e_book_query_unref (query);
+
+    return;
+  }
+
+  if (!contacts) {
+    e_book_query_unref (query);
+
+    return;
+  }
+
+  for (tmp_list = contacts; tmp_list; tmp_list = tmp_list->next) {
+    EContact *contact = E_CONTACT (tmp_list->data);
+
+    tmp_list->data = (gpointer) e_contact_get_const (contact, E_CONTACT_UID);
+  }
+
+  e_book_async_remove_contacts (book, contacts, NULL, NULL);
+
+  g_list_free (contacts);
+  e_book_query_unref (query);
+}
+
+static void
+on_pb_status_changed (MokoPb *pb, GParamSpec *pspec, EBook *book)
+{
+  MokoPbStatus status;
+
+  g_object_get (G_OBJECT (pb), pspec->name, &status, NULL);
+
+  if (status == MOKO_PB_STATUS_READY)
+    ebook_pb_session_end (book);
+  else if (status == MOKO_PB_STATUS_BUSY)
+    ebook_pb_session_begin (book);
+}
+
+static void
+ebook_monitor (EBook *book, MokoPb *pb)
+{
+  EBookView *view;
+  EBookQuery *query;
+
+  query = e_book_query_vcard_field_exists (PK_X_PBENTRY);
+
+  if (e_book_get_book_view (book, query, NULL, 0, &view, NULL)) {
+    g_signal_connect (G_OBJECT (view), "contacts-changed",
+                    G_CALLBACK (on_ebook_changed), book);
+
+    g_signal_connect (G_OBJECT (pb), "notify::status",
+                    G_CALLBACK (on_pb_status_changed), book);
+
+    e_book_view_start (view);
+  }
+  e_book_query_unref(query);
+}
+
+static EBook *
+ebook_get (void)
+{
+  MokoContacts *m_contacts;
+  gpointer backend;
+
+  m_contacts = moko_contacts_get_default ();
+  if (!m_contacts)
+    return NULL;
+
+  backend = moko_contacts_get_backend (m_contacts);
+
+  return (E_IS_BOOK (backend)) ? backend : NULL;
+}
+
+static void
+on_pb_entry (MokoPb *pb, gint index, const gchar *number, const gchar *text, EBook *book)
+{
+  EContact *contact;
+  EVCard *evc;
+  EVCardAttribute *attr;
+  gchar *vcard;
+  gchar buf[8];
+
+  contact = ebook_find (book, E_CONTACT_FULL_NAME, text);
+  g_debug ("%s new entry: %s", (contact) ? "ignore" : "import", text);
+
+  if (contact)
+    return;
+
+  evc = e_vcard_new ();
+
+  attr = e_vcard_attribute_new (NULL, EVC_FN);
+  e_vcard_attribute_add_value (attr, text);
+  e_vcard_add_attribute (evc, attr);
+
+  attr = e_vcard_attribute_new (NULL, EVC_TEL);
+  e_vcard_attribute_add_value (attr, number);
+  e_vcard_add_attribute (evc, attr);
+
+  attr = e_vcard_attribute_new (NULL, PK_X_PBENTRY);
+  g_snprintf (buf, sizeof (buf), "%d", index);
+  e_vcard_attribute_add_value (attr, buf);
+  e_vcard_add_attribute (evc, attr);
+
+  vcard = e_vcard_to_string (evc, EVC_FORMAT_VCARD_30);
+  contact = e_contact_new_from_vcard (vcard);
+  g_free (vcard);
+  g_object_unref (evc);
+
+  e_book_async_add_contact (book, contact,
+      (EBookIdCallback) ebook_commit_contact, NULL);
+}
+
+static gboolean
+pb_import (MokoPb *pb)
+{
+  EBook *book;
+
+  book = ebook_get();
+  if (!book)
+    return FALSE;
+
+  ebook_monitor (book, pb);
+
+  g_signal_connect (pb, "entry", G_CALLBACK (on_pb_entry), book);
+  moko_pb_get_entries (pb, NULL);
+
+  return FALSE;
+}
+
+static void
+on_network_status_changed (MokoNetwork *network, PhoneKitNetworkStatus status, MokoPb *pb)
+{
+  /* we can't read phonebook right after modem power-on;
+   * wait some more time */
+  g_timeout_add_seconds (15, (GSourceFunc) pb_import, pb);
+  g_signal_handlers_disconnect_by_func (network,
+      on_network_status_changed, pb);
+}
+
+static void
+pb_sync (MokoPb *pb, MokoNetwork *network)
+{
+  EBook *book;
+  PhoneKitNetworkStatus status;
+
+  book = ebook_get ();
+  if (!book)
+    return;
+
+  ebook_clear_pb (book);
+
+  /* wait for modem power-on */
+  g_signal_connect (network, "status-changed",
+                    G_CALLBACK (on_network_status_changed), pb);
+  status = moko_network_get_status (network);
+  if (status != PK_NETWORK_POWERDOWN)
+    on_network_status_changed (network, status, pb);
+}
+
 int
 main (int argc, char **argv)
 {
   MokoNetwork *network;
   MokoDialer *dialer;
   MokoSms *sms;
+  MokoPb *pb;
   DBusGConnection *connection;
   DBusGProxy *proxy;
   GError *error = NULL;
   guint32 ret;
-  char *prog;
 
   /* initialise type system */
   g_type_init ();
@@ -125,6 +405,7 @@
   network = moko_network_get_default ();
   dialer = moko_dialer_get_default (network);
   sms = moko_sms_get_default (network);
+  pb = moko_pb_get_default (network);
 
   /* Add the objects onto the bus */
   dbus_g_connection_register_g_object (connection, 
@@ -137,6 +418,10 @@
                                        SMS_PATH,
                                        G_OBJECT (sms));
 
+  /* Sync phonebook */
+  /* XXX this is not the right place! */
+  pb_sync (pb, network);
+
   /* application object */
   g_set_application_name ("OpenMoko Dialer");
  

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.c	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.c	2008-03-06 15:46:47 UTC (rev 4176)
@@ -180,6 +180,16 @@
 }
 
 void
+moko_listener_on_read_phonebook (MokoListener *listener,
+                                 struct lgsm_handle *handle,
+                                 struct gsmd_phonebooks *gps)
+{
+  MokoListenerInterface *interface = MOKO_LISTENER_GET_INTERFACE (listener);
+  if (interface->on_read_phonebook)
+    interface->on_read_phonebook (listener, handle, gps);
+}
+
+void
 moko_listener_on_error (MokoListener *listener,
                         struct lgsm_handle *handle,
                         int cme, int cms)

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.h	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-listener.h	2008-03-06 15:46:47 UTC (rev 4176)
@@ -81,6 +81,9 @@
   void  (*on_send_sms)           (MokoListener *listener,
                                   struct lgsm_handle *handle,
                                   int result);
+  void  (*on_read_phonebook)     (MokoListener *listener,
+                                  struct lgsm_handle *handle,
+				  struct gsmd_phonebooks *gps);
   void  (*on_error)              (MokoListener *listener,
                                   struct lgsm_handle *handle,
                                   int cme, int cms);
@@ -125,6 +128,9 @@
 void  moko_listener_on_send_sms           (MokoListener *listener,
                                 struct lgsm_handle *handle,
                                 int result);
+void  moko_listener_on_read_phonebook     (MokoListener *listener,
+                                struct lgsm_handle *handle,
+				struct gsmd_phonebooks *gps);
 void  moko_listener_on_error              (MokoListener *listener,
                                 struct lgsm_handle *handle,
                                 int cme, int cms);

Copied: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-marshal.list (from rev 4174, trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms-marshal.list)
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms-marshal.list	2008-03-06 09:35:12 UTC (rev 4174)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-marshal.list	2008-03-06 15:46:47 UTC (rev 4176)
@@ -0,0 +1 @@
+VOID:INT,STRING,STRING

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-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.c	2008-03-06 15:46:47 UTC (rev 4176)
@@ -84,6 +84,7 @@
   int                       lac;
   
   /* Registration variables */
+  gboolean                  powered;
   enum lgsm_netreg_state    registered;
   gboolean                  pin_requested;
   
@@ -735,6 +736,11 @@
       {
         /* phone has been powered on successfully */
         g_debug ("Phone powered on");
+
+        priv->powered = TRUE;
+        g_signal_emit (network, signals[STATUS_CHANGED], 0,
+                       moko_network_get_status (network));
+
         /* Register with network */
         priv->registered = GSMD_NETREG_UNREG;
         lgsm_netreg_register (priv->handle, "");
@@ -775,6 +781,30 @@
   return 0;
 }
 
+static int
+pb_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
+{
+  GList *l;
+  MokoNetwork *network = moko_network_get_default ();
+  MokoNetworkPrivate *priv = network->priv;
+  struct gsmd_phonebooks *gps;
+
+  switch (gmh->msg_subtype) {
+    case GSMD_PHONEBOOK_READRG:
+      gps = (struct gsmd_phonebooks *) ((char *)gmh + sizeof(*gmh));
+      for (l = priv->listeners; l; l = l->next) {
+	moko_listener_on_read_phonebook (MOKO_LISTENER (l->data),
+	    priv->handle, gps);
+      }
+      break;
+    default:
+      g_warning ("Unhandled phonebook event type = %d\n", gmh->msg_subtype);
+      break;
+   };
+
+  return 0;
+}
+
 static gboolean
 io_func (GIOChannel *source, GIOCondition condition, MokoNetwork *self)
 {
@@ -847,6 +877,7 @@
   lgsm_register_handler (priv->handle, GSMD_MSG_PHONE, phone_msghandler);
   lgsm_register_handler (priv->handle, GSMD_MSG_SMS, sms_msghandler);
   lgsm_register_handler (priv->handle, GSMD_MSG_PIN, pin_msghandler);
+  lgsm_register_handler (priv->handle, GSMD_MSG_PHONEBOOK, pb_msghandler);
 
   /* Power the gsm modem up - this should trigger a PIN requiest if needed */
   lgsm_phone_power (priv->handle, 1);
@@ -920,6 +951,9 @@
 {
   MokoNetworkPrivate *priv = network->priv;
   
+  if (!priv->powered)
+    return PK_NETWORK_POWERDOWN;
+
   switch (priv->registered) {
     default:
     case GSMD_NETREG_UNREG:

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.h	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-network.h	2008-03-06 15:46:47 UTC (rev 4176)
@@ -61,6 +61,7 @@
 } PhoneKitNetworkError;
 
 typedef enum {
+  PK_NETWORK_POWERDOWN,
   PK_NETWORK_UNREGISTERED,
   PK_NETWORK_DENIED,
   PK_NETWORK_REGISTERED_HOME,

Added: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.c	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.c	2008-03-06 15:46:47 UTC (rev 4176)
@@ -0,0 +1,335 @@
+/*
+ * Copyright (C) 2008 by OpenMoko, Inc.
+ * Written by Chia-I Wu <olv at openmoko.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "moko-listener.h"
+#include "moko-pb.h"
+#include "moko-marshal.h"
+
+#include <libgsmd/libgsmd.h>
+#include <libgsmd/misc.h>
+#include <libgsmd/phonebook.h>
+
+typedef struct _MokoPbPrivate MokoPbPrivate;
+
+enum {
+  ENTRY,
+  LAST_SIGNAL
+};
+
+enum {
+  PROP_STATUS = 1,
+  PROP_NETWORK,
+  PROP_TIMEOUT,
+};
+
+struct _MokoPbPrivate
+{
+  MokoNetwork *network;
+  gint timeout;
+
+  MokoPbStatus status;
+  gint pb_first, pb_last;
+  guint pb_timeout_id;
+};
+
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_PB, MokoPbPrivate))
+
+static guint pb_signals[LAST_SIGNAL] = { 0 };
+
+static void moko_pb_iface_init (MokoListenerInterface *iface, gpointer iface_data);
+
+G_DEFINE_TYPE_EXTENDED (MokoPb, moko_pb, G_TYPE_OBJECT, 0,
+    G_IMPLEMENT_INTERFACE (MOKO_TYPE_LISTENER, moko_pb_iface_init));
+
+static void
+moko_pb_dispose (GObject *obj)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (obj);
+
+  if (priv->network) {
+    moko_network_remove_listener (priv->network, MOKO_LISTENER (obj));
+    g_object_unref (priv->network);
+
+    priv->network = NULL;
+  }
+
+  G_OBJECT_CLASS (moko_pb_parent_class)->dispose (obj);
+}
+
+static void
+moko_pb_finalize (GObject *obj)
+{
+  G_OBJECT_CLASS (moko_pb_parent_class)->finalize (obj);
+}
+
+static void
+moko_pb_get_property (GObject *object, guint property_id,
+                      GValue *value, GParamSpec *pspec)
+{
+  switch (property_id) {
+    case PROP_STATUS:
+      g_value_set_int (value, moko_pb_get_status (MOKO_PB (object)));
+      break;
+    case PROP_TIMEOUT:
+      g_value_set_int (value, moko_pb_get_timeout (MOKO_PB (object)));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+  }
+}
+
+static void
+moko_pb_set_property (GObject *object, guint property_id,
+                      const GValue *value, GParamSpec *pspec)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (object);
+
+  switch (property_id) {
+    case PROP_NETWORK:
+      if (priv->network) {
+        moko_network_remove_listener (priv->network, MOKO_LISTENER (object));
+        g_object_unref (priv->network);
+      }
+      priv->network = g_value_dup_object (value);
+      moko_network_add_listener (priv->network, MOKO_LISTENER (object));
+      break;
+    case PROP_TIMEOUT:
+      priv->timeout = g_value_get_uint (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+  }
+}
+
+static void
+moko_pb_class_init (MokoPbClass *klass)
+{
+  GObjectClass* obj_class = G_OBJECT_CLASS (klass);
+
+  obj_class->get_property = moko_pb_get_property;
+  obj_class->set_property = moko_pb_set_property;
+  obj_class->dispose = moko_pb_dispose;
+  obj_class->finalize = moko_pb_finalize;
+
+  g_object_class_install_property (obj_class,
+                                   PROP_STATUS,
+                                   g_param_spec_int (
+                                   "status",
+                                   "PB status",
+                                   "The current PB status.",
+                                   MOKO_PB_STATUS_READY,
+                                   MOKO_PB_STATUS_BUSY,
+                                   MOKO_PB_STATUS_READY,
+                                   G_PARAM_READABLE));
+
+  g_object_class_install_property (obj_class,
+                                   PROP_NETWORK,
+                                   g_param_spec_object (
+                                   "network",
+                                   "MokoNetwork *",
+                                   "The parent MokoNetwork object.",
+                                   MOKO_TYPE_NETWORK,
+                                   G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (obj_class,
+                                   PROP_TIMEOUT,
+                                   g_param_spec_uint (
+                                   "timeout",
+                                   "Timeout",
+                                   "Timeout for AT+CPBR.",
+				   0, G_MAXUINT,
+				   20,
+                                   G_PARAM_WRITABLE |
+				   G_PARAM_READABLE));
+
+  pb_signals[ENTRY] =
+    g_signal_new ("entry",
+		  G_TYPE_FROM_CLASS (klass),
+		  G_SIGNAL_RUN_LAST,
+		  G_STRUCT_OFFSET (MokoPbClass, entry),
+		  NULL, NULL,
+		  _moko_marshal_VOID__INT_STRING_STRING,
+		  G_TYPE_NONE, 3,
+		  G_TYPE_INT,
+		  G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
+		  G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
+
+  g_type_class_add_private (klass, sizeof(MokoPbPrivate));
+}
+
+static void
+moko_pb_init (MokoPb *pb)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+
+  priv->pb_first = 0;
+  priv->pb_last = 0;
+  priv->pb_timeout_id = 0;
+}
+
+MokoPb *
+moko_pb_get_default (MokoNetwork *network)
+{
+  static MokoPb *pb;
+  MokoPbPrivate *priv;
+
+  if (pb)
+    return pb;
+
+  pb = g_object_new (MOKO_TYPE_PB,
+      "network", network,
+      "timeout", 20,
+      NULL);
+
+  priv = GET_PRIVATE (pb);
+
+  /* XXX */
+  priv->pb_first = 1;
+  priv->pb_last = 255;
+
+  return pb;
+}
+
+MokoPbStatus
+moko_pb_get_status (MokoPb *pb)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+
+  return priv->status;
+}
+
+guint
+moko_pb_get_timeout (MokoPb *pb)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+
+  return priv->timeout;
+}
+
+void
+moko_pb_get_range (MokoPb *pb, int *first, int *last)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+
+  if (first)
+    *first = priv->pb_first;
+
+  if (last)
+    *last = priv->pb_last;
+}
+
+static void
+moko_pb_get_entries_fini (MokoPb *pb)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+
+  if (priv->pb_timeout_id) {
+    g_source_remove (priv->pb_timeout_id);
+    priv->pb_timeout_id = 0;
+  }
+
+  if (priv->status != MOKO_PB_STATUS_READY) {
+    priv->status = MOKO_PB_STATUS_READY;
+    g_object_notify (G_OBJECT (pb), "status");
+  }
+}
+
+static gboolean
+moko_pb_get_entries_timeout (gpointer data)
+{
+  g_warning ("Reading phonebook entries timeout");
+
+  moko_pb_get_entries_fini (data);
+
+  return FALSE;
+}
+
+void
+moko_pb_get_entries (MokoPb *pb, const gchar *storage)
+{
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+  struct lgsm_handle *handle;
+  struct lgsm_phonebook_readrg prr;
+
+  if (priv->status != MOKO_PB_STATUS_READY)
+    return;
+
+  if (!moko_network_get_lgsm_handle (priv->network, &handle, NULL))
+    return;
+
+  priv->status = MOKO_PB_STATUS_BUSY;
+  g_object_notify (G_OBJECT (pb), "status");
+
+  moko_pb_get_range (pb, &prr.index1, &prr.index2);
+  lgsm_pb_read_entries (handle, &prr);
+
+  priv->pb_timeout_id = g_timeout_add_seconds (priv->timeout,
+		  moko_pb_get_entries_timeout, pb);
+}
+
+static void
+moko_pb_on_read_phonebook (MokoListener *listener,
+                           struct lgsm_handle *handle,
+                           struct gsmd_phonebooks *gps)
+{
+  MokoPb *pb = MOKO_PB (listener);
+  MokoPbPrivate *priv = GET_PRIVATE (pb);
+
+  if (priv->status != MOKO_PB_STATUS_BUSY) {
+    g_warning ("strayed phonebook entry");
+
+    return;
+  }
+
+  if (gps->pb.index < priv->pb_first ||
+      gps->pb.index > priv->pb_last) {
+    g_warning ("index %d is out of range", gps->pb.index);
+
+    return;
+  }
+
+  if (!g_utf8_validate (gps->pb.numb, -1, NULL)) {
+    g_warning ("entry %d has invalid number\n", gps->pb.index);
+
+    return;
+  }
+
+  if (!g_utf8_validate (gps->pb.text, -1, NULL)) {
+    g_warning ("entry %d has invalid text\n", gps->pb.index);
+
+    return;
+  }
+
+  g_signal_emit (MOKO_PB (pb), pb_signals[ENTRY], 0,
+      gps->pb.index, gps->pb.numb, gps->pb.text);
+
+  /* XXX is_last is not reliable */
+  /*
+  if (gps->is_last)
+    moko_pb_get_entries_fini (pb);
+    */
+}
+
+static void
+moko_pb_iface_init (MokoListenerInterface *iface, gpointer iface_data)
+{
+  iface->on_read_phonebook = moko_pb_on_read_phonebook;
+}

Added: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.h	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-pb.h	2008-03-06 15:46:47 UTC (rev 4176)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2008 by OpenMoko, Inc.
+ * Written by Chia-I Wu <olv at openmoko.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include "moko-network.h"
+
+#ifndef _MOKO_PB_H_
+#define _MOKO_PB_H_
+
+G_BEGIN_DECLS
+
+#define MOKO_TYPE_PB		(moko_pb_get_type ())
+#define MOKO_PB(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), MOKO_TYPE_PB, MokoPb))
+#define MOKO_PB_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), MOKO_TYPE_PB, MokoPbClass))
+#define MOKO_IS_PB(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), MOKO_TYPE_PB))
+#define MOKO_IS_PB_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), MOKO_TYPE_PB))
+#define MOKO_PB_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), MOKO_TYPE_PB, MokoPbClass))
+
+typedef struct _MokoPb MokoPb;
+typedef struct _MokoPbClass MokoPbClass;
+
+struct _MokoPb
+{
+  GObject parent_object;
+};
+
+struct _MokoPbClass
+{
+  GObjectClass parent_class;
+
+  void (*entry) (MokoPb *pb, int index, const gchar *number, const gchar *text);
+};
+
+typedef enum _MokoPbStatus MokoPbStatus;
+
+enum _MokoPbStatus {
+  MOKO_PB_STATUS_READY,
+  MOKO_PB_STATUS_BUSY,
+};
+
+GType moko_pb_get_type (void) G_GNUC_CONST;
+
+MokoPb *
+moko_pb_get_default (MokoNetwork *network);
+
+MokoPbStatus
+moko_pb_get_status (MokoPb *pb);
+
+guint
+moko_pb_get_timeout (MokoPb *pb);
+
+void
+moko_pb_get_range (MokoPb *pb, int *first, int *last);
+
+void
+moko_pb_get_entries (MokoPb *pb, const gchar *storage);
+
+G_END_DECLS
+
+#endif /* _MOKO_PB_H_ */

Deleted: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms-marshal.list
===================================================================

Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms.c	2008-03-06 15:44:32 UTC (rev 4175)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-sms.c	2008-03-06 15:46:47 UTC (rev 4176)
@@ -35,7 +35,7 @@
 #include "moko-network.h"
 #include "moko-listener.h"
 #include "moko-notify.h"
-#include "moko-sms-marshal.h"
+#include "moko-marshal.h"
 
 static void
 listener_interface_init (gpointer g_iface, gpointer iface_data);





More information about the commitlog mailing list