gecko-dev/mailnews/mapi/hook/mapimail.cpp

835 lines
23 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
//
// More MAPI Hooks for Communicator
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include "windows.h"
#include "template.h"
#include "msgcom.h"
#include "wfemsg.h"
#include "compstd.h"
#include "compbar.h"
#include "compmisc.h"
#include "compfrm.h"
#include "prefapi.h"
#include "intl_csi.h"
#include "dlghtmrp.h"
#include "dlghtmmq.h"
// rhp - was breaking the optimized build!
//#include "edt.h"
//#include "edview.h"
//#include "postal.h"
//#include "apiaddr.h"
//#include "mailmisc.h"
extern "C" {
#include "xpgetstr.h"
extern int MK_MSG_MSG_COMPOSITION;
};
#include "mapimail.h"
#include "nscpmapi.h"
#include "mailpriv.h"
#include "nsstrseq.h"
MWContext
*GetUsableContext(void)
{
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
ASSERT(pFrame != NULL);
if (pFrame == NULL)
{
return(NULL);
}
// Now return the context...
return((MWContext *) pFrame->GetMainContext());
}
//
// This function will create a composition window and either do
// a blind send or pop up the compose window for the user to
// complete the operation
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
const char *pInitialText,
BOOL winShowFlag)
{
CGenericDoc *pDocument;
LPSTR subject;
NSstringSeq mailInfoSeq;
DWORD stringCount = 6;
DWORD i;
CString csDefault;
// Get a context to use for this call...
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
{
return(MAPI_E_FAILURE);
}
// Don't allow a compose window to be created if the user hasn't
// specified an email address
const char *real_addr = FE_UsersMailAddress();
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
{
return(MAPI_E_FAILURE);
}
//
// Now, we must build the fields object...
//
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
subject = NSStrSeqGet(mailInfoSeq, 0);
// We should give it a subject to preven the prompt from coming
// up...
if ((!subject) || !(*subject))
{
csDefault.LoadString(IDS_COMPOSE_DEFAULTNOSUBJECT);
subject = csDefault.GetBuffer(2);
}
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
char toString[1024] = "";
char ccString[1024] = "";
char bccString[1024] = "";
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
{
LPSTR ptr;
UCHAR tempString[256];
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
// figure which type of address this is?
if (addrType == MAPI_CC)
ptr = ccString;
else if (addrType == MAPI_BCC)
ptr = bccString;
else
ptr = toString;
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
{
emailPtr += 5;
}
// Now build the temp string to tack on in the format
// "Rich Pizzarro" <rhp@netscape.com>
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
// add a comma if not the first one
if (ptr[0] != '\0')
lstrcat(ptr, ",");
// tack on string!
lstrcat(ptr, (LPSTR) tempString);
}
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
MSG_CompositionFields *fields =
MSG_CreateCompositionFields(real_addr, real_addr,
toString,
ccString,
bccString,
"", "", "",
"", subject, "",
"", "", "",
"",
bEncrypt,
bSign);
if (!fields)
{
return(MAPI_E_FAILURE);
}
// RICHIE
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
// int16 win_csid = INTL_GetCSIWinCSID(csi);
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
if ( !pDocument )
{
return(MAPI_E_FAILURE);
}
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
if ( !pContext )
{
return(MAPI_E_FAILURE);
}
MSG_CompositionPaneCallbacks Callbacks;
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
int16 doccsid;
MWContext *context = pContext->GetContext();
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
// This needs to be set TRUE if using the old non-HTML text frame
// to prevent dropping dragged URLs
pContext->m_bDragging = !pCompose->UseHtml();
if (!pCompose->UseHtml())
{
pCompose->SetMsgPane(
MSG_CreateCompositionPane(pContext->GetContext(),
context,
g_MsgPrefs.m_pMsgPrefs,
fields,
WFE_MSGGetMaster())
);
}
ASSERT(pCompose->GetMsgPane());
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
pCompose->UpdateAttachmentInfo();
// Pass doccsid info to new context for MailToWin conversion
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
pCompose->DisplayHeaders(NULL);
CComposeBar * pBar = pCompose->GetComposeBar();
ASSERT(pBar);
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
if (!pIAddressList->IsCreated())
{
pBar->CreateAddressingBlock();
}
// rhp - Deal with addressing the brute force way! This is a
// "fix" for bad behavior when creating these windows and not
// showing them on the desktop.
if (!winShowFlag) // Hack to fix the window not being mapped
{
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
}
// Always do plain text composition!
pCompose->CompleteComposeInitialization();
// Do this so we don't get popups on "empty" messages
if ( (!pInitialText) || (!(*pInitialText)) )
pInitialText = " ";
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
if (pBody)
{
FE_InsertMessageCompositionText(context,pBody,TRUE);
}
//
// Now set the message as being edited!
//
pCompose->SetModified(TRUE);
//
// Finally deal with the attachments...
//
if (sendMailPtr->MSG_nFileCount > 0)
{
// Send this puppy when done with the attachments...
if (!winShowFlag)
{
pCompose->SetMAPISendMode(MAPI_SEND);
}
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
sizeof(MSG_AttachmentData));
if (!pAttach)
{
return(MAPI_E_INSUFFICIENT_MEMORY);
}
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
sizeof(MSG_AttachmentData));
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
CString cs;
// Create URL from filename...
WFE_ConvertFile2Url(cs,
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
pAttach[i].url = XP_STRDUP(cs);
// Now also include the "display" name...
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
}
// Set the list!
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
// Now free everything...
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
if (pAttach[i].url)
XP_FREE(pAttach[i].url);
if (pAttach[i].real_name)
XP_FREE(pAttach[i].real_name);
}
XP_FREE(pAttach);
}
//
// Now, if we were supposed to do the blind send...do it, otherwise,
// just popup the window...
//
if (winShowFlag)
{
// Post message to compose window to set the initial focus.
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
}
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
{
pCompose->PostMessage(WM_COMMAND, IDM_SEND);
}
return(SUCCESS_SUCCESS);
}
//
// This function will create a composition window and just attach
// the attachments of interest and pop up the window...
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr)
{
CGenericDoc *pDocument;
// Get a context to use for this call...
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
{
return(MAPI_E_FAILURE);
}
// Don't allow a compose window to be created if the user hasn't
// specified an email address
const char *real_addr = FE_UsersMailAddress();
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
{
return(MAPI_E_FAILURE);
}
//
// Now, build the fields object w/o much info...
//
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
MSG_CompositionFields *fields =
MSG_CreateCompositionFields(real_addr, real_addr, NULL,
"", "",
"", "", "",
"", "", "",
"", "", "",
"",
bEncrypt,
bSign);
if (!fields)
{
return(MAPI_E_FAILURE);
}
// RICHIE - INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
// int16 win_csid = INTL_GetCSIWinCSID(csi);
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*RICHIE win_csid,*/ TRUE);
if ( !pDocument )
{
// cleanup fields object
MSG_DestroyCompositionFields(fields);
return(MAPI_E_FAILURE);
}
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
if ( !pContext )
{
return(MAPI_E_FAILURE);
}
MSG_CompositionPaneCallbacks Callbacks;
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
MWContext *context = pContext->GetContext();
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
pCompose->SetComposeStuff(context,fields); // squirl away stuff for post-create
// This needs to be set TRUE if using the old non-HTML text frame
// to prevent dropping dragged URLs
pContext->m_bDragging = !pCompose->UseHtml();
if (!pCompose->UseHtml())
{
pCompose->SetMsgPane(MSG_CreateCompositionPane(
pContext->GetContext(),
context,
g_MsgPrefs.m_pMsgPrefs, fields,
WFE_MSGGetMaster()));
}
ASSERT(pCompose->GetMsgPane());
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
pCompose->UpdateAttachmentInfo();
// Pass doccsid info to new context for MailToWin conversion
/***
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(pOldContext));
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
(doccsid ? doccsid : INTL_DefaultDocCharSetID(pOldContext)));
****/
pCompose->DisplayHeaders(NULL);
CComposeBar * pBar = pCompose->GetComposeBar();
ASSERT(pBar);
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
if (!pIAddressList->IsCreated())
{
pBar->CreateAddressingBlock();
}
// Always do plain text composition!
pCompose->CompleteComposeInitialization();
//
// Finally deal with the attachments...
//
NSstringSeq mailInfoSeq = (NSstringSeq) &(sendDocPtr->dataBuf[0]);
DWORD stringCount = 0;
DWORD i;
TRACE("MAPI: ProcessMAPISendDocuments() # of Attachments = [%d]\n", sendDocPtr->nFileCount);
if (sendDocPtr->nFileCount > 0)
{
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
XP_CALLOC((sendDocPtr->nFileCount + 1),
sizeof(MSG_AttachmentData));
if (!pAttach)
{
return(MAPI_E_INSUFFICIENT_MEMORY);
}
memset(pAttach, 0, (sendDocPtr->nFileCount + 1) *
sizeof(MSG_AttachmentData));
for (i=0; i<sendDocPtr->nFileCount; i++)
{
CString cs;
// Create URL from filename...
WFE_ConvertFile2Url(cs,
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
pAttach[i].url = XP_STRDUP(cs);
// Now also include the "display" name...
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
}
// Set the list!
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
// Now free everything...
for (i=0; i<sendDocPtr->nFileCount; i++)
{
if (pAttach[i].url)
XP_FREE(pAttach[i].url);
if (pAttach[i].real_name)
XP_FREE(pAttach[i].real_name);
}
XP_FREE(pAttach);
}
//
// Now some checking for ... well I'm not sure...
//
if (MSG_GetAttachmentList(pCompose->GetMsgPane()))
pCompose->SetModified(TRUE);
else
pCompose->SetModified(FALSE);
// Post message to compose window to set the initial focus.
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
//
// Now, just popup the window...
//
pCompose->ShowWindow(TRUE);
// return pCompose->GetMsgPane(); rhp - used to return the MsgPane
return(SUCCESS_SUCCESS);
}
static void _GetMailCallback(HWND hwnd, MSG_Pane *pane, void *closure)
{
if (pane != NULL)
{
ShowWindow(hwnd, SW_HIDE);
MSG_Command( pane, MSG_GetNewMail, NULL, 0 );
}
}
static void _GetMailDoneCallback(HWND hwnd, MSG_Pane *pane, void *closure)
{
for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
f->PostMessage(WM_COMMAND, (WPARAM) ID_DONEGETTINGMAIL, (LPARAM) 0);
}
//
// This will fire off a "get mail in background operation" in an
// async. fashion.
//
extern "C" void
MAPIGetNewMessagesInBackground(void)
{
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
// rhp - we should not hit the net if we are offline!
if (NET_IsOffline())
return;
if (!pFrame)
return;
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
return;
TRACE("MAPI: DOWNLOAD MAIL IN BACKGROUND\n");
new CProgressDialog(
pFrame->GetFrameWnd(),
NULL,
_GetMailCallback, NULL, NULL,
_GetMailDoneCallback);
}
//
// This function will save a message into the Communicator "Drafts"
// folder with no UI showing.
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
const char *pInitialText)
{
CGenericDoc *pDocument;
LPSTR subject;
NSstringSeq mailInfoSeq;
DWORD stringCount = 6;
DWORD i;
BOOL winShowFlag = FALSE;
// Get a context to use for this call...
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
{
return(MAPI_E_FAILURE);
}
// Don't allow a compose window to be created if the user hasn't
// specified an email address
const char *real_addr = FE_UsersMailAddress();
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
{
return(MAPI_E_FAILURE);
}
//
// Now, we must build the fields object...
//
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
subject = NSStrSeqGet(mailInfoSeq, 0);
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
char toString[1024] = "";
char ccString[1024] = "";
char bccString[1024] = "";
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
{
LPSTR ptr;
UCHAR tempString[256];
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
// figure which type of address this is?
if (addrType == MAPI_CC)
ptr = ccString;
else if (addrType == MAPI_BCC)
ptr = bccString;
else
ptr = toString;
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
if ( (!emailPtr) && (!namePtr))
{
return(MAPI_E_INVALID_RECIPS);
}
if (!emailPtr)
emailPtr = namePtr;
char *tptr = strchr(emailPtr, ':');
if (tptr != NULL)
{
if ( (*tptr != '\0') && (*(tptr+1) != '\0') )
{
emailPtr = (tptr + 1);
}
}
/**
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
{
emailPtr += 5;
}
**/
// Now build the temp string to tack on in the format
// "Rich Pizzarro" <rhp@netscape.com>
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
// add a comma if not the first one
if (ptr[0] != '\0')
lstrcat(ptr, ",");
// tack on string!
lstrcat(ptr, (LPSTR) tempString);
}
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
MSG_CompositionFields *fields =
MSG_CreateCompositionFields(real_addr, real_addr,
toString,
ccString,
bccString,
"", "", "",
"", subject, "",
"", "", "",
"",
bEncrypt,
bSign);
if (!fields)
{
return(MAPI_E_FAILURE);
}
// RICHIE
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
// int16 win_csid = INTL_GetCSIWinCSID(csi);
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
if ( !pDocument )
{
return(MAPI_E_FAILURE);
}
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
if ( !pContext )
{
return(MAPI_E_FAILURE);
}
MSG_CompositionPaneCallbacks Callbacks;
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
int16 doccsid;
MWContext *context = pContext->GetContext();
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
// This needs to be set TRUE if using the old non-HTML text frame
// to prevent dropping dragged URLs
pContext->m_bDragging = !pCompose->UseHtml();
if (!pCompose->UseHtml())
{
pCompose->SetMsgPane(
MSG_CreateCompositionPane(pContext->GetContext(),
context,
g_MsgPrefs.m_pMsgPrefs,
fields,
WFE_MSGGetMaster())
);
}
ASSERT(pCompose->GetMsgPane());
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
pCompose->UpdateAttachmentInfo();
// Pass doccsid info to new context for MailToWin conversion
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
pCompose->DisplayHeaders(NULL);
CComposeBar * pBar = pCompose->GetComposeBar();
ASSERT(pBar);
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
if (!pIAddressList->IsCreated())
{
pBar->CreateAddressingBlock();
}
// rhp - Deal with addressing the brute force way! This is a
// "fix" for bad behavior when creating these windows and not
// showing them on the desktop.
if (!winShowFlag) // Hack to fix the window not being mapped
{
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
}
// Always do plain text composition!
pCompose->CompleteComposeInitialization();
// Do this so we don't get popups on "empty" messages
if ( (!pInitialText) || (!(*pInitialText)) )
pInitialText = " ";
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
if (pBody)
{
FE_InsertMessageCompositionText(context,pBody,TRUE);
}
//
// Now set the message as being edited!
//
pCompose->SetModified(TRUE);
//
// Finally deal with the attachments...
//
if (sendMailPtr->MSG_nFileCount > 0)
{
// Send this puppy when done with the attachments...
if (!winShowFlag)
{
pCompose->SetMAPISendMode(MAPI_SAVE);
}
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
sizeof(MSG_AttachmentData));
if (!pAttach)
{
return(MAPI_E_INSUFFICIENT_MEMORY);
}
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
sizeof(MSG_AttachmentData));
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
CString cs;
// Create URL from filename...
WFE_ConvertFile2Url(cs,
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
pAttach[i].url = XP_STRDUP(cs);
// Now also include the "display" name...
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
}
// Set the list!
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
// Now free everything...
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
if (pAttach[i].url)
XP_FREE(pAttach[i].url);
if (pAttach[i].real_name)
XP_FREE(pAttach[i].real_name);
}
XP_FREE(pAttach);
}
//
// Now, if we were supposed to do the blind send...do it, otherwise,
// just popup the window...
//
if (winShowFlag)
{
// Post message to compose window to set the initial focus.
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
}
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
{
pCompose->PostMessage(WM_COMMAND, IDM_SAVEASDRAFT);
}
return(SUCCESS_SUCCESS);
}