evolution-mapi r115 - in trunk/src: camel libexchangemapi



Author: jjohnny
Date: Sun Feb 15 21:38:48 2009
New Revision: 115
URL: http://svn.gnome.org/viewvc/evolution-mapi?rev=115&view=rev

Log:
Fixes #568519 â Delete/Renaming default folders should not be allowed.

	* exchange-mapi-connection.c (set_default_folders): Use PR_REN_ADDITIONAL_ENTRYIDS for
	Junk & Sync issues folder.
	(mapi_get_ren_additional_fids): Added. Fetch Use PR_REN_ADDITIONAL_ENTRYIDS.

	* camel-mapi-store.c (mapi_convert_to_folder_info): Mark Junk & Outbox folders.

Modified:
   trunk/src/camel/ChangeLog
   trunk/src/camel/camel-mapi-store.c
   trunk/src/libexchangemapi/ChangeLog
   trunk/src/libexchangemapi/exchange-mapi-connection.c

Modified: trunk/src/camel/camel-mapi-store.c
==============================================================================
--- trunk/src/camel/camel-mapi-store.c	(original)
+++ trunk/src/camel/camel-mapi-store.c	Sun Feb 15 21:38:48 2009
@@ -1004,10 +1004,12 @@
 		case olFolderDeletedItems:
 			fi->flags |= CAMEL_FOLDER_TYPE_TRASH;
 			break;
-		/*Fixme : IsMailboxFolder doesn't support this yet*/
-		/* case olFolderJunkMail: */
-		/* 	fi->flags |= CAMEL_FOLDER_TYPE_JUNK; */
-		/* 	break; */
+		case olFolderOutbox:
+			fi->flags |= CAMEL_FOLDER_TYPE_OUTBOX;
+			break;
+		case olFolderJunk:
+			fi->flags |= CAMEL_FOLDER_TYPE_JUNK;
+			break;
 		}
 
 		fi->flags |= CAMEL_FOLDER_SYSTEM;

Modified: trunk/src/libexchangemapi/exchange-mapi-connection.c
==============================================================================
--- trunk/src/libexchangemapi/exchange-mapi-connection.c	(original)
+++ trunk/src/libexchangemapi/exchange-mapi-connection.c	Sun Feb 15 21:38:48 2009
@@ -2513,21 +2513,122 @@
 	return result;
 }
 
+/* TODO : Find a right place for this. */
+#define PR_ADDITIONAL_REN_ENTRYIDS    PROP_TAG(PT_MV_BINARY, 0x36D8)
+
+/*NOTE : This should be called when you hold the connection lock*/
+/*NOTE : IsMailboxFolder doesn't support this yet. */
+/* Ticket : http://trac.openchange.org/ticket/134  */
+static void
+mapi_get_ren_additional_fids (const mapi_object_t *obj_store, GHashTable **folder_list)
+{
+	mapi_id_t inbox_id, fid, *default_fid;
+	mapi_object_t obj_folder_inbox;
+	struct SPropTagArray *SPropTagArray;
+	struct SPropValue *lpProps;
+	struct SRow aRow;
+	struct BinaryArray_r *entryids;
+	struct Binary_r entryid;
+	enum MAPISTATUS retval;
+
+	guint32 count, *folder_type;
+	guint i = 0;
+
+	TALLOC_CTX *mem_ctx;
+
+	/*Note : Do not change the order.*/
+	const guint32 olfolder_defaults[] = {
+		olFolderConflicts,
+		olFolderSyncIssues,
+		olFolderLocalFailures,
+		olFolderServerFailures,
+		olFolderJunk
+	};
+
+	mem_ctx = talloc_init("ExchangeMAPI_GetAdditionalFIDs");
+	mapi_object_init(&obj_folder_inbox);
+
+	/* Get Inbox FID using GetDefaultFolder. */
+	retval = GetDefaultFolder(obj_store, &inbox_id, olFolderInbox);
+	if (retval != MAPI_E_SUCCESS) {
+		mapi_errstr("GetDefaultFolder", GetLastError());
+		goto cleanup;
+	}
+
+	/* Open InboxFolder. */
+	retval = OpenFolder(obj_store, inbox_id, &obj_folder_inbox);
+	if (retval != MAPI_E_SUCCESS) {
+		mapi_errstr("OpenFolder", GetLastError());
+		goto cleanup;
+	}
+
+	/* GetProps on Inbox for PR_ADDITIONAL_REN_ENTRYIDS */
+	SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_ADDITIONAL_REN_ENTRYIDS);
+
+	lpProps = talloc_zero(mem_ctx, struct SPropValue);
+	retval = GetProps (&obj_folder_inbox, SPropTagArray, &lpProps, &count);
+
+	/* Build a SRow structure */
+	aRow.ulAdrEntryPad = 0;
+	aRow.cValues = count;
+	aRow.lpProps = lpProps;
+
+	entryids = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_ADDITIONAL_REN_ENTRYIDS);
+
+	/* Iterate through MV_BINARY */
+	if (entryids) {
+		for (i = 0; i < G_N_ELEMENTS (olfolder_defaults); i++) {
+			entryid = entryids->lpbin [i];
+			retval = GetFIDFromEntryID(entryid.cb, entryid.lpb, inbox_id, &fid);
+
+			if (fid) {
+				folder_type = g_new0 (guint32, 1);
+				*folder_type = olfolder_defaults[i];
+
+				g_hash_table_insert (*folder_list, 
+						     exchange_mapi_util_mapi_id_to_string (fid), 
+						     folder_type);
+			}
+		}
+	}
+
+cleanup:
+	mapi_object_release(&obj_folder_inbox);
+	talloc_free (mem_ctx);
+}
+
 static void 
 set_default_folders (mapi_object_t *obj_store, GSList **mapi_folders)
 {
 	GSList *folder_list = *mapi_folders;
+
+	GHashTable *default_folders = g_hash_table_new_full (g_str_hash, g_str_equal,
+							     g_free, g_free);
+
+	mapi_get_ren_additional_fids (obj_store, &default_folders);
 	
 	while (folder_list != NULL) {
 		ExchangeMAPIFolder *folder = NULL;
 		guint32 default_type = 0;
+		gchar *key_fid = NULL;
+		gpointer value = NULL;
+
 		folder = folder_list->data;
-		if (IsMailboxFolder (obj_store,folder->folder_id, &default_type )) {
+		key_fid = exchange_mapi_util_mapi_id_to_string (folder->folder_id);
+
+		if (value = g_hash_table_lookup (default_folders, key_fid))
+			default_type = *(guint32 *)value;
+		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->default_type = default_type;
 		}
+
 		folder_list = g_slist_next (folder_list); 
 	}
+
+	g_hash_table_destroy (default_folders);
 }
 
 static void 



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