Properly lookup contact from aggregator
authorArtem Garmash <artemgarmash@gmail.com>
Wed, 6 Jan 2010 23:01:18 +0000 (01:01 +0200)
committerArtem Garmash <artem.garmash@nokia.com>
Sun, 27 Jun 2010 19:13:42 +0000 (22:13 +0300)
src/el-home-applet.c

index 101bea4..5ee1406 100644 (file)
@@ -99,6 +99,7 @@ struct _ELHomeAppletPrivate
         gchar *contact_id;
         gchar *remote_id;
         gchar *local_id;
+        OssoABookContact *contact;
 };
 
 HD_DEFINE_PLUGIN_MODULE (ELHomeApplet, el_home_applet, HD_TYPE_HOME_PLUGIN_ITEM);
@@ -422,18 +423,41 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
         return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event);
 }
 
+
 static void
-destroy_aggregator (ELHomeApplet *self)
+clean_state (ELHomeApplet *self)
 {
-        ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv;
+        ELHomeAppletPrivate *priv = self->priv;
+
+        if (priv->message) {
+                g_free (priv->message);
+                priv->message = NULL;
+        }
 
+        if (priv->contact_id) {
+                g_free (priv->contact_id);
+                priv->contact_id = NULL;
+        }
+        if (priv->local_id) {
+                g_free (priv->local_id);
+                priv->local_id = NULL;
+        }
+        if (priv->remote_id) {
+                g_free (priv->remote_id);
+                priv->remote_id = NULL;
+        }
+
+        if (priv->contact) {
+                g_object_unref (priv->contact);
+                priv->contact = NULL;
+        }
         if (priv->aggregator) {
                 if (priv->aggregator_ready_closure){
                         osso_abook_waitable_cancel (OSSO_ABOOK_WAITABLE (priv->aggregator),
                                                     priv->aggregator_ready_closure);
                         priv->aggregator_ready_closure = NULL;
                 }
-
+                osso_abook_roster_stop (priv->aggregator);
                 g_object_unref (priv->aggregator);
                 priv->aggregator = NULL;
         }
@@ -453,29 +477,12 @@ dispose (GObject *self)
                 g_object_unref (priv->eventlogger);
                 priv->eventlogger = NULL;
         }
-
-        if (priv->message) {
-                g_free (priv->message);
-                priv->message = NULL;
-        }
-        if (priv->contact_id) {
-                g_free (priv->contact_id);
-                priv->contact_id = NULL;
-        }
-        if (priv->remote_id) {
-                g_free (priv->remote_id);
-                priv->remote_id = NULL;
-        }
-        if (priv->local_id) {
-                g_free (priv->local_id);
-                priv->local_id = NULL;
-        }
-
         if (priv->font_desc) {
                 pango_font_description_free (priv->font_desc);
                 priv->font_desc = NULL;
         }
-        destroy_aggregator (EL_HOME_APPLET (self));
+
+        clean_state (EL_HOME_APPLET (self));
 
         G_OBJECT_CLASS (el_home_applet_parent_class)->dispose (self);
 }
@@ -494,7 +501,7 @@ aggregator_ready_cb (OssoABookWaitable *waitable,
         g_warning (G_STRFUNC);
         ELHomeApplet *self = EL_HOME_APPLET(userdata);
         ELHomeAppletPrivate *priv = self->priv;
-        GList *contacts;
+        GList *contacts = NULL;
 
         priv->aggregator_ready_closure = NULL;
 
@@ -503,22 +510,53 @@ aggregator_ready_cb (OssoABookWaitable *waitable,
                 return;
         }
 
-        contacts = osso_abook_aggregator_list_master_contacts
-                (OSSO_ABOOK_AGGREGATOR (priv->aggregator));
+        if (priv->contact_id) {
+                contacts = osso_abook_aggregator_lookup
+                        (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+                         priv->contact_id);
+        }
+        else if (priv->local_id && priv->remote_id) {
+                if (g_strcmp0 (priv->local_id, "ring/tel/ring" == 0)) {
+                        contacts = osso_abook_aggregator_find_contacts_for_phone_number
+                                (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+                                 priv->remote_id,
+                                 TRUE);
+                }
+                else {
+                        McAccount *account;
+                        account = osso_abook_account_manager_lookup_by_name
+                                (NULL,
+                                 priv->local_id);
+                        if (account) {
+                                contacts = osso_abook_aggregator_find_contacts_for_im_contact
+                                        (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+                                         priv->remote_id,
+                                         account);
+                        }
+                }
+        }
+
         if (contacts && contacts->data) {
-                OssoABookContact *contact = OSSO_ABOOK_CONTACT (contacts->data);
+                GdkPixbuf *avatar_image;
+
+                priv->contact = g_object_ref (OSSO_ABOOK_CONTACT (contacts->data));
                 gtk_label_set_text (GTK_LABEL (priv->sender),
-                                    osso_abook_contact_get_display_name (contact));
-                GdkPixbuf *avatar_image = osso_abook_avatar_get_image_rounded
-                        (OSSO_ABOOK_AVATAR (contact),
+                                    osso_abook_contact_get_display_name (priv->contact));
+                avatar_image = osso_abook_avatar_get_image_rounded
+                        (OSSO_ABOOK_AVATAR (priv->contact),
                          HILDON_ICON_PIXEL_SIZE_THUMB,
                          HILDON_ICON_PIXEL_SIZE_THUMB,
                          TRUE,
                          -1,
                          priv->border_color);
-                g_warning ("%s av_img %p", G_STRFUNC, avatar_image);
+
+                g_warning ("contact's name %s\nid=%s\npid=%s",
+                           osso_abook_contact_get_display_name (priv->contact),
+                           osso_abook_contact_get_uid (priv->contact),
+                           osso_abook_contact_get_persistent_uid (priv->contact));
+
+
                 if (avatar_image) {
-                        g_warning ("SHOE AVATAR");
                         gtk_image_set_from_pixbuf (GTK_IMAGE (priv->avatar),
                                                    avatar_image);
                         gtk_widget_show (priv->avatar);
@@ -535,16 +573,9 @@ resolve_contact (ELHomeApplet *self)
         EBookQuery *query = NULL;
         GError *error = NULL;
 
-        g_warning ("%s %s", G_STRFUNC, priv->contact_id);
-
-        destroy_aggregator (self);
+        g_warning ("%s %s %s %s", G_STRFUNC, priv->contact_id, priv->local_id, priv->remote_id);
 
-        if (priv->contact_id) {
-                query = e_book_query_vcard_field_test (EVC_UID,
-                                                       E_BOOK_QUERY_IS,
-                                                       priv->contact_id);
-        }
-        else if (priv->local_id && priv->remote_id) {
+        if (priv->local_id && priv->remote_id) {
                 const gchar *vcard = osso_abook_account_manager_get_vcard_field
                         (NULL, priv->local_id);
                 if (vcard)
@@ -570,17 +601,13 @@ resolve_contact (ELHomeApplet *self)
         }
 
         if (priv->aggregator) {
-                OssoABookRosterManager *manager;
-
                 priv->aggregator_ready_closure = osso_abook_waitable_call_when_ready
                         (OSSO_ABOOK_WAITABLE (priv->aggregator),
                          aggregator_ready_cb,
                          self, NULL);
 
-                manager = osso_abook_aggregator_get_roster_manager
-                        (OSSO_ABOOK_AGGREGATOR (priv->aggregator));
-                osso_abook_roster_manager_start (manager);
                 osso_abook_roster_start (priv->aggregator);
+                g_warning ("AGG STARTED");
         }
 }
 
@@ -612,29 +639,11 @@ static void
 show_event (ELHomeApplet *self, RTComElIter *it)
 {
         ELHomeAppletPrivate *priv = self->priv;
-
+        g_warning (G_STRFUNC);
         gchar *remote = NULL;
         gchar *received = NULL;
         const gchar *icon_name = NULL;
 
-        if (priv->message) {
-                g_free (priv->message);
-                priv->message = NULL;
-        }
-
-        if (priv->contact_id) {
-                g_free (priv->contact_id);
-                priv->contact_id = NULL;
-        }
-        if (priv->local_id) {
-                g_free (priv->local_id);
-                priv->local_id = NULL;
-        }
-        if (priv->remote_id) {
-                g_free (priv->remote_id);
-                priv->remote_id = NULL;
-        }
-
         if (it && rtcom_el_iter_first (it)) {
                 rtcom_el_iter_dup_string (it, "free-text", &priv->message);
                 if (priv->message) {
@@ -663,6 +672,11 @@ show_event (ELHomeApplet *self, RTComElIter *it)
                 priv->event_id = -1;
         }
 
+        g_warning ("event_id=%d\nremote-uid=%s\nremote_name=%s",
+                   priv->event_id,
+                   priv->remote_id,
+                   remote);
+
         gtk_widget_hide (priv->avatar);
 
         if (priv->message) {
@@ -698,9 +712,8 @@ show_event (ELHomeApplet *self, RTComElIter *it)
 
         if (remote)
                 gtk_label_set_text (GTK_LABEL (priv->sender), remote);
-        else if (priv->remote_id)
+        else
                 gtk_label_set_text (GTK_LABEL (priv->sender), priv->remote_id);
-
         g_free (remote);
 
         stop_scroll_anim (priv);
@@ -801,9 +814,12 @@ query_unread_events (RTComEl *el)
 static void
 read_event (ELHomeApplet *self)
 {
+        g_warning (G_STRFUNC);
         ELHomeAppletPrivate *priv = self->priv;
         RTComElIter *it = NULL;
 
+        clean_state (self);
+
         it = make_query (priv->eventlogger, -1);
         show_event (self, it);
         resolve_contact (self);
@@ -814,15 +830,12 @@ static void
 mark_as_read (ELHomeApplet *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
-
+        g_warning (G_STRFUNC);
         if (priv->event_id >= 0) {
                 rtcom_el_set_read_event (priv->eventlogger,
                                          priv->event_id,
                                          TRUE,
                                          NULL);
-                read_event (self);
-                priv->unread_count--;
-                update_unread_label (self);
         }
 }
 
@@ -830,7 +843,7 @@ static gboolean
 read_new_event (ELHomeApplet *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
-
+        g_warning (G_STRFUNC);
         read_event (self);
         priv->unread_count = query_unread_events (priv->eventlogger);
         update_unread_label (self);
@@ -861,6 +874,7 @@ new_event_cb (RTComEl      *backend,
               const gchar  *service,
               ELHomeApplet *self)
 {
+        /* TODO: avoid updating if not related */
         add_new_idle (self);
 }
 
@@ -891,13 +905,14 @@ button_press_event_cb (GtkWidget      *widget,
                        GdkEventButton *event,
                        ELHomeApplet   *self)
 {
+        g_warning (G_STRFUNC);
         ELHomeAppletPrivate *priv = self->priv;
 
         if (priv->event_id > 0) {
                 if (event->y < C_Y + HEADER_HEIGHT) {
                         if (priv->aggregator &&
-                            osso_abook_aggregator_get_master_contact_count
-                            (OSSO_ABOOK_AGGREGATOR (priv->aggregator)) > 0)
+                            osso_abook_waitable_is_ready
+                            (OSSO_ABOOK_WAITABLE (priv->aggregator), NULL))
                                 priv->active_header = TRUE;
                 }
                 else
@@ -965,6 +980,7 @@ button_release_event_cb (GtkWidget      *widget,
                          ELHomeApplet   *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
+        g_warning (G_STRFUNC);
 
         if (priv->active_body) {
                 priv->active_body = FALSE;
@@ -986,8 +1002,11 @@ button_release_event_cb (GtkWidget      *widget,
         if (priv->active_header) {
                 GtkWidget *dialog = NULL;
                 priv->active_header = FALSE;
-                dialog = create_contact_starter_dialog (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
-                                                        priv->contact_id);
+
+                if (priv->aggregator && priv->contact_id)
+                        dialog = create_contact_starter_dialog
+                                (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+                                 priv->contact_id);
                 if (!dialog &&
                     priv->remote_id &&
                     priv->local_id)