[gnome-calendar] [PATCH] Port to newer EvolutionDataServer



commit 970529cb2f67c06b5b6a4da069851ba7cdd924fd
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Wed Jul 11 23:52:45 2012 -0400

    [PATCH] Port to newer EvolutionDataServer
    
    Since 3.5.3, evolution-data-server has changed API regarding
    storage and retrieval of sources, introducing the ESourceRegistry
    and removing GConf.
    Adapt to that.

 configure.ac          |    6 +-
 src/gcal-manager.c    |  214 +++++++++++++++++++++++++------------------------
 src/gcal-manager.h    |    3 +-
 src/gcal-month-view.c |    2 +-
 src/gcal-utils.c      |    8 +-
 src/gcal-week-view.c  |    2 +-
 src/gcal-window.c     |    4 +-
 7 files changed, 122 insertions(+), 117 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 6268a55..5a539c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,9 +70,9 @@ GLIB_MIN_VERSION=2.30.0
 GTK_MIN_VERSION=3.4.0
 CLUTTER_MIN_VERSION=1.10
 CLUTTER_GTK_MIN_VERSION=1.2
-ECAL_REQUIRED=3.1.5
-EDATASERVER_REQUIRED=3.1.5
-EDATASERVERUI_REQUIRED=3.1.5
+ECAL_REQUIRED=3.5.3
+EDATASERVER_REQUIRED=3.5.3
+EDATASERVERUI_REQUIRED=3.5.3
 
 PKG_CHECK_MODULES(CALENDAR,
                   glib-2.0 >= $GLIB_MIN_VERSION
diff --git a/src/gcal-manager.c b/src/gcal-manager.c
index 630ac49..79d94ae 100644
--- a/src/gcal-manager.c
+++ b/src/gcal-manager.c
@@ -22,10 +22,8 @@
 
 #include <glib/gi18n.h>
 
-#include <libecal/e-cal-client.h>
-#include <libecal/e-cal-client-view.h>
-#include <libecal/e-cal-time-util.h>
-#include <libedataserver/e-data-server-util.h>
+#include <libecal/libecal.h>
+#include <libedataserver/libedataserver.h>
 
 enum
 {
@@ -79,24 +77,21 @@ struct _GcalManagerPrivate
    * Each value is of type GCalStoreUnit
    * And each key is the source uid
    */
-  GHashTable    *clients;
+  GHashTable      *clients;
 
-  /**
-   * System sources read from gconf
-   */
-  ESourceList   *system_sources;
+  ESourceRegistry *source_registry;
 
   /* The store for keeping easily retrieved data about sources */
-  GtkListStore  *sources_model;
+  GtkListStore    *sources_model;
 
   /* The range of dates defining the query */
-  icaltimetype  *initial_date;
-  icaltimetype  *final_date;
+  icaltimetype    *initial_date;
+  icaltimetype    *final_date;
 
   /* The active query */
-  gchar         *query;
+  gchar           *query;
 
-  GCancellable  *async_ops;
+  GCancellable    *async_ops;
 };
 
 /* Signal IDs */
@@ -114,6 +109,14 @@ static void     gcal_manager_constructed                  (GObject         *obje
 
 static void     gcal_manager_finalize                     (GObject         *object);
 
+static void     gcal_manager_on_source_added              (ESourceRegistry *registry,
+                                                           ESource         *source,
+                                                           GcalManager     *manager);
+
+static void     gcal_manager_on_source_removed            (ESourceRegistry *registry,
+                                                           ESource         *source,
+                                                           GcalManager     *manager);
+
 void            gcal_manager_free_unit_data               (gpointer         data);
 
 static void     gcal_manager_on_client_opened             (GObject         *source_object,
@@ -124,12 +127,12 @@ static gboolean gcal_manager_retry_open_on_timeout        (gpointer         user
 
 static void     gcal_manager_free_retry_open_data         (gpointer         user_data);
 
-void            gcal_manager_remove_client                (GcalManager     *manager,
-                                                           ECalClient      *client);
-
 static void     gcal_manager_load_source                  (GcalManager     *manager,
                                                            ESource         *source);
 
+void            gcal_manager_remove_source                (GcalManager     *manager,
+                                                           ESource         *source);
+
 static void     gcal_manager_reload_events                (GcalManager     *manager);
 
 static void     gcal_manager_reload_view                  (GcalManager     *manager,
@@ -243,33 +246,34 @@ gcal_manager_constructed (GObject *object)
   GcalManagerPrivate *priv;
 
   GError *error;
-  GSList *l_groups;
-  GSList *l;
+  GList *sources;
+  GList *l;
 
   if (G_OBJECT_CLASS (gcal_manager_parent_class)->constructed != NULL)
     G_OBJECT_CLASS (gcal_manager_parent_class)->constructed (object);
 
   priv = GCAL_MANAGER (object)->priv;
 
-  if (!e_cal_client_get_sources (&(priv->system_sources),
-                                 E_CAL_CLIENT_SOURCE_TYPE_EVENTS,
-                                 &error))
+  error = NULL;
+  priv->source_registry = e_source_registry_new_sync (NULL, &error);
+  if (priv->source_registry == NULL)
     {
-     //FIXME maybe give more information of what happened
-      g_warning ("%s", error->message);
+      g_warning ("Failed to access calendar configuration: %s", error->message);
+      g_error_free (error);
+      return;
     }
 
-  for (l_groups = e_source_list_peek_groups (priv->system_sources);
-       l_groups != NULL;
-       l_groups = l_groups->next)
-    {
-      for (l = e_source_group_peek_sources (E_SOURCE_GROUP (l_groups->data));
-           l != NULL;
-           l = l->next)
-        {
-          gcal_manager_load_source (GCAL_MANAGER (object), l->data);
-        }
-    }
+  sources = e_source_registry_list_sources (priv->source_registry,
+                                            E_SOURCE_EXTENSION_CALENDAR);
+
+  for (l = sources; l != NULL; l = l->next)
+    gcal_manager_load_source (GCAL_MANAGER (object), l->data);
+
+  g_object_connect (
+      priv->source_registry,
+      "signal::source-added", gcal_manager_on_source_added, object,
+      "signal::source-removed", gcal_manager_on_source_removed, object,
+      NULL);
 }
 
 static void
@@ -283,6 +287,22 @@ gcal_manager_finalize (GObject *object)
   g_clear_object (&(priv->sources_model));
 }
 
+static void
+gcal_manager_on_source_added (ESourceRegistry *registry,
+                              ESource         *source,
+                              GcalManager     *manager)
+{
+  gcal_manager_load_source (manager, source);
+}
+
+static void
+gcal_manager_on_source_removed (ESourceRegistry *registry,
+                                ESource         *source,
+                                GcalManager     *manager)
+{
+  gcal_manager_remove_source (manager, source);
+}
+
 void
 gcal_manager_free_unit_data (gpointer data)
 {
@@ -318,8 +338,9 @@ gcal_manager_on_client_opened (GObject      *source_object,
       /* get_object_list */
       if (priv->query != NULL)
         {
-          uid = e_source_peek_uid (e_client_get_source (E_CLIENT (client)));
+          uid = e_source_get_uid (e_client_get_source (E_CLIENT (client)));
           unit = (GcalManagerUnit*) g_hash_table_lookup (priv->clients, uid);
+          unit->enabled = TRUE;
 
           /* setting view */
           gcal_manager_reload_view (GCAL_MANAGER (user_data), unit);
@@ -362,10 +383,10 @@ gcal_manager_on_client_opened (GObject      *source_object,
 
           /* in any other case, remove it*/
           source = e_client_get_source (E_CLIENT (client));
-          gcal_manager_remove_client (GCAL_MANAGER (user_data), client);
+          gcal_manager_remove_source (GCAL_MANAGER (user_data), source);
           g_warning ("%s: Failed to open '%s': %s",
                      G_STRFUNC,
-                     e_source_peek_name (source),
+                     e_source_get_display_name (source),
                      error->message);
 
           g_error_free (error);
@@ -411,18 +432,17 @@ gcal_manager_free_retry_open_data (gpointer user_data)
 }
 
 void
-gcal_manager_remove_client (GcalManager  *manager,
-                            ECalClient *client)
+gcal_manager_remove_source (GcalManager  *manager,
+                            ESource      *source)
 {
   GcalManagerPrivate *priv;
 
   g_return_if_fail (GCAL_IS_MANAGER (manager));
-  g_return_if_fail (E_IS_CAL_CLIENT (client));
+  g_return_if_fail (E_IS_SOURCE (source));
 
   priv = manager->priv;
-  g_hash_table_remove (
-      priv->clients,
-      e_source_peek_uid (e_client_get_source (E_CLIENT (client))));
+  g_hash_table_remove (priv->clients,
+                       e_source_get_uid (source));
 }
 
 static void
@@ -433,13 +453,17 @@ gcal_manager_load_source (GcalManager *manager,
   ECalClient *new_client;
   GcalManagerUnit *unit;
   GError *error;
+  ESourceSelectable *extension;
 
   GtkTreeIter iter;
   GdkColor gdk_color;
 
   priv = manager->priv;
   error = NULL;
-  new_client = e_cal_client_new (source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &error);
+  new_client = e_cal_client_new (source,
+                                 E_CAL_CLIENT_SOURCE_TYPE_EVENTS,
+                                 &error);
+
   if (error != NULL)
     {
       g_warning ("Couldn't create ECalClient. Error: %s", error->message);
@@ -454,26 +478,27 @@ gcal_manager_load_source (GcalManager *manager,
                                         g_str_equal,
                                         g_free,
                                         g_object_unref);
-  unit->enabled = TRUE;
 
-  if (g_hash_table_lookup (priv->clients, e_source_peek_uid (source)) == NULL)
+  if (g_hash_table_lookup (priv->clients, e_source_get_uid (source)) == NULL)
     {
       g_hash_table_insert (priv->clients,
-                           g_strdup (e_source_peek_uid (source)),
+                           g_strdup (e_source_get_uid (source)),
                            unit);
     }
   else
     {
       g_warning ("Reinserting source: %s in priv->clients",
-                 e_source_peek_uid (source));
+                 e_source_get_uid (source));
     }
 
   /* filling store */
-  gdk_color_parse (e_source_peek_color_spec (source), &gdk_color);
+  extension = E_SOURCE_SELECTABLE (e_source_get_extension (source,
+                                   E_SOURCE_EXTENSION_CALENDAR));
+  gdk_color_parse (e_source_selectable_get_color (extension), &gdk_color);
   gtk_list_store_append (priv->sources_model, &iter);
   gtk_list_store_set (priv->sources_model, &iter,
-                      COLUMN_UID, e_source_peek_uid (source),
-                      COLUMN_NAME, e_source_peek_name (source),
+                      COLUMN_UID, e_source_get_uid (source),
+                      COLUMN_NAME, e_source_get_display_name (source),
                       COLUMN_ACTIVE, TRUE,
                       COLUMN_COLOR, &gdk_color,
                       -1);
@@ -599,7 +624,7 @@ gcal_manager_on_view_objects_added (ECalClientView *view,
   events_data = NULL;
 
   client = e_cal_client_view_get_client (view);
-  source_uid = e_source_peek_uid (e_client_get_source (E_CLIENT (client)));
+  source_uid = e_source_get_uid (e_client_get_source (E_CLIENT (client)));
   unit = (GcalManagerUnit*) g_hash_table_lookup (priv->clients, source_uid);
 
   for (l = objects; l != NULL; l = l->next)
@@ -665,7 +690,7 @@ gcal_manager_on_view_objects_removed (ECalClientView *view,
 
   events_data = NULL;
   client = e_cal_client_view_get_client (view);
-  source_uid = e_source_peek_uid (e_client_get_source (E_CLIENT (client)));
+  source_uid = e_source_get_uid (e_client_get_source (E_CLIENT (client)));
 
   unit = g_hash_table_lookup (priv->clients, source_uid);
 
@@ -799,7 +824,7 @@ gcal_manager_send_fake_events_added (GcalManager *manager)
       if (! unit->enabled)
         continue;
 
-      source_uid = e_source_peek_uid (unit->source);
+      source_uid = e_source_get_uid (unit->source);
       g_hash_table_iter_init (&e_iter, unit->events);
       while (g_hash_table_iter_next (&e_iter, &e_key, &e_value))
         {
@@ -830,7 +855,7 @@ gcal_manager_send_fave_events_removed (GcalManager     *manager,
   gchar *event_uuid;
 
   events_data = NULL;
-  source_uid = e_source_peek_uid (unit->source);
+  source_uid = e_source_get_uid (unit->source);
   g_hash_table_iter_init (&e_iter, unit->events);
   while (g_hash_table_iter_next (&e_iter, &e_key, &e_value))
     {
@@ -885,61 +910,45 @@ gcal_manager_get_sources_model (GcalManager *manager)
 gchar*
 gcal_manager_add_source (GcalManager *manager,
                          const gchar *name,
-                         const gchar *base_uri,
-                         const gchar *relative_uri,
+                         const gchar *backend,
                          const gchar *color)
 {
   GcalManagerPrivate *priv;
-  GSList *groups;
-  ESourceGroup *selected_group;
-  GHashTableIter iter;
-  gpointer key;
-  gpointer value;
   ESource *source;
+  ESourceCalendar *extension;
+  GError *error;
 
   g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL);
   priv = manager->priv;
   g_return_val_if_fail (GCAL_IS_MANAGER (manager), FALSE);
 
-  selected_group = NULL;
-  for (groups = e_source_list_peek_groups (priv->system_sources);
-       groups != NULL;
-       groups = groups->next)
-    {
-      if (g_strcmp0 (
-            base_uri,
-            e_source_group_peek_base_uri (E_SOURCE_GROUP (groups->data))) == 0)
-        {
-          selected_group = (ESourceGroup*) groups->data;
+  source = e_source_new (NULL, NULL, NULL);
+  extension = E_SOURCE_CALENDAR (e_source_get_extension (source,
+                                                         E_SOURCE_EXTENSION_CALENDAR));
 
-          g_hash_table_iter_init (&iter, priv->clients);
-          while (g_hash_table_iter_next (&iter, &key, &value))
-            {
-              GcalManagerUnit *unit = (GcalManagerUnit*) value;
-              if (g_strcmp0 (
-                    e_source_peek_relative_uri (unit->source),
-                    relative_uri) == 0)
-                {
-                  return NULL;
-                }
-            }
-          break;
-        }
-    }
+  g_object_set (extension,
+                "backend-name", backend,
+                "color", color,
+                NULL);
+
+  e_source_set_display_name (source, name);
 
-  if (selected_group == NULL)
+  error = NULL;
+  e_source_registry_commit_source_sync (priv->source_registry,
+                                        source,
+                                        NULL,
+                                        &error);
+  if (error)
     {
-      selected_group = e_source_group_new (gcal_get_group_name (base_uri),
-                                           base_uri);
-      e_source_list_add_group (priv->system_sources, selected_group, -1);
+      g_warning ("Failed to store calendar configuration: %s",
+                 error->message);
+      g_error_free (error);
+      g_object_unref (source);
+      return NULL;
     }
 
-  source = e_source_new (name, relative_uri);
-  e_source_group_add_source (selected_group, source, -1);
-
   gcal_manager_load_source (manager, source);
-
-  return g_strdup (e_source_peek_uid (source));
+  return e_source_dup_uid (source);
 }
 
 const gchar*
@@ -953,7 +962,7 @@ gcal_manager_get_source_name (GcalManager *manager,
   priv = manager->priv;
 
   unit = g_hash_table_lookup (priv->clients, source_uid);
-  return e_source_peek_name (unit->source);
+  return e_source_get_display_name (unit->source);
 }
 
 /**
@@ -1254,21 +1263,18 @@ gcal_manager_get_event_color (GcalManager *manager,
 {
   GcalManagerPrivate *priv;
   GcalManagerUnit *unit;
+  ESourceSelectable *extension;
   GdkRGBA *color;
-  GdkColor gdk_color;
 
   g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL);
   priv = manager->priv;
   color = g_new0 (GdkRGBA, 1);
 
   unit = g_hash_table_lookup (priv->clients, source_uid);
-  gdk_color_parse (e_source_peek_color_spec (unit->source), &gdk_color);
-
-  color->red = (gdouble) gdk_color.red / 65535;
-  color->green = (gdouble) gdk_color.green / 65535;
-  color->blue = (gdouble) gdk_color.blue / 65535;
-  color->alpha = 1;
 
+  extension = E_SOURCE_SELECTABLE (e_source_get_extension (unit->source,
+                                   E_SOURCE_EXTENSION_CALENDAR));
+  gdk_rgba_parse (color, e_source_selectable_get_color (extension));
   return color;
 }
 
diff --git a/src/gcal-manager.h b/src/gcal-manager.h
index 721af4b..cf6d71d 100644
--- a/src/gcal-manager.h
+++ b/src/gcal-manager.h
@@ -65,8 +65,7 @@ GtkListStore*  gcal_manager_get_sources_model       (GcalManager        *manager
 
 gchar*         gcal_manager_add_source              (GcalManager        *manager,
                                                      const gchar        *name,
-                                                     const gchar        *base_uri,
-                                                     const gchar        *relative_uri,
+                                                     const gchar        *backend,
                                                      const gchar        *color);
 
 const gchar*   gcal_manager_get_source_name         (GcalManager        *manager,
diff --git a/src/gcal-month-view.c b/src/gcal-month-view.c
index a13c0d8..755f03d 100644
--- a/src/gcal-month-view.c
+++ b/src/gcal-month-view.c
@@ -25,7 +25,7 @@
 
 #include <glib/gi18n.h>
 
-#include <libecal/e-cal-time-util.h>
+#include <libecal/libecal.h>
 
 enum
 {
diff --git a/src/gcal-utils.c b/src/gcal-utils.c
index e897ffb..4b3afca 100644
--- a/src/gcal-utils.c
+++ b/src/gcal-utils.c
@@ -20,12 +20,12 @@
 
 #include "gcal-utils.h"
 
-#include <string.h>
-
 #include <glib/gi18n.h>
 
-#include <libedataserver/e-data-server-util.h>
-#include <libedataserverui/e-cell-renderer-color.h>
+#include <string.h>
+
+#include <libedataserver/libedataserver.h>
+#include <libedataserverui/libedataserverui.h>
 
 G_DEFINE_BOXED_TYPE (icaltimetype, icaltime, gcal_dup_icaltime, g_free)
 
diff --git a/src/gcal-week-view.c b/src/gcal-week-view.c
index c37a9b7..d1bda71 100644
--- a/src/gcal-week-view.c
+++ b/src/gcal-week-view.c
@@ -25,7 +25,7 @@
 
 #include <glib/gi18n.h>
 
-#include <libecal/e-cal-time-util.h>
+#include <libecal/libecal.h>
 
 enum
 {
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 43b7193..ca5f257 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -29,11 +29,11 @@
 #include "gcal-enum-types.h"
 #include "gtk-notification.h"
 
+#include <glib/gi18n.h>
 #include <clutter/clutter.h>
 #include <clutter-gtk/clutter-gtk.h>
-#include <glib/gi18n.h>
 
-#include <libedataserverui/e-cell-renderer-color.h>
+#include <libedataserverui/libedataserverui.h>
 
 #include <libical/icaltime.h>
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]