summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJP Rosevear <jpr@ximian.com>2004-04-05 00:43:11 +0000
committerJP Rosevear <jpr@src.gnome.org>2004-04-05 00:43:11 +0000
commit47102e6ee92ef8524e1ddc72682d57364c476a71 (patch)
tree7fac0efc3a5aabbac90535038792af7bf168313b
parent961b5ffa82c3d627fff8a9c9c737cf578ae1e886 (diff)
downloadevolution-data-server-47102e6ee92ef8524e1ddc72682d57364c476a71.tar.gz
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
-rw-r--r--calendar/ChangeLog14
-rw-r--r--calendar/backends/contacts/e-cal-backend-contacts.c96
2 files changed, 110 insertions, 0 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index a8dbf3f89..bda92f4cd 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -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
diff --git a/calendar/backends/contacts/e-cal-backend-contacts.c b/calendar/backends/contacts/e-cal-backend-contacts.c
index c9b214e07..b73c41bf0 100644
--- a/calendar/backends/contacts/e-cal-backend-contacts.c
+++ b/calendar/backends/contacts/e-cal-backend-contacts.c
@@ -53,6 +53,7 @@ struct _ECalBackendContactsPrivate {
EBookView *book_view;
GHashTable *tracked_contacts; /* UID -> ContactRecord */
+ GHashTable *zones;
icaltimezone *default_zone;
};
@@ -729,6 +730,90 @@ e_cal_backend_contacts_is_loaded (ECalBackend *backend)
}
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 @@ e_cal_backend_contacts_internal_get_timezone (ECalBackend *backend, const char *
/***********************************************************************************
*/
+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 @@ e_cal_backend_contacts_finalize (GObject *object)
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 @@ e_cal_backend_contacts_init (ECalBackendContacts *cbc, ECalBackendContactsClass
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 @@ e_cal_backend_contacts_class_init (ECalBackendContactsClass *class)
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;