X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fel-home-applet.c;h=101bea41d2aca9a4656415c042dc579e6fa8fbd3;hb=def55826425550712aa2b808d40996d34ad4291c;hp=79941559ba1d111f7dd0fab147d63abd12dacfbf;hpb=4f7d8de028c8d790db13e4c28b3f1dd58382a662;p=conv-inbox diff --git a/src/el-home-applet.c b/src/el-home-applet.c index 7994155..101bea4 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -423,6 +423,23 @@ expose_event (GtkWidget *self, GdkEventExpose *event) } static void +destroy_aggregator (ELHomeApplet *self) +{ + ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv; + + 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; + } + + g_object_unref (priv->aggregator); + priv->aggregator = NULL; + } +} + +static void dispose (GObject *self) { ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv; @@ -458,16 +475,7 @@ dispose (GObject *self) pango_font_description_free (priv->font_desc); priv->font_desc = 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; - } - - g_object_unref (priv->aggregator); - priv->aggregator = NULL; - } + destroy_aggregator (EL_HOME_APPLET (self)); G_OBJECT_CLASS (el_home_applet_parent_class)->dispose (self); } @@ -479,39 +487,100 @@ finalize (GObject *self) } static void +aggregator_ready_cb (OssoABookWaitable *waitable, + const GError *error, + gpointer userdata) +{ + g_warning (G_STRFUNC); + ELHomeApplet *self = EL_HOME_APPLET(userdata); + ELHomeAppletPrivate *priv = self->priv; + GList *contacts; + + priv->aggregator_ready_closure = NULL; + + if (error) { + g_warning ("Failed to create aggregator: %s", error->message); + return; + } + + contacts = osso_abook_aggregator_list_master_contacts + (OSSO_ABOOK_AGGREGATOR (priv->aggregator)); + if (contacts && contacts->data) { + OssoABookContact *contact = 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), + 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); + if (avatar_image) { + g_warning ("SHOE AVATAR"); + gtk_image_set_from_pixbuf (GTK_IMAGE (priv->avatar), + avatar_image); + gtk_widget_show (priv->avatar); + g_object_unref (avatar_image); + } + gtk_widget_queue_draw (GTK_WIDGET (self)); + } +} + +static void resolve_contact (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; + EBookQuery *query = NULL; + GError *error = NULL; g_warning ("%s %s", G_STRFUNC, priv->contact_id); + destroy_aggregator (self); + if (priv->contact_id) { - GList *contacts = osso_abook_aggregator_lookup (OSSO_ABOOK_AGGREGATOR (priv->aggregator), - priv->contact_id); - if (contacts && contacts->data) { - OssoABookContact *contact = 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), - 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); - if (avatar_image) { - g_warning ("SHOE AVATAR"); - /* gtk_widget_hide (priv->icon); */ - /* gtk_widget_show (priv->avatar); */ - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->avatar), - avatar_image); - g_object_unref (avatar_image); - } - } + query = e_book_query_vcard_field_test (EVC_UID, + E_BOOK_QUERY_IS, + priv->contact_id); } - else { - /* TODO: use priv->remote_id and priv->local_id to lookup contact*/ + else if (priv->local_id && priv->remote_id) { + const gchar *vcard = osso_abook_account_manager_get_vcard_field + (NULL, priv->local_id); + if (vcard) + query = e_book_query_vcard_field_test (vcard, + E_BOOK_QUERY_IS, + priv->remote_id); + else + query = e_book_query_any_field_contains (priv->remote_id); + } + + if (query) { + priv->aggregator = osso_abook_aggregator_new_with_query (NULL, + query, + NULL, + 1, + &error); + e_book_query_unref (query); + } + if (error) { + g_warning ("Failed to create aggregator: %s", error->message); + g_error_free (error); + return; + } + + 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); } } @@ -576,7 +645,7 @@ show_event (ELHomeApplet *self, RTComElIter *it) if (rtcom_el_iter_get_int (it, "start-time", (gint*)&received_t)) received = format_time (received_t); - rtcom_el_iter_dup_string (it, "remote-id", &priv->remote_id); + rtcom_el_iter_dup_string (it, "remote-uid", &priv->remote_id); if (!rtcom_el_iter_dup_string (it, "remote-name", &remote)) remote = g_strdup (priv->remote_id); @@ -594,8 +663,11 @@ show_event (ELHomeApplet *self, RTComElIter *it) priv->event_id = -1; } + gtk_widget_hide (priv->avatar); + if (priv->message) { gtk_widget_hide (priv->empty); + /* TODO: don's show avatar at all, fix layout */ gtk_widget_show (priv->avatar); gtk_image_set_from_icon_name (GTK_IMAGE (priv->avatar), "general_default_avatar", @@ -603,7 +675,6 @@ show_event (ELHomeApplet *self, RTComElIter *it) } else { gtk_widget_show (priv->empty); - gtk_widget_hide (priv->avatar); } gtk_label_set_text (GTK_LABEL (priv->received), received); @@ -625,14 +696,10 @@ show_event (ELHomeApplet *self, RTComElIter *it) gtk_widget_hide (priv->icon); #endif - if (priv->contact_id && - priv->aggregator && - !priv->aggregator_ready_closure) { - resolve_contact (self); - } - else { + if (remote) gtk_label_set_text (GTK_LABEL (priv->sender), remote); - } + else if (priv->remote_id) + gtk_label_set_text (GTK_LABEL (priv->sender), priv->remote_id); g_free (remote); @@ -739,6 +806,7 @@ read_event (ELHomeApplet *self) it = make_query (priv->eventlogger, -1); show_event (self, it); + resolve_contact (self); if (it) g_object_unref (it); } @@ -826,8 +894,12 @@ button_press_event_cb (GtkWidget *widget, ELHomeAppletPrivate *priv = self->priv; if (priv->event_id > 0) { - if (event->y < C_Y + HEADER_HEIGHT) - priv->active_header = TRUE; + if (event->y < C_Y + HEADER_HEIGHT) { + if (priv->aggregator && + osso_abook_aggregator_get_master_contact_count + (OSSO_ABOOK_AGGREGATOR (priv->aggregator)) > 0) + priv->active_header = TRUE; + } else priv->active_body = TRUE; gtk_widget_queue_draw (widget); @@ -953,21 +1025,6 @@ leave_notify_event_cb (GtkWidget *widget, } static void -aggregator_ready_cb (OssoABookWaitable *waitable, - const GError *error, - gpointer userdata) -{ - g_warning (G_STRFUNC); - ELHomeApplet *self = EL_HOME_APPLET(userdata); - - self->priv->aggregator_ready_closure = NULL; - - if (!error) { - resolve_contact (self); - } -} - -static void el_home_applet_init (ELHomeApplet *self) { ELHomeAppletPrivate *priv; @@ -1103,12 +1160,6 @@ el_home_applet_init (ELHomeApplet *self) read_new_event (self); osso_abook_init_with_name (PACKAGE, NULL); - - priv->aggregator = osso_abook_aggregator_get_default (NULL); - priv->aggregator_ready_closure = osso_abook_waitable_call_when_ready - (OSSO_ABOOK_WAITABLE (priv->aggregator), - aggregator_ready_cb, - self, NULL); #endif }