From fad1e5e9221632326b930933515ce70d3e01222b Mon Sep 17 00:00:00 2001 From: Artem Garmash Date: Thu, 7 Jan 2010 01:01:18 +0200 Subject: [PATCH] Properly lookup contact from aggregator --- src/el-home-applet.c | 169 ++++++++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 75 deletions(-) diff --git a/src/el-home-applet.c b/src/el-home-applet.c index 101bea4..5ee1406 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -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) -- 1.7.9.5