[evolution-ews] Bug #677888 - Notes on Exchange do not show up as Memos
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Bug #677888 - Notes on Exchange do not show up as Memos
- Date: Thu, 29 Nov 2012 18:13:52 +0000 (UTC)
commit 0756a0ae5bec78943e1d2fbbe0ffa5ebbc5cf543
Author: Milan Crha <mcrha redhat com>
Date: Thu Nov 29 19:13:12 2012 +0100
Bug #677888 - Notes on Exchange do not show up as Memos
src/addressbook/e-book-backend-ews.c | 4 +-
src/calendar/e-cal-backend-ews.c | 300 ++++++++++++++++++++++++--------
src/camel/camel-ews-folder.c | 14 +-
src/camel/camel-ews-utils.c | 2 +-
src/collection/e-ews-backend.c | 15 ++
src/server/e-ews-connection.c | 18 ++-
src/server/e-ews-connection.h | 9 +
src/server/e-ews-enums.h | 3 +-
src/server/e-ews-folder.c | 45 ++---
src/server/e-ews-item.c | 27 ++-
src/server/e-ews-item.h | 3 +-
src/server/tests/test-syncfolder.c | 2 +-
src/utils/e-ews-query-to-restriction.c | 4 +-
13 files changed, 321 insertions(+), 125 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c
index b6bff41..86cd492 100644
--- a/src/addressbook/e-book-backend-ews.c
+++ b/src/addressbook/e-book-backend-ews.c
@@ -2199,7 +2199,7 @@ ebews_fetch_items (EBookBackendEws *ebews,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
contact_item_ids, "Default", CONTACT_ITEM_PROPS,
- FALSE, NULL, &new_items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_TEXT, &new_items, NULL, NULL,
cancellable, error);
if (*error)
goto cleanup;
@@ -2217,7 +2217,7 @@ ebews_fetch_items (EBookBackendEws *ebews,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
dl_ids, "Default", NULL,
- FALSE, NULL, &new_items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_TEXT, &new_items, NULL, NULL,
cancellable, error);
if (*error)
goto cleanup;
diff --git a/src/calendar/e-cal-backend-ews.c b/src/calendar/e-cal-backend-ews.c
index a475fbb..becb0d4 100644
--- a/src/calendar/e-cal-backend-ews.c
+++ b/src/calendar/e-cal-backend-ews.c
@@ -1075,6 +1075,28 @@ add_attendees_list_to_message (ESoapMessage *msg,
}
static void
+convert_sensitivity_calcomp_to_xml (ESoapMessage *msg,
+ icalcomponent *icalcomp)
+{
+ icalproperty *prop;
+
+ g_return_if_fail (msg != NULL);
+ g_return_if_fail (icalcomp != NULL);
+
+ prop = icalcomponent_get_first_property (icalcomp, ICAL_CLASS_PROPERTY);
+ if (prop) {
+ icalproperty_class classify = icalproperty_get_class (prop);
+ if (classify == ICAL_CLASS_PUBLIC) {
+ e_ews_message_write_string_parameter (msg, "Sensitivity", NULL, "Normal");
+ } else if (classify == ICAL_CLASS_PRIVATE) {
+ e_ews_message_write_string_parameter (msg, "Sensitivity", NULL, "Private");
+ } else if (classify == ICAL_CLASS_CONFIDENTIAL) {
+ e_ews_message_write_string_parameter (msg, "Sensitivity", NULL, "Personal");
+ }
+ }
+}
+
+static void
convert_vevent_calcomp_to_xml (ESoapMessage *msg,
gpointer user_data)
{
@@ -1099,6 +1121,8 @@ convert_vevent_calcomp_to_xml (ESoapMessage *msg,
if (value)
e_ews_message_write_string_parameter (msg, "Subject", NULL, value);
+ convert_sensitivity_calcomp_to_xml (msg, icalcomp);
+
/* description */
value = icalcomponent_get_description (icalcomp);
if (value)
@@ -1186,6 +1210,8 @@ convert_vtodo_calcomp_to_xml (ESoapMessage *msg,
e_ews_message_write_string_parameter (msg, "Subject", NULL, icalcomponent_get_summary (icalcomp));
+ convert_sensitivity_calcomp_to_xml (msg, icalcomp);
+
e_ews_message_write_string_parameter_with_attribute (msg, "Body", NULL, icalcomponent_get_description (icalcomp), "BodyType", "Text");
prop = icalcomponent_get_first_property (icalcomp, ICAL_DUE_PROPERTY);
@@ -1225,6 +1251,29 @@ convert_vtodo_calcomp_to_xml (ESoapMessage *msg,
}
static void
+convert_vjournal_calcomp_to_xml (ESoapMessage *msg,
+ gpointer user_data)
+{
+ EwsConvertData *convert_data = user_data;
+ icalcomponent *icalcomp = convert_data->icalcomp;
+ const gchar *text;
+
+ e_soap_message_start_element (msg, "Message", NULL, NULL);
+ e_ews_message_write_string_parameter (msg, "ItemClass", NULL, "IPM.StickyNote");
+
+ e_ews_message_write_string_parameter (msg, "Subject", NULL, icalcomponent_get_summary (icalcomp));
+
+ convert_sensitivity_calcomp_to_xml (msg, icalcomp);
+
+ text = icalcomponent_get_description (icalcomp);
+ if (!text || !*text)
+ text = icalcomponent_get_summary (icalcomp);
+ e_ews_message_write_string_parameter_with_attribute (msg, "Body", NULL, text, "BodyType", "Text");
+
+ e_soap_message_end_element (msg); /* Message */
+}
+
+static void
convert_calcomp_to_xml (ESoapMessage *msg,
gpointer user_data)
{
@@ -1237,7 +1286,11 @@ convert_calcomp_to_xml (ESoapMessage *msg,
case ICAL_VTODO_COMPONENT:
convert_vtodo_calcomp_to_xml (msg, user_data);
break;
+ case ICAL_VJOURNAL_COMPONENT:
+ convert_vjournal_calcomp_to_xml (msg, user_data);
+ break;
default:
+ g_warn_if_reached ();
break;
}
@@ -1348,7 +1401,9 @@ ews_create_attachments_cb (GObject *object,
}
} else if (create_data->cb_type == 2) {
const gchar *send_meeting_invitations;
+ const gchar *send_or_save;
EwsModifyData * modify_data;
+
modify_data = g_new0 (EwsModifyData, 1);
modify_data->cbews = g_object_ref (create_data->cbews);
modify_data->comp = create_data->comp;
@@ -1358,16 +1413,19 @@ ews_create_attachments_cb (GObject *object,
modify_data->itemid = create_data->itemid;
modify_data->changekey = change_key;
- if (e_cal_component_has_attendees (create_data->comp))
+ if (e_cal_component_has_attendees (create_data->comp)) {
send_meeting_invitations = "SendToAllAndSaveCopy";
- else
+ send_or_save = "SendAndSaveCopy";
+ } else {
/*In case of appointment we have to set SendMeetingInvites to SendToNone */
send_meeting_invitations = "SendToNone";
+ send_or_save = "SaveOnly";
+ }
e_ews_connection_update_items (
priv->cnc, EWS_PRIORITY_MEDIUM,
"AlwaysOverwrite",
- "SendAndSaveCopy",
+ send_or_save,
send_meeting_invitations,
priv->folder_id,
convert_component_to_updatexml,
@@ -1419,7 +1477,7 @@ ews_create_object_cb (GObject *object,
item_id = e_ews_item_get_id (item);
g_slist_free (ids);
- if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_CALENDAR_ITEM) {
+ if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_EVENT) {
items = g_slist_append (items, item_id->id);
@@ -1429,7 +1487,7 @@ ews_create_object_cb (GObject *object,
items,
"IdOnly",
"calendar:UID",
- FALSE, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_TEXT,
&items_req,
NULL, NULL, priv->cancellable, &error);
if (!res && error != NULL) {
@@ -1483,7 +1541,7 @@ ews_create_object_cb (GObject *object,
e_cal_backend_store_freeze_changes (priv->store);
/* set a new ical property containing the change key we got from the exchange server for future use */
- if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_CALENDAR_ITEM)
+ if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_EVENT)
e_cal_component_set_uid (create_data->comp, e_ews_item_get_uid (item));
else
e_cal_component_set_uid (create_data->comp, item_id->id);
@@ -1844,6 +1902,18 @@ convert_vevent_component_to_updatexml (ESoapMessage *msg,
} else if (!value && old_value)
convert_vevent_property_to_updatexml (msg, "Subject", "", "item", NULL, NULL);
+ prop = icalcomponent_get_first_property (icalcomp, ICAL_CLASS_PROPERTY);
+ if (prop) {
+ icalproperty_class classify = icalproperty_get_class (prop);
+ if (classify == ICAL_CLASS_PUBLIC) {
+ convert_vevent_property_to_updatexml (msg, "Sensitivity", "Normal", "item", NULL, NULL);
+ } else if (classify == ICAL_CLASS_PRIVATE) {
+ convert_vevent_property_to_updatexml (msg, "Sensitivity", "Private", "item", NULL, NULL);
+ } else if (classify == ICAL_CLASS_CONFIDENTIAL) {
+ convert_vevent_property_to_updatexml (msg, "Sensitivity", "Personal", "item", NULL, NULL);
+ }
+ }
+
/*description*/
value = icalcomponent_get_description (icalcomp);
old_value = icalcomponent_get_description (icalcomp_old);
@@ -2015,6 +2085,18 @@ convert_vtodo_component_to_updatexml (ESoapMessage *msg,
convert_vtodo_property_to_updatexml (msg, "Subject", icalcomponent_get_summary (icalcomp), "item", NULL, NULL);
+ prop = icalcomponent_get_first_property (icalcomp, ICAL_CLASS_PROPERTY);
+ if (prop) {
+ icalproperty_class classify = icalproperty_get_class (prop);
+ if (classify == ICAL_CLASS_PUBLIC) {
+ convert_vtodo_property_to_updatexml (msg, "Sensitivity", "Normal", "item", NULL, NULL);
+ } else if (classify == ICAL_CLASS_PRIVATE) {
+ convert_vtodo_property_to_updatexml (msg, "Sensitivity", "Private", "item", NULL, NULL);
+ } else if (classify == ICAL_CLASS_CONFIDENTIAL) {
+ convert_vtodo_property_to_updatexml (msg, "Sensitivity", "Personal", "item", NULL, NULL);
+ }
+ }
+
convert_vtodo_property_to_updatexml (msg, "Body", icalcomponent_get_description (icalcomp), "item", "BodyType", "Text");
prop = icalcomponent_get_first_property (icalcomp, ICAL_DUE_PROPERTY);
@@ -2068,6 +2150,56 @@ convert_vtodo_component_to_updatexml (ESoapMessage *msg,
}
static void
+convert_vjournal_property_to_updatexml (ESoapMessage *msg,
+ const gchar *name,
+ const gchar *value,
+ const gchar *prefix,
+ const gchar *attr_name,
+ const gchar *attr_value)
+{
+ e_ews_message_start_set_item_field (msg, name, prefix, "Message");
+ e_ews_message_write_string_parameter_with_attribute (msg, name, NULL, value, attr_name, attr_value);
+ e_ews_message_end_set_item_field (msg);
+}
+
+static void
+convert_vjournal_component_to_updatexml (ESoapMessage *msg,
+ gpointer user_data)
+{
+ EwsModifyData *modify_data = user_data;
+ icalcomponent *icalcomp = e_cal_component_get_icalcomponent (modify_data->comp);
+ icalproperty *prop;
+ const gchar *text;
+
+ e_ews_message_start_item_change (
+ msg, E_EWS_ITEMCHANGE_TYPE_ITEM,
+ modify_data->itemid, modify_data->changekey, 0);
+
+ convert_vjournal_property_to_updatexml (msg, "ItemClass", "IPM.StickyNote", "item", NULL, NULL);
+ convert_vjournal_property_to_updatexml (msg, "Subject", icalcomponent_get_summary (icalcomp), "item", NULL, NULL);
+
+ prop = icalcomponent_get_first_property (icalcomp, ICAL_CLASS_PROPERTY);
+ if (prop) {
+ icalproperty_class classify = icalproperty_get_class (prop);
+ if (classify == ICAL_CLASS_PUBLIC) {
+ convert_vjournal_property_to_updatexml (msg, "Sensitivity", "Normal", "item", NULL, NULL);
+ } else if (classify == ICAL_CLASS_PRIVATE) {
+ convert_vjournal_property_to_updatexml (msg, "Sensitivity", "Private", "item", NULL, NULL);
+ } else if (classify == ICAL_CLASS_CONFIDENTIAL) {
+ convert_vjournal_property_to_updatexml (msg, "Sensitivity", "Personal", "item", NULL, NULL);
+ }
+ }
+
+ text = icalcomponent_get_description (icalcomp);
+ if (!text || !*text)
+ text = icalcomponent_get_summary (icalcomp);
+
+ convert_vjournal_property_to_updatexml (msg, "Body", text, "item", "BodyType", "Text");
+
+ e_ews_message_end_item_change (msg);
+}
+
+static void
convert_component_to_updatexml (ESoapMessage *msg,
gpointer user_data)
{
@@ -2081,6 +2213,9 @@ convert_component_to_updatexml (ESoapMessage *msg,
case ICAL_VTODO_COMPONENT:
convert_vtodo_component_to_updatexml (msg, user_data);
break;
+ case ICAL_VJOURNAL_COMPONENT:
+ convert_vjournal_component_to_updatexml (msg, user_data);
+ break;
default:
break;
}
@@ -2259,6 +2394,8 @@ e_cal_backend_ews_modify_object (ECalBackend *backend,
} else {
const gchar *send_meeting_invitations;
+ const gchar *send_or_save;
+
modify_data = g_new0 (EwsModifyData, 1);
modify_data->cbews = g_object_ref (cbews);
modify_data->comp = g_object_ref (comp);
@@ -2268,16 +2405,19 @@ e_cal_backend_ews_modify_object (ECalBackend *backend,
modify_data->itemid = itemid;
modify_data->changekey = changekey;
- if (e_cal_component_has_attendees (comp))
+ if (e_cal_component_has_attendees (comp)) {
send_meeting_invitations = "SendToAllAndSaveCopy";
- else
+ send_or_save = "SendAndSaveCopy";
+ } else {
/*In case of appointment we have to set SendMeetingInvites to SendToNone */
send_meeting_invitations = "SendToNone";
+ send_or_save = "SaveOnly";
+ }
e_ews_connection_update_items (
priv->cnc, EWS_PRIORITY_MEDIUM,
"AlwaysOverwrite",
- "SendAndSaveCopy",
+ send_or_save,
send_meeting_invitations,
priv->folder_id,
convert_component_to_updatexml,
@@ -2892,13 +3032,15 @@ add_item_to_cache (ECalBackendEws *cbews,
{
ECalBackendEwsPrivate *priv;
icalcomponent_kind kind;
+ EEwsItemType item_type;
icalcomponent *vtimezone, *icalcomp, *vcomp;
const gchar *mime_content;
kind = e_cal_backend_get_kind ((ECalBackend *) cbews);
priv = cbews->priv;
- if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_TASK) {
+ item_type = e_ews_item_get_item_type (item);
+ if (item_type == E_EWS_ITEM_TYPE_TASK || item_type == E_EWS_ITEM_TYPE_MEMO) {
icalproperty *icalprop;
icaltimetype due_date, start_date, complete_date, created;
icalproperty_status status = ICAL_STATUS_NONE;
@@ -2910,70 +3052,15 @@ add_item_to_cache (ECalBackendEws *cbews,
vcomp = icalcomponent_new (ICAL_VCALENDAR_COMPONENT);
/*subject*/
- icalcomp = icalcomponent_new (ICAL_VTODO_COMPONENT);
+ icalcomp = icalcomponent_new (item_type == E_EWS_ITEM_TYPE_TASK ? ICAL_VTODO_COMPONENT : ICAL_VJOURNAL_COMPONENT);
icalprop = icalproperty_new_summary (e_ews_item_get_subject (item));
icalcomponent_add_property (icalcomp, icalprop);
- /*status*/
- ews_task_status = e_ews_item_get_status (item);
- if (!g_strcmp0 (ews_task_status, "NotStarted") == 0) {
- if (g_strcmp0 (ews_task_status, "Completed") == 0)
- status = ICAL_STATUS_COMPLETED;
- else if (g_strcmp0 (ews_task_status, "InProgress") == 0)
- status = ICAL_STATUS_INPROCESS;
- else if (g_strcmp0 (ews_task_status, "WaitingOnOthers") == 0)
- status = ICAL_STATUS_NEEDSACTION;
- else if (g_strcmp0 (ews_task_status, "Deferred") == 0)
- status = ICAL_STATUS_CANCELLED;
- icalprop = icalproperty_new_status (status);
- icalcomponent_add_property (icalcomp, icalprop);
- }
- /*precent complete*/
- icalprop = icalproperty_new_percentcomplete (atoi (e_ews_item_get_percent_complete (item)));
- icalcomponent_add_property (icalcomp, icalprop);
-
- /*due date*/
- e_ews_item_task_has_due_date (item, &has_this_date);
- if (has_this_date) {
- due_date = icaltime_from_timet_with_zone (e_ews_item_get_due_date (item), 0, priv->default_zone);
- due_date.is_date = 1;
- icalprop = icalproperty_new_due (due_date);
- icalcomponent_add_property (icalcomp, icalprop);
- }
-
- /*start date*/
- has_this_date = FALSE;
- e_ews_item_task_has_start_date (item, &has_this_date);
- if (has_this_date) {
- start_date = icaltime_from_timet_with_zone (e_ews_item_get_start_date (item), 0, priv->default_zone);
- start_date.is_date = 1;
- icalprop = icalproperty_new_dtstart (start_date);
- icalcomponent_add_property (icalcomp, icalprop);
- }
-
- /*complete date*/
- has_this_date = FALSE;
- e_ews_item_task_has_complete_date (item, &has_this_date);
- if (has_this_date) {
- complete_date = icaltime_from_timet_with_zone (e_ews_item_get_complete_date (item), 0, priv->default_zone);
- complete_date.is_date = 1;
- icalprop = icalproperty_new_completed (complete_date);
- icalcomponent_add_property (icalcomp, icalprop);
- }
/*date time created*/
created = icaltime_from_timet_with_zone (e_ews_item_get_date_created (item), 0, priv->default_zone);
icalprop = icalproperty_new_created (created);
icalcomponent_add_property (icalcomp, icalprop);
- /*priority*/
- item_importance = e_ews_item_get_importance (item);
- if (item_importance == EWS_ITEM_HIGH)
- priority = 3;
- else if (item_importance == EWS_ITEM_LOW)
- priority = 7;
- icalprop = icalproperty_new_priority (priority);
- icalcomponent_add_property (icalcomp, icalprop);
-
/*sensitivity*/
sensitivity = e_ews_item_get_sensitivity (item);
if (g_strcmp0 (sensitivity, "Normal") == 0)
@@ -2991,7 +3078,7 @@ add_item_to_cache (ECalBackendEws *cbews,
icalcomponent_add_property (icalcomp, icalprop);
/*task assaingments*/
- if (e_ews_item_get_delegator (item)!= NULL) {
+ if (e_ews_item_get_delegator (item) != NULL) {
const gchar *task_owner = e_ews_item_get_delegator (item);
GSList *mailboxes = NULL, *l;
GError *error = NULL;
@@ -3031,6 +3118,65 @@ add_item_to_cache (ECalBackendEws *cbews,
g_slist_free (mailboxes);
}
+ if (item_type == E_EWS_ITEM_TYPE_TASK) {
+ /*start date*/
+ has_this_date = FALSE;
+ e_ews_item_task_has_start_date (item, &has_this_date);
+ if (has_this_date) {
+ start_date = icaltime_from_timet_with_zone (e_ews_item_get_start_date (item), 0, priv->default_zone);
+ start_date.is_date = 1;
+ icalprop = icalproperty_new_dtstart (start_date);
+ icalcomponent_add_property (icalcomp, icalprop);
+ }
+
+ /*status*/
+ ews_task_status = e_ews_item_get_status (item);
+ if (!g_strcmp0 (ews_task_status, "NotStarted") == 0) {
+ if (g_strcmp0 (ews_task_status, "Completed") == 0)
+ status = ICAL_STATUS_COMPLETED;
+ else if (g_strcmp0 (ews_task_status, "InProgress") == 0)
+ status = ICAL_STATUS_INPROCESS;
+ else if (g_strcmp0 (ews_task_status, "WaitingOnOthers") == 0)
+ status = ICAL_STATUS_NEEDSACTION;
+ else if (g_strcmp0 (ews_task_status, "Deferred") == 0)
+ status = ICAL_STATUS_CANCELLED;
+ icalprop = icalproperty_new_status (status);
+ icalcomponent_add_property (icalcomp, icalprop);
+ }
+
+ /*precent complete*/
+ icalprop = icalproperty_new_percentcomplete (atoi (e_ews_item_get_percent_complete (item)));
+ icalcomponent_add_property (icalcomp, icalprop);
+
+ /*due date*/
+ e_ews_item_task_has_due_date (item, &has_this_date);
+ if (has_this_date) {
+ due_date = icaltime_from_timet_with_zone (e_ews_item_get_due_date (item), 0, priv->default_zone);
+ due_date.is_date = 1;
+ icalprop = icalproperty_new_due (due_date);
+ icalcomponent_add_property (icalcomp, icalprop);
+ }
+
+ /*complete date*/
+ has_this_date = FALSE;
+ e_ews_item_task_has_complete_date (item, &has_this_date);
+ if (has_this_date) {
+ complete_date = icaltime_from_timet_with_zone (e_ews_item_get_complete_date (item), 0, priv->default_zone);
+ complete_date.is_date = 1;
+ icalprop = icalproperty_new_completed (complete_date);
+ icalcomponent_add_property (icalcomp, icalprop);
+ }
+
+ /*priority*/
+ item_importance = e_ews_item_get_importance (item);
+ if (item_importance == EWS_ITEM_HIGH)
+ priority = 3;
+ else if (item_importance == EWS_ITEM_LOW)
+ priority = 7;
+ icalprop = icalproperty_new_priority (priority);
+ icalcomponent_add_property (icalcomp, icalprop);
+ }
+
icalcomponent_add_component (vcomp,icalcomp);
} else {
struct icaltimetype dt;
@@ -3303,6 +3449,7 @@ ews_cal_sync_get_items_sync (ECalBackendEws *cbews,
additional_props,
FALSE,
NULL,
+ E_EWS_BODY_TYPE_TEXT,
&items,
NULL, NULL,
priv->cancellable,
@@ -3361,7 +3508,7 @@ cal_backend_ews_process_folder_items (ECalBackendEws *cbews,
GHashTable *ex_to_smtp)
{
ECalBackendEwsPrivate *priv;
- GSList *l[2], *m, *cal_item_ids = NULL, *task_item_ids = NULL;
+ GSList *l[2], *m, *cal_item_ids = NULL, *task_memo_item_ids = NULL;
gint i;
priv = cbews->priv;
@@ -3376,10 +3523,10 @@ cal_backend_ews_process_folder_items (ECalBackendEws *cbews,
const EwsId *id;
id = e_ews_item_get_id (item);
- if (type == E_EWS_ITEM_TYPE_CALENDAR_ITEM)
+ if (type == E_EWS_ITEM_TYPE_EVENT)
cal_item_ids = g_slist_prepend (cal_item_ids, id->id);
- else if (type == E_EWS_ITEM_TYPE_TASK)
- task_item_ids = g_slist_prepend (task_item_ids, id->id);
+ else if (type == E_EWS_ITEM_TYPE_TASK || type == E_EWS_ITEM_TYPE_MEMO)
+ task_memo_item_ids = g_slist_prepend (task_memo_item_ids, id->id);
}
}
@@ -3406,17 +3553,17 @@ cal_backend_ews_process_folder_items (ECalBackendEws *cbews,
ex_to_smtp);
}
- if (task_item_ids) {
+ if (task_memo_item_ids) {
ews_cal_sync_get_items_sync (
cbews,
- task_item_ids,
+ task_memo_item_ids,
"AllProperties",
NULL,
ex_to_smtp);
}
g_slist_free (cal_item_ids);
- g_slist_free (task_item_ids);
+ g_slist_free (task_memo_item_ids);
}
static void
@@ -3469,7 +3616,7 @@ ews_start_sync_thread (gpointer data)
e_ews_connection_sync_folder_items_sync (
priv->cnc, EWS_PRIORITY_MEDIUM,
old_sync_state, priv->folder_id,
- "IdOnly", NULL,
+ "IdOnly", "item:ItemClass",
EWS_MAX_FETCH_COUNT,
&new_sync_state,
&includes_last_item,
@@ -3861,6 +4008,9 @@ e_cal_backend_ews_get_backend_property (ECalBackend *backend,
case ICAL_VTODO_COMPONENT:
e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_TODO);
break;
+ case ICAL_VJOURNAL_COMPONENT:
+ e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_JOURNAL);
+ break;
default:
g_object_unref (comp);
e_data_cal_respond_get_backend_property (cal, opid, EDC_ERROR (ObjectNotFound), NULL);
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 80b1c10..26489a2 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -453,7 +453,7 @@ camel_ews_folder_get_message (CamelFolder *folder,
res = e_ews_connection_get_items_sync (
cnc, pri, ids, "IdOnly", "item:MimeContent",
- TRUE, mime_dir,
+ TRUE, mime_dir, E_EWS_BODY_TYPE_ANY,
&items,
(ESoapProgressFn) camel_operation_progress,
(gpointer) cancellable,
@@ -486,7 +486,7 @@ camel_ews_folder_get_message (CamelFolder *folder,
res = e_ews_connection_get_items_sync (
cnc, pri, ids, "IdOnly",
"meeting:AssociatedCalendarItemId",
- FALSE, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_ANY,
&items_req,
(ESoapProgressFn) camel_operation_progress,
(gpointer) cancellable,
@@ -1264,7 +1264,7 @@ sync_updated_items (CamelEwsFolder *ews_folder,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
msg_ids, "IdOnly", SUMMARY_MESSAGE_FLAGS,
- FALSE, NULL, &items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_ANY, &items, NULL, NULL,
cancellable, &local_error);
camel_ews_utils_sync_updated_items (ews_folder, items);
@@ -1279,7 +1279,7 @@ sync_updated_items (CamelEwsFolder *ews_folder,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
generic_item_ids, "IdOnly", SUMMARY_ITEM_FLAGS,
- FALSE, NULL, &items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_ANY, &items, NULL, NULL,
cancellable, &local_error);
camel_ews_utils_sync_updated_items (ews_folder, items);
@@ -1347,7 +1347,7 @@ sync_created_items (CamelEwsFolder *ews_folder,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
msg_ids, "IdOnly", SUMMARY_MESSAGE_PROPS,
- FALSE, NULL, &items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_ANY, &items, NULL, NULL,
cancellable, &local_error);
if (local_error) {
@@ -1363,7 +1363,7 @@ sync_created_items (CamelEwsFolder *ews_folder,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
post_item_ids, "IdOnly", SUMMARY_POSTITEM_PROPS,
- FALSE, NULL, &items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_ANY, &items, NULL, NULL,
cancellable, &local_error);
if (local_error) {
@@ -1379,7 +1379,7 @@ sync_created_items (CamelEwsFolder *ews_folder,
e_ews_connection_get_items_sync (
cnc, EWS_PRIORITY_MEDIUM,
generic_item_ids, "IdOnly", SUMMARY_ITEM_PROPS,
- FALSE, NULL, &items, NULL, NULL,
+ FALSE, NULL, E_EWS_BODY_TYPE_ANY, &items, NULL, NULL,
cancellable, &local_error);
camel_ews_utils_sync_created_items (ews_folder, cnc, items, cancellable);
diff --git a/src/camel/camel-ews-utils.c b/src/camel/camel-ews-utils.c
index 89c9664..c58d593 100644
--- a/src/camel/camel-ews-utils.c
+++ b/src/camel/camel-ews-utils.c
@@ -713,7 +713,7 @@ camel_ews_utils_sync_created_items (CamelEwsFolder *ews_folder,
}
item_type = e_ews_item_get_item_type (item);
- if (item_type == E_EWS_ITEM_TYPE_CALENDAR_ITEM ||
+ if (item_type == E_EWS_ITEM_TYPE_EVENT ||
item_type == E_EWS_ITEM_TYPE_MEETING_MESSAGE ||
item_type == E_EWS_ITEM_TYPE_MEETING_REQUEST ||
item_type == E_EWS_ITEM_TYPE_MEETING_RESPONSE ||
diff --git a/src/collection/e-ews-backend.c b/src/collection/e-ews-backend.c
index a6cee3e..e709d4d 100644
--- a/src/collection/e-ews-backend.c
+++ b/src/collection/e-ews-backend.c
@@ -198,6 +198,9 @@ ews_backend_new_child (EEwsBackend *backend,
case E_EWS_FOLDER_TYPE_TASKS:
extension_name = E_SOURCE_EXTENSION_TASK_LIST;
break;
+ case E_EWS_FOLDER_TYPE_MEMOS:
+ extension_name = E_SOURCE_EXTENSION_MEMO_LIST;
+ break;
case E_EWS_FOLDER_TYPE_CONTACTS:
extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK;
break;
@@ -244,6 +247,14 @@ ews_backend_new_task_list (EEwsBackend *backend,
}
static ESource *
+ews_backend_new_memo_list (EEwsBackend *backend,
+ EEwsFolder *folder)
+{
+ /* No extra configuration to do. */
+ return ews_backend_new_child (backend, folder);
+}
+
+static ESource *
ews_backend_new_address_book (EEwsBackend *backend,
EEwsFolder *folder)
{
@@ -283,6 +294,10 @@ ews_backend_sync_created_folders (EEwsBackend *backend,
source = ews_backend_new_task_list (
backend, folder);
break;
+ case E_EWS_FOLDER_TYPE_MEMOS:
+ source = ews_backend_new_memo_list (
+ backend, folder);
+ break;
case E_EWS_FOLDER_TYPE_CONTACTS:
source = ews_backend_new_address_book (
backend, folder);
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 701964a..506cf71 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -3495,6 +3495,7 @@ e_ews_connection_get_items (EEwsConnection *cnc,
const gchar *additional_props,
gboolean include_mime,
const gchar *mime_directory,
+ EEwsBodyType body_type,
ESoapProgressFn progress_fn,
gpointer progress_data,
GCancellable *cancellable,
@@ -3523,6 +3524,20 @@ e_ews_connection_get_items (EEwsConnection *cnc,
if (mime_directory)
e_soap_message_store_node_data (msg, "MimeContent", mime_directory, TRUE);
+ switch (body_type) {
+ case E_EWS_BODY_TYPE_BEST:
+ e_ews_message_write_string_parameter (msg, "BodyType", NULL, "Best");
+ break;
+ case E_EWS_BODY_TYPE_HTML:
+ e_ews_message_write_string_parameter (msg, "BodyType", NULL, "HTML");
+ break;
+ case E_EWS_BODY_TYPE_TEXT:
+ e_ews_message_write_string_parameter (msg, "BodyType", NULL, "Text");
+ break;
+ case E_EWS_BODY_TYPE_ANY:
+ break;
+ }
+
if (additional_props && *additional_props) {
gchar **prop = g_strsplit (additional_props, " ", 0);
gint i = 0;
@@ -3608,6 +3623,7 @@ e_ews_connection_get_items_sync (EEwsConnection *cnc,
const gchar *additional_props,
gboolean include_mime,
const gchar *mime_directory,
+ EEwsBodyType body_type,
GSList **items,
ESoapProgressFn progress_fn,
gpointer progress_data,
@@ -3625,7 +3641,7 @@ e_ews_connection_get_items_sync (EEwsConnection *cnc,
e_ews_connection_get_items (
cnc, pri,ids, default_props,
additional_props, include_mime,
- mime_directory, progress_fn,
+ mime_directory, body_type, progress_fn,
progress_data, cancellable,
e_async_closure_callback, closure);
diff --git a/src/server/e-ews-connection.h b/src/server/e-ews-connection.h
index e3732b9..86874eb 100644
--- a/src/server/e-ews-connection.h
+++ b/src/server/e-ews-connection.h
@@ -105,6 +105,13 @@ typedef enum {
EWS_SPECIFIED_OCCURRENCE_ONLY
} EwsAffectedTaskOccurrencesType;
+typedef enum {
+ E_EWS_BODY_TYPE_ANY,
+ E_EWS_BODY_TYPE_BEST,
+ E_EWS_BODY_TYPE_HTML,
+ E_EWS_BODY_TYPE_TEXT
+} EEwsBodyType;
+
typedef struct {
gchar *as_url;
gchar *oab_url;
@@ -321,6 +328,7 @@ void e_ews_connection_get_items (EEwsConnection *cnc,
const gchar *additional_props,
gboolean include_mime,
const gchar *mime_directory,
+ EEwsBodyType body_type,
ESoapProgressFn progress_fn,
gpointer progress_data,
GCancellable *cancellable,
@@ -338,6 +346,7 @@ gboolean e_ews_connection_get_items_sync (EEwsConnection *cnc,
const gchar *additional_props,
gboolean include_mime,
const gchar *mime_directory,
+ EEwsBodyType body_type,
GSList **items,
ESoapProgressFn progress_fn,
gpointer progress_data,
diff --git a/src/server/e-ews-enums.h b/src/server/e-ews-enums.h
index 89ff1cd..1c5be6b 100644
--- a/src/server/e-ews-enums.h
+++ b/src/server/e-ews-enums.h
@@ -35,7 +35,8 @@ typedef enum {
E_EWS_FOLDER_TYPE_CALENDAR,
E_EWS_FOLDER_TYPE_CONTACTS,
E_EWS_FOLDER_TYPE_SEARCH,
- E_EWS_FOLDER_TYPE_TASKS
+ E_EWS_FOLDER_TYPE_TASKS,
+ E_EWS_FOLDER_TYPE_MEMOS
} EEwsFolderType;
typedef enum {
diff --git a/src/server/e-ews-folder.c b/src/server/e-ews-folder.c
index 6551b80..f789171 100644
--- a/src/server/e-ews-folder.c
+++ b/src/server/e-ews-folder.c
@@ -39,7 +39,6 @@ struct _EEwsFolderPrivate {
gchar *name;
EwsFolderId *fid;
EwsFolderId *parent_fid;
- gchar *folder_class;
EEwsFolderType folder_type;
guint32 unread;
guint32 total;
@@ -120,29 +119,11 @@ e_ews_folder_init (EEwsFolder *folder)
priv->foreign = FALSE;
}
-/* FIXME pick it from folder_type and make it set folder_type */
-static void
-e_ews_folder_set_folder_class (EEwsFolder *folder,
- const gchar *folder_class)
-{
- EEwsFolderPrivate *priv;
-
- g_return_if_fail (E_IS_EWS_FOLDER (folder));
- g_return_if_fail (folder_class != NULL);
-
- priv = folder->priv;
-
- if (priv->folder_class)
- g_free (priv->folder_class);
- priv->folder_class = g_strdup (folder_class);
-}
-
static gboolean
e_ews_folder_set_from_soap_parameter (EEwsFolder *folder,
ESoapParameter *param)
{
EEwsFolderPrivate *priv = folder->priv;
- gchar *value;
ESoapParameter *subparam, *node;
g_return_val_if_fail (param != NULL, FALSE);
@@ -172,6 +153,25 @@ e_ews_folder_set_from_soap_parameter (EEwsFolder *folder,
return FALSE;
}
+ if (priv->folder_type == E_EWS_FOLDER_TYPE_MAILBOX) {
+ subparam = e_soap_parameter_get_first_child_by_name (node, "FolderClass");
+ if (subparam) {
+ gchar *folder_class = e_soap_parameter_get_string_value (subparam);
+
+ if (g_strcmp0 (folder_class, "IPF.Contact") == 0) {
+ priv->folder_type = E_EWS_FOLDER_TYPE_CONTACTS;
+ } else if (g_strcmp0 (folder_class, "IPF.Appointment") == 0) {
+ priv->folder_type = E_EWS_FOLDER_TYPE_CALENDAR;
+ } else if (g_strcmp0 (folder_class, "IPF.Task") == 0) {
+ priv->folder_type = E_EWS_FOLDER_TYPE_TASKS;
+ } else if (g_strcmp0 (folder_class, "IPF.StickyNote") == 0) {
+ priv->folder_type = E_EWS_FOLDER_TYPE_MEMOS;
+ }
+
+ g_free (folder_class);
+ }
+ }
+
subparam = e_soap_parameter_get_first_child_by_name (node, "FolderId");
if (subparam) {
priv->fid = g_new0 (EwsFolderId, 1);
@@ -186,13 +186,6 @@ e_ews_folder_set_from_soap_parameter (EEwsFolder *folder,
priv->parent_fid->change_key = e_soap_parameter_get_property (subparam, "ChangeKey");
}
- subparam = e_soap_parameter_get_first_child_by_name (node, "FolderClass");
- if (subparam) {
- value = e_soap_parameter_get_string_value (subparam);
- e_ews_folder_set_folder_class (folder, (const gchar *) value);
- g_free (value);
- }
-
subparam = e_soap_parameter_get_first_child_by_name (node, "DisplayName");
if (subparam)
priv->name = e_soap_parameter_get_string_value (subparam);
diff --git a/src/server/e-ews-item.c b/src/server/e-ews-item.c
index c64905c..62c3fbc 100644
--- a/src/server/e-ews-item.c
+++ b/src/server/e-ews-item.c
@@ -879,7 +879,6 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item,
{
EEwsItemPrivate *priv = item->priv;
ESoapParameter *subparam, *node = NULL, *attach_id;
- gboolean contact = FALSE, task = FALSE;
const gchar *name;
g_return_val_if_fail (param != NULL, FALSE);
@@ -902,14 +901,27 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item,
* </m:Changes>
* So check param is the node we want to use, by comparing name or is it child of the param */
- if (!g_ascii_strcasecmp (name, "Message") || (node = e_soap_parameter_get_first_child_by_name (param, "Message")))
+ if (!g_ascii_strcasecmp (name, "Message") || (node = e_soap_parameter_get_first_child_by_name (param, "Message"))) {
priv->item_type = E_EWS_ITEM_TYPE_MESSAGE;
- else if (!g_ascii_strcasecmp (name, "PostItem") || (node = e_soap_parameter_get_first_child_by_name (param, "PostItem")))
+ subparam = e_soap_parameter_get_first_child_by_name (node ? node : param, "ItemClass");
+ if (subparam) {
+ gchar *folder_class = e_soap_parameter_get_string_value (subparam);
+
+ if (g_strcmp0 (folder_class, "IPM.StickyNote") == 0) {
+ priv->item_type = E_EWS_ITEM_TYPE_MEMO;
+ priv->task_fields = g_new0 (struct _EEwsTaskFields, 1);
+ priv->task_fields->has_due_date = FALSE;
+ priv->task_fields->has_start_date = FALSE;
+ priv->task_fields->has_complete_date = FALSE;
+ }
+
+ g_free (folder_class);
+ }
+ } else if (!g_ascii_strcasecmp (name, "PostItem") || (node = e_soap_parameter_get_first_child_by_name (param, "PostItem")))
priv->item_type = E_EWS_ITEM_TYPE_POST_ITEM;
else if (!g_ascii_strcasecmp (name, "CalendarItem") || (node = e_soap_parameter_get_first_child_by_name (param, "CalendarItem")))
- priv->item_type = E_EWS_ITEM_TYPE_CALENDAR_ITEM;
+ priv->item_type = E_EWS_ITEM_TYPE_EVENT;
else if (!g_ascii_strcasecmp (name, "Contact") || (node = e_soap_parameter_get_first_child_by_name (param, "Contact"))) {
- contact = TRUE;
priv->item_type = E_EWS_ITEM_TYPE_CONTACT;
priv->contact_fields = g_new0 (struct _EEwsContactFields, 1);
} else if (!g_ascii_strcasecmp (name, "DistributionList") || (node = e_soap_parameter_get_first_child_by_name (param, "DistributionList")))
@@ -923,7 +935,6 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item,
else if (!g_ascii_strcasecmp (name, "MeetingCancellation") || (node = e_soap_parameter_get_first_child_by_name (param, "MeetingCancellation")))
priv->item_type = E_EWS_ITEM_TYPE_MEETING_CANCELLATION;
else if (!g_ascii_strcasecmp (name, "Task") || (node = e_soap_parameter_get_first_child_by_name (param, "Task"))) {
- task = TRUE;
priv->item_type = E_EWS_ITEM_TYPE_TASK;
priv->task_fields = g_new0 (struct _EEwsTaskFields, 1);
priv->task_fields->has_due_date = FALSE;
@@ -1012,7 +1023,7 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item,
g_free (value);
} else if (!g_ascii_strcasecmp (name, "Attachments")) {
process_attachments_list (priv, subparam);
- } else if (contact)
+ } else if (priv->item_type == E_EWS_ITEM_TYPE_CONTACT)
parse_contact_field (item, name, subparam);
/* fields below are not relevant for contacts, so skip them */
else if (!g_ascii_strcasecmp (name, "Sender")) {
@@ -1058,7 +1069,7 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item,
g_free (value);
} else if (!g_ascii_strcasecmp (name, "TimeZone")) {
priv->timezone = e_soap_parameter_get_string_value (subparam);
- } else if (task) {
+ } else if (priv->item_type == E_EWS_ITEM_TYPE_TASK || priv->item_type == E_EWS_ITEM_TYPE_MEMO) {
parse_task_field (item, name, subparam);
/* fields below are not relevant for task, so skip them */
} else if (!g_ascii_strcasecmp (name, "References")) {
diff --git a/src/server/e-ews-item.h b/src/server/e-ews-item.h
index 448c746..b91bcb2 100644
--- a/src/server/e-ews-item.h
+++ b/src/server/e-ews-item.h
@@ -41,7 +41,7 @@ typedef enum {
E_EWS_ITEM_TYPE_UNKNOWN,
E_EWS_ITEM_TYPE_MESSAGE,
E_EWS_ITEM_TYPE_POST_ITEM,
- E_EWS_ITEM_TYPE_CALENDAR_ITEM,
+ E_EWS_ITEM_TYPE_EVENT,
E_EWS_ITEM_TYPE_CONTACT,
E_EWS_ITEM_TYPE_GROUP,
E_EWS_ITEM_TYPE_MEETING_MESSAGE,
@@ -49,6 +49,7 @@ typedef enum {
E_EWS_ITEM_TYPE_MEETING_RESPONSE,
E_EWS_ITEM_TYPE_MEETING_CANCELLATION,
E_EWS_ITEM_TYPE_TASK,
+ E_EWS_ITEM_TYPE_MEMO,
E_EWS_ITEM_TYPE_GENERIC_ITEM,
E_EWS_ITEM_TYPE_ERROR
} EEwsItemType;
diff --git a/src/server/tests/test-syncfolder.c b/src/server/tests/test-syncfolder.c
index 8df5bc5..420d809 100644
--- a/src/server/tests/test-syncfolder.c
+++ b/src/server/tests/test-syncfolder.c
@@ -277,7 +277,7 @@ op_test_get_item ()
ids = g_slist_reverse (ids);
e_ews_connection_get_items (
cnc, EWS_PRIORITY_MEDIUM,
- g_slist_last (ids), "IdOnly", NULL, FALSE, NULL,
+ g_slist_last (ids), "IdOnly", NULL, FALSE, NULL, E_EWS_BODY_TYPE_ANY,
NULL, NULL, cancellable,
get_item_ready_callback, NULL);
diff --git a/src/utils/e-ews-query-to-restriction.c b/src/utils/e-ews-query-to-restriction.c
index 3069481..8939e4d 100644
--- a/src/utils/e-ews-query-to-restriction.c
+++ b/src/utils/e-ews-query-to-restriction.c
@@ -1145,7 +1145,7 @@ e_ews_convert_sexp_to_restriction (ESoapMessage *msg,
contact_symbols[i].func, msg);
}
- } else if (type == E_EWS_FOLDER_TYPE_CALENDAR || type == E_EWS_FOLDER_TYPE_TASKS) {
+ } else if (type == E_EWS_FOLDER_TYPE_CALENDAR || type == E_EWS_FOLDER_TYPE_TASKS || type == E_EWS_FOLDER_TYPE_MEMOS) {
for (i = 0; i < G_N_ELEMENTS (calendar_symbols); i++) {
if (calendar_symbols[i].immediate)
e_sexp_add_ifunction (
@@ -1195,7 +1195,7 @@ e_ews_check_is_query (const gchar *query,
else
return TRUE;
- } else if (type == E_EWS_FOLDER_TYPE_CALENDAR || type == E_EWS_FOLDER_TYPE_TASKS) {
+ } else if (type == E_EWS_FOLDER_TYPE_CALENDAR || type == E_EWS_FOLDER_TYPE_TASKS || type == E_EWS_FOLDER_TYPE_MEMOS) {
if (!g_strcmp0 (query, "(contains? \"summary\" \"\")"))
return FALSE;
else
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]