[evolution-ews] Request and parse the tzid from the exchange server when a GetItem action is performed



commit 019a900f1988e07ea64553cd4d015f043eaeb69a
Author: Or Goshen <orx goshen intel com>
Date:   Mon Jul 18 15:51:05 2011 +0300

    Request and parse the tzid from the exchange server when a GetItem action is performed

 src/calendar/e-cal-backend-ews.c |   23 ++++++++++++++++++++---
 src/server/e-ews-item.c          |   18 +++++++++++++++++-
 src/server/e-ews-item.h          |    1 +
 3 files changed, 38 insertions(+), 4 deletions(-)
---
diff --git a/src/calendar/e-cal-backend-ews.c b/src/calendar/e-cal-backend-ews.c
index 0147e68..83d06f8 100644
--- a/src/calendar/e-cal-backend-ews.c
+++ b/src/calendar/e-cal-backend-ews.c
@@ -2596,20 +2596,37 @@ add_item_to_cache (ECalBackendEws *cbews, EEwsItem *item, gchar *uid)
 
 		icalcomponent_add_component (vcomp,icalcomp);
 	} else {
+		struct icaltimetype dt;
+		icaltimezone *zone;
 		mime_content = e_ews_item_get_mime_content (item);
 		vcomp = icalparser_parse_string (mime_content);
 
 		/* Add the timezone */
 		vtimezone = icalcomponent_get_first_component (vcomp, ICAL_VTIMEZONE_COMPONENT);
 		if (vtimezone) {
-			icaltimezone *zone;
-
 			zone = icaltimezone_new ();
 			icaltimezone_set_component (zone, icalcomponent_new_clone (vtimezone));
 			e_cal_backend_store_put_timezone (priv->store, zone);
 
 			icaltimezone_free (zone, TRUE);
 		}
+
+		if ((zone = (icaltimezone *)e_cal_backend_store_get_timezone(priv->store, e_ews_item_get_tzid (item))) == NULL)
+			zone = (icaltimezone *)icaltimezone_get_builtin_timezone(e_ews_item_get_tzid (item));
+
+		if (zone) {
+			icalcomp = icalcomponent_get_first_component (vcomp, kind);
+
+			icalcomponent_add_component (vcomp, icalcomponent_new_clone (icaltimezone_get_component (zone)));
+
+			dt = icalcomponent_get_dtstart (icalcomp);
+			dt = icaltime_set_timezone (&dt, zone);
+			icalcomponent_set_dtstart (icalcomp, dt);
+
+			dt = icalcomponent_get_dtend (icalcomp);
+			dt = icaltime_set_timezone (&dt, zone);
+			icalcomponent_set_dtend (icalcomp, dt);
+		}
 	}
 	/* Vevent or Vtodo */
 	icalcomp = icalcomponent_get_first_component (vcomp, kind);
@@ -2934,7 +2951,7 @@ ews_cal_sync_items_ready_cb (GObject *obj, GAsyncResult *res, gpointer user_data
 						  EWS_PRIORITY_MEDIUM,
 						  cal_item_ids,
 						  "IdOnly",
-						  "item:Attachments item:HasAttachments item:MimeContent calendar:ModifiedOccurrences calendar:RequiredAttendees calendar:OptionalAttendees",
+						  "item:Attachments item:HasAttachments item:MimeContent calendar:TimeZone calendar:ModifiedOccurrences calendar:RequiredAttendees calendar:OptionalAttendees",
 						  FALSE, NULL,
 						  ews_cal_get_items_ready_cb,
 						  NULL, NULL, NULL,
diff --git a/src/server/e-ews-item.c b/src/server/e-ews-item.c
index 48d0ed6..aa13a24 100644
--- a/src/server/e-ews-item.c
+++ b/src/server/e-ews-item.c
@@ -171,6 +171,8 @@ struct _EEwsItemPrivate {
 	gboolean is_read;
 	EwsImportance importance;
 
+	gchar *timezone;
+
 	GSList *to_recipients;
 	GSList *cc_recipients;
 	GSList *bcc_recipients;
@@ -232,6 +234,9 @@ e_ews_item_dispose (GObject *object)
 	g_free (priv->references);
 	priv->references = NULL;
 
+	g_free (priv->timezone);
+	priv->timezone = NULL;
+
 	if (priv->to_recipients) {
 		g_slist_foreach (priv->to_recipients, (GFunc) ews_item_free_mailbox, NULL);
 		g_slist_free (priv->to_recipients);
@@ -973,6 +978,8 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item, ESoapParameter *param)
 			value = e_soap_parameter_get_string_value (subparam);
 			priv->is_read = (!g_ascii_strcasecmp (value, "true"));
 			g_free (value);
+		} else if (!g_ascii_strcasecmp (name, "TimeZone")) {
+			priv->timezone = e_soap_parameter_get_string_value (subparam);
 		} else if (task) {
 			parse_task_field (item, name, subparam);
 			/* fields below are not relevant for task, so skip them */
@@ -1713,4 +1720,13 @@ e_ews_item_task_has_complete_date (EEwsItem *item,  gboolean *has_date)
 	*has_date =  item->priv->task_fields->has_complete_date;
 
 	return TRUE;
-}
\ No newline at end of file
+}
+
+const gchar *
+e_ews_item_get_tzid (EEwsItem *item)
+{
+	g_return_val_if_fail (E_IS_EWS_ITEM(item), NULL);
+	g_return_val_if_fail (item->priv->timezone != NULL, NULL);
+
+	return item->priv->timezone;
+}
diff --git a/src/server/e-ews-item.h b/src/server/e-ews-item.h
index aefc17f..6ff26ca 100644
--- a/src/server/e-ews-item.h
+++ b/src/server/e-ews-item.h
@@ -208,6 +208,7 @@ gboolean	e_ews_item_task_has_due_date	(EEwsItem *item,
 gboolean	e_ews_item_task_has_complete_date
 						(EEwsItem* item,
 						 gboolean* has_date);
+const gchar *	e_ews_item_get_tzid		(EEwsItem *item);
 
 G_END_DECLS
 



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