gecko-dev/cmd/macfe/central/ExternalMail.cp

184 строки
5.2 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.
*/
/*
This file contains Navigator only code which supports "Send Page..." and
"mailto:" URLs using an external mail client registered with InternetConfig.
*/
#ifndef MOZ_MAIL_NEWS
#include "msgcom.h" // MSG_MailDocument()
#include "xlate.h" // PrintSetup
#include "shist.h" // SHIST_GetCurrent()
#include "xpgetstr.h" // XP_GetString()
#include "CURLDispatcher.h" // CURLDispatcher::DispatchURL()
#include "CNSContext.h" // ExtractNSContext()
#include "net.h" // NET_Escape()
extern int MK_MSG_MSG_COMPOSITION;
#define MAX_MAIL_SIZE 300000
extern "C" void FE_DoneMailTo(PrintSetup * print) ;
extern "C" void FE_DoneMailTo(PrintSetup * print)
{
const char * prefix = "mailto:?body=";
const char * blankLines = "\r\n\r\n";
XP_ASSERT(print);
if (!print)
return;
XP_ASSERT(print->url);
if (!print->url)
return;
fclose(print->out); // don't need this for writing anymore.
MWContext * context = (MWContext *) (print->carg);
if (!context) // we'll require this later
return;
char * buffer = (char *) malloc(MAX_MAIL_SIZE);
if (buffer) {
strcpy(buffer, print->url->address);
strcat(buffer, blankLines);
int buflen = strlen(buffer);
// now tack as much of the page onto the body as we have space for...
FILE * fp = fopen(print->filename, "r");
if (fp) {
int len = fread(buffer + buflen, 1, MAX_MAIL_SIZE - buflen - (5 /* slop? */), fp);
buffer[buflen + len] = '\0';
fclose(fp);
char *temp = NET_Escape (buffer, URL_XALPHAS);
XP_FREE(buffer);
buffer = temp;
} else {
XP_FREE(buffer);
buffer = NULL;
}
}
// get rid of the file and free the memory
remove(print->filename);
char *buffer2 = NULL;
if (buffer) {
buffer2 = (char *) malloc(strlen(prefix) + strlen(buffer) + 1);
if (buffer2) {
strcpy(buffer2, prefix); // start creating a "mailto:" URL
strcat(buffer2, buffer); // the message
}
}
if (buffer2 == NULL) { // no buffer, or we don't have enough memory to use it, try to just send the URL...
if (buffer)
XP_FREE(buffer); // if we're here, we can't use the buffer anyway...
buffer = NET_Escape (print->url->address, URL_XALPHAS);
if (buffer == NULL)
return; // not enough memory to do ANYTHING useful!
buffer2 = (char *) malloc(strlen(prefix) + strlen(buffer) + 1);
if (buffer2 == NULL) {
XP_FREE(buffer);
return; // not enough memory to do ANYTHING useful!
}
strcpy(buffer2, prefix); // start creating a "mailto:" URL
strcat(buffer2, buffer); // the message
}
XP_FREE(buffer);
// XP_FREE(print->filename);
// print->filename = NULL;
CURLDispatcher::DispatchURL(buffer2, ExtractNSContext(context));
XP_FREE(buffer2);
}
#ifndef MOZ_MAIL_COMPOSE
extern MSG_Pane* MSG_MailDocument(MWContext *context)
{
if(!context)
return NULL;
History_entry * hist_ent = SHIST_GetCurrent(&(context->hist));
// make sure there was a document loaded
if(!hist_ent)
return NULL;
//Set hist_ent to NULL if context->title is "Message Composition"
//This is a nasty way of determining if we're in here in response
//to "Mail Doc" or "New Mail Message".
//Also, if there's To: field info present(pBar->m_pszTo) then
//we know that it's a Mailto: and set hist_ent to NULL
//Without this differentiation the code always sends the contents
//of the previously mailed document even when someone chooses
//"New Mail Message" or "Mailto:"
if(!strcmp(XP_GetString(MK_MSG_MSG_COMPOSITION), context->title))
return NULL;
URL_Struct * URL_s = SHIST_CreateURLStructFromHistoryEntry(context, hist_ent);
if (!URL_s)
return NULL;
// Zero out the saved data
memset(&URL_s->savedData, 0, sizeof(URL_s->savedData));
PrintSetup print;
XL_InitializeTextSetup(&print);
print.width = 68;
print.prefix = "";
print.eol = "\r\n";
char * name = WH_TempName(xpTemporary, NULL);
if(!name) {
// Leak URL_s here
return(FALSE);
}
print.out = fopen(name, "w");
print.completion = (XL_CompletionRoutine) FE_DoneMailTo;
print.carg = context;
print.filename = name;
print.url = URL_s;
// leave pCompose window alive until completion routine
XL_TranslateText(context, URL_s, &print);
return NULL;
}
#endif // ! MOZ_MAIL_COMPOSE
#endif // !MOZ_MAIL_NEWS