void camel_ews_utils_sync_created_items (CamelEwsFolder *ews_folder, EEwsConnection *cnc, GSList *items_created, CamelFolderChangeInfo *change_info, GCancellable *cancellable) { CamelFolder *folder; CamelFolderSummary *folder_summary; GSList *l; if (!items_created) return; folder = CAMEL_FOLDER (ews_folder); folder_summary = camel_folder_get_folder_summary (folder); for (l = items_created; l != NULL; l = g_slist_next (l)) { EEwsItem *item = (EEwsItem *) l->data; CamelMessageInfo *mi; const EwsId *id; const EwsMailbox *from; gchar *tmp; EEwsItemType item_type; const gchar *msg_headers; gboolean has_attachments, found_property, message_requests_read_receipt = FALSE; guint32 server_flags; if (!item) continue; if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_ERROR) { g_object_unref (item); continue; } id = e_ews_item_get_id (item); if (!id) { g_warning ("%s: Missing ItemId for item type %d (subject:%s)", G_STRFUNC, e_ews_item_get_item_type (item), e_ews_item_get_subject (item) ? e_ews_item_get_subject (item) : "???"); g_object_unref (item); continue; } mi = camel_folder_summary_get (folder_summary, id->id); if (mi) { g_clear_object (&mi); g_object_unref (item); continue; } /* PidTagTransportMessageHeaders */ found_property = FALSE; msg_headers = e_ews_item_get_extended_property_as_string (item, NULL, 0x007D, &found_property); if (!found_property) msg_headers = NULL; if (msg_headers && *msg_headers) { CamelMimePart *part = camel_mime_part_new (); CamelStream *stream; CamelMimeParser *parser; stream = camel_stream_mem_new_with_buffer (msg_headers, strlen (msg_headers)); parser = camel_mime_parser_new (); camel_mime_parser_init_with_stream (parser, stream, NULL); camel_mime_parser_scan_from (parser, FALSE); g_object_unref (stream); if (camel_mime_part_construct_from_parser_sync (part, parser, NULL, NULL)) { mi = camel_folder_summary_info_new_from_headers (folder_summary, camel_medium_get_headers (CAMEL_MEDIUM (part))); if (camel_medium_get_header (CAMEL_MEDIUM (part), "Disposition-Notification-To")) message_requests_read_receipt = TRUE; } g_object_unref (parser); g_object_unref (part); } if (!mi) mi = camel_message_info_new (folder_summary); camel_message_info_set_abort_notifications (mi, TRUE); item_type = e_ews_item_get_item_type (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 || item_type == E_EWS_ITEM_TYPE_MEETING_RESPONSE) camel_message_info_set_user_flag (mi, "$has_cal", TRUE); camel_message_info_set_uid (mi, id->id); camel_message_info_set_size (mi, e_ews_item_get_size (item)); camel_message_info_set_subject (mi, e_ews_item_get_subject (item)); camel_ews_message_info_set_item_type (CAMEL_EWS_MESSAGE_INFO (mi), item_type); camel_ews_message_info_set_change_key (CAMEL_EWS_MESSAGE_INFO (mi), id->change_key); camel_message_info_set_date_sent (mi, e_ews_item_get_date_sent (item)); camel_message_info_set_date_received (mi, e_ews_item_get_date_received (item)); from = e_ews_item_get_from (item); if (!from) from = e_ews_item_get_sender (item); tmp = form_email_string_from_mb (cnc, from, cancellable); camel_message_info_set_from (mi, tmp); g_free (tmp); tmp = form_recipient_list (cnc, e_ews_item_get_to_recipients (item), cancellable); camel_message_info_set_to (mi, tmp); g_free (tmp); tmp = form_recipient_list (cnc, e_ews_item_get_cc_recipients (item), cancellable); camel_message_info_set_cc (mi, tmp); g_free (tmp); e_ews_item_has_attachments (item, &has_attachments); if (has_attachments) camel_message_info_set_flags (mi, CAMEL_MESSAGE_ATTACHMENTS, CAMEL_MESSAGE_ATTACHMENTS); ews_set_threading_data (mi, item); server_flags = ews_utils_get_server_flags (item); ews_utils_merge_server_user_flags (item, mi); camel_message_info_set_flags (mi, server_flags, server_flags); camel_ews_message_info_set_server_flags (CAMEL_EWS_MESSAGE_INFO (mi), server_flags); camel_ews_utils_update_follow_up_flags (item, mi); camel_ews_utils_update_read_receipt_flags (item, mi, server_flags, message_requests_read_receipt); camel_message_info_set_abort_notifications (mi, FALSE); camel_folder_summary_add (folder_summary, mi, FALSE); /* camel_folder_summary_add() sets folder_flagged flag * on the message info, but this is a fresh item downloaded * from the server, thus unset it, to avoid resync up to the server * on folder leave/store */ camel_message_info_set_folder_flagged (mi, FALSE); camel_folder_change_info_add_uid (change_info, id->id); camel_folder_change_info_recent_uid (change_info, id->id); g_object_unref (mi); g_object_unref (item); } g_slist_free (items_created); }
gboolean camel_ews_utils_create_mime_message (EEwsConnection *cnc, const gchar *disposition, const EwsFolderId *fid, CamelMimeMessage *message, CamelMessageInfo *info, CamelAddress *from, CamelAddress *recipients, gchar **itemid, gchar **changekey, GCancellable *cancellable, GError **error) { struct _create_mime_msg_data *create_data; GSList *ids; EEwsItem *item; const EwsId *ewsid; gchar *restore_from = NULL; gboolean res; create_data = g_new0 (struct _create_mime_msg_data, 1); create_data->message = message; create_data->info = info; create_data->from = from; create_data->recipients = recipients; if (g_strcmp0 (disposition, "SendOnly") == 0 || g_strcmp0 (disposition, "SendAndSaveCopy") == 0) { struct _camel_header_raw *header; for (header = CAMEL_MIME_PART (message)->headers; header; header = header->next) { if (header->name && g_ascii_strcasecmp (header->name, "From") == 0) { restore_from = header->value; header->value = g_strdup (""); break; } } } res = e_ews_connection_create_items_sync ( cnc, EWS_PRIORITY_MEDIUM, disposition, NULL, fid, create_mime_message_cb, create_data, &ids, cancellable, error); if (restore_from) { struct _camel_header_raw *header; for (header = CAMEL_MIME_PART (message)->headers; header; header = header->next) { if (header->name && g_ascii_strcasecmp (header->name, "From") == 0) { g_free (header->value); header->value = restore_from; break; } } } if (!res || (!itemid && !changekey)) return res; item = (EEwsItem *) ids->data; if (!item || !(ewsid = e_ews_item_get_id (item))) { g_set_error ( error, CAMEL_ERROR, CAMEL_ERROR_GENERIC, _("CreateItem call failed to return ID for new message")); return FALSE; } if (itemid) *itemid = g_strdup (ewsid->id); if (changekey) *changekey = g_strdup (ewsid->change_key); g_object_unref (item); g_slist_free (ids); return TRUE; }
void camel_ews_utils_sync_updated_items (CamelEwsFolder *ews_folder, GSList *items_updated, CamelFolderChangeInfo *change_info) { CamelFolder *folder; CamelFolderSummary *folder_summary; GSList *l; folder = CAMEL_FOLDER (ews_folder); folder_summary = camel_folder_get_folder_summary (folder); for (l = items_updated; l != NULL; l = g_slist_next (l)) { EEwsItem *item = (EEwsItem *) l->data; const EwsId *id; CamelMessageInfo *mi; if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_ERROR) { g_object_unref (item); continue; } id = e_ews_item_get_id (item); if (!id) { g_warning ("%s: Missing ItemId for item type %d (subject:%s)", G_STRFUNC, e_ews_item_get_item_type (item), e_ews_item_get_subject (item) ? e_ews_item_get_subject (item) : "???"); g_object_unref (item); continue; } mi = camel_folder_summary_get (folder_summary, id->id); if (mi) { guint32 server_flags; gboolean changed, was_changed; camel_message_info_freeze_notifications (mi); was_changed = camel_message_info_get_folder_flagged (mi); server_flags = ews_utils_get_server_flags (item); ews_utils_merge_server_user_flags (item, mi); changed = camel_ews_update_message_info_flags (folder_summary, mi, server_flags, NULL); changed = camel_ews_utils_update_follow_up_flags (item, mi) || changed; changed = camel_ews_utils_update_read_receipt_flags (item, mi, server_flags, FALSE) || changed; if (changed) camel_folder_change_info_change_uid (change_info, id->id); camel_ews_message_info_set_change_key (CAMEL_EWS_MESSAGE_INFO (mi), id->change_key); if (!was_changed) { /* do not save to the server what was just read, when did not change locally before */ camel_message_info_set_folder_flagged (mi, FALSE); } camel_message_info_thaw_notifications (mi); g_clear_object (&mi); g_object_unref (item); continue; } g_object_unref (item); } g_slist_free (items_updated); }