[evolution-patches] timezone support in ECalBackendCache



This patch adds support for storing / retrieving timezones in the
cal-backend cache. This is needed for an upcoming patch I'll send
separately to add timezone support to the GW backend.
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/ChangeLog,v
retrieving revision 1.203
diff -u -p -r1.203 ChangeLog
--- ChangeLog	11 Mar 2004 15:15:06 -0000	1.203
+++ ChangeLog	11 Mar 2004 16:33:18 -0000
@@ -1,5 +1,17 @@
 2004-03-11  Rodrigo Moya <rodrigo ximian com>
 
+	* libedata-cal/e-cal-backend-cache.[ch]
+	(e_cal_backend_cache_get_timezone, e_cal_backend_cache_put_timezone,
+	e_cal_backend_cache_remove_timezone): new functions to support
+	timezones in the cache.
+	(e_cal_backend_cache_get_components): only append to the returned
+	list the VEVENT's and VTODO's components.
+	(e_cal_backend_cache_init): create a hash table to store all the
+	icaltimezone objects we create in e_cal_backend_cache_get_timezone.
+	(e_cal_backend_cache_finalize): free the timezones hash table.
+
+2004-03-11  Rodrigo Moya <rodrigo ximian com>
+
 	* libedata-cal/e-data-cal.c (e_data_cal_notify_objects_sent): guard
 	against sending NULL strings to CORBA.
 
Index: libedata-cal/e-cal-backend-cache.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/libedata-cal/e-cal-backend-cache.c,v
retrieving revision 1.13
diff -u -p -r1.13 e-cal-backend-cache.c
--- libedata-cal/e-cal-backend-cache.c	26 Jan 2004 14:55:08 -0000	1.13
+++ libedata-cal/e-cal-backend-cache.c	11 Mar 2004 16:33:18 -0000
@@ -29,6 +29,7 @@
 
 struct _ECalBackendCachePrivate {
 	char *uri;
+	GHashTable *timezones;
 };
 
 /* Property IDs */
@@ -112,6 +113,13 @@ e_cal_backend_cache_get_property (GObjec
 }
 
 static void
+free_timezone_hash (gpointer key, gpointer value, gpointer user_data)
+{
+	g_free (key);
+	icaltimezone_free (value, 1);
+}
+
+static void
 e_cal_backend_cache_finalize (GObject *object)
 {
 	ECalBackendCache *cache;
@@ -126,6 +134,12 @@ e_cal_backend_cache_finalize (GObject *o
 			priv->uri = NULL;
 		}
 
+		if (priv->timezones) {
+			g_hash_table_foreach (priv->timezones, (GHFunc) free_timezone_hash, NULL);
+			g_hash_table_destroy (priv->timezones);
+			priv->timezones = NULL;
+		}
+
 		g_free (priv);
 		cache->priv = NULL;
 	}
@@ -184,7 +198,10 @@ e_cal_backend_cache_init (ECalBackendCac
 	ECalBackendCachePrivate *priv;
 
 	priv = g_new0 (ECalBackendCachePrivate, 1);
+	priv->timezones = g_hash_table_new (g_str_hash, g_str_equal);
+
 	cache->priv = priv;
+
 }
 
 /**
@@ -380,9 +397,15 @@ e_cal_backend_cache_get_components (ECal
                 if (comp_str) {
                         icalcomp = icalparser_parse_string (comp_str);
                         if (icalcomp) {
-                                comp = e_cal_component_new ();
-                                e_cal_component_set_icalcomponent (comp, icalcomp);
-                                list = g_list_append (list, comp);
+				icalcomponent_kind kind;
+
+				kind = icalcomponent_isa (icalcomp);
+				if (kind == ICAL_VEVENT_COMPONENT || kind == ICAL_VTODO_COMPONENT) {
+					comp = e_cal_component_new ();
+					e_cal_component_set_icalcomponent (comp, icalcomp);
+					list = g_list_append (list, comp);
+				} else
+					icalcomponent_free (icalcomp);
                         }
                 }
                 
@@ -390,3 +413,70 @@ e_cal_backend_cache_get_components (ECal
 
         return list;
 }
+
+const icaltimezone *
+e_cal_backend_cache_get_timezone (ECalBackendCache *cache, const char *tzid)
+{
+	icaltimezone *zone;
+	const char *comp_str;
+	ECalBackendCachePrivate *priv;
+
+	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), NULL);
+	g_return_val_if_fail (tzid != NULL, NULL);
+
+	priv = cache->priv;
+
+	/* we first look for the timezone in the timezones hash table */
+	zone = g_hash_table_lookup (priv->timezones, tzid);
+	if (zone)
+		return (const icaltimezone *) zone;
+
+	/* if not found look for the timezone in the cache */
+	comp_str = e_file_cache_get_object (E_FILE_CACHE (cache), tzid);
+	if (comp_str) {
+		icalcomponent *icalcomp;
+
+		icalcomp = icalparser_parse_string (comp_str);
+		if (icalcomp) {
+			zone = icaltimezone_new ();
+			if (icaltimezone_set_component (zone, icalcomp) == 1)
+				g_hash_table_insert (priv->timezones, g_strdup (tzid), zone);
+			else {
+				icalcomponent_free (icalcomp);
+				icaltimezone_free (zone, 1);
+			}
+		}
+	}
+
+	return (const icaltimezone *) zone;
+}
+
+gboolean
+e_cal_backend_cache_put_timezone (ECalBackendCache *cache, const icaltimezone *zone)
+{
+	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), FALSE);
+	g_return_val_if_fail (zone != NULL, FALSE);
+
+	/* FIXME */
+	return FALSE;
+}
+
+gboolean
+e_cal_backend_cache_remove_timezone (ECalBackendCache *cache, const char *tzid)
+{
+	gpointer orig_key, orig_value;
+	ECalBackendCachePrivate *priv;
+
+	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), FALSE);
+	g_return_val_if_fail (tzid != NULL, FALSE);
+
+	priv = cache->priv;
+
+	if (g_hash_table_lookup_extended (priv->timezones, tzid, &orig_key, &orig_value)) {
+		g_hash_table_remove (priv->timezones, tzid);
+		g_free (orig_key);
+		icaltimezone_free (orig_value, 1);
+	}
+
+	return e_file_cache_remove_object (E_FILE_CACHE (cache), tzid);
+}
Index: libedata-cal/e-cal-backend-cache.h
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/libedata-cal/e-cal-backend-cache.h,v
retrieving revision 1.8
diff -u -p -r1.8 e-cal-backend-cache.h
--- libedata-cal/e-cal-backend-cache.h	22 Jan 2004 06:23:21 -0000	1.8
+++ libedata-cal/e-cal-backend-cache.h	11 Mar 2004 16:33:18 -0000
@@ -44,17 +44,21 @@ typedef struct {
 	EFileCacheClass parent_class;
 } ECalBackendCacheClass;
 
-GType             e_cal_backend_cache_get_type (void);
+GType               e_cal_backend_cache_get_type (void);
 
-ECalBackendCache *e_cal_backend_cache_new (const char *uri);
-ECalComponent    *e_cal_backend_cache_get_component (ECalBackendCache *cache,
-						     const char *uid,
-						     const char *rid);
-gboolean          e_cal_backend_cache_put_component (ECalBackendCache *cache, ECalComponent *comp);
-gboolean          e_cal_backend_cache_remove_component (ECalBackendCache *cache,
-							const char *uid,
-							const char *rid);
-GList           *e_cal_backend_cache_get_components (ECalBackendCache *cache);
+ECalBackendCache   *e_cal_backend_cache_new (const char *uri);
+ECalComponent      *e_cal_backend_cache_get_component (ECalBackendCache *cache,
+						       const char *uid,
+						       const char *rid);
+gboolean            e_cal_backend_cache_put_component (ECalBackendCache *cache, ECalComponent *comp);
+gboolean            e_cal_backend_cache_remove_component (ECalBackendCache *cache,
+							  const char *uid,
+							  const char *rid);
+GList              *e_cal_backend_cache_get_components (ECalBackendCache *cache);
+
+const icaltimezone *e_cal_backend_cache_get_timezone (ECalBackendCache *cache, const char *tzid);
+gboolean            e_cal_backend_cache_put_timezone (ECalBackendCache *cache, const icaltimezone *zone);
+gboolean            e_cal_backend_cache_remove_timezone (ECalBackendCache *cache, const char *tzid);
 
 G_END_DECLS
 


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