diff options
Diffstat (limited to 'plugins/SendScreenshotPlus/CSendEmail.cpp')
| -rw-r--r-- | plugins/SendScreenshotPlus/CSendEmail.cpp | 221 | 
1 files changed, 221 insertions, 0 deletions
diff --git a/plugins/SendScreenshotPlus/CSendEmail.cpp b/plugins/SendScreenshotPlus/CSendEmail.cpp new file mode 100644 index 0000000000..14e539ea0d --- /dev/null +++ b/plugins/SendScreenshotPlus/CSendEmail.cpp @@ -0,0 +1,221 @@ +/*
 +
 +Miranda IM: the free IM client for Microsoft* Windows*
 +Copyright 2000-2009 Miranda ICQ/IM project, 
 +
 +This file is part of Send Screenshot Plus, a Miranda IM plugin.
 +Copyright (c) 2010 Ing.U.Horn
 +
 +Parts of this file based on original sorce code
 +(c) 2004-2006 Sérgio Vieira Rolanski (portet from Borland C++)
 +
 +This program is free software; you can redistribute it and/or
 +modify it under the terms of the GNU General Public License
 +as published by the Free Software Foundation; either version 2
 +of the License, or (at your option) any later version.
 +
 +This program 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 General Public License for more details.
 +
 +You should have received a copy of the GNU General Public License
 +along with this program; if not, write to the Free Software
 +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 +
 +File name      : $HeadURL: http://merlins-miranda.googlecode.com/svn/trunk/miranda/plugins/SendSSPlus/CSendEmail.cpp $
 +Revision       : $Revision: 13 $
 +Last change on : $Date: 2010-04-02 02:54:30 +0400 (Пт, 02 апр 2010) $
 +Last change by : $Author: ing.u.horn $
 +
 +*/
 +
 +//---------------------------------------------------------------------------
 +#include "CSendEmail.h"
 +
 +//---------------------------------------------------------------------------
 +CSendEmail::CSendEmail(HWND Owner, HANDLE hContact, bool bFreeOnExit)
 +: CSend(Owner, hContact, bFreeOnExit){
 +	m_EnableItem		= SS_DLG_DELETEAFTERSSEND | SS_DLG_DESCRIPTION; // SS_DLG_AUTOSEND | ;
 +	m_pszSendTyp		= _T("Email transfer");
 +	m_pszFileA			= NULL;
 +	m_pszFileName		= NULL;
 +	m_Email				= NULL;
 +	m_FriendlyName		= NULL;
 +	m_Subject			= NULL;
 +}
 +
 +CSendEmail::~CSendEmail(){
 +	mir_free(m_pszFileA);
 +	mir_free(m_pszFileName);
 +	mir_free(m_Email);
 +	mir_free(m_FriendlyName);
 +	mir_free(m_Subject);
 +}
 +
 +//---------------------------------------------------------------------------
 +void	CSendEmail::Send() {
 +
 +	mir_freeAndNil(m_pszFileName);
 +	m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ);
 +
 +	mir_freeAndNil(m_pszFileA);
 +	m_pszFileA = mir_t2a(m_pszFile);
 +
 +
 +//	AnsiString Email, Subject, FriendlyName;
 +	CONTACTINFO ci={0};
 +	ci.cbSize = sizeof(ci);
 +	ci.hContact = m_hContact;
 +	ci.szProto = m_pszProto;
 +	//ci.dwFlag = CNF_TCHAR;
 +
 +	ci.dwFlag = CNF_EMAIL | CNF_TCHAR;
 +	CallService(MS_CONTACT_GETCONTACTINFO,(WPARAM)0,(LPARAM)&ci);
 +	m_Email = mir_t2a(ci.pszVal);
 +
 +	ci.dwFlag = CNF_DISPLAY | CNF_TCHAR;
 +	CallService(MS_CONTACT_GETCONTACTINFO,(WPARAM)0,(LPARAM)&ci);
 +	m_FriendlyName = mir_t2a(ci.pszVal);
 +
 +	mir_free(ci.pszVal);
 +
 +	m_Subject = mir_t2a(m_pszFileDesc);
 +
 +	//SendByEmail(m_pszFileA, "", m_FriendlyName, m_Email, m_Subject);
 +
 +	//start Send thread
 +	m_bFreeOnExit = TRUE;
 +	mir_forkthread(&CSendEmail::SendThreadWrapper, this);
 +}
 +
 +void CSendEmail::SendThread() {
 +	//This code based on SentTo.exe application.
 +	//The default mail client for Simple MAPI or MAPI calls is defined by the
 +	//HKLM\Software\Clients\Mail::(default) registry value. 
 +
 +	LPTSTR err = NULL;
 +	MapiFileDesc arrfileDesc[1];
 +
 +	typedef ULONG (FAR PASCAL *MAPIFUNC)(LHANDLE,ULONG,lpMapiMessage,FLAGS,ULONG);
 +	MapiMessage Msg;
 +	MAPIFUNC lpMAPISendMail;
 +
 +	HINSTANCE hMAPILib = ::LoadLibrary(_T("MAPI32.DLL"));
 +	if (hMAPILib == NULL) {
 +		//return -1;
 +		Error(SS_ERR_INIT, m_pszSendTyp);
 +		Exit(ACKRESULT_FAILED);
 +	}
 +
 +	lpMAPISendMail = (MAPIFUNC)GetProcAddress(hMAPILib, "MAPISendMail");
 +	if (lpMAPISendMail == NULL) {
 +		::FreeLibrary(hMAPILib);
 +		//return -2;
 +		Error(SS_ERR_INIT, m_pszSendTyp);
 +		Exit(ACKRESULT_FAILED);
 +	}
 +
 +	memset(&Msg, 0, sizeof(Msg));
 +
 +	arrfileDesc[0].ulReserved = 0;
 +	arrfileDesc[0].flFlags = 0;
 +	arrfileDesc[0].lpFileType = NULL;
 +	arrfileDesc[0].nPosition = -1;
 +	arrfileDesc[0].lpszPathName = m_pszFileA;
 +	arrfileDesc[0].lpszFileName = NULL;
 +
 +	Msg.nFileCount = 1;
 +	Msg.lpFiles = arrfileDesc;
 +	Msg.lpszNoteText = "";							//body
 +	Msg.lpszSubject = m_Subject;					//subject
 +
 +	Msg.nRecipCount = 1;
 +	MapiRecipDesc recip;
 +	recip.ulReserved = 0;
 +	recip.ulRecipClass = MAPI_TO;
 +
 +	if (m_FriendlyName && m_FriendlyName[0]!= NULL) {
 +		recip.lpszName = m_FriendlyName;			//friendly name set to contact's name
 +	}
 +	else {
 +		recip.lpszName = m_Email;					//friendly name set to contact's email
 +	}
 +
 +	recip.lpszAddress = m_Email;					//email
 +	recip.ulEIDSize = 0;
 +	recip.lpEntryID = NULL;
 +	Msg.lpRecips = &recip;
 +
 +	try {
 +		int res = lpMAPISendMail(NULL, NULL, &Msg, MAPI_LOGON_UI|MAPI_DIALOG, 0);
 +		::FreeLibrary(hMAPILib);
 +
 +		switch (res) {
 +			case SUCCESS_SUCCESS:
 +				//The call succeeded and the message was sent.
 +				Exit(ACKRESULT_SUCCESS);
 +				return;
 +
 +			// No message was sent
 +			case MAPI_E_AMBIGUOUS_RECIPIENT:
 +				err = _T("A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set");
 +				break;
 +			case MAPI_E_ATTACHMENT_NOT_FOUND:
 +				err = _T("The specified attachment was not found");
 +				break;
 +			case MAPI_E_ATTACHMENT_OPEN_FAILURE:
 +				err = _T("The specified attachment could not be opened");
 +				break;
 +			case MAPI_E_BAD_RECIPTYPE:
 +				err = _T("The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC");
 +				break;
 +			case MAPI_E_FAILURE:
 +				err = _T("One or more unspecified errors occurred");
 +				break;
 +			case MAPI_E_INSUFFICIENT_MEMORY:
 +				err = _T("There was insufficient memory to proceed");
 +				break;
 +			case MAPI_E_INVALID_RECIPS:
 +				err = _T("One or more recipients were invalid or did not resolve to any address");
 +				break;
 +			case MAPI_E_LOGIN_FAILURE:
 +				err = _T("There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed");
 +				break;
 +			case MAPI_E_TEXT_TOO_LARGE:
 +				err = _T("The text in the message was too large");
 +				break;
 +			case MAPI_E_TOO_MANY_FILES:
 +				err = _T("There were too many file attachments");
 +				break;
 +			case MAPI_E_TOO_MANY_RECIPIENTS:
 +				err = _T("There were too many recipients");
 +				break;
 +			case MAPI_E_UNKNOWN_RECIPIENT:
 +				err = _T("A recipient did not appear in the address list");
 +				break;
 +			case MAPI_E_USER_ABORT:
 +				err = _T("The user canceled one of the dialog boxes");
 +				break;
 +			default:
 +				err = _T("Unknown Error");
 +				break;
 +		}
 +		Error(SS_ERR_MAPI, res, err);
 +		Exit(ACKRESULT_FAILED);
 +
 +	} catch (...) {
 +		::FreeLibrary(hMAPILib);
 +		Error(SS_ERR_INIT, m_pszSendTyp);
 +		Exit(ACKRESULT_FAILED);
 +		//return -3;
 +		return;
 +	}
 +}
 +
 +void	CSendEmail::SendThreadWrapper(void * Obj) {
 +	reinterpret_cast<CSendEmail*>(Obj)->SendThread();
 +}
 +
 +//---------------------------------------------------------------------------
 +
  | 
