浏览代码

export to email

Scott Brogden 7 年之前
父节点
当前提交
896225569c
共有 13 个文件被更改,包括 347 次插入18 次删除
  1. 7 4
      ActionEnums.cpp
  2. 2 1
      ActionEnums.h
  3. 2 1
      CP_Main.rc
  4. 2 0
      CP_Main.vcxproj
  5. 2 0
      CP_Main.vcxproj.filters
  6. 37 0
      Clip.cpp
  7. 1 0
      Clip.h
  8. 2 2
      Misc.cpp
  9. 227 9
      QPasteWnd.cpp
  10. 3 0
      QPasteWnd.h
  11. 2 1
      Resource.h
  12. 53 0
      SendMail.cpp
  13. 7 0
      SendMail.h

+ 7 - 4
ActionEnums.cpp

@@ -84,7 +84,7 @@ CString ActionEnums::EnumDescription(ActionEnumValues value)
 		val = "Back Group";
 		break;
 	case TOGGLESHOWPERSISTANT:
-		val = "Toggle Show Persistant";
+		val = "Toggle Show Persistent";
 		break;
 	case PASTE_SELECTED:
 		val = "Paste Selected";
@@ -102,7 +102,7 @@ CString ActionEnums::EnumDescription(ActionEnumValues value)
 		val = "Move Clip To Group";
 		break;
 	case ELEVATE_PRIVlEGES:
-		val = "Option - Elevate Privleges";
+		val = "Option - Elevate Privileges";
 		break;
 	case SHOW_IN_TASKBAR:
 		val = "Option - Show In TaskBar";
@@ -347,8 +347,11 @@ CString ActionEnums::EnumDescription(ActionEnumValues value)
 	case TRANSPARENCY_DECREASE:
 		val = "Decrease Transparency %";
 		break;
-	case EMAILTO:
-		val = "EMail To";
+	case EMAILTO_BODY:
+		val = "EMail To in Body";
+		break;
+	case EMAILTO_ATTACH:
+		val = "EMail To with attachment";
 		break;
 	case GMAIL:
 		val = "Gmail";

+ 2 - 1
ActionEnums.h

@@ -117,7 +117,8 @@ public:
 		TRANSPARENCY_TOGGLE,
 		TRANSPARENCY_INCREASE,
 		TRANSPARENCY_DECREASE,
-		EMAILTO,
+		EMAILTO_BODY,
+		EMAILTO_ATTACH,
 		GMAIL,
 
 		LAST_ACTION

+ 2 - 1
CP_Main.rc

@@ -309,7 +309,8 @@ BEGIN
             MENUITEM "Export Clip(s) to Image File", ID_IMPORT_EXPORTCLIP_BITMAP
             MENUITEM "Export to Google Translate",  ID_IMPORT_EXPORTTOGOOGLETRANSLATE
             MENUITEM "Import File Contents From CF_HDROP", ID_IMPORT_IMPORTCOPIEDFILE
-            MENUITEM "Email To",                    ID_IMPORT_EMAILTO
+            MENUITEM "Mail in Body",                ID_IMPORT_EMAILTO
+            MENUITEM "Mail as Attachment ",         ID_IMPORT_EMAILTOASATTACHMENT
             MENUITEM "Gmail",                       ID_IMPORT_GMAIL
         END
     END

+ 2 - 0
CP_Main.vcxproj

@@ -652,6 +652,7 @@
     <ClCompile Include="RegExFilterHelper.cpp" />
     <ClCompile Include="ScriptEditor.cpp" />
     <ClCompile Include="ScrollHelper.cpp" />
+    <ClCompile Include="SendMail.cpp" />
     <ClCompile Include="Shared\TextConvert.cpp" />
     <ClCompile Include="Shared\Tokenizer.cpp" />
     <ClCompile Include="ShowTaskBarIcon.cpp" />
@@ -1924,6 +1925,7 @@
     <ClInclude Include="ScriptEditor.h" />
     <ClInclude Include="ScrollHelper.h" />
     <ClInclude Include="SearchEditBox.h" />
+    <ClInclude Include="SendMail.h" />
     <ClInclude Include="Shared\TextConvert.h" />
     <ClInclude Include="Shared\Tokenizer.h" />
     <ClInclude Include="ShowTaskBarIcon.h" />

+ 2 - 0
CP_Main.vcxproj.filters

@@ -461,6 +461,7 @@
     <ClCompile Include="SymbolEdit.cpp">
       <Filter>source</Filter>
     </ClCompile>
+    <ClCompile Include="SendMail.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="sqlite\CppSQLite3.h">
@@ -962,6 +963,7 @@
     <ClInclude Include="SymbolEdit.h">
       <Filter>header</Filter>
     </ClInclude>
+    <ClInclude Include="SendMail.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="CP_Main.rc">

+ 37 - 0
Clip.cpp

@@ -1732,6 +1732,43 @@ BOOL CClip::WriteTextToFile(CString path, BOOL unicode, BOOL asci, BOOL utf8)
 	return ret;
 }
 
+BOOL CClip::WriteTextToHtmlFile(CString path)
+{
+	BOOL ret = false;
+
+	CFile f;
+	if (f.Open(path, CFile::modeWrite | CFile::modeCreate))
+	{
+		IClipFormat *pFormat = this->Clips()->FindFormatEx(theApp.m_HTML_Format);
+		if (pFormat != NULL)
+		{
+			char *stringData = (char *)GlobalLock(pFormat->Data());
+			if (stringData != NULL)
+			{
+				CStringA html(stringData);							
+
+				int pos = html.Find("<html");
+				if (pos >= 0)
+				{
+					html = html.Mid(pos);
+				}
+				else
+				{
+					html = html;
+				}
+
+				f.Write(html.GetBuffer(), html.GetLength());
+
+				GlobalUnlock(pFormat->Data());
+			}
+		}
+
+		f.Close();
+	}
+
+	return ret;
+}
+
 BOOL CClip::WriteImageToFile(CString path)
 {
 	BOOL ret = false;

+ 1 - 0
Clip.h

@@ -153,6 +153,7 @@ public:
 
 	BOOL WriteTextToFile(CString path, BOOL unicode, BOOL asci, BOOL utf8);
 	BOOL WriteImageToFile(CString path);
+	BOOL WriteTextToHtmlFile(CString path);
 
 	// Allocates a Global containing the requested Clip's Format Data
 	static HGLOBAL LoadFormat(int id, UINT cfType);

+ 2 - 2
Misc.cpp

@@ -1311,13 +1311,13 @@ CString InternetEncode(CString text)
 	CString ret = _T("");
 	LPTSTR lpOutputBuffer = new TCHAR[1];
 	DWORD dwSize = 1;
-	BOOL fRes = ::InternetCanonicalizeUrl(text, lpOutputBuffer, &dwSize, ICU_DECODE | ICU_NO_ENCODE);
+	BOOL fRes = ::InternetCanonicalizeUrl(text, lpOutputBuffer, &dwSize, ICU_BROWSER_MODE);
 	DWORD dwError = ::GetLastError();
 	if (!fRes && dwError == ERROR_INSUFFICIENT_BUFFER)
 	{
 		delete lpOutputBuffer;
 		lpOutputBuffer = new TCHAR[dwSize];
-		fRes = ::InternetCanonicalizeUrl(text, lpOutputBuffer, &dwSize, ICU_DECODE | ICU_NO_ENCODE);
+		fRes = ::InternetCanonicalizeUrl(text, lpOutputBuffer, &dwSize, ICU_BROWSER_MODE);
 		if (fRes)
 		{
 			ret = lpOutputBuffer;

+ 227 - 9
QPasteWnd.cpp

@@ -22,6 +22,10 @@
 #include "FriendPromptDlg.h"
 #include "DimWnd.h"
 #include "client.h"
+#include "SendMail.h"
+#include "CF_UnicodeTextAggregator.h"
+#include "CF_TextAggregator.h"
+#include "htmlformataggregator.h"
 
 #ifdef _DEBUG
     #define new DEBUG_NEW
@@ -329,6 +333,8 @@ ON_COMMAND(ID_IMPORT_EMAILTO, &CQPasteWnd::OnImportEmailto)
 ON_UPDATE_COMMAND_UI(ID_IMPORT_EMAILTO, &CQPasteWnd::OnUpdateImportEmailto)
 ON_COMMAND(ID_IMPORT_GMAIL, &CQPasteWnd::OnImportGmail)
 ON_UPDATE_COMMAND_UI(ID_IMPORT_GMAIL, &CQPasteWnd::OnUpdateImportGmail)
+ON_COMMAND(ID_IMPORT_EMAILTOASATTACHMENT, &CQPasteWnd::OnImportEmailtoasattachment)
+ON_UPDATE_COMMAND_UI(ID_IMPORT_EMAILTOASATTACHMENT, &CQPasteWnd::OnUpdateImportEmailtoasattachment)
 END_MESSAGE_MAP()
 
 
@@ -3190,12 +3196,15 @@ bool CQPasteWnd::DoAction(CAccel a)
 	case ActionEnums::TRANSPARENCY_DECREASE:
 		DoActionDecreaseTransparency();
 		break;
-	case ActionEnums::EMAILTO:
+	case ActionEnums::EMAILTO_BODY:
 		DoActionEmailTo();
 		break;
 	case ActionEnums::GMAIL:
 		DoActionGmail();
 		break;
+	case ActionEnums::EMAILTO_ATTACH:
+		DoActionEmailToAttach();
+		break;
 	}
 
 	return ret;
@@ -7021,24 +7030,216 @@ bool CQPasteWnd::DoActionDecreaseTransparency()
 	return true;
 }
 
-bool DoActionEmailTo()
+bool CQPasteWnd::DoActionEmailTo()
 {
+	CWaitCursor wait;
+
 	CClipIDs IDs;
 	m_lstHeader.GetSelectionItemData(IDs);
 
+	CClip clip;
+
+	if (IDs.GetCount() > 1)
+	{
+		CStringA SepA = CTextConvert::ConvertToChar(g_Opt.GetMultiPasteSeparator());
+		CStringW SepW = CTextConvert::ConvertToUnicode(g_Opt.GetMultiPasteSeparator());
+
+		CHTMLFormatAggregator Html(SepA);
+		if (IDs.AggregateData(Html, theApp.m_HTML_Format, g_Opt.m_bMultiPasteReverse))
+		{
+			CClipFormat cf(theApp.m_HTML_Format, Html.GetHGlobal());
+			clip.m_Formats.Add(cf);
+			//clip.m_Formats now owns the global data
+			cf.m_autoDeleteData = false;
+		}
+		
+		CCF_UnicodeTextAggregator CFUnicodeText(SepW);
+		if (IDs.AggregateData(CFUnicodeText, CF_UNICODETEXT, g_Opt.m_bMultiPasteReverse))
+		{
+			CClipFormat cf(CF_UNICODETEXT, CFUnicodeText.GetHGlobal());
+			clip.m_Formats.Add(cf);
+			//clip.m_Formats now owns the global data
+			cf.m_autoDeleteData = false;
+		}
+		else
+		{
+			
+			CCF_TextAggregator CFText(SepA);
+			if (IDs.AggregateData(CFText, CF_TEXT, g_Opt.m_bMultiPasteReverse))
+			{
+				CClipFormat cf(CF_TEXT, CFText.GetHGlobal());
+				clip.m_Formats.Add(cf);
+				//clip.m_Formats now owns the global data
+				cf.m_autoDeleteData = false;
+			}
+		}
+	}
+	else
+	{
+		clip.LoadFormats(IDs[0], false, false);
+	}
+
+	CString path = CGetSetOptions::GetPath(PATH_DRAG_FILES);
+	CreateDirectory(path, NULL);
+	int dragId = CGetSetOptions::GetDragId();
+	int origDragId = dragId;
 
-	CStringW SepW = CTextConvert::ConvertToUnicode(g_Opt.GetMultiPasteSeparator());
-	CCF_UnicodeTextAggregator CFUnicodeText(SepW);
-	if (IDs.AggregateData(CFUnicodeText, CF_UNICODETEXT, g_Opt.m_bMultiPasteReverse))
+	CString subject;
+	CString body;
+	CString attachment;
+
+	CClipFormat *html = clip.m_Formats.FindFormat(theApp.m_HTML_Format);
+	if (html != NULL)
 	{
+		CString file;
+		file.Format(_T("%shtml_%d.html"), path, dragId++);
+
+		clip.WriteTextToHtmlFile(file);
+
+		attachment = file;
 	}
-	CHyperLink::GotoURL(_T("https://sourceforge.net/p/ditto-cp/wiki/"), SW_SHOW);
+	else
+	{
+		CString text = clip.GetUnicodeTextFormat();
+		if (text == _T(""))
+		{
+			text = clip.GetCFTextTextFormat();
+		}
+
+		if (text != _T(""))
+		{
+			body = text;
+			subject = text.Left(30);
+		}
+		else
+		{
+			CClipFormat *png = NULL;
+			CClipFormat *dib = clip.m_Formats.FindFormat(CF_DIB);
+			if (dib == NULL)
+			{
+				png = clip.m_Formats.FindFormat(theApp.m_PNG_Format);
+			}
+
+			if (png != NULL ||
+				dib != NULL)
+			{
+				CString file;
+				file.Format(_T("%simage_%d.png"), path, dragId++);
+
+				clip.WriteImageToFile(file);
 
+				CString fileWrapper;
+				fileWrapper.Format(_T("%shtml_%d.html"), path, dragId++);
+
+				CFile f;
+				if (f.Open(fileWrapper, CFile::modeWrite | CFile::modeCreate))
+				{
+					CString html;
+					html.Format(_T("<html><img src=\"%s\"></html>"), file);
+
+					CStringA convToUtf8;
+					CTextConvert::ConvertToUTF8(html, convToUtf8);
+					f.Write(convToUtf8.GetBuffer(), convToUtf8.GetLength());
+
+					f.Close();
+				}
+
+				attachment = fileWrapper;
+			}
+		}
+	}
+
+	if (subject != _T("") ||
+		body != _T("") ||
+		attachment != _T(""))
+	{
+		SendMail::Send(subject, body, attachment);
+	}
+
+	if (dragId != origDragId)
+	{
+		CGetSetOptions::SetDragId(dragId);
+	}
+
+	return true;
 }
 
-bool DoActionGmail()
+bool CQPasteWnd::DoActionGmail()
 {
+	CWaitCursor wait;
+
+	CClipIDs IDs;
+	m_lstHeader.GetSelectionItemData(IDs);
+
+	CClip clip;
+
+	if (IDs.GetCount() > 1)
+	{
+		CStringW SepW = CTextConvert::ConvertToUnicode(g_Opt.GetMultiPasteSeparator());
+		CCF_UnicodeTextAggregator CFUnicodeText(SepW);
+		if (IDs.AggregateData(CFUnicodeText, CF_UNICODETEXT, g_Opt.m_bMultiPasteReverse))
+		{
+			CClipFormat cf(CF_UNICODETEXT, CFUnicodeText.GetHGlobal());
+			clip.m_Formats.Add(cf);
+			//clip.m_Formats now owns the global data
+			cf.m_autoDeleteData = false;
+		}
+		else
+		{
+			CStringA SepA = CTextConvert::ConvertToChar(g_Opt.GetMultiPasteSeparator());
+			CCF_TextAggregator CFText(SepA);
+			if (IDs.AggregateData(CFText, CF_TEXT, g_Opt.m_bMultiPasteReverse))
+			{
+				CClipFormat cf(CF_TEXT, CFText.GetHGlobal());
+				clip.m_Formats.Add(cf);
+				//clip.m_Formats now owns the global data
+				cf.m_autoDeleteData = false;
+			}
+		}
+	}
+	else
+	{
+		clip.LoadFormats(IDs[0], true, false);
+	}
+
+	CString text = clip.GetUnicodeTextFormat();
+	if (text == _T(""))
+	{
+		text = clip.GetCFTextTextFormat();
+	}
+
+	if (text != _T(""))
+	{
+		CString link;
+		text.Replace(_T("\r\n"), _T("%0D%0A"));
+		CString en = InternetEncode(text);
+
+		link.Format(_T("https://mail.google.com/mail/u/0/?view=cm&body=%s"), en);
 
+		CHyperLink::GotoURL(link, SW_SHOW);
+	}
+
+	return true;
+}
+
+bool CQPasteWnd::DoActionEmailToAttach()
+{
+	CClipIDs IDs;
+	m_lstHeader.GetSelectionItemData(IDs);
+
+	CString path = CGetSetOptions::GetPath(PATH_DRAG_FILES);
+	CreateDirectory(path, NULL);
+	int dragId = CGetSetOptions::GetDragId();
+	int origDragId = dragId;
+
+	CString file;
+	file.Format(_T("%sexport_%d.dto"), path, dragId++);
+
+	IDs.Export(file);
+
+	SendMail::Send(_T(""), _T(""), file);
+
+	return true;
 }
 
 void CQPasteWnd::SetTransparency(int percent)
@@ -7130,7 +7331,7 @@ void CQPasteWnd::OnUpdateTransparencyToggle(CCmdUI *pCmdUI)
 
 void CQPasteWnd::OnImportEmailto()
 {
-	DoAction(ActionEnums::EMAILTO);
+	DoAction(ActionEnums::EMAILTO_BODY);
 }
 
 void CQPasteWnd::OnUpdateImportEmailto(CCmdUI *pCmdUI)
@@ -7140,7 +7341,7 @@ void CQPasteWnd::OnUpdateImportEmailto(CCmdUI *pCmdUI)
 		return;
 	}
 
-	UpdateMenuShortCut(pCmdUI, ActionEnums::EMAILTO);
+	UpdateMenuShortCut(pCmdUI, ActionEnums::EMAILTO_BODY);
 }
 
 
@@ -7159,3 +7360,20 @@ void CQPasteWnd::OnUpdateImportGmail(CCmdUI *pCmdUI)
 
 	UpdateMenuShortCut(pCmdUI, ActionEnums::GMAIL);
 }
+
+
+void CQPasteWnd::OnImportEmailtoasattachment()
+{
+	DoAction(ActionEnums::EMAILTO_ATTACH);
+}
+
+
+void CQPasteWnd::OnUpdateImportEmailtoasattachment(CCmdUI *pCmdUI)
+{
+	if (!pCmdUI->m_pMenu)
+	{
+		return;
+	}
+
+	UpdateMenuShortCut(pCmdUI, ActionEnums::EMAILTO_ATTACH);
+}

+ 3 - 0
QPasteWnd.h

@@ -298,6 +298,7 @@ public:
 	bool DoActionDecreaseTransparency();
 	bool DoActionEmailTo();
 	bool DoActionGmail();
+	bool DoActionEmailToAttach();
 
 	bool OnNewClip();
 	bool OnImportClip();
@@ -563,4 +564,6 @@ public:
 	afx_msg void OnUpdateImportEmailto(CCmdUI *pCmdUI);
 	afx_msg void OnImportGmail();
 	afx_msg void OnUpdateImportGmail(CCmdUI *pCmdUI);
+	afx_msg void OnImportEmailtoasattachment();
+	afx_msg void OnUpdateImportEmailtoasattachment(CCmdUI *pCmdUI);
 };

+ 2 - 1
Resource.h

@@ -768,6 +768,7 @@
 #define ID_TRANSPARENCY_35              32950
 #define ID_IMPORT_EMAILTO               32951
 #define ID_IMPORT_GMAIL                 32952
+#define ID_IMPORT_EMAILTOASATTACHMENT   32953
 
 // Next default values for new objects
 // 
@@ -775,7 +776,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        383
-#define _APS_NEXT_COMMAND_VALUE         32953
+#define _APS_NEXT_COMMAND_VALUE         32954
 #define _APS_NEXT_CONTROL_VALUE         2172
 #define _APS_NEXT_SYMED_VALUE           104
 #endif

+ 53 - 0
SendMail.cpp

@@ -0,0 +1,53 @@
+#include "stdafx.h"
+#include "SendMail.h"
+#include "Path.h"
+#include <mapi.h>
+
+
+bool SendMail::Send(CString subject, CString body, CString attachmentFileName)
+{
+	HINSTANCE hMAPI = ::LoadLibraryA(("MAPI32.DLL"));
+	if (!hMAPI)
+		return false;
+
+	// Grab the exported entry point for the MAPISendMail function
+	ULONG(PASCAL *SendMail)(ULONG, ULONG_PTR, MapiMessageW*, FLAGS, ULONG);
+	(FARPROC&)SendMail = GetProcAddress(hMAPI, "MAPISendMailW");
+
+	if (!SendMail)
+		return false;
+
+	MapiMessageW message;
+	::ZeroMemory(&message, sizeof(message));
+	message.lpszNoteText = body.GetBuffer();
+	message.lpszSubject = subject.GetBuffer();
+
+	CString attachFileName;
+
+	if (attachmentFileName != _T(""))
+	{
+		MapiFileDescW fileDesc;
+		::ZeroMemory(&fileDesc, sizeof(fileDesc));
+		fileDesc.nPosition = (ULONG)-1;
+		fileDesc.lpszPathName = attachmentFileName.GetBuffer();
+
+		using namespace nsPath;
+		CPath path(fileDesc.lpszPathName);
+		attachFileName = path.GetName();
+
+		fileDesc.lpszFileName = attachFileName.GetBuffer();
+
+		message.nFileCount = 1;
+		message.lpFiles = &fileDesc;
+	}
+
+	// Ok to send
+	int nError = SendMail(0, (ULONG_PTR)0, &message, MAPI_DIALOG_MODELESS, 0);
+
+	if (nError != SUCCESS_SUCCESS &&
+		nError != MAPI_USER_ABORT &&
+		nError != MAPI_E_LOGIN_FAILURE)
+		return false;
+
+	return true;
+}

+ 7 - 0
SendMail.h

@@ -0,0 +1,7 @@
+#pragma once
+class SendMail
+{
+public:
+	static bool Send(CString subject, CString body, CString attachmentFileName);
+};
+