From 6096697e8607c2330f955d3a74e4d0fa87e47310 Mon Sep 17 00:00:00 2001
From: Jose Luis Perez Diez <jluis@escomposlinux.org>
Date: Fri, 2 Oct 2009 12:40:48 +0200
Subject: [PATCH] Added support to opimd contacts

---
 src/zhone |  108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 103 insertions(+), 5 deletions(-)

diff --git a/src/zhone b/src/zhone
index 992e1fb..04d4f23 100755
--- a/src/zhone
+++ b/src/zhone
@@ -667,12 +667,25 @@ class pyphone_contacts(edje_group):
         self.selected = None
 
         self.part_text_set( "label_action_dial", _("dial") )
+    
+    def Opim( self, reference ):
+        return Interface( 
+            dbus_object.bus.get_object(
+                'org.freesmartphone.opimd',
+                '/org/freesmartphone/PIM/Contacts'+reference
+            ),
+            'org.freesmartphone.PIM.Contact'
+        )
 
     def cbNameEdit( self, name, reference ):
         for i in range( len( self.phonebook ) ):
             if self.phonebook[i][0] == reference:
                 self.phonebook[i] = ( reference, name, self.phonebook[i][2] )
-                if dbus_object.gsm_device_obj:
+                if dbus_object.contacts_iface:
+		    self.Opim(reference).Update({"Name": name})
+                    logger.debug('opimd Name changed')
+                elif dbus_object.gsm_device_obj:
+                    logger.debug("Name changed");
                     dbus_object.gsm_sim_iface.StoreEntry(
                         "contacts",
                         reference,
@@ -687,7 +700,11 @@ class pyphone_contacts(edje_group):
         for i in range( len( self.phonebook ) ):
             if self.phonebook[i][0] == reference:
                 self.phonebook[i] = ( reference, self.phonebook[i][1], number )
-                if dbus_object.gsm_device_obj:
+                if dbus_object.contacts_iface:
+		    self.Opim(reference).Update({"Phone": "tel:"+number})
+                    logger.debug("opimd Number changed");
+                elif dbus_object.gsm_device_obj:
+                    logger.debug("Number changed");
                     dbus_object.gsm_sim_iface.StoreEntry(
                         "contacts",
                         reference,
@@ -716,7 +733,14 @@ class pyphone_contacts(edje_group):
                 break
         if reference is None:
             return # no space?
-        if dbus_object.gsm_device_obj:
+        if dbus_object.contacts_iface:
+            logger.debug("opimd New contact");
+            reference = dbus_object.contacts_iface.Add(
+                {"Name" : name,"Phone" : "tel:"+number}
+            )
+            reference = reference[reference.rfind("/"):]
+        elif dbus_object.gsm_device_obj:
+            lgogger.debug("New contact");
             dbus_object.gsm_sim_iface.StoreEntry(
                 "contacts",
                 reference,
@@ -730,7 +754,11 @@ class pyphone_contacts(edje_group):
     def cbDelete( self, result, reference ):
         if result == "abort":
             return
-        if dbus_object.gsm_device_obj:
+        if dbus_object.contacts_iface:
+	    self.Opim(reference).Delete()
+            logger.debug("opimd Deleting contact");
+        elif dbus_object.gsm_device_obj:
+            logger.debug("Deleting contact SIM");
             dbus_object.gsm_sim_iface.DeleteEntry(
                 "contacts",
                 reference
@@ -788,9 +816,60 @@ class pyphone_contacts(edje_group):
         logger.error( "error while retrieving phonebook %s" % e )
         self.busy = False
 
+    def cbOpimdReplies(self,result):
+        if str(result) == result:
+            logger.debug("opimd query %s" % result)
+            self.query_iface = Interface(
+	        dbus_object.bus.get_object('org.freesmartphone.opimd',result),
+		'org.freesmartphone.PIM.ContactQuery'
+	    )
+            self.query_iface.GetResultCount(
+                reply_handler= self.cbOpimdReplies,
+                error_handler = self.cbPhonebookError
+            )
+        elif isinstance(result,int):
+            logger.debug("procesing %s opimd contacts" % result)
+            self.query_iface.GetMultipleResults(
+                result,
+                reply_handler = self.cbOpimdReplies,
+                error_handler = self.cbPhonebookError
+            )
+        else:
+            for contact in result:
+                try:
+                    phonenum = contact["Phone"][4:]
+                except KeyError:
+                    phonenum = contact["Cell phone"][4:]
+                try:
+                    name = contact["Name"]
+                except KeyError:
+                    name = "N/A %s" % i
+                self.phonebook.append( ( 
+                   str(contact["Path"][contact["Path"].rfind("/"):]),
+                   str(name),
+                   str(phonenum)
+                ))
+            self.query_iface.Dispose()
+            self.quier_iface = None
+            self.busy = False
+            self.phonebook.sort( key = lambda x: x[1].lower() )
+            logger.info( "retrieved phonebook: %s" % self.phonebook )
+            self.ready = True
+            self.updateList()
+            self.main.groups["main"].targets["contacts"] = True
+            self.main.groups["main"].update()
+ 
+
     def prepare( self ):
         if not self.ready and not self.busy:
-            if dbus_object.gsm_device_obj:
+            if dbus_object.contacts_iface:
+                self.busy = True
+                dbus_object.contacts_iface.Query(
+                    {},
+                    reply_handler = self.cbOpimdReplies,
+                    error_handler=self.cbPhonebookError
+                )
+            elif dbus_object.gsm_device_obj:
                 logger.info( "retrieving phonebook..." )
                 dbus_object.gsm_sim_iface.RetrievePhonebook(
                     "contacts",
@@ -2559,6 +2638,8 @@ class DBusObject( object ):
         self.gsm_server_obj = None
         self.gsm_data_iface = None
 
+        self.contacts_iface = None
+
         self.fullinit = False
 
     def tryGetProxy( self, busname, objname ):
@@ -2674,6 +2755,23 @@ class DBusObject( object ):
         self.prefs_obj = self.tryGetProxy( 'org.freesmartphone.opreferencesd', '/org/freesmartphone/Preferences' )
         self.prefs_iface = Interface( self.prefs_obj, 'org.freesmartphone.Preferences' )
         logger.debug( "preferences ok: %s" % self.prefs_iface )
+        
+	#Starting with  Contacts
+        #opimd contacts
+        contacts_obj = self.tryGetProxy(
+            'org.freesmartphone.opimd',
+            '/org/freesmartphone/PIM/Contacts'
+        )
+        if contacts_obj: 
+	    self.contacts_iface = Interface(
+                contacts_obj,
+                'org.freesmartphone.PIM.Contacts'
+            )
+            logger.info ( 'Using contacts from org.freesmartphone.opimd')
+        elif self.gsm_device_object:
+            logger.info ( 'Using contacts from memory in SIM card' )
+        else:
+            logger.info ( 'Using contacts harcoded on Zhone')
 
         logger.debug( "failcount = %d" % failcount )
         if failcount == 0:
-- 
1.5.6.5


