[gnome-bluetooth] [PATCH 04/12] contacts: adapt to Evolution-Data-Server API changes

Ladislav Michl ladis at linux-mips.org
Sun Jan 15 04:42:58 EST 2017


From: Matthew Barnes <mbarnes at redhat.com>

---
 cut-n-paste/e-contact-entry/e-contact-entry.c | 126 +++++++++++---------------
 cut-n-paste/e-contact-entry/e-contact-entry.h |   8 +-
 libgsm/phonemgr-utils.c                       |   4 +-
 src/e-phone-entry.c                           |  67 +++++++-------
 4 files changed, 89 insertions(+), 116 deletions(-)

diff --git a/cut-n-paste/e-contact-entry/e-contact-entry.c b/cut-n-paste/e-contact-entry/e-contact-entry.c
index dc8e2e3..d95e5b9 100644
--- a/cut-n-paste/e-contact-entry/e-contact-entry.c
+++ b/cut-n-paste/e-contact-entry/e-contact-entry.c
@@ -38,11 +38,6 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
-#include <libedataserver/e-source.h>
-#include <libebook/e-book.h>
-#include <libebook/e-book-view.h>
-#include <libebook/e-contact.h>
-
 #include "e-contact-entry.h"
 #include "econtactentry-marshal.h"
 
@@ -59,7 +54,7 @@ static int signals[LAST_SIGNAL] = { 0 };
 /* Properties */
 enum {
   PROP_0, /* TODO: why? */
-  PROP_SOURCE_LIST,
+  PROP_REGISTRY,
   PROP_COMPLETE_LENGTH,
 };
 
@@ -70,7 +65,7 @@ enum {
 struct EContactEntryPriv {
   GtkEntryCompletion *completion;
   GtkListStore *store;
-  ESourceList *source_list;
+  ESourceRegistry *registry;
   /* A list of EntryLookup structs we are searching */
   GList *lookup_entries;
   /* Number of characters to start searching at */
@@ -227,7 +222,7 @@ e_contact_entry_display_func (EContact *contact)
   emails = e_contact_get (contact, E_CONTACT_EMAIL);
   for (l = emails; l != NULL; l = l->next) {
     item = g_new0 (EContactEntyItem, 1);
-    item->identifier = item->identifier = g_strdup (l->data);
+    item->identifier = g_strdup (l->data);
     item->display_string = g_strdup_printf ("%s <%s>", (char*)e_contact_get_const (contact, E_CONTACT_NAME_OR_ORG), item->identifier);
 
     items = g_list_prepend (items, item);
@@ -276,22 +271,13 @@ view_contacts_added_cb (EBook *book, GList *contacts, gpointer user_data)
       return;
 
     photo = e_contact_get (contact, E_CONTACT_PHOTO);
-#ifndef HAVE_ECONTACTPHOTOTYPE
-    if (photo) {
-#else
     if (photo && photo->type == E_CONTACT_PHOTO_TYPE_INLINED) {
-#endif
       GdkPixbufLoader *loader;
 
       loader = gdk_pixbuf_loader_new ();
 
-#ifndef HAVE_ECONTACTPHOTOTYPE
-      if (gdk_pixbuf_loader_write (loader, (guchar *)photo->data,
-			      photo->length, NULL))
-#else
       if (gdk_pixbuf_loader_write (loader, (guchar *)photo->data.inlined.data,
 			      photo->data.inlined.length, NULL))
-#endif
         pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
 
       if (pixbuf) {
@@ -339,16 +325,15 @@ view_contacts_added_cb (EBook *book, GList *contacts, gpointer user_data)
  * The query on the EBookView has completed.
  */
 static void
-view_completed_cb (EBookView *book_view, EBookViewStatus status, gpointer user_data)
+view_completed_cb (EBookView *book_view, EBookViewStatus status, const gchar *message, gpointer user_data)
 {
   EntryLookup *lookup;
   g_return_if_fail (user_data != NULL);
-  /* TODO: handle status != OK */
-  g_return_if_fail (status == E_BOOK_ERROR_OK);
   g_return_if_fail (book_view != NULL);
 
   lookup = (EntryLookup*)user_data;
   g_object_unref (lookup->bookview);
+  lookup->bookview = NULL;
 }
 
 /**
@@ -373,8 +358,8 @@ bookview_cb (EBook *book, EBookStatus status, EBookView *book_view, gpointer clo
   lookup->bookview = book_view;
   g_object_add_weak_pointer ((GObject*)book_view, (gpointer*)&lookup->bookview);
   
-  g_signal_connect (book_view, "contacts_added", (GCallback)view_contacts_added_cb, lookup);
-  g_signal_connect (book_view, "sequence_complete", (GCallback)view_completed_cb, lookup);
+  g_signal_connect (book_view, "contacts-added", (GCallback)view_contacts_added_cb, lookup);
+  g_signal_connect (book_view, "view_complete", (GCallback)view_completed_cb, lookup);
   
   e_book_view_start (book_view);
 }
@@ -396,6 +381,7 @@ entry_changed_cb (GtkEditable *editable, gpointer user_data)
       if (lookup->bookview) {
         e_book_view_stop (lookup->bookview);
         g_object_unref (lookup->bookview);
+        lookup->bookview = NULL;
       }
     }
     
@@ -410,7 +396,7 @@ entry_changed_cb (GtkEditable *editable, gpointer user_data)
       if (!lookup->open)
         continue;
       
-      if (e_book_async_get_book_view (lookup->book, query, NULL, 11, (EBookBookViewCallback)bookview_cb, lookup) != 0) {
+      if (e_book_async_get_book_view (lookup->book, query, NULL, MAX_ENTRIES, (EBookBookViewCallback)bookview_cb, lookup) == FALSE) {
         g_signal_emit (entry, signals[ERROR], 0, _("Cannot create searchable view."));
       }
     }
@@ -458,11 +444,12 @@ book_opened_cb (EBook *book, EBookStatus status, gpointer data)
  */
 
 void
-e_contact_entry_set_source_list (EContactEntry *entry,
-    				  ESourceList *source_list)
+e_contact_entry_set_registry (EContactEntry *entry,
+    			      ESourceRegistry *registry)
 {
+  GList *list, *link;
+  const gchar *extension_name;
   GError *error = NULL;
-  GSList *list, *l;
 
   g_return_if_fail (E_IS_CONTACT_ENTRY (entry));
 
@@ -471,58 +458,48 @@ e_contact_entry_set_source_list (EContactEntry *entry,
     g_list_foreach (entry->priv->lookup_entries, (GFunc)lookup_entry_free, NULL);
     g_list_free (entry->priv->lookup_entries);
   }
-  if (entry->priv->source_list) {
-    g_object_unref (entry->priv->source_list);
+  if (entry->priv->registry) {
+    g_object_unref (entry->priv->registry);
   }
 
   /* If we have no new sources, disable and return here */
-  if (source_list == NULL) {
+  if (registry == NULL) {
     g_signal_emit (entry, signals[STATE_CHANGE], 0, FALSE);
-    entry->priv->source_list = NULL;
+    entry->priv->registry = NULL;
     entry->priv->lookup_entries = NULL;
     return;
   }
 
-  entry->priv->source_list = source_list;
-  /* So that the list isn't going away underneath us */
-  g_object_ref (entry->priv->source_list);
+  entry->priv->registry = registry;
+  /* So that the registry isn't going away underneath us */
+  g_object_ref (entry->priv->registry);
 
-  /* That gets us a list of ESourceGroup */
-  list = e_source_list_peek_groups (source_list);
   entry->priv->lookup_entries = NULL;
 
-  for (l = list; l != NULL; l = l->next) {
-    ESourceGroup *group = l->data;
-    GSList *sources = NULL, *m;
-    /* That should give us a list of ESource */
-    sources = e_source_group_peek_sources (group);
-    for (m = sources; m != NULL; m = m->next) {
-      ESource *source = m->data;
-      ESource *s = e_source_copy (source);
-      EntryLookup *lookup;
-      char *uri;
+  extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK;
+  list = e_source_registry_list_sources (registry, extension_name);
 
-      uri = g_strdup_printf("%s/%s", e_source_group_peek_base_uri (group), e_source_peek_relative_uri (source));
-      e_source_set_absolute_uri (s, uri);
-      g_free (uri);
+  for (link = list; link != NULL; link = g_list_next (link)) {
+    ESource *source = E_SOURCE (link->data);
+    EntryLookup *lookup;
 
-      /* Now add those to the lookup entries list */
-      lookup = g_new0 (EntryLookup, 1);
-      lookup->entry = entry;
-      lookup->status = E_BOOK_ERROR_OK;
-      lookup->open = FALSE;
+    /* Now add those to the lookup entries list */
+    lookup = g_new0 (EntryLookup, 1);
+    lookup->entry = entry;
+    lookup->status = E_BOOK_ERROR_OK;
+    lookup->open = FALSE;
 
-      if ((lookup->book = e_book_new (s, &error)) == NULL) {
-        /* TODO handle this better, fire the error signal I guess */
+    if ((lookup->book = e_book_new (source, &error)) == NULL) {
+      /* TODO handle this better, fire the error signal I guess */
+      if (error) {
         g_warning ("%s", error->message);
-	g_error_free (error);
-	g_free (lookup);
-      } else {
-        entry->priv->lookup_entries = g_list_append (entry->priv->lookup_entries, lookup);
-	e_book_async_open(lookup->book, TRUE, (EBookCallback)book_opened_cb, lookup);
+        g_error_free (error);
+        error = NULL;
       }
-
-      g_object_unref (s);
+      g_free (lookup);
+    } else {
+      entry->priv->lookup_entries = g_list_append (entry->priv->lookup_entries, lookup);
+      e_book_async_open(lookup->book, TRUE, (EBookCallback)book_opened_cb, lookup);
     }
   }
 
@@ -530,12 +507,12 @@ e_contact_entry_set_source_list (EContactEntry *entry,
     g_signal_emit (entry, signals[STATE_CHANGE], 0, FALSE);
 }
 
-ESourceList *
-e_contact_entry_get_source_list (EContactEntry *entry)
+ESourceRegistry *
+e_contact_entry_get_registry (EContactEntry *entry)
 {
   g_return_val_if_fail (E_IS_CONTACT_ENTRY (entry), NULL);
 
-  return entry->priv->source_list;
+  return entry->priv->registry;
 }
 
 void
@@ -601,8 +578,8 @@ e_contact_entry_set_property (GObject *object, guint property_id, const GValue *
   entry = E_CONTACT_ENTRY (object);
   
   switch (property_id) {
-  case PROP_SOURCE_LIST:
-    e_contact_entry_set_source_list (entry, g_value_get_object (value));
+  case PROP_REGISTRY:
+    e_contact_entry_set_registry (entry, g_value_get_object (value));
     break;
   case PROP_COMPLETE_LENGTH:
     e_contact_entry_set_complete_length (entry, g_value_get_int (value));
@@ -620,8 +597,8 @@ e_contact_entry_get_property (GObject *object, guint property_id, GValue *value,
   entry = E_CONTACT_ENTRY (object);
   
   switch (property_id) {
-  case PROP_SOURCE_LIST:
-    g_value_set_object (value, e_contact_entry_get_source_list (entry));
+  case PROP_REGISTRY:
+    g_value_set_object (value, e_contact_entry_get_registry (entry));
     break;
   case PROP_COMPLETE_LENGTH:
     g_value_set_int (value, e_contact_entry_get_complete_length (entry));
@@ -644,7 +621,7 @@ e_contact_entry_finalize (GObject *object)
     g_list_free (entry->priv->lookup_entries);
     g_object_unref (entry->priv->completion);
     g_object_unref (entry->priv->store);
-    g_object_unref (entry->priv->source_list);
+    g_object_unref (entry->priv->registry);
 
     if (entry->priv->display_destroy) {
       entry->priv->display_destroy (entry->priv->display_func);
@@ -657,7 +634,7 @@ e_contact_entry_finalize (GObject *object)
 static void
 reset_search_fields (EContactEntry *entry)
 {
-  EContactField fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_EMAIL, E_CONTACT_NICKNAME, E_CONTACT_ORG, 0 };
+  EContactField fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_EMAIL, E_CONTACT_NICKNAME, 0 };
 
   g_free (entry->priv->search_fields);
   entry->priv->search_fields = g_new0 (EContactField, G_N_ELEMENTS (fields));
@@ -716,9 +693,9 @@ e_contact_entry_class_init (EContactEntryClass *klass)
   object_class->finalize = e_contact_entry_finalize;
 
   /* Properties */
-  g_object_class_install_property (object_class, PROP_SOURCE_LIST,
-                                   g_param_spec_object ("source-list", "Source List", "The source list to search for contacts.",
-                                                        E_TYPE_SOURCE_LIST, G_PARAM_READWRITE));
+  g_object_class_install_property (object_class, PROP_REGISTRY,
+                                   g_param_spec_object ("registry", "Registry", "Data source registry.",
+                                                        E_TYPE_SOURCE_REGISTRY, G_PARAM_READWRITE));
   
   g_object_class_install_property (object_class, PROP_COMPLETE_LENGTH,
                                    g_param_spec_int ("complete-length", "Complete length", "Number of characters to start a search on.",
@@ -771,6 +748,7 @@ lookup_entry_free (EntryLookup *lookup)
   if (lookup->bookview) {
     g_warning("EBookView still around");
     g_object_unref (lookup->bookview);
+    lookup->bookview = NULL;
   }
   if (lookup->book) {
     g_object_unref (lookup->book);
diff --git a/cut-n-paste/e-contact-entry/e-contact-entry.h b/cut-n-paste/e-contact-entry/e-contact-entry.h
index bf6b39b..6fedef7 100644
--- a/cut-n-paste/e-contact-entry/e-contact-entry.h
+++ b/cut-n-paste/e-contact-entry/e-contact-entry.h
@@ -23,10 +23,8 @@
 #ifndef CONTACT_ENTRY_H
 #define CONTACT_ENTRY_H
 
-#include <libedataserver/e-source-group.h>
-#include <libedataserver/e-source-list.h>
-#include <libebook/e-contact.h>
 #include <gtk/gtk.h>
+#include <libebook/libebook.h>
 
 G_BEGIN_DECLS
 
@@ -71,8 +69,8 @@ GType e_contact_entry_get_type (void);
 
 GtkWidget *e_contact_entry_new (void);
 
-void e_contact_entry_set_source_list (EContactEntry *entry, ESourceList *list);
-ESourceList *e_contact_entry_get_source_list (EContactEntry *entry);
+void e_contact_entry_set_registry (EContactEntry *entry, ESourceRegistry *registry);
+ESourceRegistry *e_contact_entry_get_registry (EContactEntry *entry);
 
 void e_contact_entry_set_complete_length(EContactEntry *entry, int length);
 int e_contact_entry_get_complete_length(EContactEntry *entry);
diff --git a/libgsm/phonemgr-utils.c b/libgsm/phonemgr-utils.c
index 4e62e10..156b99e 100644
--- a/libgsm/phonemgr-utils.c
+++ b/libgsm/phonemgr-utils.c
@@ -23,11 +23,11 @@
 
 #include <stdlib.h>
 #include <unistd.h>
-#include <string.h> 
+#include <string.h>
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <glib-object.h>
-#include <libebook/e-contact.h>
+#include <libebook-contacts/libebook-contacts.h>
 #include <gnokii.h>
 
 #include <bluetooth/bluetooth.h>
diff --git a/src/e-phone-entry.c b/src/e-phone-entry.c
index d59ea80..277e3d2 100644
--- a/src/e-phone-entry.c
+++ b/src/e-phone-entry.c
@@ -1,5 +1,5 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
+/*
  * Copyright (C) 2005 Bastien Nocera <hadess at hadess.net>
  *
  * e-phone-entry.c
@@ -30,16 +30,15 @@
 
 #include <gtk/gtk.h>
 #include <string.h>
-#include <libedataserver/e-source-list.h>
-#include <libedataserverui/e-client-utils.h>
+#include <libedataserver/libedataserver.h>
 #include "e-phone-entry.h"
 
 #define CONTACT_FORMAT "%s (%s)"
 
 /* Signals */
 enum {
-  PHONE_CHANGED, /* Signal argument is the phone number */
-  LAST_SIGNAL
+	PHONE_CHANGED, /* Signal argument is the phone number */
+	LAST_SIGNAL
 };
 
 static int signals[LAST_SIGNAL] = { 0 };
@@ -180,25 +179,25 @@ e_phone_entry_finalize (GObject *object)
 }
 
 static void
-add_sources (EContactEntry *entry)
-{
-	ESourceList *source_list;
-
-	if (e_client_utils_get_sources (&source_list,
-					E_CLIENT_SOURCE_TYPE_CONTACTS,
-					NULL)) {
-		e_contact_entry_set_source_list (E_CONTACT_ENTRY (entry),
-						 source_list);
-		g_object_unref (source_list);
-	}
-}
-
-static void
 e_phone_entry_init (EPhoneEntry *entry)
 {
 	EContactField fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_NICKNAME, E_CONTACT_ORG, E_CONTACT_PHONE_MOBILE, 0 };
+	ESourceRegistry *registry;
+	GError *error = NULL;
+
+	/* XXX This call blocks while a D-Bus connection is made, possibly
+	 *     requiring activation.  Might be better to create the registry
+	 *     in main(), pass it to ui_init(), and have e_phone_entry_new()
+	 *     take it as an argument.  Calling this from main() means if it
+	 *     fails you can abort cleanly with a console error message. */
+	registry = e_source_registry_new_sync (NULL, &error);
+	if (registry == NULL) {
+		g_error ("%s: %s", G_STRFUNC, error->message);
+		g_assert_not_reached ();
+	}
+	e_contact_entry_set_registry (E_CONTACT_ENTRY (entry), registry);
+	g_object_unref (registry);
 
-	add_sources (E_CONTACT_ENTRY (entry));
 	e_contact_entry_set_search_fields (E_CONTACT_ENTRY (entry), (const EContactField *)fields);
 	e_contact_entry_set_display_func (E_CONTACT_ENTRY (entry), test_display_func, NULL, NULL);
 	g_signal_connect (G_OBJECT (entry), "contact_selected",
@@ -210,21 +209,19 @@ e_phone_entry_init (EPhoneEntry *entry)
 static void
 e_phone_entry_class_init (EPhoneEntryClass *klass)
 {
-  GObjectClass *object_class;
-  
-  object_class = (GObjectClass *) klass;
-  
-  /* GObject */
-  object_class->finalize = e_phone_entry_finalize;
-
-  /* Signals */
-  signals[PHONE_CHANGED] = g_signal_new ("phone-changed",
-                                            G_TYPE_FROM_CLASS (object_class),
-                                            G_SIGNAL_RUN_LAST,
-                                            G_STRUCT_OFFSET (EPhoneEntryClass, phone_changed),
-                                            NULL, NULL,
-                                            g_cclosure_marshal_VOID__STRING,
-                                            G_TYPE_NONE, 1, G_TYPE_STRING);
+	GObjectClass *object_class = (GObjectClass *) klass;
+
+	/* GObject */
+	object_class->finalize = e_phone_entry_finalize;
+
+	/* Signals */
+	signals[PHONE_CHANGED] = g_signal_new ("phone-changed",
+					G_TYPE_FROM_CLASS (object_class),
+					G_SIGNAL_RUN_LAST,
+					G_STRUCT_OFFSET (EPhoneEntryClass, phone_changed),
+					NULL, NULL,
+					g_cclosure_marshal_VOID__STRING,
+					G_TYPE_NONE, 1, G_TYPE_STRING);
 }
 
 GtkWidget *
-- 
2.11.0



More information about the gnome-bluetooth mailing list