Owen Rudge : mapi32: Add support to MAPISendMailW for ANSI fallback.
Alexandre Julliard
julliard at winehq.org
Wed Apr 25 13:40:26 CDT 2012
Module: wine
Branch: master
Commit: 0eb0292eb5d7bcd44a4621c217c347b29638203a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0eb0292eb5d7bcd44a4621c217c347b29638203a
Author: Owen Rudge <orudge at codeweavers.com>
Date: Wed Apr 25 15:46:58 2012 +0100
mapi32: Add support to MAPISendMailW for ANSI fallback.
---
dlls/mapi32/sendmail.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 120 insertions(+), 0 deletions(-)
diff --git a/dlls/mapi32/sendmail.c b/dlls/mapi32/sendmail.c
index 4784968..da19259 100644
--- a/dlls/mapi32/sendmail.c
+++ b/dlls/mapi32/sendmail.c
@@ -548,6 +548,27 @@ ULONG WINAPI MAPISendMail( LHANDLE session, ULONG_PTR uiparam,
return MAPI_E_NOT_SUPPORTED;
}
+static lpMapiRecipDesc convert_recipient_from_unicode(lpMapiRecipDescW recipW, lpMapiRecipDesc dest)
+{
+ lpMapiRecipDesc ret;
+
+ if (!recipW)
+ return NULL;
+
+ if (dest)
+ ret = dest;
+ else
+ ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MapiRecipDesc));
+
+ ret->ulRecipClass = recipW->ulRecipClass;
+ ret->lpszName = convert_from_unicode(recipW->lpszName);
+ ret->lpszAddress = convert_from_unicode(recipW->lpszAddress);
+ ret->ulEIDSize = recipW->ulEIDSize;
+ ret->lpEntryID = recipW->lpEntryID;
+
+ return ret;
+}
+
/**************************************************************************
* MAPISendMailW (MAPI32.256)
*
@@ -578,6 +599,105 @@ ULONG WINAPI MAPISendMailW(LHANDLE session, ULONG_PTR uiparam,
if (MAPIInitialize(NULL) == S_OK)
return sendmail_extended_mapi(session, uiparam, message, flags);
+ if (mapiFunctions.MAPISendMail)
+ {
+ MapiMessage messageA;
+ ULONG ret;
+
+ if (flags & MAPI_FORCE_UNICODE)
+ return MAPI_E_UNICODE_NOT_SUPPORTED;
+
+ /* Convert to ANSI and send to MAPISendMail */
+ ZeroMemory(&messageA, sizeof(MapiMessage));
+
+ messageA.lpszSubject = convert_from_unicode(message->lpszSubject);
+ messageA.lpszNoteText = convert_from_unicode(message->lpszNoteText);
+ messageA.lpszMessageType = convert_from_unicode(message->lpszMessageType);
+ messageA.lpszDateReceived = convert_from_unicode(message->lpszDateReceived);
+ messageA.lpszConversationID = convert_from_unicode(message->lpszConversationID);
+ messageA.flFlags = message->flFlags;
+ messageA.lpOriginator = convert_recipient_from_unicode(message->lpOriginator, NULL);
+ messageA.nRecipCount = message->nRecipCount;
+ messageA.nFileCount = message->nFileCount;
+
+ if (message->nRecipCount && message->lpRecips)
+ {
+ lpMapiRecipDesc recipsA;
+ int i;
+
+ recipsA = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MapiRecipDesc) * message->nRecipCount);
+
+ for (i = 0; i < message->nRecipCount; i++)
+ {
+ convert_recipient_from_unicode(&message->lpRecips[i], &recipsA[i]);
+ }
+
+ messageA.lpRecips = recipsA;
+ }
+
+ if (message->nFileCount && message->lpFiles)
+ {
+ lpMapiFileDesc filesA;
+ int i;
+
+ filesA = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MapiFileDesc) * message->nFileCount);
+
+ for (i = 0; i < message->nFileCount; i++)
+ {
+ filesA[i].flFlags = message->lpFiles[i].flFlags;
+ filesA[i].nPosition = message->lpFiles[i].nPosition;
+ filesA[i].lpszPathName = convert_from_unicode(message->lpFiles[i].lpszPathName);
+ filesA[i].lpszFileName = convert_from_unicode(message->lpFiles[i].lpszFileName);
+ filesA[i].lpFileType = message->lpFiles[i].lpFileType;
+ }
+
+ messageA.lpFiles = filesA;
+ }
+
+ ret = mapiFunctions.MAPISendMail(session, uiparam, &messageA, flags, reserved);
+
+ /* Now free everything we allocated */
+ if (message->lpOriginator)
+ {
+ HeapFree(GetProcessHeap(), 0, messageA.lpOriginator->lpszName);
+ HeapFree(GetProcessHeap(), 0, messageA.lpOriginator->lpszAddress);
+ HeapFree(GetProcessHeap(), 0, messageA.lpOriginator);
+ }
+
+ if (message->nRecipCount && message->lpRecips)
+ {
+ int i;
+
+ for (i = 0; i < message->nRecipCount; i++)
+ {
+ HeapFree(GetProcessHeap(), 0, messageA.lpRecips[i].lpszName);
+ HeapFree(GetProcessHeap(), 0, messageA.lpRecips[i].lpszAddress);
+ }
+
+ HeapFree(GetProcessHeap(), 0, messageA.lpRecips);
+ }
+
+ if (message->nFileCount && message->lpFiles)
+ {
+ int i;
+
+ for (i = 0; i < message->nFileCount; i++)
+ {
+ HeapFree(GetProcessHeap(), 0, messageA.lpFiles[i].lpszPathName);
+ HeapFree(GetProcessHeap(), 0, messageA.lpFiles[i].lpszFileName);
+ }
+
+ HeapFree(GetProcessHeap(), 0, messageA.lpFiles);
+ }
+
+ HeapFree(GetProcessHeap(), 0, messageA.lpszSubject);
+ HeapFree(GetProcessHeap(), 0, messageA.lpszNoteText);
+ HeapFree(GetProcessHeap(), 0, messageA.lpszDateReceived);
+ HeapFree(GetProcessHeap(), 0, messageA.lpszConversationID);
+
+ return ret;
+ }
+
/* Display an error message since we apparently have no mail clients */
LoadStringW(hInstMAPI32, IDS_NO_MAPI_CLIENT, error_msg, sizeof(error_msg) / sizeof(WCHAR));
LoadStringW(hInstMAPI32, IDS_SEND_MAIL, msg_title, sizeof(msg_title) / sizeof(WCHAR));
More information about the wine-cvs
mailing list