Module: wine Branch: master Commit: 0eb0292eb5d7bcd44a4621c217c347b29638203a URL: http://source.winehq.org/git/wine.git/?a=commit;h=0eb0292eb5d7bcd44a4621c217...
Author: Owen Rudge orudge@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));