diff options
Diffstat (limited to 'shell/source/win32/simplemail/senddoc.cxx')
-rw-r--r-- | shell/source/win32/simplemail/senddoc.cxx | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/shell/source/win32/simplemail/senddoc.cxx b/shell/source/win32/simplemail/senddoc.cxx new file mode 100644 index 000000000000..bb743960afc5 --- /dev/null +++ b/shell/source/win32/simplemail/senddoc.cxx @@ -0,0 +1,347 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_shell.hxx" +#include <osl/diagnose.h> + +#ifndef _RTL_STRING_HXX_ +//#include <rtl/string.hxx> +#endif +#include "simplemapi.hxx" + +#define WIN32_LEAN_AND_MEAN +#if defined _MSC_VER +#pragma warning(push, 1) +#endif +#include <windows.h> +#if defined _MSC_VER +#pragma warning(pop) +#endif +#include <tchar.h> + +#include <iostream> +#include <vector> +#include <sstream> +#include <stdexcept> + +#if OSL_DEBUG_LEVEL > 2 + void dumpParameter(); +#endif + +typedef std::vector<std::string> StringList_t; +typedef StringList_t::const_iterator StringListIterator_t; +typedef std::vector<MapiRecipDesc> MapiRecipientList_t; +typedef std::vector<MapiFileDesc> MapiAttachmentList_t; + +const int LEN_SMTP_PREFIX = 5; // "SMTP:" + +namespace /* private */ +{ + std::string gFrom; + std::string gSubject; + std::string gBody; + StringList_t gTo; + StringList_t gCc; + StringList_t gBcc; + StringList_t gAttachments; + int gMapiFlags = 0; +} + +/** + Add a prefix to an email address. MAPI requires that that + email addresses have an 'SMTP:' prefix. + + @param aEmailAddress + [in] the email address. + + @param aPrefix + [in] the prefix to be added to the email address. + + @returns + the email address prefixed with the specified prefix. +*/ +inline std::string prefixEmailAddress( + const std::string& aEmailAddress, + const std::string& aPrefix = "SMTP:") +{ + return (aPrefix + aEmailAddress); +} + +/** @internal */ +void addRecipient( + ULONG recipClass, + const std::string& recipAddress, + MapiRecipientList_t* pMapiRecipientList) +{ + MapiRecipDesc mrd; + ZeroMemory(&mrd, sizeof(mrd)); + + mrd.ulRecipClass = recipClass; + mrd.lpszName = const_cast<char*>(recipAddress.c_str()) + LEN_SMTP_PREFIX; + mrd.lpszAddress = const_cast<char*>(recipAddress.c_str()); + pMapiRecipientList->push_back(mrd); +} + +/** @internal */ +void initRecipientList(MapiRecipientList_t* pMapiRecipientList) +{ + OSL_ASSERT(pMapiRecipientList->size() == 0); + + // add to recipients + StringListIterator_t iter = gTo.begin(); + StringListIterator_t iter_end = gTo.end(); + for (; iter != iter_end; ++iter) + addRecipient(MAPI_TO, *iter, pMapiRecipientList); + + // add cc recipients + iter = gCc.begin(); + iter_end = gCc.end(); + for (; iter != iter_end; ++iter) + addRecipient(MAPI_CC, *iter, pMapiRecipientList); + + // add bcc recipients + iter = gBcc.begin(); + iter_end = gBcc.end(); + for (; iter != iter_end; ++iter) + addRecipient(MAPI_BCC, *iter, pMapiRecipientList); +} + +/** @internal */ +void initAttachementList(MapiAttachmentList_t* pMapiAttachmentList) +{ + OSL_ASSERT(pMapiAttachmentList->size() == 0); + + StringListIterator_t iter = gAttachments.begin(); + StringListIterator_t iter_end = gAttachments.end(); + for (/**/; iter != iter_end; ++iter) + { + MapiFileDesc mfd; + ZeroMemory(&mfd, sizeof(mfd)); + mfd.lpszPathName = const_cast<char*>(iter->c_str()); + mfd.nPosition = sal::static_int_cast<ULONG>(-1); + pMapiAttachmentList->push_back(mfd); + } +} + +/** @internal */ +void initMapiOriginator(MapiRecipDesc* pMapiOriginator) +{ + ZeroMemory(pMapiOriginator, sizeof(MapiRecipDesc)); + + pMapiOriginator->ulRecipClass = MAPI_ORIG; + pMapiOriginator->lpszName = ""; + pMapiOriginator->lpszAddress = const_cast<char*>(gFrom.c_str()); +} + +/** @internal */ +void initMapiMessage( + MapiRecipDesc* aMapiOriginator, + MapiRecipientList_t& aMapiRecipientList, + MapiAttachmentList_t& aMapiAttachmentList, + MapiMessage* pMapiMessage) +{ + ZeroMemory(pMapiMessage, sizeof(MapiMessage)); + + pMapiMessage->lpszSubject = const_cast<char*>(gSubject.c_str()); + pMapiMessage->lpszNoteText = (gBody.length() ? const_cast<char*>(gBody.c_str()) : NULL); + pMapiMessage->lpOriginator = aMapiOriginator; + pMapiMessage->lpRecips = aMapiRecipientList.size() ? &aMapiRecipientList[0] : 0; + pMapiMessage->nRecipCount = aMapiRecipientList.size(); + pMapiMessage->lpFiles = &aMapiAttachmentList[0]; + pMapiMessage->nFileCount = aMapiAttachmentList.size(); +} + +char* KnownParameter[] = +{ + "--to", + "--cc", + "--bcc", + "--from", + "--subject", + "--body", + "--attach", + "--mapi-dialog", + "--mapi-logon-ui" +}; + +const size_t nKnownParameter = (sizeof(KnownParameter)/sizeof(KnownParameter[0])); + +/** @internal */ +bool isKnownParameter(const char* aParameterName) +{ + for (size_t i = 0; i < nKnownParameter; i++) + if (_tcsicmp(aParameterName, KnownParameter[i]) == 0) + return true; + + return false; +} + +/** @internal */ +void initParameter(int argc, char* argv[]) +{ + for (int i = 1; i < argc; i++) + { + if (!isKnownParameter(argv[i])) + { + OSL_ENSURE(false, "Wrong parameter received"); + continue; + } + + if ((_tcsicmp(argv[i], TEXT("--mapi-dialog")) == 0)) + { + gMapiFlags |= MAPI_DIALOG; + } + else if ((_tcsicmp(argv[i], TEXT("--mapi-logon-ui")) == 0)) + { + gMapiFlags |= MAPI_LOGON_UI; + } + else if ((i+1) < argc) // is the value of a parameter available too? + { + if (_tcsicmp(argv[i], TEXT("--to")) == 0) + gTo.push_back(prefixEmailAddress(argv[i+1])); + else if (_tcsicmp(argv[i], TEXT("--cc")) == 0) + gCc.push_back(prefixEmailAddress(argv[i+1])); + else if (_tcsicmp(argv[i], TEXT("--bcc")) == 0) + gBcc.push_back(prefixEmailAddress(argv[i+1])); + else if (_tcsicmp(argv[i], TEXT("--from")) == 0) + gFrom = prefixEmailAddress(argv[i+1]); + else if (_tcsicmp(argv[i], TEXT("--subject")) == 0) + gSubject = argv[i+1]; + else if (_tcsicmp(argv[i], TEXT("--body")) == 0) + gBody = argv[i+1]; + else if ((_tcsicmp(argv[i], TEXT("--attach")) == 0)) + gAttachments.push_back(argv[i+1]); + + i++; + } + } +} + +/** + Main. + NOTE: Because this is program only serves implementation + purposes and should not be used by any end user the + parameter checking is very limited. Every unknown parameter + will be ignored. +*/ +int main(int argc, char* argv[]) +{ + //MessageBox(NULL, "Debug", "Debug", MB_OK); + + initParameter(argc, argv); + +#if OSL_DEBUG_LEVEL > 2 + dumpParameter(); +#endif + + ULONG ulRet = MAPI_E_FAILURE; + + try + { + CSimpleMapi mapi; + + // #93007# we have to set the flag MAPI_NEW_SESSION, + // because in the case Outlook xxx (not Outlook Express!) + // is installed as Exchange and Mail Client a Profile + // selection dialog must appear because we specify no + // profile name, so the user has to specify a profile + FLAGS flFlag = MAPI_NEW_SESSION | MAPI_LOGON_UI; + LHANDLE hSession; + ulRet = mapi.MAPILogon(0, NULL, NULL, flFlag, 0L, &hSession); + + if (ulRet == SUCCESS_SUCCESS) + { + MapiRecipDesc mapiOriginator; + MapiRecipientList_t mapiRecipientList; + MapiAttachmentList_t mapiAttachmentList; + MapiMessage mapiMsg; + + initMapiOriginator(&mapiOriginator); + initRecipientList(&mapiRecipientList); + initAttachementList(&mapiAttachmentList); + initMapiMessage((gFrom.length() ? &mapiOriginator : NULL), mapiRecipientList, mapiAttachmentList, &mapiMsg); + + ulRet = mapi.MAPISendMail(hSession, 0, &mapiMsg, gMapiFlags, 0); + + mapi.MAPILogoff(hSession, 0, 0, 0); + } + } + catch (const std::runtime_error& + #if OSL_DEBUG_LEVEL > 0 + ex + #endif + ) + { + OSL_ENSURE(false, ex.what()); + } + return ulRet; +} + +#if OSL_DEBUG_LEVEL > 2 + void dumpParameter() + { + std::ostringstream oss; + + if (gFrom.length() > 0) + oss << "--from" << " " << gFrom << std::endl; + + if (gSubject.length() > 0) + oss << "--subject" << " " << gSubject << std::endl; + + if (gBody.length() > 0) + oss << "--body" << " " << gBody << std::endl; + + StringListIterator_t iter = gTo.begin(); + StringListIterator_t iter_end = gTo.end(); + for (/**/;iter != iter_end; ++iter) + oss << "--to" << " " << *iter << std::endl; + + iter = gCc.begin(); + iter_end = gCc.end(); + for (/**/;iter != iter_end; ++iter) + oss << "--cc" << " " << *iter << std::endl; + + iter = gBcc.begin(); + iter_end = gBcc.end(); + for (/**/;iter != iter_end; ++iter) + oss << "--bcc" << " " << *iter << std::endl; + + iter = gAttachments.begin(); + iter_end = gAttachments.end(); + for (/**/;iter != iter_end; ++iter) + oss << "--attach" << " " << *iter << std::endl; + + if (gMapiFlags & MAPI_DIALOG) + oss << "--mapi-dialog" << std::endl; + + if (gMapiFlags & MAPI_LOGON_UI) + oss << "--mapi-logon-ui" << std::endl; + + MessageBox(NULL, oss.str().c_str(), "Arguments", MB_OK | MB_ICONINFORMATION); + } +#endif |