Owen Rudge : mapi32: Open the Drafts folder in preparation for creating a message.

Alexandre Julliard julliard at winehq.org
Thu Oct 1 09:48:21 CDT 2009


Module: wine
Branch: master
Commit: 6e33bfb76732b3d739454f2b9c42d1cfd1c32169
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6e33bfb76732b3d739454f2b9c42d1cfd1c32169

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Thu Oct  1 14:11:07 2009 +0100

mapi32: Open the Drafts folder in preparation for creating a message.

---

 dlls/mapi32/sendmail.c |   38 ++++++++++++++++++++++++++++++++++++++
 include/mapitags.h     |    1 +
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/dlls/mapi32/sendmail.c b/dlls/mapi32/sendmail.c
index d644525..c7e0cfd 100644
--- a/dlls/mapi32/sendmail.c
+++ b/dlls/mapi32/sendmail.c
@@ -48,10 +48,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(mapi);
 static ULONG sendmail_extended_mapi(LHANDLE mapi_session, ULONG_PTR uiparam, lpMapiMessage message,
     FLAGS flags, ULONG reserved)
 {
+    ULONG tags[] = {1, PR_IPM_DRAFTS_ENTRYID};
     ULONG retval = MAPI_E_FAILURE;
     IMAPISession *session = NULL;
     IMAPITable* msg_table;
     LPSRowSet rows = NULL;
+    IMsgStore* msg_store;
+    IMAPIFolder* folder;
+    LPENTRYID entry_id;
+    LPSPropValue props;
+    ULONG entry_len;
+    DWORD obj_type;
+    ULONG values;
     HRESULT ret;
 
     TRACE("Using Extended MAPI wrapper for MAPISendMail\n");
@@ -110,9 +118,39 @@ static ULONG sendmail_extended_mapi(LHANDLE mapi_session, ULONG_PTR uiparam, lpM
     if (!rows)
         goto logoff;
 
+    /* Open the message store */
+    IMAPISession_OpenMsgStore(session, 0, rows->aRow[0].lpProps[0].Value.bin.cb,
+                              (ENTRYID *) rows->aRow[0].lpProps[0].Value.bin.lpb, NULL,
+                              MDB_NO_DIALOG | MAPI_BEST_ACCESS, &msg_store);
+
     /* We don't need this any more */
     FreeProws(rows);
 
+    /* First open the inbox, from which the drafts folder can be opened */
+    if (IMsgStore_GetReceiveFolder(msg_store, NULL, 0, &entry_len, &entry_id, NULL) == S_OK)
+    {
+        IMsgStore_OpenEntry(msg_store, entry_len, entry_id, NULL, 0, &obj_type, (LPUNKNOWN*) &folder);
+        MAPIFreeBuffer(entry_id);
+    }
+
+    /* Open the drafts folder, or failing that, try asking the message store for the outbox */
+    if ((folder == NULL) || ((ret = IMAPIFolder_GetProps(folder, (LPSPropTagArray) tags, 0, &values, &props)) != S_OK))
+    {
+        TRACE("Unable to open Drafts folder; opening Outbox instead\n");
+        tags[1] = PR_IPM_OUTBOX_ENTRYID;
+        ret = IMsgStore_GetProps(msg_store, (LPSPropTagArray) tags, 0, &values, &props);
+    }
+
+    if (ret != S_OK)
+        goto logoff;
+
+    IMsgStore_OpenEntry(msg_store, props[0].Value.bin.cb, (LPENTRYID) props[0].Value.bin.lpb,
+        NULL, MAPI_MODIFY, &obj_type, (LPUNKNOWN *) &folder);
+
+    /* Free up the resources we've used */
+    IMAPIFolder_Release(folder);
+    IMsgStore_Release(msg_store);
+
 logoff: ;
     IMAPISession_Logoff(session, (ULONG) NULL, 0, 0);
     IMAPISession_Release(session);
diff --git a/include/mapitags.h b/include/mapitags.h
index abeee48..48f4dc1 100644
--- a/include/mapitags.h
+++ b/include/mapitags.h
@@ -452,6 +452,7 @@
 #define PR_AB_PROVIDER_ID PROP_TAG(PT_BINARY,0x3615)
 #define PR_DEFAULT_VIEW_ENTRYID PROP_TAG(PT_BINARY,0x3616)
 #define PR_ASSOC_CONTENT_COUNT PROP_TAG(PT_I4,0x3617)
+#define PR_IPM_DRAFTS_ENTRYID PROP_TAG(PT_BINARY,0x36D7)
 #define PR_ATTACHMENT_X400_PARAMETERS PROP_TAG(PT_BINARY,0x3700)
 #define PR_ATTACH_DATA_OBJ PROP_TAG(PT_OBJECT,0x3701)
 #define PR_ATTACH_DATA_BIN PROP_TAG(PT_BINARY,0x3701)




More information about the wine-cvs mailing list