diff --git a/mailnews/base/prefs/resources/content/mailPrefsOverlay.xul b/mailnews/base/prefs/resources/content/mailPrefsOverlay.xul
index d1fcab61dd35..96ea66009411 100644
--- a/mailnews/base/prefs/resources/content/mailPrefsOverlay.xul
+++ b/mailnews/base/prefs/resources/content/mailPrefsOverlay.xul
@@ -72,7 +72,11 @@
-
+
+
+
+
+
diff --git a/mailnews/base/public/MANIFEST_IDL b/mailnews/base/public/MANIFEST_IDL
index cebd2e512da3..ce9bd23f3b80 100644
--- a/mailnews/base/public/MANIFEST_IDL
+++ b/mailnews/base/public/MANIFEST_IDL
@@ -39,3 +39,4 @@ nsIMsgPrintEngine.idl
nsIMsgProgress.idl
nsIMsgDBView.idl
nsIMessengerOSIntegration.idl
+nsIMsgMdnGenerator.idl
diff --git a/mailnews/base/public/Makefile.in b/mailnews/base/public/Makefile.in
index 354ca8d8463d..b899f05a6839 100644
--- a/mailnews/base/public/Makefile.in
+++ b/mailnews/base/public/Makefile.in
@@ -78,6 +78,7 @@ XPIDLSRCS = \
nsIMsgOfflineManager.idl \
nsIMsgProgress.idl \
nsIMessengerOSIntegration.idl \
+ nsIMsgMdnGenerator.idl \
$(NULL)
include $(topsrcdir)/config/rules.mk
diff --git a/mailnews/base/public/makefile.win b/mailnews/base/public/makefile.win
index 48fb0ef9a7b6..4fbad9668ff3 100644
--- a/mailnews/base/public/makefile.win
+++ b/mailnews/base/public/makefile.win
@@ -64,6 +64,7 @@ XPIDLSRCS = \
.\nsIMsgOfflineManager.idl \
.\nsIMsgProgress.idl \
.\nsIMessengerOSIntegration.idl \
+ .\nsIMsgMdnGenerator.idl \
$(NULL)
################################################################################
diff --git a/mailnews/base/public/nsIMsgAccountManager.idl b/mailnews/base/public/nsIMsgAccountManager.idl
index 9c7a48ae83c6..793c591b93bb 100644
--- a/mailnews/base/public/nsIMsgAccountManager.idl
+++ b/mailnews/base/public/nsIMsgAccountManager.idl
@@ -140,6 +140,11 @@ interface nsIMsgAccountManager : nsISupports {
*/
nsISupportsArray GetIdentitiesForServer(in nsIMsgIncomingServer server);
+ /**
+ * given a server, return the first identity in accounts that have this server
+ */
+ nsIMsgIdentity getFirstIdentityForServer(in nsIMsgIncomingServer server);
+
/* given an identity, return all servers in accounts that have
* this identity
* returns an array of nsIMsgIncomingServer
diff --git a/mailnews/base/public/nsIMsgIncomingServer.idl b/mailnews/base/public/nsIMsgIncomingServer.idl
index b96eae538639..bc809b7a853c 100644
--- a/mailnews/base/public/nsIMsgIncomingServer.idl
+++ b/mailnews/base/public/nsIMsgIncomingServer.idl
@@ -237,7 +237,7 @@ interface nsIMsgIncomingServer : nsISupports {
readonly attribute boolean downloadMessagesAtStartup;
/* check to this if the server supports filters */
- attribute boolean canHaveFilters;
+ readonly attribute boolean canHaveFilters;
/**
* can this server be removed from the account manager? for
@@ -344,6 +344,18 @@ interface nsIMsgIncomingServer : nsISupports {
* manager, set the password member variable.
*/
readonly attribute boolean isAuthenticated;
+
+ /**
+ * If we have set up to filter return receipts into
+ * our Sent folder, this utility method creates
+ * a filter to do that, and adds it to our filterList
+ * if it doesn't exist. If it does, it will enable it.
+ *
+ * If the user changes their prefs, to leave the
+ * return receipt in the inbox, this will disable
+ * the existing return receipts filter, if it exists.
+ */
+ void configureTemporaryReturnReceiptsFilter(in nsIMsgFilterList filterList);
};
%{C++
diff --git a/mailnews/base/public/nsIMsgMailNewsUrl.idl b/mailnews/base/public/nsIMsgMailNewsUrl.idl
index 66ff8768bb26..7da23d8b7b60 100644
--- a/mailnews/base/public/nsIMsgMailNewsUrl.idl
+++ b/mailnews/base/public/nsIMsgMailNewsUrl.idl
@@ -47,6 +47,7 @@ interface nsILoadGroup;
interface nsIMsgSearchSession;
interface nsICacheEntryDescriptor;
interface nsICacheSession;
+interface nsIMimeHeaders;
[scriptable, uuid(6CFFCEB0-CB8C-11d2-8065-006008128C4E)]
interface nsIMsgMailNewsUrl : nsIURL {
///////////////////////////////////////////////////////////////////////////////
@@ -74,6 +75,9 @@ interface nsIMsgMailNewsUrl : nsIURL {
attribute nsIMsgWindow msgWindow;
+ // current mime headers if reading message
+ attribute nsIMimeHeaders mimeHeaders;
+
// the load group is computed from the msgWindow
readonly attribute nsILoadGroup loadGroup;
diff --git a/mailnews/base/search/public/nsIMsgFilter.idl b/mailnews/base/search/public/nsIMsgFilter.idl
index 74acc020613c..14b4b2fd8b55 100644
--- a/mailnews/base/search/public/nsIMsgFilter.idl
+++ b/mailnews/base/search/public/nsIMsgFilter.idl
@@ -47,6 +47,13 @@ interface nsOutputStream;
[scriptable, uuid(605db0f8-04a1-11d3-a50a-0060b0fc04b7)]
interface nsIMsgFilter : nsISupports {
readonly attribute nsMsgFilterTypeType filterType;
+ /**
+ * some filters are "temporary". For example, the filters we create when the user
+ * filters return receipts to the Sent folder.
+ * we don't show temporary filters in the UI
+ * and we don't write them to disk.
+ */
+ attribute boolean temporary;
attribute boolean enabled;
attribute wstring filterName;
attribute string filterDesc;
diff --git a/mailnews/base/search/public/nsMsgSearchTerm.h b/mailnews/base/search/public/nsMsgSearchTerm.h
index d61d9c459533..bee2821c6719 100644
--- a/mailnews/base/search/public/nsMsgSearchTerm.h
+++ b/mailnews/base/search/public/nsMsgSearchTerm.h
@@ -41,9 +41,6 @@
//---------------------------------------------------------------------------
// nsMsgSearchTerm specifies one criterion, e.g. name contains phil
//---------------------------------------------------------------------------
-
-// perhaps this should go in its own header file, if this class gets
-// its own cpp file, nsMsgSearchTerm.cpp
#include "nsIMsgSearchSession.h"
#include "nsIMsgSearchScopeTerm.h"
#include "nsIMsgSearchTerm.h"
@@ -54,9 +51,6 @@ class nsMsgSearchTerm : public nsIMsgSearchTerm
{
public:
nsMsgSearchTerm();
-#if 0
- nsMsgSearchTerm (nsMsgSearchAttribute, nsMsgSearchOperator, nsIMsgSearchValue *, PRBool, char * arbitraryHeader); // the bool is true if AND, PR_FALSE if OR
-#endif
nsMsgSearchTerm (nsMsgSearchAttribValue, nsMsgSearchOpValue, nsIMsgSearchValue *, nsMsgSearchBooleanOperator, const char * arbitraryHeader);
virtual ~nsMsgSearchTerm ();
diff --git a/mailnews/base/search/src/nsMsgFilter.cpp b/mailnews/base/search/src/nsMsgFilter.cpp
index e031de31e5c8..9b2f61d84aa1 100644
--- a/mailnews/base/search/src/nsMsgFilter.cpp
+++ b/mailnews/base/search/src/nsMsgFilter.cpp
@@ -66,13 +66,13 @@ nsMsgRuleAction::~nsMsgRuleAction()
{
}
-
-nsMsgFilter::nsMsgFilter() :
+nsMsgFilter::nsMsgFilter():
m_type(1),
+ m_temporary(PR_FALSE),
m_filterList(nsnull)
{
NS_INIT_REFCNT();
- NS_NewISupportsArray(getter_AddRefs(m_termList));
+ NS_NewISupportsArray(getter_AddRefs(m_termList));
}
nsMsgFilter::~nsMsgFilter()
@@ -83,53 +83,60 @@ NS_IMPL_ISUPPORTS1(nsMsgFilter, nsIMsgFilter)
NS_IMETHODIMP nsMsgFilter::GetFilterType(nsMsgFilterTypeType *aResult)
{
- if (aResult == NULL)
- return NS_ERROR_NULL_POINTER;
-
+ NS_ENSURE_ARG_POINTER(aResult);
*aResult = m_type;
return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::GetEnabled(PRBool *aResult)
{
- if (aResult == NULL)
- return NS_ERROR_NULL_POINTER;
-
+ NS_ENSURE_ARG_POINTER(aResult);
*aResult = m_enabled;
return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::SetEnabled(PRBool enabled)
{
- m_enabled=enabled;
- return NS_OK;
+ m_enabled = enabled;
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsMsgFilter::GetTemporary(PRBool *aTemporary)
+{
+ NS_ENSURE_ARG_POINTER(aTemporary);
+ *aTemporary = m_temporary;
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsMsgFilter::SetTemporary(PRBool aTemporary)
+{
+ m_temporary = aTemporary;
+ return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::GetFilterName(PRUnichar **name)
{
- NS_ENSURE_ARG_POINTER(name);
-
- *name = ToNewUnicode(m_filterName);
+ NS_ENSURE_ARG_POINTER(name);
+ *name = ToNewUnicode(m_filterName);
return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::SetFilterName(const PRUnichar *name)
{
- m_filterName.Assign(name);
+ m_filterName.Assign(name);
return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::GetFilterDesc(char **description)
{
- NS_ENSURE_ARG_POINTER(description);
-
- *description = ToNewCString(m_description);
+ NS_ENSURE_ARG_POINTER(description);
+ *description = ToNewCString(m_description);
return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::SetFilterDesc(const char *description)
{
- m_description.Assign(description);
+ m_description.Assign(description);
return NS_OK;
}
@@ -157,7 +164,7 @@ nsMsgFilter::CreateTerm(nsIMsgSearchTerm **aResult)
{
nsMsgSearchTerm *term = new nsMsgSearchTerm;
NS_ENSURE_TRUE(term, NS_ERROR_OUT_OF_MEMORY);
-
+
*aResult = NS_STATIC_CAST(nsIMsgSearchTerm*,term);
NS_ADDREF(*aResult);
return NS_OK;
@@ -184,19 +191,18 @@ NS_IMETHODIMP nsMsgFilter::GetTerm(PRInt32 termIndex,
term->GetValue(value);
if(booleanAnd)
term->GetBooleanAnd(booleanAnd);
- if (attrib && arbitraryHeader)
+ if (attrib && arbitraryHeader) {
if (*attrib > nsMsgSearchAttrib::OtherHeader && *attrib < nsMsgSearchAttrib::kNumMsgSearchAttributes)
term->GetArbitraryHeader(arbitraryHeader);
- }
- return NS_OK;
+ }
+ }
+ return NS_OK;
}
NS_IMETHODIMP nsMsgFilter::GetSearchTerms(nsISupportsArray **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
-
- *aResult = m_termList;
- NS_IF_ADDREF(*aResult);
+ NS_IF_ADDREF(*aResult = m_termList);
return NS_OK;
}
@@ -209,9 +215,7 @@ NS_IMETHODIMP nsMsgFilter::SetScope(nsIMsgSearchScopeTerm *aResult)
NS_IMETHODIMP nsMsgFilter::GetScope(nsIMsgSearchScopeTerm **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
-
- *aResult = m_scope;
- NS_IF_ADDREF(*aResult);
+ NS_IF_ADDREF(*aResult = m_scope);
return NS_OK;
}
@@ -392,8 +396,7 @@ nsresult
nsMsgFilter::GetFilterList(nsIMsgFilterList **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
- *aResult = m_filterList;
- NS_IF_ADDREF(*aResult);
+ NS_IF_ADDREF(*aResult = m_filterList);
return NS_OK;
}
diff --git a/mailnews/base/search/src/nsMsgFilter.h b/mailnews/base/search/src/nsMsgFilter.h
index 51a9aa12a4cd..459c7468c80c 100644
--- a/mailnews/base/search/src/nsMsgFilter.h
+++ b/mailnews/base/search/src/nsMsgFilter.h
@@ -86,7 +86,6 @@ public:
nsresult SaveRule(nsIOFileStream *aStream);
PRInt16 GetVersion();
- void SetDontFileMe(PRBool bDontFileMe) {m_dontFileMe = bDontFileMe;}
#ifdef DEBUG
void Dump();
#endif
@@ -98,13 +97,14 @@ static nsMsgRuleActionType GetActionForFilingStr(nsCString &actionStr);
nsMsgRuleAction m_action;
protected:
nsMsgFilterTypeType m_type;
- PRBool m_enabled;
nsString m_filterName;
nsCString m_scriptFileName; // iff this filter is a script.
nsCString m_description;
- PRBool m_dontFileMe;
- nsIMsgFilterList *m_filterList; /* owning filter list */
+ PRPackedBool m_enabled;
+ PRPackedBool m_temporary;
+
+ nsIMsgFilterList *m_filterList; /* owning filter list */
nsCOMPtr m_termList; /* linked list of criteria terms */
nsCOMPtr m_scope; /* default for mail rules is inbox, but news rules could
have a newsgroup - LDAP would be invalid */
diff --git a/mailnews/base/search/src/nsMsgFilterDataSource.cpp b/mailnews/base/search/src/nsMsgFilterDataSource.cpp
index b32e12bcf484..96f34af87f2d 100644
--- a/mailnews/base/search/src/nsMsgFilterDataSource.cpp
+++ b/mailnews/base/search/src/nsMsgFilterDataSource.cpp
@@ -321,6 +321,12 @@ nsMsgFilterDataSource::getFilterListTargets(nsIMsgFilterList *aFilterList,
rv = aFilterList->GetFilterAt(i, getter_AddRefs(filter));
if (NS_FAILED(rv)) continue;
+ PRBool isTemporary;
+ rv = filter->GetTemporary(&isTemporary);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "GetTemporary() failed");
+ if (isTemporary)
+ continue;
+
nsXPIDLString filterName;
rv = filter->GetFilterName(getter_Copies(filterName));
if (NS_FAILED(rv)) return rv;
diff --git a/mailnews/base/search/src/nsMsgFilterList.cpp b/mailnews/base/search/src/nsMsgFilterList.cpp
index 424f90d1a38b..1e3164bdc4bc 100644
--- a/mailnews/base/search/src/nsMsgFilterList.cpp
+++ b/mailnews/base/search/src/nsMsgFilterList.cpp
@@ -726,8 +726,15 @@ nsresult nsMsgFilterList::SaveTextFilters(nsIOFileStream *aStream)
if (GetMsgFilterAt(i, &filter) == NS_OK && filter != nsnull)
{
filter->SetFilterList(this);
- if ((err = filter->SaveToTextFile(aStream)) != NS_OK)
- break;
+
+ // if the filter is temporary, don't write it to disk
+ PRBool isTemporary;
+ err = filter->GetTemporary(&isTemporary);
+ if (NS_SUCCEEDED(err) && !isTemporary) {
+ if ((err = filter->SaveToTextFile(aStream)) != NS_OK)
+ break;
+ }
+
NS_RELEASE(filter);
}
else
diff --git a/mailnews/base/search/src/nsMsgLocalSearch.cpp b/mailnews/base/search/src/nsMsgLocalSearch.cpp
index 1dc9b431a1bc..4a974e74b8f3 100644
--- a/mailnews/base/search/src/nsMsgLocalSearch.cpp
+++ b/mailnews/base/search/src/nsMsgLocalSearch.cpp
@@ -649,7 +649,16 @@ nsresult nsMsgSearchOfflineMail::MatchTerms(nsIMsgDBHdr *msgToMatch,
}
break;
default:
- if ( attrib > nsMsgSearchAttrib::OtherHeader && attrib < nsMsgSearchAttrib::kNumMsgSearchAttributes)
+ // XXX todo
+ // for the temporary return receipts filters, we use a custom header for Content-Type
+ // but unlike the other custom headers, this one doesn't show up in the search / filter
+ // UI. we set the attrib to be nsMsgSearchAttrib::OtherHeader, where as for user
+ // defined custom headers start at nsMsgSearchAttrib::OtherHeader + 1
+ // Not sure if there is a better way to do this yet. Maybe reserve the last
+ // custom header for ::Content-Type? But if we do, make sure that change
+ // doesn't cause nsMsgFilter::GetTerm() to change, and start making us
+ // ask IMAP servers for the Content-Type header on all messages.
+ if ( attrib >= nsMsgSearchAttrib::OtherHeader && attrib < nsMsgSearchAttrib::kNumMsgSearchAttributes)
{
PRUint32 lineCount;
msgToMatch->GetLineCount(&lineCount);
diff --git a/mailnews/base/search/src/nsMsgSearchAdapter.cpp b/mailnews/base/search/src/nsMsgSearchAdapter.cpp
index 73dc8d2e9e75..f8b989fbd19c 100644
--- a/mailnews/base/search/src/nsMsgSearchAdapter.cpp
+++ b/mailnews/base/search/src/nsMsgSearchAdapter.cpp
@@ -1110,7 +1110,7 @@ nsMsgSearchValidityManager::NewTable(nsIMsgSearchValidityTable **aTable)
nsresult
nsMsgSearchValidityManager::InitOtherHeadersInTable (nsIMsgSearchValidityTable *aTable, const char *customHeaders)
{
- PRUint32 customHeadersLength = PL_strlen(customHeaders);
+ PRUint32 customHeadersLength = strlen(customHeaders);
PRUint32 numHeaders=0;
PRUint32 i=0;
if (customHeadersLength)
diff --git a/mailnews/base/search/src/nsMsgSearchTerm.cpp b/mailnews/base/search/src/nsMsgSearchTerm.cpp
index 63a20dbd06c2..db41c44dc500 100644
--- a/mailnews/base/search/src/nsMsgSearchTerm.cpp
+++ b/mailnews/base/search/src/nsMsgSearchTerm.cpp
@@ -291,25 +291,6 @@ nsMsgSearchTerm::nsMsgSearchTerm()
m_value.u.priority=0;
}
-#if 0
-nsMsgSearchTerm::nsMsgSearchTerm (
- nsMsgSearchAttribute attrib,
- nsMsgSearchOperator op,
- nsMsgSearchValue *val,
- PRBool booleanAND,
- char * arbitraryHeader)
-{
- NS_INIT_REFCNT();
- m_operator = op;
- m_booleanOp = (booleanAND) ? nsMsgSearchBooleanOp::BooleanAND : nsMsgSearchBooleanOp::BooleanOR;
- if (attrib > nsMsgSearchAttrib::OtherHeader && attrib < nsMsgSearchAttrib::kNumMsgSearchAttributes && arbitraryHeader)
- m_arbitraryHeader = arbitraryHeader;
- m_attribute = attrib;
-
- nsMsgResultElement::AssignValues (val, &m_value);
-}
-#endif
-
nsMsgSearchTerm::nsMsgSearchTerm (
nsMsgSearchAttribValue attrib,
nsMsgSearchOpValue op,
@@ -1321,8 +1302,7 @@ NS_IMPL_ISUPPORTS1(nsMsgSearchScopeTerm, nsIMsgSearchScopeTerm)
NS_IMETHODIMP
nsMsgSearchScopeTerm::GetFolder(nsIMsgFolder **aResult)
{
- *aResult = m_folder;
- NS_IF_ADDREF(*aResult);
+ NS_IF_ADDREF(*aResult = m_folder);
return NS_OK;
}
@@ -1331,8 +1311,7 @@ nsMsgSearchScopeTerm::GetSearchSession(nsIMsgSearchSession** aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
nsCOMPtr searchSession = do_QueryReferent (m_searchSession);
- *aResult = searchSession;
- NS_IF_ADDREF(*aResult);
+ NS_IF_ADDREF(*aResult = searchSession);
return NS_OK;
}
diff --git a/mailnews/base/src/nsMsgAccountManager.cpp b/mailnews/base/src/nsMsgAccountManager.cpp
index 96dd8dd7de50..a1fb3d336b02 100644
--- a/mailnews/base/src/nsMsgAccountManager.cpp
+++ b/mailnews/base/src/nsMsgAccountManager.cpp
@@ -1876,6 +1876,24 @@ nsMsgAccountManager::findServer(nsISupports *aElement, void *data)
return PR_TRUE;
}
+NS_IMETHODIMP
+nsMsgAccountManager::GetFirstIdentityForServer(nsIMsgIncomingServer *aServer, nsIMsgIdentity **aIdentity)
+{
+ NS_ENSURE_ARG_POINTER(aServer);
+ NS_ENSURE_ARG_POINTER(aIdentity);
+
+ nsCOMPtr identities;
+ nsresult rv = GetIdentitiesForServer(aServer, getter_AddRefs(identities));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr identity;
+ rv = identities->QueryElementAt(0, NS_GET_IID(nsIMsgIdentity),
+ (void **)getter_AddRefs(identity));
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_IF_ADDREF(*aIdentity = identity);
+ return rv;
+}
+
NS_IMETHODIMP
nsMsgAccountManager::GetIdentitiesForServer(nsIMsgIncomingServer *server,
nsISupportsArray **_retval)
diff --git a/mailnews/base/util/nsMsgFolder.cpp b/mailnews/base/util/nsMsgFolder.cpp
index 6a87b07a385e..6243cf3de213 100644
--- a/mailnews/base/util/nsMsgFolder.cpp
+++ b/mailnews/base/util/nsMsgFolder.cpp
@@ -57,7 +57,6 @@
#include "nsMsgDatabase.h"
#include "nsIDBFolderInfo.h"
#include "nsIMsgAccountManager.h"
-#include "nsIMsgIdentity.h"
#include "nsMsgBaseCID.h"
#include "nsMsgUtils.h" // for NS_MsgHashIfNecessary()
#include "nsMsgI18N.h"
@@ -78,6 +77,7 @@
#include "nsILocale.h"
#include "nsILocaleService.h"
#include "nsCollationCID.h"
+#include "nsIMsgMdnGenerator.h"
#define PREF_MAIL_WARN_FILTER_CHANGED "mail.warn_filter_changed"
@@ -259,6 +259,7 @@ nsMsgFolder::createCollationKeyGenerator()
return NS_OK;
}
+
NS_IMETHODIMP
nsMsgFolder::Init(const char* aURI)
{
@@ -1527,30 +1528,19 @@ NS_IMETHODIMP nsMsgFolder::SetPrefFlag()
// folders later on on the imap server, the subsequent GetResouce() of the
// same uri will get us the cached rdf resouce which should have the folder
// flag set appropriately.
- nsresult rv = NS_OK;
- nsCOMPtr accountManager =
- do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
+ nsresult rv;
+ nsCOMPtr rdf(do_GetService(kRDFServiceCID, &rv));
if (NS_FAILED(rv)) return rv;
- nsCOMPtr rdf(do_GetService(kRDFServiceCID, &rv));
-
- if(NS_FAILED(rv)) return rv;
+ nsCOMPtr accountMgr = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr server;
rv = GetServer(getter_AddRefs(server));
-
- if (NS_FAILED(rv)) return rv;
-
- nsCOMPtr identities;
- rv = accountManager->GetIdentitiesForServer(server,
- getter_AddRefs(identities));
- if (NS_FAILED(rv)) return rv;
+ NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr identity;
-
- rv = identities->QueryElementAt(0, NS_GET_IID(nsIMsgIdentity),
- (void **)getter_AddRefs(identity));
-
+ rv = accountMgr->GetFirstIdentityForServer(server, getter_AddRefs(identity));
if (NS_SUCCEEDED(rv) && identity)
{
nsXPIDLCString folderUri;
diff --git a/mailnews/base/util/nsMsgIncomingServer.cpp b/mailnews/base/util/nsMsgIncomingServer.cpp
index b597f1249065..2c01d1dd18ec 100644
--- a/mailnews/base/util/nsMsgIncomingServer.cpp
+++ b/mailnews/base/util/nsMsgIncomingServer.cpp
@@ -75,10 +75,8 @@
#include "nsIMsgAccountManager.h"
#include "nsCPasswordManager.h"
-
-#ifdef DEBUG_sspitzer
-#define DEBUG_MSGINCOMING_SERVER
-#endif /* DEBUG_sspitzer */
+#include "nsIMsgMdnGenerator.h"
+#include "nsMsgFolderFlags.h"
static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
@@ -239,14 +237,6 @@ nsMsgIncomingServer::GetCanHaveFilters(PRBool *canHaveFilters)
return NS_OK;
}
-NS_IMETHODIMP
-nsMsgIncomingServer::SetCanHaveFilters(PRBool canHaveFilters)
-{
- // derived class should override if they need to do this.
- m_canHaveFilters = canHaveFilters;
- return NS_OK;
-}
-
NS_IMETHODIMP
nsMsgIncomingServer::GetCanBeDefaultServer(PRBool *canBeDefaultServer)
{
@@ -1077,8 +1067,7 @@ nsMsgIncomingServer::GetFilterList(nsIMsgWindow *aMsgWindow, nsIMsgFilterList **
NS_ENSURE_SUCCESS(rv, rv);
}
- *aResult = mFilterList;
- NS_IF_ADDREF(*aResult);
+ NS_IF_ADDREF(*aResult = mFilterList);
return NS_OK;
}
@@ -1660,3 +1649,121 @@ nsMsgIncomingServer::GetIsAuthenticated(PRBool *isAuthenticated)
*isAuthenticated = !m_password.IsEmpty();
return rv;
}
+
+NS_IMETHODIMP
+nsMsgIncomingServer::ConfigureTemporaryReturnReceiptsFilter(nsIMsgFilterList *filterList)
+{
+ NS_ENSURE_ARG_POINTER(filterList);
+ nsresult rv;
+
+ nsCOMPtr accountMgr = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr identity;
+ rv = accountMgr->GetFirstIdentityForServer(this, getter_AddRefs(identity));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ PRBool useCustomPrefs = PR_FALSE;
+ PRInt32 incorp = nsIMsgMdnGenerator::eIncorporateInbox;
+
+ identity->GetBoolAttribute("use_custom_prefs", &useCustomPrefs);
+ if (useCustomPrefs)
+ rv = GetIntValue("incorporate_return_receipt", &incorp);
+ else
+ {
+ nsCOMPtr prefs = do_GetService(NS_PREF_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr prefBranch;
+ rv = prefs->GetBranch(nsnull, getter_AddRefs(prefBranch));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = prefBranch->GetIntPref("mail.incorporate.return_receipt", &incorp);
+ }
+
+ PRBool enable = (incorp == nsIMsgMdnGenerator::eIncorporateSent);
+
+ // this is a temporary, internal mozilla filter
+ // it will not show up in the UI, it will not be written to disk
+ NS_NAMED_LITERAL_STRING(internalReturnReceiptFilterName, "mozilla-temporary-internal-MDN-receipt-filter");
+
+ nsCOMPtr newFilter;
+ rv = filterList->GetFilterNamed(internalReturnReceiptFilterName.get(),
+ getter_AddRefs(newFilter));
+ if (newFilter)
+ newFilter->SetEnabled(enable);
+ else if (enable)
+ {
+ nsCOMPtr rootFolder;
+ rv = GetRootMsgFolder(getter_AddRefs(rootFolder));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ PRUint32 numFolders;
+ nsCOMPtr sentFolder;
+
+ rootFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_SENTMAIL, 1,
+ &numFolders,
+ getter_AddRefs(sentFolder));
+ if (sentFolder)
+ {
+ filterList->CreateFilter(internalReturnReceiptFilterName.get(),
+ getter_AddRefs(newFilter));
+ if (newFilter)
+ {
+ newFilter->SetEnabled(PR_TRUE);
+ // this internal filter is temporary
+ // and should not show up in the UI or be written to disk
+ newFilter->SetTemporary(PR_TRUE);
+
+ nsCOMPtr term;
+ nsCOMPtr value;
+
+ rv = newFilter->CreateTerm(getter_AddRefs(term));
+ if (NS_SUCCEEDED(rv))
+ {
+ rv = term->GetValue(getter_AddRefs(value));
+ if (NS_SUCCEEDED(rv))
+ {
+ // XXX todo
+ // determine if ::OtherHeader is the best way to do this.
+ // see nsMsgSearchOfflineMail::MatchTerms()
+ value->SetAttrib(nsMsgSearchAttrib::OtherHeader);
+ value->SetStr(NS_LITERAL_STRING("multipart/report").get());
+ term->SetAttrib(nsMsgSearchAttrib::OtherHeader);
+ term->SetOp(nsMsgSearchOp::Contains);
+ term->SetBooleanAnd(PR_TRUE);
+ term->SetArbitraryHeader("Content-Type");
+ term->SetValue(value);
+ newFilter->AppendTerm(term);
+ }
+ }
+ rv = newFilter->CreateTerm(getter_AddRefs(term));
+ if (NS_SUCCEEDED(rv))
+ {
+ rv = term->GetValue(getter_AddRefs(value));
+ if (NS_SUCCEEDED(rv))
+ {
+ // XXX todo
+ // determine if ::OtherHeader is the best way to do this.
+ // see nsMsgSearchOfflineMail::MatchTerms()
+ value->SetAttrib(nsMsgSearchAttrib::OtherHeader);
+ value->SetStr(NS_LITERAL_STRING("disposition-notification").get());
+ term->SetAttrib(nsMsgSearchAttrib::OtherHeader);
+ term->SetOp(nsMsgSearchOp::Contains);
+ term->SetBooleanAnd(PR_TRUE);
+ term->SetArbitraryHeader("Content-Type");
+ term->SetValue(value);
+ newFilter->AppendTerm(term);
+ }
+ }
+ newFilter->SetAction(nsMsgFilterAction::MoveToFolder);
+ nsXPIDLCString actionTargetFolderUri;
+ rv = sentFolder->GetURI(getter_Copies(actionTargetFolderUri));
+ if (NS_SUCCEEDED(rv))
+ {
+ newFilter->SetActionTargetFolderUri(actionTargetFolderUri);
+ filterList->InsertFilterAt(0, newFilter);
+ }
+ }
+ }
+ }
+ return rv;
+}
diff --git a/mailnews/base/util/nsMsgMailNewsUrl.cpp b/mailnews/base/util/nsMsgMailNewsUrl.cpp
index cec77aabe28c..3767ab0f67a5 100644
--- a/mailnews/base/util/nsMsgMailNewsUrl.cpp
+++ b/mailnews/base/util/nsMsgMailNewsUrl.cpp
@@ -788,3 +788,16 @@ NS_IMETHODIMP nsMsgMailNewsUrl:: RemoveCacheEntry(nsICacheEntryDescriptor *cache
}
return NS_OK;
}
+
+NS_IMETHODIMP nsMsgMailNewsUrl::GetMimeHeaders(nsIMimeHeaders * *mimeHeaders)
+{
+ NS_ENSURE_ARG_POINTER(mimeHeaders);
+ NS_IF_ADDREF(*mimeHeaders = mMimeHeaders);
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsMsgMailNewsUrl::SetMimeHeaders(nsIMimeHeaders *mimeHeaders)
+{
+ mMimeHeaders = mimeHeaders;
+ return NS_OK;
+}
diff --git a/mailnews/base/util/nsMsgMailNewsUrl.h b/mailnews/base/util/nsMsgMailNewsUrl.h
index 805df217026b..d716c3c178dc 100644
--- a/mailnews/base/util/nsMsgMailNewsUrl.h
+++ b/mailnews/base/util/nsMsgMailNewsUrl.h
@@ -46,6 +46,7 @@
#include "nsIMsgWindow.h"
#include "nsIMsgStatusFeedback.h"
#include "nsCOMPtr.h"
+#include "nsIMimeHeaders.h"
#include "nsIMsgMailNewsUrl.h"
#include "nsIURL.h"
#include "nsILoadGroup.h"
@@ -81,6 +82,7 @@ protected:
nsCOMPtr m_statusFeedback;
nsCOMPtr m_msgWindow;
nsCOMPtr m_loadGroup;
+ nsCOMPtr mMimeHeaders;
nsCOMPtr m_searchSession;
nsCOMPtr m_memCacheEntry;
nsCOMPtr m_imageCacheSession;
diff --git a/mailnews/compose/build/nsMsgCompCID.h b/mailnews/compose/build/nsMsgCompCID.h
index c2f29255ba51..b827025e6088 100644
--- a/mailnews/compose/build/nsMsgCompCID.h
+++ b/mailnews/compose/build/nsMsgCompCID.h
@@ -287,5 +287,16 @@
{ 0x01b8a701, 0x2f52, 0x11d5, \
{ 0x9d, 0xaa, 0xf7, 0x8d, 0xa7, 0x81, 0xa1, 0xfc } }
+//
+// nsMsgCompUtils
+//
+#define NS_MSGCOMPUTILS_CONTRACTID \
+ "@mozilla.org/messengercompose/computils;1"
+
+// {ceb0dca2-5e7d-4204-94d4-2ab925921fae}
+#define NS_MSGCOMPUTILS_CID \
+{ 0xceb0dca2, 0x5e7d, 0x4204, \
+ { 0x94, 0xd4, 0x2a, 0xb9, 0x25, 0x92, 0x1f, 0xae } }
+
#endif // nsMessageCompCID_h__
diff --git a/mailnews/compose/build/nsMsgCompFactory.cpp b/mailnews/compose/build/nsMsgCompFactory.cpp
index d5bc68a47adb..b0e812f72e9f 100644
--- a/mailnews/compose/build/nsMsgCompFactory.cpp
+++ b/mailnews/compose/build/nsMsgCompFactory.cpp
@@ -70,6 +70,7 @@
#include "nsIContentHandler.h"
#include "nsMsgRecipientArray.h"
#include "nsMsgComposeStringBundle.h"
+#include "nsMsgCompUtils.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSmtpService);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSmtpServer);
@@ -93,6 +94,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsComposeStringService);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSmtpDataSource);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSmtpDelegateFactory);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsURLFetcher);
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgCompUtils);
////////////////////////////////////////////////////////////
//
@@ -202,6 +204,10 @@ static const nsModuleComponentInfo components[] =
NS_URLFETCHER_CID,
NS_URLFETCHER_CONTRACTID,
nsURLFetcherConstructor },
+ { "Msg Compose Utils",
+ NS_MSGCOMPUTILS_CID,
+ NS_MSGCOMPUTILS_CONTRACTID,
+ nsMsgCompUtilsConstructor },
};
diff --git a/mailnews/compose/public/Makefile.in b/mailnews/compose/public/Makefile.in
index 1fd81e2e7a9f..ec775acd8a54 100644
--- a/mailnews/compose/public/Makefile.in
+++ b/mailnews/compose/public/Makefile.in
@@ -54,6 +54,7 @@ XPIDLSRCS = \
nsISmtpService.idl \
nsIURLFetcher.idl \
nsIMsgComposeSecure.idl \
+ nsIMsgCompUtils.idl \
$(NULL)
include $(topsrcdir)/config/rules.mk
diff --git a/mailnews/compose/public/makefile.win b/mailnews/compose/public/makefile.win
index 9f89ca096be6..ed08bfc5ac29 100644
--- a/mailnews/compose/public/makefile.win
+++ b/mailnews/compose/public/makefile.win
@@ -42,6 +42,7 @@ XPIDLSRCS = \
.\nsISmtpService.idl \
.\nsIURLFetcher.idl \
.\nsIMsgComposeSecure.idl \
+ .\nsIMsgCompUtils.idl \
$(NULL)
################################################################################
diff --git a/mailnews/compose/public/nsIMsgCompFields.idl b/mailnews/compose/public/nsIMsgCompFields.idl
index 6eed768efbb0..b75e19af7430 100644
--- a/mailnews/compose/public/nsIMsgCompFields.idl
+++ b/mailnews/compose/public/nsIMsgCompFields.idl
@@ -78,6 +78,7 @@ interface nsIMsgCompFields : nsISupports {
attribute string draftId;
attribute boolean returnReceipt;
+ attribute long receiptHeaderType;
attribute boolean attachVCard;
attribute boolean forcePlainText;
attribute boolean useMultipartAlternative;
diff --git a/mailnews/compose/resources/content/MsgComposeCommands.js b/mailnews/compose/resources/content/MsgComposeCommands.js
index 699d9007acb7..cea692abda2f 100644
--- a/mailnews/compose/resources/content/MsgComposeCommands.js
+++ b/mailnews/compose/resources/content/MsgComposeCommands.js
@@ -606,7 +606,6 @@ var defaultController =
case "cmd_selectAddress" : if (defaultController.isCommandEnabled(command)) SelectAddress(); break;
// case "cmd_quoteMessage" : if (defaultController.isCommandEnabled(command)) QuoteSelectedMessage(); break;
case "cmd_rewrap" : editorShell.Rewrap(false); break;
-
default:
// dump("##MsgCompose: don't know what to do with command " + command + "!\n");
return;
@@ -1307,6 +1306,9 @@ function ComposeStartup(recycled, aParams)
return;
}
+ document.getElementById("returnReceiptMenu").setAttribute('checked',
+ gMsgCompose.compFields.returnReceipt);
+
if (!recycled) //The editor is already initialized and does not support to be re-initialized.
{
// save the editorShell in the window. The editor JS expects to find it there.
@@ -1807,25 +1809,6 @@ function PriorityMenuSelect(target)
}
}
-function ReturnReceiptMenuSelect()
-{
- if (gMsgCompose)
- {
- var msgCompFields = gMsgCompose.compFields;
- if (msgCompFields)
- {
- if (msgCompFields.returnReceipt)
- {
- msgCompFields.returnReceipt = false;
- }
- else
- {
- msgCompFields.returnReceipt = true;
- }
- }
- }
-}
-
function OutputFormatMenuSelect(target)
{
if (gMsgCompose)
@@ -1866,6 +1849,16 @@ function SelectAddress()
AdjustFocus();
}
+function ToggleReturnReceipt(target)
+{
+ var msgCompFields = gMsgCompose.compFields;
+ if (msgCompFields)
+ {
+ msgCompFields.returnReceipt = ! msgCompFields.returnReceipt;
+ target.setAttribute('checked', msgCompFields.returnReceipt);
+ }
+}
+
function queryISupportsArray(supportsArray, iid) {
var result = new Array;
for (var i=0; i
+