#include <windows.h>
#include <commctrl.h>
#include "resource.h"
#include "resrc1.h"
#include "sendmail.h"
#include "abook.h"
#include "gwoapi.h"
#include "util.h"
BOOL WINAPI SendMailDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void SendMailMessage(HWND hWndDlg);
void InitDialog(HWND hWnd);
extern HINSTANCE ghInst;
extern IGWSession* pIGWSession;
extern IGWAccount *pIGWAccount;
BSTR bsFrom = NULL;
HANDLE hWndAttach;
HIMAGELIST imageList;
void CreateSendMailDialog(HWND hWnd)
{
DialogBox(ghInst, MAKEINTRESOURCE(IDD_MAIL), hWnd, (DLGPROC)SendMailDlgProc);
}
BOOL WINAPI SendMailDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
OPENFILENAME ofn;
char szDirName[MAX_PATH];
char szFile[260];
char szFileTitle[260];
LV_ITEM lvItem;
switch(uMsg) {
case WM_INITDIALOG:
InitDialog(hWnd);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDCANCEL:
EndDialog(hWnd, TRUE);
break;
case IDSEND:
SendMailMessage(hWnd);
EndDialog(hWnd, TRUE);
break;
case IDADDRESSBOOK: {
Recip recip;
HWND hCtl;
if(ShowAddressBook(hWnd, &recip) == IDOK) {
hCtl = GetDlgItem(hWnd, IDC_TO);
SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)recip.DisplayName);
SendMessage(hCtl, CB_SETCURSEL, 0, 0);
}
return TRUE;
}
case IDATTACH:
GetSystemDirectory(szDirName, sizeof(szDirName));
szFile[0] = '\0';
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitialDir = szDirName;
ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn)) {
lvItem.mask = LVIF_TEXT | TVIF_IMAGE;
lvItem.iItem = ListView_GetItemCount( (HWND) hWndAttach);
lvItem.iSubItem = 0;
lvItem.iImage = 0;
lvItem.pszText = szFile;
ListView_InsertItem( (HWND) hWndAttach, &lvItem);
}
break;
}
break;
default:
return FALSE;
}
return FALSE;
}
void SendMailMessage(HWND hWndDlg)
{
DIGWFolder* pDIGWWorkFolder;
DIGWMessages* pDIGWMessages;
DIGWMessage* pDIGWMessage;
DIGWMessage* pDIGWRetMessage = NULL;
DIGWRecipients* pDIGWRecipients;
DIGWRecipient* pDIGWRecipient;
DIGWFormattedText* pDSubject;
DIGWFormattedText* pDBodyText;
DIGWAttachments* pDIGWAttachments;
DIGWAttachment* pDIGWAttachment;
IGWFolder* pIGWWorkFolder;
IGWMessages* pIGWMessages;
IGWMessage* pIGWMessage;
IGWRecipients* pIGWRecipients;
IGWRecipient* pIGWRecipient;
IGWFormattedText* pSubject;
IGWFormattedText* pBodyText;
IGWAttachments* pIGWAttachments;
VARIANT vClass, vType, vTargetType, vVersion;
TCHAR* szTo;
TCHAR* szSubject;
TCHAR* szMessage;
UINT len;
BSTR bstrClass = NULL;
BSTR bstrName = NULL;
len = GetWindowTextLength(GetDlgItem(hWndDlg, IDC_TO)) + 1;
szTo = new TCHAR[len];
GetDlgItemText(hWndDlg, IDC_TO, szTo, len);
len = GetWindowTextLength(GetDlgItem(hWndDlg, IDC_SUBJECT)) + 1;
szSubject = new TCHAR[len];
GetDlgItemText(hWndDlg, IDC_SUBJECT, szSubject, len);
len = GetWindowTextLength(GetDlgItem(hWndDlg, IDC_MESSAGE)) + 1;
szMessage = new TCHAR[len];
GetDlgItemText(hWndDlg, IDC_MESSAGE, szMessage, len);
pIGWAccount->get_WorkFolder(&pDIGWWorkFolder);
if(pDIGWWorkFolder && SUCCEEDED(pDIGWWorkFolder->QueryInterface(IID_IGWFolder, (LPVOID*)&pIGWWorkFolder))) {
pDIGWWorkFolder->Release();
pIGWWorkFolder->get_Messages(&pDIGWMessages);
if(pDIGWMessages && SUCCEEDED(pDIGWMessages->QueryInterface(IID_IGWMessages, (LPVOID*)&pIGWMessages))) {
pDIGWMessages->Release();
bstrClass = SysAllocString(OLESTR("GW.MESSAGE.MAIL"));
VariantInit(&vClass);
VariantInit(&vType);
VariantInit(&vVersion);
V_VT(&vClass) = VT_BSTR;
V_VT(&vType) = VT_I4;
V_VT(&vVersion) = VT_EMPTY;
V_BSTR(&vClass) = bstrClass;
V_I4(&vType) = egwDraft;
pIGWMessages->Add(vClass, vType, vVersion, &pDIGWMessage);
if(pDIGWMessage && SUCCEEDED(pDIGWMessage->QueryInterface(IID_IGWMessage, (LPVOID*)&pIGWMessage))) {
pDIGWMessage->Release();
pIGWMessage->put_FromText(bsFrom);
pIGWMessage->get_Subject(&pDSubject);
if(pDSubject && SUCCEEDED(pDSubject->QueryInterface(IID_IGWFormattedText, (LPVOID*)&pSubject)))
pDSubject->Release();
pSubject->put_PlainText(SysAllocString(TO_OLE_STRING(szSubject)));
pIGWMessage->get_BodyText(&pDBodyText);
if(pDBodyText && SUCCEEDED(pDBodyText->QueryInterface(IID_IGWFormattedText, (LPVOID*)&pBodyText))) {
pDBodyText->Release();
pBodyText->put_PlainText(SysAllocString(TO_OLE_STRING(szMessage)));
}
pIGWMessage->get_Attachments(&pDIGWAttachments);
if(pDIGWAttachments && SUCCEEDED(pDIGWAttachments->QueryInterface(IID_IGWAttachments, (void**)&pIGWAttachments))) {
pDIGWAttachments->Release();
VARIANT vFilename, vType, vDisplayName;
int nCount;
char textBuff[255];
VariantInit(&vFilename);
VariantInit(&vType);
VariantInit(&vDisplayName);
V_VT(&vFilename) = VT_BSTR;
V_VT(&vType) = VT_EMPTY;
V_VT(&vDisplayName) = VT_EMPTY;
nCount = ListView_GetItemCount( (HWND) hWndAttach);
for(int i=0; i<nCount; i++) {
ListView_GetItemText( (HWND) hWndAttach, i, 0, textBuff, 255);
V_BSTR(&vFilename) = SysAllocString(TO_OLE_STRING(textBuff));
pIGWAttachments->Add(vFilename, vType, vDisplayName, &pDIGWAttachment);
}
pIGWAttachments->Release();
}
pIGWMessage->get_Recipients(&pDIGWRecipients);
if(pDIGWRecipients && SUCCEEDED(pDIGWRecipients->QueryInterface(IID_IGWRecipients, (LPVOID*)&pIGWRecipients))) {
pDIGWRecipients->Release();
VariantInit(&vTargetType);
V_VT(&vTargetType) = VT_EMPTY;
bstrName = SysAllocString(TO_OLE_STRING(szTo));
pIGWRecipients->AddByDisplayName(bstrName, vTargetType, &pDIGWRecipient);
if(pDIGWRecipient && SUCCEEDED(pDIGWRecipient->QueryInterface(IID_IGWRecipient, (LPVOID*)&pIGWRecipient)))
pDIGWRecipient->Release();
pIGWRecipient->Resolve(vTargetType);
pIGWMessage->Send(&pDIGWRetMessage);
pIGWRecipient->Release();
if ( pDIGWRetMessage != NULL )
{
pDIGWRetMessage->Release();
}
}
pIGWRecipients->Release();
}
pIGWMessages->Release();
}
pIGWWorkFolder->Release();
}
delete[] szTo;
delete[] szSubject;
delete[] szMessage;
}
void InitDialog(HWND hWnd)
{
DIGWAddress* pDIGWAddress;
IGWAddress* pIGWAddress;
pIGWAccount->get_Owner(&pDIGWAddress);
if(pDIGWAddress && SUCCEEDED(pDIGWAddress->QueryInterface(IID_IGWAddress, (LPVOID*)&pIGWAddress))) {
pDIGWAddress->Release();
pIGWAddress->get_DisplayName(&bsFrom);
if(bsFrom)
SetDlgItemText(hWnd, IDC_FROM, FROM_OLE_STRING(bsFrom));
pIGWAddress->Release();
}
else {
ErrorMessage("QueryInterface on IID_IGWAddress Failed");
}
hWndAttach = GetDlgItem(hWnd, IDC_ATTACHLIST);
imageList = ImageList_Create(32, 32, ILC_COLOR, 2, 2);
ImageList_AddIcon(imageList, LoadIcon(ghInst, MAKEINTRESOURCE(IDI_MAIL)));
ImageList_AddIcon(imageList, LoadIcon(ghInst, MAKEINTRESOURCE(IDI_FILE)));
ListView_SetImageList( (HWND) hWndAttach, imageList, LVSIL_NORMAL);
}