scott%scott-macgregor.org a9271269d5 Bug #379070 --> remove nsCRT useage from mailnews\compose. Remove several files which are not part of the build.
sr=bienvenu


git-svn-id: svn://10.0.0.236/trunk@227674 18797224-902f-48f8-a5cc-f745e15eee43
2007-06-07 22:22:29 +00:00

707 lines
18 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1999
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "msgCore.h"
#include "nsIURI.h"
#include "nsNetCID.h"
#include "nsSmtpUrl.h"
#include "nsString.h"
#include "nsReadableUtils.h"
#include "nsEscape.h"
#include "nsIMimeConverter.h"
#include "nsMsgMimeCID.h"
#include "nsISupportsObsolete.h"
/////////////////////////////////////////////////////////////////////////////////////
// mailto url definition
/////////////////////////////////////////////////////////////////////////////////////
nsMailtoUrl::nsMailtoUrl()
{
mFormat = nsIMsgCompFormat::Default;
m_baseURL = do_CreateInstance(NS_SIMPLEURI_CONTRACTID);
}
nsMailtoUrl::~nsMailtoUrl()
{
}
NS_IMPL_ISUPPORTS2(nsMailtoUrl, nsIMailtoUrl, nsIURI)
nsresult nsMailtoUrl::ParseMailtoUrl(char * searchPart)
{
char *rest = searchPart;
nsCAutoString inReplyToPart;
// okay, first, free up all of our old search part state.....
CleanupMailtoState();
if (rest && *rest == '?')
{
/* start past the '?' */
rest++;
}
if (rest)
{
char *token = NS_strtok("&", &rest);
while (token && *token)
{
char *value = 0;
char *eq = PL_strchr(token, '=');
if (eq)
{
value = eq+1;
*eq = 0;
}
switch (toupper(*token))
{
/* DO NOT support attachment= in mailto urls. This poses a security fire hole!!!
case 'A':
if (!PL_strcasecmp (token, "attachment"))
m_attachmentPart = value;
break;
*/
case 'B':
if (!PL_strcasecmp (token, "bcc"))
{
if (!m_bccPart.IsEmpty())
{
m_bccPart += ", ";
m_bccPart += value;
}
else
m_bccPart = value;
}
else if (!PL_strcasecmp (token, "body"))
{
if (!m_bodyPart.IsEmpty())
{
m_bodyPart +="\n";
m_bodyPart += value;
}
else
m_bodyPart = value;
}
break;
case 'C':
if (!PL_strcasecmp (token, "cc"))
{
if (!m_ccPart.IsEmpty())
{
m_ccPart += ", ";
m_ccPart += value;
}
else
m_ccPart = value;
}
break;
case 'F':
if (!PL_strcasecmp (token, "followup-to"))
m_followUpToPart = value;
else if (!PL_strcasecmp (token, "from"))
m_fromPart = value;
break;
case 'H':
if (!PL_strcasecmp(token, "html-part") || !PL_strcasecmp (token, "html-body"))
{
// m_htmlPart holds the body for both html-part and html-body.
m_htmlPart = value;
mFormat = nsIMsgCompFormat::HTML;
}
break;
case 'I':
if (!PL_strcasecmp (token, "in-reply-to"))
inReplyToPart = value;
break;
case 'N':
if (!PL_strcasecmp (token, "newsgroups"))
m_newsgroupPart = value;
else if (!PL_strcasecmp (token, "newshost"))
m_newsHostPart = value;
break;
case 'O':
if (!PL_strcasecmp (token, "organization"))
m_organizationPart = value;
break;
case 'R':
if (!PL_strcasecmp (token, "references"))
m_referencePart = value;
else if (!PL_strcasecmp (token, "reply-to"))
m_replyToPart = value;
break;
case 'S':
if(!PL_strcasecmp (token, "subject"))
m_subjectPart = value;
break;
case 'P':
if (!PL_strcasecmp (token, "priority"))
m_priorityPart = PL_strdup(value);
break;
case 'T':
if (!PL_strcasecmp (token, "to"))
{
if (!m_toPart.IsEmpty())
{
m_toPart += ", ";
m_toPart += value;
}
else
m_toPart = value;
}
break;
default:
break;
} // end of switch statement...
if (eq)
*eq = '='; /* put it back */
token = NS_strtok("&", &rest);
} // while we still have part of the url to parse...
} // if rest && *rest
// Ensure that References and In-Reply-To are consistent...
if (!inReplyToPart.IsEmpty())
{
if (m_referencePart.IsEmpty())
m_referencePart = inReplyToPart;
else
{
const char * lastRef = strrchr(m_referencePart.get(), '<');
nsCAutoString lastReference;
lastReference = lastRef ? lastRef : m_referencePart.get();
if (lastReference != inReplyToPart)
{
m_referencePart += " ";
m_referencePart += inReplyToPart;
}
}
}
nsCOMPtr<nsIMimeConverter> mimeConverter = do_GetService(NS_MIME_CONVERTER_CONTRACTID);
char *decodedString;
// Now unescape any fields that need escaped...
if (!m_toPart.IsEmpty())
{
nsUnescape(m_toPart.BeginWriting());
if (mimeConverter)
{
if (NS_SUCCEEDED(mimeConverter->DecodeMimeHeader(m_toPart.get(),
&decodedString,
"UTF-8", PR_FALSE))
&& decodedString)
m_toPart.Adopt(decodedString);
}
}
if (!m_ccPart.IsEmpty())
{
nsUnescape(m_ccPart.BeginWriting());
if (mimeConverter)
{
if (NS_SUCCEEDED(mimeConverter->DecodeMimeHeader(m_ccPart.get(),
&decodedString,
"UTF-8", PR_FALSE))
&& decodedString)
m_ccPart.Adopt(decodedString);
}
}
if (!m_bccPart.IsEmpty())
{
nsUnescape(m_bccPart.BeginWriting());
if (mimeConverter &&
NS_SUCCEEDED(mimeConverter->DecodeMimeHeader(m_bccPart.get(),
&decodedString,
"UTF-8", PR_FALSE))
&& decodedString)
m_bccPart.Adopt(decodedString);
}
if (!m_subjectPart.IsEmpty())
{
nsUnescape(m_subjectPart.BeginWriting());
if (mimeConverter)
{
if (NS_SUCCEEDED(mimeConverter->DecodeMimeHeader(m_subjectPart.get(),
&decodedString,
"UTF-8", PR_FALSE))
&& decodedString)
m_subjectPart.Adopt(decodedString);
}
}
if (!m_newsgroupPart.IsEmpty())
nsUnescape(m_newsgroupPart.BeginWriting());
if (!m_referencePart.IsEmpty())
nsUnescape(m_referencePart.BeginWriting());
if (!m_bodyPart.IsEmpty())
{
nsUnescape(m_bodyPart.BeginWriting());
if (mimeConverter)
{
if (NS_SUCCEEDED(mimeConverter->DecodeMimeHeader(m_bodyPart.get(),
&decodedString,
"UTF-8", PR_FALSE,
PR_FALSE))
&& decodedString)
m_bodyPart.Adopt(decodedString);
}
}
if (!m_newsHostPart.IsEmpty())
nsUnescape(m_newsHostPart.BeginWriting());
return NS_OK;
}
NS_IMETHODIMP nsMailtoUrl::SetSpec(const nsACString &aSpec)
{
m_baseURL->SetSpec(aSpec);
return ParseUrl();
}
nsresult nsMailtoUrl::CleanupMailtoState()
{
m_ccPart = "";
m_subjectPart = "";
m_newsgroupPart = "";
m_newsHostPart = "";
m_referencePart = "";
m_bodyPart = "";
m_bccPart = "";
m_followUpToPart = "";
m_fromPart = "";
m_htmlPart = "";
m_organizationPart = "";
m_replyToPart = "";
m_priorityPart = "";
return NS_OK;
}
nsresult nsMailtoUrl::ParseUrl()
{
nsresult rv = NS_OK;
// we can get the path from the simple url.....
nsCAutoString aPath;
m_baseURL->GetPath(aPath);
m_toPart.Assign(aPath);
PRInt32 startOfSearchPart = m_toPart.FindChar('?');
if (startOfSearchPart >= 0)
{
// now parse out the search field...
nsCAutoString searchPart;
PRUint32 numExtraChars = m_toPart.Right(searchPart,
m_toPart.Length() -
startOfSearchPart);
if (!searchPart.IsEmpty())
{
// now we need to strip off the search part from the
// to part....
m_toPart.Cut(startOfSearchPart, numExtraChars);
ParseMailtoUrl(searchPart.BeginWriting());
}
}
else if (!m_toPart.IsEmpty())
{
nsUnescape(m_toPart.BeginWriting());
}
return rv;
}
NS_IMETHODIMP nsMailtoUrl::GetMessageContents(char ** aToPart, char ** aCcPart, char ** aBccPart,
char ** aFromPart, char ** aFollowUpToPart, char ** aOrganizationPart,
char ** aReplyToPart, char ** aSubjectPart, char ** aBodyPart, char ** aHtmlPart,
char ** aReferencePart, char ** aAttachmentPart, char ** aPriorityPart,
char ** aNewsgroupPart, char ** aNewsHostPart, MSG_ComposeFormat * aFormat)
{
if (aToPart)
*aToPart = ToNewCString(m_toPart);
if (aCcPart)
*aCcPart = ToNewCString(m_ccPart);
if (aBccPart)
*aBccPart = ToNewCString(m_bccPart);
if (aFromPart)
*aFromPart = ToNewCString(m_fromPart);
if (aFollowUpToPart)
*aFollowUpToPart = ToNewCString(m_followUpToPart);
if (aOrganizationPart)
*aOrganizationPart = ToNewCString(m_organizationPart);
if (aReplyToPart)
*aReplyToPart = ToNewCString(m_replyToPart);
if (aSubjectPart)
*aSubjectPart = ToNewCString(m_subjectPart);
if (aBodyPart)
*aBodyPart = ToNewCString(m_bodyPart);
if (aHtmlPart)
*aHtmlPart = ToNewCString(m_htmlPart);
if (aReferencePart)
*aReferencePart = ToNewCString(m_referencePart);
if (aAttachmentPart)
*aAttachmentPart = nsnull; // never pass out an attachment part as part of a mailto url
if (aPriorityPart)
*aPriorityPart = ToNewCString(m_priorityPart);
if (aNewsgroupPart)
*aNewsgroupPart = ToNewCString(m_newsgroupPart);
if (aNewsHostPart)
*aNewsHostPart = ToNewCString(m_newsHostPart);
if (aFormat)
*aFormat = mFormat;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////////
// Begin nsIURI support
////////////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP nsMailtoUrl::GetSpec(nsACString &aSpec)
{
return m_baseURL->GetSpec(aSpec);
}
NS_IMETHODIMP nsMailtoUrl::GetPrePath(nsACString &aPrePath)
{
return m_baseURL->GetPrePath(aPrePath);
}
NS_IMETHODIMP nsMailtoUrl::GetScheme(nsACString &aScheme)
{
return m_baseURL->GetScheme(aScheme);
}
NS_IMETHODIMP nsMailtoUrl::SetScheme(const nsACString &aScheme)
{
m_baseURL->SetScheme(aScheme);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetUserPass(nsACString &aUserPass)
{
return m_baseURL->GetUserPass(aUserPass);
}
NS_IMETHODIMP nsMailtoUrl::SetUserPass(const nsACString &aUserPass)
{
m_baseURL->SetUserPass(aUserPass);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetUsername(nsACString &aUsername)
{
return m_baseURL->GetUsername(aUsername);
}
NS_IMETHODIMP nsMailtoUrl::SetUsername(const nsACString &aUsername)
{
m_baseURL->SetUsername(aUsername);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetPassword(nsACString &aPassword)
{
return m_baseURL->GetPassword(aPassword);
}
NS_IMETHODIMP nsMailtoUrl::SetPassword(const nsACString &aPassword)
{
m_baseURL->SetPassword(aPassword);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetHostPort(nsACString &aHostPort)
{
return m_baseURL->GetHost(aHostPort);
}
NS_IMETHODIMP nsMailtoUrl::SetHostPort(const nsACString &aHostPort)
{
m_baseURL->SetHost(aHostPort);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetHost(nsACString &aHost)
{
return m_baseURL->GetHost(aHost);
}
NS_IMETHODIMP nsMailtoUrl::SetHost(const nsACString &aHost)
{
m_baseURL->SetHost(aHost);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetPort(PRInt32 *aPort)
{
return m_baseURL->GetPort(aPort);
}
NS_IMETHODIMP nsMailtoUrl::SetPort(PRInt32 aPort)
{
m_baseURL->SetPort(aPort);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetPath(nsACString &aPath)
{
return m_baseURL->GetPath(aPath);
}
NS_IMETHODIMP nsMailtoUrl::SetPath(const nsACString &aPath)
{
m_baseURL->SetPath(aPath);
return ParseUrl();
}
NS_IMETHODIMP nsMailtoUrl::GetAsciiHost(nsACString &aHostA)
{
return m_baseURL->GetAsciiHost(aHostA);
}
NS_IMETHODIMP nsMailtoUrl::GetAsciiSpec(nsACString &aSpecA)
{
return m_baseURL->GetAsciiSpec(aSpecA);
}
NS_IMETHODIMP nsMailtoUrl::GetOriginCharset(nsACString &aOriginCharset)
{
return m_baseURL->GetOriginCharset(aOriginCharset);
}
NS_IMETHODIMP nsMailtoUrl::SchemeIs(const char *aScheme, PRBool *_retval)
{
return m_baseURL->SchemeIs(aScheme, _retval);
}
NS_IMETHODIMP nsMailtoUrl::Equals(nsIURI *other, PRBool *_retval)
{
return m_baseURL->Equals(other, _retval);
}
NS_IMETHODIMP nsMailtoUrl::Clone(nsIURI **_retval)
{
return m_baseURL->Clone(_retval);
}
NS_IMETHODIMP nsMailtoUrl::Resolve(const nsACString &relativePath, nsACString &result)
{
return m_baseURL->Resolve(relativePath, result);
}
/////////////////////////////////////////////////////////////////////////////////////
// smtp url definition
/////////////////////////////////////////////////////////////////////////////////////
nsSmtpUrl::nsSmtpUrl() : nsMsgMailNewsUrl()
{
// nsISmtpUrl specific state...
m_isPostMessage = PR_TRUE;
}
nsSmtpUrl::~nsSmtpUrl()
{
}
NS_IMPL_ISUPPORTS_INHERITED1(nsSmtpUrl, nsMsgMailNewsUrl, nsISmtpUrl)
////////////////////////////////////////////////////////////////////////////////////
// Begin nsISmtpUrl specific support
////////////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP nsSmtpUrl::SetSpec(const nsACString &aSpec)
{
nsresult rv = nsMsgMailNewsUrl::SetSpec(aSpec);
if (NS_SUCCEEDED(rv))
rv = ParseUrl();
return rv;
}
// mscott - i think this function can be obsoleted and its functionality
// moved into SetSpec or an init method....
nsresult nsSmtpUrl::ParseUrl()
{
nsresult rv = NS_OK;
// set the username
nsCAutoString userName;
rv = GetUsername(userName);
if (NS_FAILED(rv)) return rv;
m_userName = userName;
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::SetRecipients(const char * aRecipientsList)
{
NS_ENSURE_ARG(aRecipientsList);
m_toPart = aRecipientsList;
if (!m_toPart.IsEmpty())
nsUnescape(m_toPart.BeginWriting());
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::GetRecipients(char ** aRecipientsList)
{
NS_ENSURE_ARG_POINTER(aRecipientsList);
if (aRecipientsList)
*aRecipientsList = ToNewCString(m_toPart);
return NS_OK;
}
NS_IMPL_GETSET(nsSmtpUrl, PostMessage, PRBool, m_isPostMessage)
// the message can be stored in a file....allow accessors for getting and setting
// the file name to post...
NS_IMETHODIMP nsSmtpUrl::SetPostMessageFile(nsIFile * aFile)
{
nsresult rv = NS_OK;
if (aFile)
m_fileName = aFile;
else
rv = NS_ERROR_NULL_POINTER;
return rv;
}
NS_IMETHODIMP nsSmtpUrl::GetPostMessageFile(nsIFile ** aFile)
{
NS_ENSURE_ARG_POINTER(aFile);
NS_IF_ADDREF(*aFile = m_fileName);
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::GetSenderIdentity(nsIMsgIdentity * *aSenderIdentity)
{
NS_ENSURE_ARG_POINTER(aSenderIdentity);
*aSenderIdentity = m_senderIdentity;
NS_ADDREF(*aSenderIdentity);
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::SetSenderIdentity(nsIMsgIdentity * aSenderIdentity)
{
NS_ENSURE_ARG_POINTER(aSenderIdentity);
m_senderIdentity = aSenderIdentity;
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::SetPrompt(nsIPrompt *aNetPrompt)
{
NS_ENSURE_ARG_POINTER(aNetPrompt);
m_netPrompt = aNetPrompt;
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::GetPrompt(nsIPrompt **aNetPrompt)
{
NS_ENSURE_ARG_POINTER(aNetPrompt);
if (!m_netPrompt) return NS_ERROR_NULL_POINTER;
*aNetPrompt = m_netPrompt;
NS_ADDREF(*aNetPrompt);
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::SetAuthPrompt(nsIAuthPrompt *aNetAuthPrompt)
{
NS_ENSURE_ARG_POINTER(aNetAuthPrompt);
m_netAuthPrompt = aNetAuthPrompt;
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::GetAuthPrompt(nsIAuthPrompt **aNetAuthPrompt)
{
NS_ENSURE_ARG_POINTER(aNetAuthPrompt);
if (!m_netAuthPrompt) return NS_ERROR_NULL_POINTER;
*aNetAuthPrompt = m_netAuthPrompt;
NS_ADDREF(*aNetAuthPrompt);
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::SetNotificationCallbacks(nsIInterfaceRequestor* aCallbacks)
{
NS_ENSURE_ARG_POINTER(aCallbacks);
m_callbacks = aCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::GetNotificationCallbacks(nsIInterfaceRequestor** aCallbacks)
{
NS_ENSURE_ARG_POINTER(aCallbacks);
if (!m_callbacks) return NS_ERROR_NULL_POINTER;
*aCallbacks = m_callbacks;
NS_ADDREF(*aCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::SetSmtpServer(nsISmtpServer * aSmtpServer)
{
NS_ENSURE_ARG_POINTER(aSmtpServer);
m_smtpServer = aSmtpServer;
return NS_OK;
}
NS_IMETHODIMP
nsSmtpUrl::GetSmtpServer(nsISmtpServer ** aSmtpServer)
{
NS_ENSURE_ARG_POINTER(aSmtpServer);
if (!m_smtpServer) return NS_ERROR_NULL_POINTER;
*aSmtpServer = m_smtpServer;
NS_ADDREF(*aSmtpServer);
return NS_OK;
}