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