Querying N900 address book
by Leandro Lucarella on 2012- 07- 02 20:49 (updated on 2012- 07- 02 20:49)- with 0 comment(s)
Since there is not a lot of information on how to hack Maemo's address book to find some contacts with a mobile phone number, I'll share my findings.
Since setting up an environment to cross-compile for ARM is a big hassle, I decided to write this small test program in Python, (ab)using the wonderful ctypes module to avoid compiling at all.
Here is a very small script to use the (sadly proprietary) OSSO Addressbook library:
# This function get all the names in the address book with mobile phone numbers
# and print them. The code is Python but is as similar as C as possible.
def get_all_mobiles():
osso_ctx = osso_initialize("test_abook", "0.1", FALSE)
osso_abook_init(argc, argv, hash(osso_ctx))
roster = osso_abook_aggregator_get_default(NULL)
osso_abook_waitable_run(roster, g_main_context_default(), NULL)
contacts = osso_abook_aggregator_list_master_contacts(roster)
for contact in glist(contacts):
name = osso_abook_contact_get_display_name(contact)
# Somehow hackish way to get the EVC_TEL attributes
field = e_contact_field_id("mobile-phone")
attrs = e_contact_get_attributes(contact, field)
mobiles = []
for attr in glist(attrs):
types = e_vcard_attribute_get_param(attr, "TYPE")
for t in glist(types):
type = ctypes.c_char_p(t).value
# Remove this condition to get all phone numbers
# (not just mobile phones)
if type == "CELL":
mobiles.append(e_vcard_attribute_get_value(attr))
if mobiles:
print name, mobiles
# Python
import sys
import ctypes
# be sure to import gtk before calling osso_abook_init()
import gtk
import osso
osso_initialize = osso.Context
# Dynamic libraries bindings
glib = ctypes.CDLL('libglib-2.0.so.0')
g_main_context_default = glib.g_main_context_default
def glist(addr):
class _GList(ctypes.Structure):
_fields_ = [('data', ctypes.c_void_p),
('next', ctypes.c_void_p)]
l = addr
while l:
l = _GList.from_address(l)
yield l.data
l = l.next
osso_abook = ctypes.CDLL('libosso-abook-1.0.so.0')
osso_abook_init = osso_abook.osso_abook_init
osso_abook_aggregator_get_default = osso_abook.osso_abook_aggregator_get_default
osso_abook_waitable_run = osso_abook.osso_abook_waitable_run
osso_abook_aggregator_list_master_contacts = osso_abook.osso_abook_aggregator_list_master_contacts
osso_abook_contact_get_display_name = osso_abook.osso_abook_contact_get_display_name
osso_abook_contact_get_display_name.restype = ctypes.c_char_p
ebook = ctypes.CDLL('libebook-1.2.so.5')
e_contact_field_id = ebook.e_contact_field_id
e_contact_get_attributes = ebook.e_contact_get_attributes
e_vcard_attribute_get_value = ebook.e_vcard_attribute_get_value
e_vcard_attribute_get_value.restype = ctypes.c_char_p
e_vcard_attribute_get_param = ebook.e_vcard_attribute_get_param
# argc/argv adaption
argv_type = ctypes.c_char_p * len(sys.argv)
argv = ctypes.byref(argv_type(*sys.argv))
argc = ctypes.byref(ctypes.c_int(len(sys.argv)))
# C-ish aliases
NULL = None
FALSE = False
# Run the test
get_all_mobiles()
Here are some useful links I used as reference:
- http://wiki.maemo.org/PyMaemo/Accessing_APIs_without_Python_bindings
- http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Using_Generic_Platform_Components/Using_Address_Book_API
- http://maemo.org/api_refs/5.0/5.0-final/libebook/
- http://maemo.org/api_refs/5.0/5.0-final/libosso-abook/
- https://garage.maemo.org/plugins/scmsvn/viewcvs.php/releases/evolution-data-server/1.4.2.1-20091104/addressbook/libebook-dbus/?root=eds
- http://www.developer.nokia.com/Community/Discussion/showthread.php?200914-How-to-print-all-contact-names-in-N900-addressbook-Please-Help