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