Re: [evolution-patches] 56416



On Sun, 2004-04-04 at 00:13 +0200, Rodrigo Moya wrote: 
> On Sat, 2004-04-03 at 00:19 -0500, JP Rosevear wrote:
> 
> > This was exposed fixing another bug where the backends wouldn't be told
> > the timezones they needed.
> > 
> 

> shouldn't this check the timezone is not already on the hash table?

Yes, it probably should, although there shouldn't be many time zones
added to a read only backend (other than the default).  New patch
attached.

-JP
-- 
JP Rosevear <jpr ximian com>
Novell, Inc.
? 56111.patch
? backend-debug.patch
? contact-zone.patch
? parse.patch
? libecal/old.c
? libical/compile.patch
? libical/src/libicalss/icalssyacc.output
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/ChangeLog,v
retrieving revision 1.235
diff -u -r1.235 ChangeLog
--- ChangeLog	2 Apr 2004 12:14:23 -0000	1.235
+++ ChangeLog	4 Apr 2004 20:40:13 -0000
@@ -1,3 +1,17 @@
+2004-04-03  JP Rosevear  <jpr ximian com>
+
+	Fixes #56416
+	
+	* backends/contacts/e-cal-backend-contacts.c
+	(e_cal_backend_contacts_get_timezone): implement
+	(e_cal_backend_contacts_add_timezone): ditto
+	(e_cal_backend_contacts_set_default_timezone): ditto
+	(free_zone): free a timezone
+	(e_cal_backend_contacts_finalize): destroy the zones hash table
+	(e_cal_backend_contacts_class_init): add new method
+	implementations
+	(e_cal_backend_contacts_init): set up zones hash table
+
 2004-04-02  Rodrigo Moya <rodrigo ximian com>
 
 	Fixes #55719
Index: backends/contacts/e-cal-backend-contacts.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/backends/contacts/e-cal-backend-contacts.c,v
retrieving revision 1.8
diff -u -r1.8 e-cal-backend-contacts.c
--- backends/contacts/e-cal-backend-contacts.c	31 Mar 2004 15:56:22 -0000	1.8
+++ backends/contacts/e-cal-backend-contacts.c	4 Apr 2004 20:40:13 -0000
@@ -53,6 +53,7 @@
         EBookView    *book_view;
         GHashTable   *tracked_contacts;   /* UID -> ContactRecord */
 
+	GHashTable *zones;	
 	icaltimezone *default_zone;
 };
 
@@ -729,6 +730,90 @@
 }
 
 static ECalBackendSyncStatus
+e_cal_backend_contacts_get_timezone (ECalBackendSync *backend, EDataCal *cal, const char *tzid, char **object)
+{
+	ECalBackendContacts *cbcontacts;
+	ECalBackendContactsPrivate *priv;
+	icaltimezone *zone;
+	icalcomponent *icalcomp;
+
+	cbcontacts = E_CAL_BACKEND_CONTACTS (backend);
+	priv = cbcontacts->priv;
+
+	g_return_val_if_fail (tzid != NULL, GNOME_Evolution_Calendar_ObjectNotFound);
+
+	zone = e_cal_backend_internal_get_timezone (E_CAL_BACKEND (backend), tzid);
+	if (!zone)
+		return GNOME_Evolution_Calendar_ObjectNotFound;
+
+	icalcomp = icaltimezone_get_component (zone);
+	if (!icalcomp)
+		return GNOME_Evolution_Calendar_InvalidObject;
+
+	*object = g_strdup (icalcomponent_as_ical_string (icalcomp));
+
+	return GNOME_Evolution_Calendar_Success;
+}
+
+/* Add_timezone handler for the file backend */
+static ECalBackendSyncStatus
+e_cal_backend_contacts_add_timezone (ECalBackendSync *backend, EDataCal *cal, const char *tzobj)
+{
+	ECalBackendContacts *cbcontacts;
+	ECalBackendContactsPrivate *priv;
+	icalcomponent *tz_comp;
+	icaltimezone *zone;
+	char *tzid;	
+
+	cbcontacts = (ECalBackendContacts *) backend;
+
+	g_return_val_if_fail (E_IS_CAL_BACKEND_CONTACTS (cbcontacts), GNOME_Evolution_Calendar_OtherError);
+	g_return_val_if_fail (tzobj != NULL, GNOME_Evolution_Calendar_OtherError);
+
+	priv = cbcontacts->priv;
+	
+	tz_comp = icalparser_parse_string (tzobj);
+	if (!tz_comp)
+		return GNOME_Evolution_Calendar_InvalidObject;
+
+	if (icalcomponent_isa (tz_comp) != ICAL_VTIMEZONE_COMPONENT)
+		return GNOME_Evolution_Calendar_InvalidObject;
+	
+	zone = icaltimezone_new ();
+	icaltimezone_set_component (zone, tz_comp);
+	tzid = icaltimezone_get_tzid (zone);
+	
+	if (g_hash_table_lookup (priv->zones, tzid)) {
+		icaltimezone_free (zone, TRUE);
+		
+		return GNOME_Evolution_Calendar_Success;
+	}
+	
+	g_hash_table_insert (priv->zones, g_strdup (tzid), zone);
+
+	return GNOME_Evolution_Calendar_Success;
+}
+
+static ECalBackendSyncStatus
+e_cal_backend_contacts_set_default_timezone (ECalBackendSync *backend, EDataCal *cal, const char *tzid)
+{
+	ECalBackendContacts *cbcontacts;
+	ECalBackendContactsPrivate *priv;
+
+	cbcontacts = E_CAL_BACKEND_CONTACTS (backend);
+	priv = cbcontacts->priv;
+
+	priv->default_zone = e_cal_backend_internal_get_timezone (E_CAL_BACKEND (backend), tzid);
+	if (priv->default_zone) {
+		priv->default_zone = icaltimezone_get_utc_timezone ();
+
+		return GNOME_Evolution_Calendar_ObjectNotFound;
+	}
+	
+	return GNOME_Evolution_Calendar_Success;
+}
+
+static ECalBackendSyncStatus
 e_cal_backend_contacts_get_object_list (ECalBackendSync *backend, EDataCal *cal,
 					const char *sexp_string, GList **objects)
 {
@@ -794,6 +879,12 @@
 /***********************************************************************************
  */
 
+static void
+free_zone (gpointer data)
+{
+	icaltimezone_free (data, TRUE);
+}
+
 /* Finalize handler for the contacts backend */
 static void
 e_cal_backend_contacts_finalize (GObject *object)
@@ -808,6 +899,7 @@
 	priv = cbc->priv;
 
         g_hash_table_destroy (priv->tracked_contacts);
+        g_hash_table_destroy (priv->zones);
         
 	g_free (priv);
 	cbc->priv = NULL;
@@ -831,6 +923,7 @@
         priv->tracked_contacts = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                         g_free, (GDestroyNotify)contact_record_free);
         
+	priv->zones = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_zone);
 	priv->default_zone = icaltimezone_get_utc_timezone ();
         
 	cbc->priv = priv;
@@ -865,6 +958,9 @@
  	sync_class->get_default_object_sync = e_cal_backend_contacts_get_default_object;
 	sync_class->get_object_sync = e_cal_backend_contacts_get_object;
 	sync_class->get_object_list_sync = e_cal_backend_contacts_get_object_list;
+	sync_class->get_timezone_sync = e_cal_backend_contacts_get_timezone;
+	sync_class->add_timezone_sync = e_cal_backend_contacts_add_timezone;
+	sync_class->set_default_timezone_sync = e_cal_backend_contacts_set_default_timezone;
 	sync_class->get_freebusy_sync = e_cal_backend_contacts_get_free_busy;
 	sync_class->get_changes_sync = e_cal_backend_contacts_get_changes;
 	backend_class->is_loaded = e_cal_backend_contacts_is_loaded;


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