[evolution-mapi] Bug #668825 - Read-receipt info set event when not requested



commit 82dc492906e72146bf495bd5fe2deb093bdafc40
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jan 31 13:41:32 2012 +0100

    Bug #668825 - Read-receipt info set event when not requested

 src/camel/camel-mapi-folder.c           |  204 +++++++++++++------------------
 src/libexchangemapi/e-mapi-cal-utils.c  |    4 +-
 src/libexchangemapi/e-mapi-connection.c |   12 +-
 src/libexchangemapi/e-mapi-debug.c      |    2 +-
 src/libexchangemapi/e-mapi-mail-utils.c |   12 +-
 5 files changed, 100 insertions(+), 134 deletions(-)
---
diff --git a/src/camel/camel-mapi-folder.c b/src/camel/camel-mapi-folder.c
index 9c9f042..819475c 100644
--- a/src/camel/camel-mapi-folder.c
+++ b/src/camel/camel-mapi-folder.c
@@ -352,6 +352,76 @@ gather_changed_objects_to_slist (EMapiConnection *conn,
 	return TRUE;
 }
 
+static void
+update_message_info (CamelMessageInfo *info,
+		     /* const */ EMapiObject *object,
+		     gboolean is_new,
+		     gboolean is_public_folder,
+		     gboolean user_has_read)
+{
+	CamelMapiMessageInfo *minfo = (CamelMapiMessageInfo *) info;
+	guint32 flags = 0, mask = CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_ATTACHMENTS | CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_FORWARDED | CAMEL_MAPI_MESSAGE_WITH_READ_RECEIPT;
+	const uint32_t *pmsg_flags, *picon_index;
+	const struct FILETIME *last_modified;
+	const uint8_t *pread_receipt;
+	const gchar *msg_class;
+	uint32_t msg_flags;
+
+	g_return_if_fail (info != NULL);
+	g_return_if_fail (object != NULL);
+
+	pmsg_flags = e_mapi_util_find_array_propval (&object->properties, PidTagMessageFlags);
+	last_modified = e_mapi_util_find_array_propval (&object->properties, PidTagLastModificationTime);
+	picon_index = e_mapi_util_find_array_propval (&object->properties, PidTagIconIndex);
+	pread_receipt = e_mapi_util_find_array_propval (&object->properties, PidTagReadReceiptRequested);
+	msg_class = e_mapi_util_find_array_propval (&object->properties, PidTagMessageClass);
+
+	if (msg_class && g_str_has_prefix (msg_class, "REPORT.IPM.Note.IPNRN"))
+		pread_receipt = NULL;
+
+	msg_flags = pmsg_flags ? *pmsg_flags : 0;
+
+	if (!is_new && is_public_folder) {
+		/* do not change unread state for known messages in public folders */
+		if ((user_has_read ? 1 : 0) != ((msg_flags & MSGFLAG_READ) ? 1 : 0))
+			msg_flags = (msg_flags & (~MSGFLAG_READ)) | (user_has_read ? MSGFLAG_READ : 0);
+	}
+
+	if (last_modified) {
+		minfo->last_modified = e_mapi_util_filetime_to_time_t (last_modified);
+	} else {
+		minfo->last_modified = 0;
+	}
+
+	if ((msg_flags & MSGFLAG_READ) != 0)
+		flags |= CAMEL_MESSAGE_SEEN;
+	if ((msg_flags & MSGFLAG_HASATTACH) != 0)
+		flags |= CAMEL_MESSAGE_ATTACHMENTS;
+	if (picon_index) {
+		if (*picon_index == 0x105)
+			flags |= CAMEL_MESSAGE_ANSWERED;
+		if (*picon_index == 0x106)
+			flags |= CAMEL_MESSAGE_FORWARDED;
+	}
+
+	if (pread_receipt && *pread_receipt)
+		flags |= CAMEL_MAPI_MESSAGE_WITH_READ_RECEIPT;
+
+	if (pread_receipt && *pread_receipt && (msg_flags & MSGFLAG_RN_PENDING) == 0)
+		camel_message_info_set_user_flag (info, "receipt-handled", TRUE);
+
+	if ((camel_message_info_flags (info) & mask) != flags) {
+		if (is_new)
+			minfo->info.flags = flags;
+		else
+			camel_message_info_set_flags (info, mask, flags);
+		minfo->server_flags = camel_message_info_flags (info);
+	}
+
+	minfo->info.dirty = TRUE;
+	camel_folder_summary_touch (minfo->info.summary);
+}
+
 struct GatherObjectSummaryData
 {
 	CamelFolder *folder;
@@ -394,32 +464,20 @@ gather_object_offline_cb (EMapiConnection *conn,
 	if (msg) {
 		gchar *uid_str;
 		const mapi_id_t *pmid;
-		const uint32_t *pmsg_flags, *picon_index;
-		const struct FILETIME *last_modified;
-		const bool *pread_receipt;
-		const gchar *msg_class;
-		uint32_t msg_flags;
 		CamelMessageInfo *info;
 		gboolean is_new;
+		gboolean user_has_read = FALSE;
 
-		pmid = e_mapi_util_find_array_propval (&object->properties, PR_MID);
-		pmsg_flags = e_mapi_util_find_array_propval (&object->properties, PR_MESSAGE_FLAGS);
-		last_modified = e_mapi_util_find_array_propval (&object->properties, PR_LAST_MODIFICATION_TIME);
-		picon_index = e_mapi_util_find_array_propval (&object->properties, PidTagIconIndex);
-		pread_receipt = e_mapi_util_find_array_propval (&object->properties, PidTagReadReceiptRequested);
-		msg_class = e_mapi_util_find_array_propval (&object->properties, PidTagMessageClass);
-
-		if (msg_class && g_str_has_prefix (msg_class, "REPORT.IPM.Note.IPNRN"))
-			pread_receipt = NULL;
+		pmid = e_mapi_util_find_array_propval (&object->properties, PidTagMid);
 
 		if (!pmid) {
-			g_debug ("%s: Received message [%d/%d] without PR_MID", G_STRFUNC, obj_index, obj_total);
+			g_debug ("%s: Received message [%d/%d] without PidTagMid", G_STRFUNC, obj_index, obj_total);
 			e_mapi_debug_dump_object (object, TRUE, 3);
 			return TRUE;
 		}
 
-		if (!last_modified) {
-			g_debug ("%s: Received message [%d/%d] without PR_LAST_MODIFICATION_TIME", G_STRFUNC, obj_index, obj_total);
+		if (!e_mapi_util_find_array_propval (&object->properties, PidTagLastModificationTime)) {
+			g_debug ("%s: Received message [%d/%d] without PidTagLastModificationTime", G_STRFUNC, obj_index, obj_total);
 			e_mapi_debug_dump_object (object, TRUE, 3);
 		}
 
@@ -427,20 +485,13 @@ gather_object_offline_cb (EMapiConnection *conn,
 		if (!uid_str)
 			return FALSE;
 
-		msg_flags = pmsg_flags ? *pmsg_flags : 0;
-
 		is_new = !camel_folder_summary_check_uid (gos->folder->summary, uid_str);
 		if (!is_new) {
 			/* keep local read/unread flag on messages from public folders */
 			if (gos->is_public_folder) {
-				gboolean user_has_read;
-
 				info = camel_folder_summary_get (gos->folder->summary, uid_str);
 				if (info) {
 					user_has_read = (camel_message_info_flags (info) & CAMEL_MESSAGE_SEEN) != 0;
-					if ((user_has_read ? 1 : 0) != ((msg_flags & MSGFLAG_READ) ? 1 : 0))
-						msg_flags = (msg_flags & (~MSGFLAG_READ)) | (user_has_read ? MSGFLAG_READ : 0);
-
 					camel_message_info_free (info);
 				}
 			}
@@ -451,50 +502,17 @@ gather_object_offline_cb (EMapiConnection *conn,
 		info = camel_folder_summary_info_new_from_message (gos->folder->summary, msg, NULL);
 		if (info) {
 			CamelMapiMessageInfo *minfo = (CamelMapiMessageInfo *) info;
-			guint32 flags = 0, mask = CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_ATTACHMENTS | CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_FORWARDED | CAMEL_MAPI_MESSAGE_WITH_READ_RECEIPT;
 
 			minfo->info.uid = camel_pstring_strdup (uid_str);
 
-			if (last_modified) {
-				minfo->last_modified = e_mapi_util_filetime_to_time_t (last_modified);
-			} else {
-				minfo->last_modified = 0;
-			}
-
-			if ((msg_flags & MSGFLAG_READ) != 0)
-				flags |= CAMEL_MESSAGE_SEEN;
-			if ((msg_flags & MSGFLAG_HASATTACH) != 0)
-				flags |= CAMEL_MESSAGE_ATTACHMENTS;
-			if (picon_index) {
-				if (*picon_index == 0x105)
-					flags |= CAMEL_MESSAGE_ANSWERED;
-				if (*picon_index == 0x106)
-					flags |= CAMEL_MESSAGE_FORWARDED;
-			}
-
-			if ((camel_message_info_flags (info) & mask) != flags) {
-				if (is_new)
-					minfo->info.flags = flags;
-				else
-					camel_message_info_set_flags (info, mask, flags);
-				minfo->server_flags = camel_message_info_flags (info);
-			}
-
-			if (pread_receipt)
-				flags |= CAMEL_MAPI_MESSAGE_WITH_READ_RECEIPT;
-
-			if (pread_receipt && (msg_flags & MSGFLAG_RN_PENDING) == 0)
-				camel_message_info_set_user_flag (info, "receipt-handled", TRUE);
+			update_message_info (info, object, is_new, gos->is_public_folder, user_has_read);
 
-			minfo->info.dirty = TRUE;
-			camel_folder_summary_touch (gos->folder->summary);
+			camel_folder_summary_add (gos->folder->summary, info);
+			camel_message_info_ref (info);
 
 			if (is_new) {
-				camel_folder_summary_add (gos->folder->summary, info);
 				camel_folder_change_info_add_uid (gos->changes, camel_message_info_uid (info));
 				camel_folder_change_info_recent_uid (gos->changes, camel_message_info_uid (info));
-
-				camel_message_info_ref (info);
 			} else {
 				camel_folder_change_info_change_uid (gos->changes, camel_message_info_uid (info));
 			}
@@ -531,12 +549,7 @@ gather_object_summary_cb (EMapiConnection *conn,
 	struct GatherObjectSummaryData *gos = user_data;
 	gchar *uid_str;
 	const mapi_id_t *pmid;
-	const uint32_t *pmsg_flags, *picon_index;
-	const struct FILETIME *last_modified;
 	const gchar *transport_headers;
-	const bool *pread_receipt;
-	const gchar *msg_class;
-	uint32_t msg_flags;
 	CamelMessageInfo *info;
 	gboolean is_new = FALSE;
 
@@ -544,25 +557,17 @@ gather_object_summary_cb (EMapiConnection *conn,
 	g_return_val_if_fail (gos->folder != NULL, FALSE);
 	g_return_val_if_fail (object != NULL, FALSE);
 
-	pmid = e_mapi_util_find_array_propval (&object->properties, PR_MID);
-	pmsg_flags = e_mapi_util_find_array_propval (&object->properties, PR_MESSAGE_FLAGS);
-	last_modified = e_mapi_util_find_array_propval (&object->properties, PR_LAST_MODIFICATION_TIME);
-	transport_headers = e_mapi_util_find_array_propval (&object->properties, PR_TRANSPORT_MESSAGE_HEADERS_UNICODE);
-	picon_index = e_mapi_util_find_array_propval (&object->properties, PidTagIconIndex);
-	pread_receipt = e_mapi_util_find_array_propval (&object->properties, PidTagReadReceiptRequested);
-	msg_class = e_mapi_util_find_array_propval (&object->properties, PidTagMessageClass);
-
-	if (msg_class && g_str_has_prefix (msg_class, "REPORT.IPM.Note.IPNRN"))
-		pread_receipt = NULL;
+	pmid = e_mapi_util_find_array_propval (&object->properties, PidTagMid);
+	transport_headers = e_mapi_util_find_array_propval (&object->properties, PidTagTransportMessageHeaders);
 
 	if (!pmid) {
-		g_debug ("%s: Received message [%d/%d] without PR_MID", G_STRFUNC, obj_index, obj_total);
+		g_debug ("%s: Received message [%d/%d] without PidTagMid", G_STRFUNC, obj_index, obj_total);
 		e_mapi_debug_dump_object (object, TRUE, 3);
 		return TRUE;
 	}
 
-	if (!last_modified) {
-		g_debug ("%s: Received message [%d/%d] without PR_LAST_MODIFICATION_TIME", G_STRFUNC, obj_index, obj_total);
+	if (!e_mapi_util_find_array_propval (&object->properties, PidTagLastModificationTime)) {
+		g_debug ("%s: Received message [%d/%d] without PidTagLastModificationTime", G_STRFUNC, obj_index, obj_total);
 		e_mapi_debug_dump_object (object, TRUE, 3);
 	}
 
@@ -570,8 +575,6 @@ gather_object_summary_cb (EMapiConnection *conn,
 	if (!uid_str)
 		return FALSE;
 
-	msg_flags = pmsg_flags ? *pmsg_flags : 0;
-
 	info = camel_folder_summary_get (gos->folder->summary, uid_str);
 	if (!info) {
 		CamelMapiMessageInfo *minfo;
@@ -697,46 +700,9 @@ gather_object_summary_cb (EMapiConnection *conn,
 	}
 
 	if (info) {
-		CamelMapiMessageInfo *minfo = (CamelMapiMessageInfo *) info;
-		guint32 flags = 0, mask = CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_ATTACHMENTS | CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_FORWARDED | CAMEL_MAPI_MESSAGE_WITH_READ_RECEIPT;
-
-		if (last_modified) {
-			minfo->last_modified = e_mapi_util_filetime_to_time_t (last_modified);
-		} else {
-			minfo->last_modified = 0;
-		}
-
-		/* do not change unread state for known messages in public folders */
-		if (gos->is_public_folder && !is_new)
-			mask &= ~CAMEL_MESSAGE_SEEN;
-
-		if ((msg_flags & MSGFLAG_READ) != 0)
-			flags |= CAMEL_MESSAGE_SEEN;
-		if ((msg_flags & MSGFLAG_HASATTACH) != 0)
-			flags |= CAMEL_MESSAGE_ATTACHMENTS;
-		if (picon_index) {
-			if (*picon_index == 0x105)
-				flags |= CAMEL_MESSAGE_ANSWERED;
-			if (*picon_index == 0x106)
-				flags |= CAMEL_MESSAGE_FORWARDED;
-		}
-
-		if (pread_receipt)
-			flags |= CAMEL_MAPI_MESSAGE_WITH_READ_RECEIPT;
-
-		if (pread_receipt && (msg_flags & MSGFLAG_RN_PENDING) == 0)
-			camel_message_info_set_user_flag (info, "receipt-handled", TRUE);
-
-		if ((camel_message_info_flags (info) & mask) != flags) {
-			if (is_new)
-				minfo->info.flags = flags;
-			else
-				camel_message_info_set_flags (info, mask, flags);
-			minfo->server_flags = camel_message_info_flags (info);
-		}
+		gboolean user_has_read = (camel_message_info_flags (info) & CAMEL_MESSAGE_SEEN) != 0;
 
-		minfo->info.dirty = TRUE;
-		camel_folder_summary_touch (gos->folder->summary);
+		update_message_info (info, object, is_new, gos->is_public_folder, user_has_read);
 
 		if (is_new) {
 			camel_folder_summary_add (gos->folder->summary, info);
diff --git a/src/libexchangemapi/e-mapi-cal-utils.c b/src/libexchangemapi/e-mapi-cal-utils.c
index 7df766b..a2eb8f3 100644
--- a/src/libexchangemapi/e-mapi-cal-utils.c
+++ b/src/libexchangemapi/e-mapi-cal-utils.c
@@ -850,7 +850,7 @@ e_mapi_cal_util_object_to_comp (EMapiConnection *conn,
 	const struct mapi_SLPSTRArrayW *categories_array;
 	const struct SBinary_short *bin;
 	const uint32_t *ui32;
-	const bool *b;
+	const uint8_t *b;
 	icalcomponent *ical_comp;
 	icalproperty *prop = NULL;
 	icalparameter *param = NULL;
@@ -1539,7 +1539,7 @@ e_mapi_cal_utils_comp_to_object (EMapiConnection *conn,
 	icalcomponent *ical_comp;
 	icalcomponent_kind kind;
 	uint32_t flag32;
-	bool b;
+	uint8_t b;
 	icalproperty *prop;
 	struct icaltimetype dtstart, dtend, utc_dtstart, utc_dtend, all_day_dtstart = {0}, all_day_dtend = {0};
 	const icaltimezone *utc_zone;
diff --git a/src/libexchangemapi/e-mapi-connection.c b/src/libexchangemapi/e-mapi-connection.c
index 0d4b1a0..3063e53 100644
--- a/src/libexchangemapi/e-mapi-connection.c
+++ b/src/libexchangemapi/e-mapi-connection.c
@@ -2397,7 +2397,7 @@ e_mapi_connection_fetch_object_internal (EMapiConnection *conn,
 	uint16_t ui16, uj16, np_count = 0, *np_propID = NULL;
 	uint32_t ui32;
 	struct MAPINAMEID *np_nameid = NULL;
-	const bool *has_attachments;
+	const uint8_t *has_attachments;
 	struct SPropTagArray recipient_proptags;
 	struct SRowSet recipient_rows;
 	mapi_object_t attach_table;
@@ -5019,7 +5019,7 @@ e_mapi_connection_resolve_named_props  (EMapiConnection *conn,
 		}
 
 		if (prop_count > 0) {
-			ms = nspi_GetIDsFromNames (priv->session->nspi->ctx, mem_ctx, false, prop_count, names, &gal_tags);
+			ms = nspi_GetIDsFromNames (priv->session->nspi->ctx, mem_ctx, 0, prop_count, names, &gal_tags);
 			if (ms == MAPI_E_SUCCESS && gal_tags) {
 				if (gal_tags->cValues != prop_count)
 					g_warning ("%s: Requested (%d) and returned (%d) property names don't match", G_STRFUNC, prop_count, gal_tags->cValues);
@@ -5643,7 +5643,7 @@ set_default_folders (TALLOC_CTX *mem_ctx,
 		g_free (key_fid);
 
 		if (default_type != 0 || IsMailboxFolder (obj_store,folder->folder_id, &default_type)) {
-			folder->is_default = true; /* TODO : Clean up. Redundant.*/
+			folder->is_default = TRUE; /* TODO : Clean up. Redundant.*/
 			folder->default_type = default_type;
 		}
 
@@ -5752,7 +5752,7 @@ e_mapi_connection_get_folders_list (EMapiConnection *conn,
 	/* FIXME: May have to get the child folders count? Do we need/use it? */
 	folder = e_mapi_folder_new (mailbox_name, IPF_NOTE,
 					   E_MAPI_FOLDER_CATEGORY_PERSONAL, mailbox_id, 0, 0, 0 ,0);
-	folder->is_default = true;
+	folder->is_default = TRUE;
 	folder->default_type = olFolderTopInformationStore; /*Is this correct ?*/
 	folder->size = mailbox_size ? *mailbox_size : 0;
 
@@ -5822,7 +5822,7 @@ e_mapi_connection_get_pf_folders_list (EMapiConnection *conn,
 	}
 
 	folder = e_mapi_folder_new (_("All Public Folders"), IPF_NOTE, 0, mailbox_id, 0, 0, 0, 0);
-	folder->is_default = true;
+	folder->is_default = TRUE;
 	folder->default_type = olPublicFoldersAllPublicFolders;
 	*mapi_folders = g_slist_prepend (*mapi_folders, folder);
 	result = get_child_folders (conn, mem_ctx, E_MAPI_FOLDER_CATEGORY_PUBLIC, &priv->public_store, mailbox_id, mapi_folders, cb, cb_user_data, cancellable, perror);
@@ -6297,7 +6297,7 @@ test_server_availability (struct mapi_context *mapi_ctx,
 	binding_str = talloc_asprintf (mem_ctx, "ncacn_ip_tcp:%s[", profile->server);
 
 	/* If seal option is enabled in the profile */
-	if (profile->seal == true) {
+	if (profile->seal != 0) {
 		binding_str = talloc_strdup_append (binding_str, "seal,");
 	}
 
diff --git a/src/libexchangemapi/e-mapi-debug.c b/src/libexchangemapi/e-mapi-debug.c
index b9cb8ad..4bb0414 100644
--- a/src/libexchangemapi/e-mapi-debug.c
+++ b/src/libexchangemapi/e-mapi-debug.c
@@ -749,7 +749,7 @@ e_mapi_debug_dump_properties (struct mapi_SPropValue_array *properties,
 			g_print (" PT_NULL");
 			break;
 		case PT_BOOLEAN:
-			g_print (" (bool) - %d", (bool) lpProp->value.b);
+			g_print (" (bool) - %d", lpProp->value.b);
 			break;
 		case PT_I2:
 			g_print (" (uint16_t) - %d", lpProp->value.i);
diff --git a/src/libexchangemapi/e-mapi-mail-utils.c b/src/libexchangemapi/e-mapi-mail-utils.c
index ba2ec83..b931247 100644
--- a/src/libexchangemapi/e-mapi-mail-utils.c
+++ b/src/libexchangemapi/e-mapi-mail-utils.c
@@ -728,7 +728,7 @@ e_mapi_mail_utils_object_to_message (EMapiConnection *conn, /* const */ EMapiObj
 	} else {
 		CamelInternetAddress *to_addr, *cc_addr, *bcc_addr;
 		const struct FILETIME *msg_date;
-		const bool *read_receipt;
+		const uint8_t *read_receipt;
 		const uint32_t *priority;
 		gchar *name, *email;
 
@@ -930,7 +930,7 @@ e_mapi_mail_add_recipients (EMapiObject *object,
 	for (ii = 0; addresses && camel_internet_address_get (addresses, ii, &name, &email); ii++) {
 		EMapiRecipient *recipient;
 		uint32_t ui32 = 0;
-		bool bl;
+		uint8_t bl;
 
 		recipient = e_mapi_recipient_new (object);
 		e_mapi_object_add_recipient (object, recipient);
@@ -970,7 +970,7 @@ e_mapi_mail_add_recipients (EMapiObject *object,
 		ui32 = MAPI_MAILUSER;
 		set_value (PidTagObjectType, &ui32);
 
-		bl = false;
+		bl = 0;
 		set_value (PidTagSendRichInfo, &bl);
 
 		#undef set_value
@@ -1399,7 +1399,7 @@ e_mapi_mail_utils_message_to_object (struct _CamelMimeMessage *message,
 	gchar *pid_name_content_type = NULL;
 	gint ii = 0;
 	uint32_t ui32;
-	bool bl;
+	uint8_t bl;
 
 	g_return_val_if_fail (message != NULL, FALSE);
 	g_return_val_if_fail (pobject != NULL, FALSE);
@@ -1454,7 +1454,7 @@ e_mapi_mail_utils_message_to_object (struct _CamelMimeMessage *message,
 	}
 	set_value (PidTagMessageFlags, &ui32);
 
-	bl = false;
+	bl = 0;
 	set_value (PidTagSendRichInfo, &bl);
 
 	/* PidTagConversationTopic and PidTagNormalizedSubject, together with PidTagSubjectPrefix
@@ -1555,7 +1555,7 @@ e_mapi_mail_utils_message_to_object (struct _CamelMimeMessage *message,
 			set_value (PidTagReadReceiptAddressType, "SMTP");
 
 			if ((create_flags & E_MAPI_CREATE_FLAG_SUBMIT) != 0) {
-				bl = true;
+				bl = 1;
 
 				set_value (PidTagReadReceiptRequested, &bl);
 			}



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