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 + diff --git a/mailnews/compose/resources/locale/en-US/messengercompose.dtd b/mailnews/compose/resources/locale/en-US/messengercompose.dtd index 25661c2d2fa1..1f0edaaac0cb 100644 --- a/mailnews/compose/resources/locale/en-US/messengercompose.dtd +++ b/mailnews/compose/resources/locale/en-US/messengercompose.dtd @@ -124,6 +124,8 @@ + + diff --git a/mailnews/compose/src/nsMsgCompFields.cpp b/mailnews/compose/src/nsMsgCompFields.cpp index 55a5a670f918..2dd3dbf9b25f 100644 --- a/mailnews/compose/src/nsMsgCompFields.cpp +++ b/mailnews/compose/src/nsMsgCompFields.cpp @@ -66,13 +66,10 @@ nsMsgCompFields::nsMsgCompFields() m_useMultipartAlternative = PR_FALSE; m_uuEncodeAttachments = PR_FALSE; m_returnReceipt = PR_FALSE; - m_receiptType = 0; nsCOMPtr prefs (do_GetService(NS_PREF_CONTRACTID)); if (prefs) { - prefs->GetBoolPref("mail.request.return_receipt_on", &m_returnReceipt); - prefs->GetIntPref("mail.request.return_receipt", &m_receiptType); // Get the default charset from pref, use this as a mail charset. nsXPIDLString charset; prefs->GetLocalizedUnicharPref("mailnews.send_default_charset", getter_Copies(charset)); @@ -398,6 +395,18 @@ NS_IMETHODIMP nsMsgCompFields::GetReturnReceipt(PRBool *_retval) return NS_OK; } +NS_IMETHODIMP nsMsgCompFields::SetReceiptHeaderType(PRInt32 value) +{ + m_receiptHeaderType = value; + return NS_OK; +} + +NS_IMETHODIMP nsMsgCompFields::GetReceiptHeaderType(PRInt32 *_retval) +{ + *_retval = m_receiptHeaderType; + return NS_OK; +} + NS_IMETHODIMP nsMsgCompFields::SetAttachVCard(PRBool value) { m_attachVCard = value; diff --git a/mailnews/compose/src/nsMsgCompFields.h b/mailnews/compose/src/nsMsgCompFields.h index 9773b1d84978..76aef3b32d62 100644 --- a/mailnews/compose/src/nsMsgCompFields.h +++ b/mailnews/compose/src/nsMsgCompFields.h @@ -166,9 +166,6 @@ public: nsresult SplitRecipientsEx(const PRUnichar *recipients, nsIMsgRecipientArray ** fullAddrsArray, nsIMsgRecipientArray ** emailsArray); - PRInt32 GetReturnReceiptType() { return m_receiptType; }; - void SetReturnReceiptType(PRInt32 type) {m_receiptType = type;}; - protected: char* m_headers[MSG_MAX_HEADERS]; char* m_body; @@ -178,7 +175,7 @@ protected: PRBool m_useMultipartAlternative; PRBool m_uuEncodeAttachments; PRBool m_returnReceipt; - PRInt32 m_receiptType; /* 0:None 1:DSN 2:MDN 3:BOTH */ + PRInt32 m_receiptHeaderType; /* receipt header type */ nsCString m_internalCharSet; nsCString m_DefaultCharacterSet; diff --git a/mailnews/compose/src/nsMsgCompUtils.cpp b/mailnews/compose/src/nsMsgCompUtils.cpp index 5cff5ee9c870..e805242c89ae 100644 --- a/mailnews/compose/src/nsMsgCompUtils.cpp +++ b/mailnews/compose/src/nsMsgCompUtils.cpp @@ -60,10 +60,49 @@ #include "nsMsgUtils.h" #include "nsMsgSimulateError.h" +#include "nsIMsgCompUtils.h" +#include "nsIMsgMdnGenerator.h" + static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); static NS_DEFINE_CID(kHTTPHandlerCID, NS_HTTPPROTOCOLHANDLER_CID); +NS_IMPL_ISUPPORTS1(nsMsgCompUtils, nsIMsgCompUtils) + +nsMsgCompUtils::nsMsgCompUtils() +{ + NS_INIT_ISUPPORTS(); +} + +nsMsgCompUtils::~nsMsgCompUtils() +{ +} + +NS_IMETHODIMP nsMsgCompUtils::MimeMakeSeparator(const char *prefix, + char **_retval) +{ + NS_ENSURE_ARG_POINTER(prefix); + NS_ENSURE_ARG_POINTER(_retval); + *_retval = mime_make_separator(prefix); + return NS_OK; +} + +NS_IMETHODIMP nsMsgCompUtils::MsgGenerateMessageId(nsIMsgIdentity *identity, + char **_retval) +{ + NS_ENSURE_ARG_POINTER(identity); + NS_ENSURE_ARG_POINTER(_retval); + *_retval = msg_generate_message_id(identity); + return NS_OK; +} + +NS_IMETHODIMP nsMsgCompUtils::GetMsgMimeConformToStandard(PRBool *_retval) +{ + NS_ENSURE_ARG_POINTER(_retval); + *_retval = nsMsgMIMEGetConformToStandard(); + return NS_OK; +} + // // Hopefully, someone will write and XP call like this eventually! // @@ -336,29 +375,28 @@ mime_generate_headers (nsMsgCompFields *fields, * coorelate the MDN reports to the original message. Here will be * the right place */ + if (fields->GetReturnReceipt() && - (fields->GetReturnReceiptType() == 2 || - fields->GetReturnReceiptType() == 3) && (deliver_mode != nsIMsgSend::nsMsgSaveAsDraft && deliver_mode != nsIMsgSend::nsMsgSaveAsTemplate)) { - PRInt32 receipt_header_type = 0; + PRInt32 receipt_header_type = nsIMsgMdnGenerator::eDntType; + fields->GetReceiptHeaderType(&receipt_header_type); - if (prefs) - prefs->GetIntPref("mail.receipt.request_header_type", &receipt_header_type); - - // 0 = MDN Disposition-Notification-To: ; 1 = Return-Receipt-To: ; 2 = - // both MDN DNT & RRT headers - if (receipt_header_type == 1) { + // nsIMsgMdnGenerator::eDntType = MDN Disposition-Notification-To: ; + // nsIMsgMdnGenerator::eRrtType = Return-Receipt-To: ; + // nsIMsgMdnGenerator::eDntRrtType = both MDN DNT & RRT headers + if (receipt_header_type == nsIMsgMdnGenerator::eRrtType) { RRT_HEADER: ENCODE_AND_PUSH("Return-Receipt-To: ", PR_TRUE, pFrom, charset, usemime); } else { ENCODE_AND_PUSH("Disposition-Notification-To: ", PR_TRUE, pFrom, charset, usemime); - if (receipt_header_type == 2) + if (receipt_header_type == nsIMsgMdnGenerator::eDntRrtType) goto RRT_HEADER; } } + #ifdef SUPPORT_X_TEMPLATE_NAME if (deliver_mode == MSG_SaveAsTemplate) { const char *pStr = fields->GetTemplateName(); @@ -415,7 +453,13 @@ RRT_HEADER: PUSH_STRING("vcard=0"); PUSH_STRING("; "); if (fields->GetReturnReceipt()) { - char *type = PR_smprintf("%d", (int) fields->GetReturnReceiptType()); + // slight change compared to 4.x; we used to use receipt= to tell + // whether the draft/template has request for either MDN or DNS or both + // return receipt; since the DNS is out of the picture we now use the + // header type + 1 to tell whether user has requested the return receipt + PRInt32 headerType = 0; + fields->GetReceiptHeaderType(&headerType); + char *type = PR_smprintf("%d", (int)headerType + 1); if (type) { PUSH_STRING("receipt="); diff --git a/mailnews/compose/src/nsMsgCompUtils.h b/mailnews/compose/src/nsMsgCompUtils.h index 7702dc4f9256..6dcfdae7d973 100644 --- a/mailnews/compose/src/nsMsgCompUtils.h +++ b/mailnews/compose/src/nsMsgCompUtils.h @@ -43,11 +43,22 @@ #include "nsFileSpec.h" #include "nsMsgCompFields.h" #include "nsIMsgSend.h" +#include "nsIMsgCompUtils.h" class nsIPrompt; #define ANY_SERVER "anyfolder://" +class nsMsgCompUtils : public nsIMsgCompUtils +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIMSGCOMPUTILS + + nsMsgCompUtils(); + virtual ~nsMsgCompUtils(); +}; + NS_BEGIN_EXTERN_C // diff --git a/mailnews/compose/src/nsMsgComposeService.cpp b/mailnews/compose/src/nsMsgComposeService.cpp index b296508ab648..0a7981088ff6 100644 --- a/mailnews/compose/src/nsMsgComposeService.cpp +++ b/mailnews/compose/src/nsMsgComposeService.cpp @@ -75,6 +75,7 @@ #include "nsMsgBaseCID.h" #include "nsIMsgAccountManager.h" +#include "nsIMsgMdnGenerator.h" #ifdef MSGCOMP_TRACE_PERFORMANCE #include "prlog.h" @@ -438,6 +439,29 @@ nsMsgComposeService::OpenComposeWindow(const char *msgComposeWindowURL, const ch else pMsgComposeParams->SetOriginalMsgURI(originalMsgURI); + PRBool requestForReturnReceipt = PR_FALSE; + PRBool useCustomPrefs = PR_FALSE; + PRInt32 receiptType = nsIMsgMdnGenerator::eDntType; + identity->GetBoolAttribute("use_custom_prefs", &useCustomPrefs); + if (useCustomPrefs) + { + identity->GetBoolAttribute("request_return_receipt_on", + &requestForReturnReceipt); + identity->GetIntAttribute("request_receipt_header_type", + &receiptType); + } + else + { + nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + rv = prefs->GetBoolPref("mail.receipt.request_return_receipt_on", + &requestForReturnReceipt); + rv = prefs->GetIntPref("mail.receipt.request_header_type", + &receiptType); + } + pMsgCompFields->SetReturnReceipt(requestForReturnReceipt); + pMsgCompFields->SetReceiptHeaderType(receiptType); + pMsgComposeParams->SetComposeFields(pMsgCompFields); if(mLogComposePerformance) diff --git a/mailnews/compose/src/nsMsgSend.cpp b/mailnews/compose/src/nsMsgSend.cpp index f8f3d7637f5a..aa8489c7c8e3 100644 --- a/mailnews/compose/src/nsMsgSend.cpp +++ b/mailnews/compose/src/nsMsgSend.cpp @@ -100,6 +100,7 @@ #include "nsNetCID.h" #include "nsMsgUtils.h" #include "nsIRDFService.h" +#include "nsIMsgMdnGenerator.h" // use these macros to define a class IID for our component. Our object currently // supports two interfaces (nsISupports and nsIMsgCompose) so we want to define constants @@ -2803,7 +2804,12 @@ nsMsgComposeAndSend::InitCompositionFields(nsMsgCompFields *fields) mCompFields->SetAttachVCard(fields->GetAttachVCard()); mCompFields->SetForcePlainText(fields->GetForcePlainText()); mCompFields->SetUseMultipartAlternative(fields->GetUseMultipartAlternative()); + PRInt32 receiptType = nsIMsgMdnGenerator::eDntType; + fields->GetReceiptHeaderType(&receiptType); + mCompFields->SetReturnReceipt(fields->GetReturnReceipt()); + mCompFields->SetReceiptHeaderType(receiptType); + mCompFields->SetUuEncodeAttachments(fields->GetUuEncodeAttachments()); nsCOMPtr secInfo; diff --git a/mailnews/extensions/Makefile.in b/mailnews/extensions/Makefile.in index ce8d28f74a69..8a6e27a1a922 100644 --- a/mailnews/extensions/Makefile.in +++ b/mailnews/extensions/Makefile.in @@ -26,12 +26,14 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk +DIRS = mdn + ifdef MOZ_PSM BUILD_SMIME=1 endif ifdef BUILD_SMIME -DIRS = smime +DIRS += smime endif ifdef BUILD_MAIL_SMOKETEST diff --git a/mailnews/extensions/makefile.win b/mailnews/extensions/makefile.win index a3c91629621a..25c639029cff 100644 --- a/mailnews/extensions/makefile.win +++ b/mailnews/extensions/makefile.win @@ -21,12 +21,14 @@ DEPTH=..\.. +DIRS=mdn + !if defined(BUILD_PSM2) BUILD_SMIME=1 !endif !if defined(BUILD_SMIME) -DIRS=smime +DIRS=$(DIRS) smime !endif !if defined(BUILD_MAIL_SMOKETEST) diff --git a/mailnews/extensions/mdn/resources/locale/en-US/msgmdn.properties b/mailnews/extensions/mdn/resources/locale/en-US/msgmdn.properties index a564f875f940..e80607ca843c 100644 --- a/mailnews/extensions/mdn/resources/locale/en-US/msgmdn.properties +++ b/mailnews/extensions/mdn/resources/locale/en-US/msgmdn.properties @@ -1,3 +1,39 @@ +#***** 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. +# +#The Initial Developer of the Original Code is +# Jeff Tsai . +#Portions created by the Initial Developer are Copyright (C) 2002 +#the Initial Developer. All Rights Reserved. +# +#Contributor(s): +# Seth Spitzer +# +#Alternatively, the contents of this file may be used under the terms of +#either 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 ***** ## Msg Mdn Report strings MsgMdnDisplayed=Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents. MsgMdnDispatched=The message was either printed, faxed, or forwarded without being displayed to the recipient. There is no guarantee that the recipient will read the message at a later time. @@ -6,7 +42,8 @@ MsgMdnDeleted=The message has been deleted. The person you sent it to may or may MsgMdnDenied=The recipient of the message does not wish to send a return receipt back to you. MsgMdnFailed=A failure occurred. A proper return receipt could not be generated or sent to you. MsgMdnWishToSend=The sender of this message has asked to be notified when you read this message.\nDo you wish to notify the sender? -MsgMdnMsgSentTo=This is a Return Receipt for the mail that you sent to %s. +# LOCALIZATION NOTE : Do not translate the word "%S" below. +MsgMdnMsgSentTo=This is a Return Receipt for the mail that you sent to %S. MdnDisplayedReceipt=Return Receipt (displayed) MdnDispatchedReceipt=Return Receipt (dispatched) MdnProcessedReceipt=Return Receipt (processed) diff --git a/mailnews/extensions/mdn/src/nsMsgMdnGenerator.cpp b/mailnews/extensions/mdn/src/nsMsgMdnGenerator.cpp index b11ab9159a61..a0a18052df82 100644 --- a/mailnews/extensions/mdn/src/nsMsgMdnGenerator.cpp +++ b/mailnews/extensions/mdn/src/nsMsgMdnGenerator.cpp @@ -128,10 +128,33 @@ nsMsgMdnGenerator::~nsMsgMdnGenerator() { } +nsresult nsMsgMdnGenerator::FormatStringFromName(const PRUnichar *aName, + const PRUnichar *aString, + PRUnichar **aResultString) +{ + DEBUG_MDN("nsMsgMdnGenerator::FormatStringFromName"); + nsresult rv; + + nsCOMPtr + bundleService(do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv,rv); + + nsCOMPtr bundle; + rv = bundleService->CreateBundle(MDN_STRINGBUNDLE_URL, + getter_AddRefs(bundle)); + NS_ENSURE_SUCCESS(rv,rv); + + const PRUnichar *formatStrings[1] = { aString }; + rv = bundle->FormatStringFromName(aName, + formatStrings, 1, aResultString); + NS_ENSURE_SUCCESS(rv,rv); + return rv; +} + nsresult nsMsgMdnGenerator::GetStringFromName(const PRUnichar *aName, PRUnichar **aResultString) { - DEBUG_MDN( "nsMsgMdnGenerator::GetStringFromName"); + DEBUG_MDN("nsMsgMdnGenerator::GetStringFromName"); nsresult rv; nsCOMPtr @@ -148,25 +171,26 @@ nsresult nsMsgMdnGenerator::GetStringFromName(const PRUnichar *aName, return rv; } -void nsMsgMdnGenerator::StoreImapMDNSentFlag(nsIMsgFolder *folder, +nsresult nsMsgMdnGenerator::StoreMDNSentFlag(nsIMsgFolder *folder, nsMsgKey key) { - DEBUG_MDN( "nsMsgMdnGenerator::StoreImapMDNSentFlag"); - nsresult rv; - nsCOMPtr imapFolder(do_QueryInterface(folder, - &rv)); - if (NS_FAILED(rv)) - return; + DEBUG_MDN("nsMsgMdnGenerator::StoreMDNSentFlag"); + // Store the $MDNSent flag if the folder is an Imap Mail Folder + // otherwise, do nothing. + nsCOMPtr imapFolder = do_QueryInterface(folder); + if (!imapFolder) + return NS_OK; + nsMsgKeyArray keyArray; keyArray.Add(key); - imapFolder->StoreImapFlags(kImapMsgMDNSentFlag, PR_TRUE, + return imapFolder->StoreImapFlags(kImapMsgMDNSentFlag, PR_TRUE, keyArray.GetArray(), keyArray.GetSize()); } PRBool nsMsgMdnGenerator::ProcessSendMode() { - DEBUG_MDN( "nsMsgMdnGenerator::ProcessSendMode"); + DEBUG_MDN("nsMsgMdnGenerator::ProcessSendMode"); PRInt32 miscState = 0; if (m_identity) @@ -277,7 +301,7 @@ PRBool nsMsgMdnGenerator::MailAddrMatch(const char *addr1, const char *addr2) // Comparing two email addresses returns true if matched; local/account // part comparison is case sensitive; domain part comparison is case // insensitive - DEBUG_MDN( "nsMsgMdnGenerator::MailAddrMatch"); + DEBUG_MDN("nsMsgMdnGenerator::MailAddrMatch"); PRBool isMatched = PR_TRUE; const char *atSign1 = nsnull, *atSign2 = nsnull; const char *lt = nsnull, *local1 = nsnull, *local2 = nsnull; @@ -313,7 +337,7 @@ PRBool nsMsgMdnGenerator::MailAddrMatch(const char *addr1, const char *addr2) PRBool nsMsgMdnGenerator::NotInToOrCc() { - DEBUG_MDN( "nsMsgMdnGenerator::NotInToOrCc"); + DEBUG_MDN("nsMsgMdnGenerator::NotInToOrCc"); nsXPIDLCString reply_to; nsXPIDLCString to; nsXPIDLCString cc; @@ -337,7 +361,7 @@ PRBool nsMsgMdnGenerator::NotInToOrCc() PRBool nsMsgMdnGenerator::ValidateReturnPath() { - DEBUG_MDN( "nsMsgMdnGenerator::ValidateReturnPath"); + DEBUG_MDN("nsMsgMdnGenerator::ValidateReturnPath"); // ValidateReturnPath applies to Automatic Send Mode only. If we were not // in auto send mode we simply by passing the check if (!m_autoSend) @@ -355,9 +379,9 @@ PRBool nsMsgMdnGenerator::ValidateReturnPath() return m_reallySendMdn; } -void nsMsgMdnGenerator::CreateMdnMsg() +nsresult nsMsgMdnGenerator::CreateMdnMsg() { - DEBUG_MDN( "nsMsgMdnGenerator::CreateMdnMsg"); + DEBUG_MDN("nsMsgMdnGenerator::CreateMdnMsg"); nsresult rv; if (!m_autoSend) { @@ -379,7 +403,8 @@ void nsMsgMdnGenerator::CreateMdnMsg() } } if (!m_reallySendMdn) - return; + return NS_OK; + nsSpecialSystemDirectory tmpFile(nsSpecialSystemDirectory::OS_TemporaryDirectory); tmpFile += "mdnmsg"; @@ -389,11 +414,12 @@ void nsMsgMdnGenerator::CreateMdnMsg() NS_ASSERTION(NS_SUCCEEDED(rv),"creating mdn: failed to create"); if (NS_FAILED(rv)) - return; + return NS_OK; + rv = m_fileSpec->GetOutputStream(getter_AddRefs(m_outputStream)); NS_ASSERTION(NS_SUCCEEDED(rv),"creating mdn: failed to output stream"); if (NS_FAILED(rv)) - return; + return NS_OK; rv = CreateFirstPart(); if (NS_SUCCEEDED(rv)) @@ -413,15 +439,17 @@ void nsMsgMdnGenerator::CreateMdnMsg() if (NS_FAILED(rv)) m_fileSpec->Delete(PR_FALSE); else - DoSendMdn(); + rv = SendMdnMsg(); + + return NS_OK; } nsresult nsMsgMdnGenerator::CreateFirstPart() { - DEBUG_MDN( "nsMsgMdnGenerator::CreateFirstPart"); + DEBUG_MDN("nsMsgMdnGenerator::CreateFirstPart"); char *convbuf = nsnull, *tmpBuffer = nsnull; char *parm = nsnull; - char *firstPart1 = nsnull; + nsXPIDLString firstPart1; nsXPIDLString firstPart2; nsresult rv = NS_OK; nsXPIDLString receipt_string; @@ -476,14 +504,10 @@ nsresult nsMsgMdnGenerator::CreateFirstPart() conformToStandard); parm = PR_smprintf("From: %s" CRLF, convbuf ? convbuf : m_email.get()); - nsXPIDLString mdnMsgSentTo; - rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnMsgSentTo").get(), - getter_Copies(mdnMsgSentTo)); + rv = FormatStringFromName(NS_LITERAL_STRING("MsgMdnMsgSentTo").get(), NS_ConvertASCIItoUCS2(m_email).get(), + getter_Copies(firstPart1)); if (NS_FAILED(rv)) return rv; - firstPart1 = - PR_smprintf (NS_LossyConvertUCS2toASCII(mdnMsgSentTo).get(), - convbuf ? convbuf : m_email.get()); PUSH_N_FREE_STRING (parm); @@ -600,12 +624,11 @@ report-type=disposition-notification;\r\n\tboundary=\"%s\"" CRLF CRLF, ENCODING_7BIT); PUSH_N_FREE_STRING(tmpBuffer); - if (firstPart1) + if (!firstPart1.IsEmpty()) { - tmpBuffer = PR_smprintf("%s" CRLF CRLF, firstPart1); + tmpBuffer = PR_smprintf("%s" CRLF CRLF, NS_LossyConvertUCS2toASCII(firstPart1).get()); PUSH_N_FREE_STRING(tmpBuffer); - PR_Free(firstPart1); - } + } switch (m_disposeType) { @@ -647,7 +670,7 @@ report-type=disposition-notification;\r\n\tboundary=\"%s\"" CRLF CRLF, if (NS_FAILED(rv)) return rv; - if (firstPart2) + if (!firstPart2.IsEmpty()) { tmpBuffer = PR_smprintf("%s" CRLF CRLF, @@ -660,7 +683,7 @@ report-type=disposition-notification;\r\n\tboundary=\"%s\"" CRLF CRLF, nsresult nsMsgMdnGenerator::CreateSecondPart() { - DEBUG_MDN( "nsMsgMdnGenerator::CreateSecondPart"); + DEBUG_MDN("nsMsgMdnGenerator::CreateSecondPart"); char *tmpBuffer = nsnull; char *convbuf = nsnull; nsresult rv = NS_OK; @@ -738,7 +761,7 @@ nsresult nsMsgMdnGenerator::CreateSecondPart() nsresult nsMsgMdnGenerator::CreateThirdPart() { - DEBUG_MDN( "nsMsgMdnGenerator::CreateThirdPart"); + DEBUG_MDN("nsMsgMdnGenerator::CreateThirdPart"); char *tmpBuffer = nsnull; nsresult rv = NS_OK; @@ -772,7 +795,7 @@ nsresult nsMsgMdnGenerator::CreateThirdPart() nsresult nsMsgMdnGenerator::OutputAllHeaders() { - DEBUG_MDN( "nsMsgMdnGenerator::OutputAllHeaders"); + DEBUG_MDN("nsMsgMdnGenerator::OutputAllHeaders"); nsXPIDLCString all_headers; PRInt32 all_headers_size = 0; nsresult rv = NS_OK; @@ -854,19 +877,19 @@ nsresult nsMsgMdnGenerator::OutputAllHeaders() return count; } -void nsMsgMdnGenerator::DoSendMdn() +nsresult nsMsgMdnGenerator::SendMdnMsg() { - DEBUG_MDN( "nsMsgMdnGenerator::DoSendMdn"); + DEBUG_MDN("nsMsgMdnGenerator::SendMdnMsg"); nsresult rv; - nsCOMPtr - smtpService(do_GetService(NS_SMTPSERVICE_CONTRACTID, &rv)); - if (NS_SUCCEEDED(rv) && smtpService) - { - nsCOMPtr aRequest; - smtpService->SendMailMessage(m_fileSpec, m_dntRrt, m_identity, + nsCOMPtr smtpService = do_GetService(NS_SMTPSERVICE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv,rv); + + nsCOMPtr aRequest; + smtpService->SendMailMessage(m_fileSpec, m_dntRrt, m_identity, nsnull, this, nsnull, nsnull, nsnull, getter_AddRefs(aRequest)); - } + + return NS_OK; } nsresult nsMsgMdnGenerator::WriteString( const char *str ) @@ -878,20 +901,17 @@ nsresult nsMsgMdnGenerator::WriteString( const char *str ) return m_outputStream->Write(str, len, &wLen); } -void nsMsgMdnGenerator::InitAndProcess() +nsresult nsMsgMdnGenerator::InitAndProcess() { - DEBUG_MDN( "nsMsgMdnGenerator::InitAndProcess"); + DEBUG_MDN("nsMsgMdnGenerator::InitAndProcess"); nsresult rv = m_folder->GetServer(getter_AddRefs(m_server)); nsCOMPtr accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); - nsCOMPtr identities; if (accountManager && m_server) { - rv = accountManager->GetIdentitiesForServer(m_server, - getter_AddRefs(identities)); - if (identities) - rv = identities->QueryElementAt(0, NS_GET_IID(nsIMsgIdentity), - (void **)getter_AddRefs(m_identity)); + rv = accountManager->GetFirstIdentityForServer(m_server, getter_AddRefs(m_identity)); + NS_ENSURE_SUCCESS(rv,rv); + if (m_identity) { PRBool useCustomPrefs = PR_FALSE; @@ -911,13 +931,13 @@ void nsMsgMdnGenerator::InitAndProcess() nsCOMPtr prefs = do_GetService(NS_PREF_CONTRACTID, &rv); if (NS_FAILED(rv)) - return; + return rv; nsCOMPtr prefBranch; rv = prefs->GetBranch(nsnull, getter_AddRefs(prefBranch)); if (NS_FAILED(rv)) - return; + return rv; PRBool bVal = PR_FALSE; prefBranch->GetBoolPref("mail.mdn.report.enabled", @@ -943,8 +963,9 @@ void nsMsgMdnGenerator::InitAndProcess() m_headers->ExtractHeader(HEADER_RETURN_RECEIPT_TO, PR_FALSE, getter_Copies(m_dntRrt)); if (m_dntRrt && ProcessSendMode() && ValidateReturnPath()) - CreateMdnMsg(); + rv = CreateMdnMsg(); } + return NS_OK; } NS_IMETHODIMP nsMsgMdnGenerator::Process(EDisposeType type, @@ -954,32 +975,35 @@ NS_IMETHODIMP nsMsgMdnGenerator::Process(EDisposeType type, nsIMimeHeaders *headers, PRBool autoAction) { - DEBUG_MDN( "nsMsgMdnGenerator::Process"); - NS_ENSURE_ARG(folder); - NS_ENSURE_ARG(headers); - NS_ENSURE_ARG(aWindow); + DEBUG_MDN("nsMsgMdnGenerator::Process"); + NS_ENSURE_ARG_POINTER(folder); + NS_ENSURE_ARG_POINTER(headers); + NS_ENSURE_ARG_POINTER(aWindow); NS_ENSURE_TRUE(key != nsMsgKey_None, NS_ERROR_INVALID_ARG); m_disposeType = type; m_autoAction = autoAction; m_window = aWindow; m_folder = folder; m_headers = headers; - // Store the $MDNSent flag if the folder is an Imap Mail Folder - StoreImapMDNSentFlag(folder, key); - InitAndProcess(); + + nsresult rv = StoreMDNSentFlag(folder, key); + NS_ASSERTION(NS_SUCCEEDED(rv), "StoreMDNSentFlag failed"); + + rv = InitAndProcess(); + NS_ASSERTION(NS_SUCCEEDED(rv), "InitAndProcess failed"); return NS_OK; } NS_IMETHODIMP nsMsgMdnGenerator::OnStartRunningUrl(nsIURI *url) { - DEBUG_MDN( "nsMsgMdnGenerator::OnStartRunningUrl"); + DEBUG_MDN("nsMsgMdnGenerator::OnStartRunningUrl"); return NS_OK; } NS_IMETHODIMP nsMsgMdnGenerator::OnStopRunningUrl(nsIURI *url, nsresult aExitCode) { - DEBUG_MDN( "nsMsgMdnGenerator::OnStopRunningUrl"); + DEBUG_MDN("nsMsgMdnGenerator::OnStopRunningUrl"); m_fileSpec->Delete(PR_FALSE); return NS_OK; } diff --git a/mailnews/extensions/mdn/src/nsMsgMdnGenerator.h b/mailnews/extensions/mdn/src/nsMsgMdnGenerator.h index 97c948236d2a..a53dfc25aaff 100644 --- a/mailnews/extensions/mdn/src/nsMsgMdnGenerator.h +++ b/mailnews/extensions/mdn/src/nsMsgMdnGenerator.h @@ -68,23 +68,28 @@ public: virtual ~nsMsgMdnGenerator(); private: - nsresult GetStringFromName(const PRUnichar *aName, PRUnichar **aResultString); - // Sanity Check methods + // Sanity Check methods PRBool ProcessSendMode(); // must called prior ValidateReturnPath PRBool ValidateReturnPath(); PRBool NotInToOrCc(); PRBool MailAddrMatch(const char *addr1, const char *addr2); - void StoreImapMDNSentFlag(nsIMsgFolder *folder, nsMsgKey key); + nsresult StoreMDNSentFlag(nsIMsgFolder *folder, nsMsgKey key); - void CreateMdnMsg(); + nsresult CreateMdnMsg(); nsresult CreateFirstPart(); nsresult CreateSecondPart(); nsresult CreateThirdPart(); - void DoSendMdn(); + nsresult SendMdnMsg(); + + // string bundle helper methods + nsresult GetStringFromName(const PRUnichar *aName, PRUnichar **aResultString); + nsresult FormatStringFromName(const PRUnichar *aName, + const PRUnichar *aString, + PRUnichar **aResultString); - // helper functions - void InitAndProcess(); + // other helper methods + nsresult InitAndProcess(); nsresult OutputAllHeaders(); nsresult WriteString(const char *str); diff --git a/mailnews/imap/public/nsIImapMessageSink.idl b/mailnews/imap/public/nsIImapMessageSink.idl index 5a7bdb907122..5c051d3b26a2 100644 --- a/mailnews/imap/public/nsIImapMessageSink.idl +++ b/mailnews/imap/public/nsIImapMessageSink.idl @@ -51,7 +51,7 @@ interface nsIImapMessageSink : nsISupports { void ParseAdoptedMsgLine(in string adoptedMsgLine, in nsMsgKey uidOfMsg); - void NormalEndMsgWriteStream(in nsMsgKey uidOfMessage, in boolean markMsgRead); + void normalEndMsgWriteStream(in nsMsgKey uidOfMessage, in boolean markMsgRead, in nsIImapUrl imapUrl); void AbortMsgWriteStream(); diff --git a/mailnews/imap/src/nsImapIncomingServer.cpp b/mailnews/imap/src/nsImapIncomingServer.cpp index 7d9c9cc28ef6..903315e338e9 100644 --- a/mailnews/imap/src/nsImapIncomingServer.cpp +++ b/mailnews/imap/src/nsImapIncomingServer.cpp @@ -201,19 +201,11 @@ nsImapIncomingServer::GetConstructedPrettyName(PRUnichar **retval) nsCOMPtr accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); - if (NS_FAILED(rv)) return rv; - - if (NS_FAILED(rv)) return rv; - - nsCOMPtr identities; - rv = accountManager->GetIdentitiesForServer(this, - 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 = accountManager->GetFirstIdentityForServer(this, getter_AddRefs(identity)); + NS_ENSURE_SUCCESS(rv,rv); nsAutoString emailAddress; @@ -1445,7 +1437,7 @@ NS_IMETHODIMP nsImapIncomingServer::GetTrashFolderByRedirectorType(char **specia nsresult rv; // see if it has a predefined trash folder name. The pref setting is like: - // pref("imap.aol.treashFolder", "RECYCLE"); where the redirector type = 'aol' + // pref("imap.aol.trashFolder", "RECYCLE"); where the redirector type = 'aol' nsCAutoString prefName; rv = CreatePrefNameWithRedirectorType(".trashFolder", prefName); if (NS_FAILED(rv)) @@ -1459,7 +1451,7 @@ NS_IMETHODIMP nsImapIncomingServer::GetTrashFolderByRedirectorType(char **specia return NS_ERROR_FAILURE; else return rv; - } +} NS_IMETHODIMP nsImapIncomingServer::AllowFolderConversion(PRBool *allowConversion) { @@ -1483,7 +1475,7 @@ NS_IMETHODIMP nsImapIncomingServer::AllowFolderConversion(PRBool *allowConversio // In case this pref is not set we need to return NS_OK. rv = prefs->GetBoolPref(prefName.get(), allowConversion); return NS_OK; - } +} NS_IMETHODIMP nsImapIncomingServer::ConvertFolderName(const char *originalName, PRUnichar **convertedName) { @@ -3636,3 +3628,5 @@ nsImapIncomingServer::OnUserOrHostNameChanged(const char *oldName, const char *n return NS_OK; } + + diff --git a/mailnews/imap/src/nsImapIncomingServer.h b/mailnews/imap/src/nsImapIncomingServer.h index 38bf68836aaf..018ce5c4d7a6 100644 --- a/mailnews/imap/src/nsImapIncomingServer.h +++ b/mailnews/imap/src/nsImapIncomingServer.h @@ -70,7 +70,7 @@ public: NS_DECL_NSIIMAPINCOMINGSERVER NS_DECL_NSIIMAPSERVERSINK NS_DECL_NSIMSGLOGONREDIRECTIONREQUESTER - NS_DECL_NSISUBSCRIBABLESERVER + NS_DECL_NSISUBSCRIBABLESERVER NS_DECL_NSIURLLISTENER NS_IMETHOD PerformBiff(); @@ -95,7 +95,7 @@ NS_IMETHOD GetCanUndoDeleteOnServer(PRBool *canUndoDeleteOnServer); NS_IMETHOD GetNumIdleConnections(PRInt32 *aNumIdleConnections); protected: nsresult GetFolder(const char* name, nsIMsgFolder** pFolder); - nsresult ResetFoldersToUnverified(nsIFolder *parentFolder); + nsresult ResetFoldersToUnverified(nsIFolder *parentFolder); nsresult GetUnverifiedSubFolders(nsIFolder *parentFolder, nsISupportsArray *aFoldersArray, PRInt32 *aNumUnverifiedFolders); nsresult GetUnverifiedFolders(nsISupportsArray *aFolderArray, PRInt32 *aNumUnverifiedFolders); diff --git a/mailnews/imap/src/nsImapMailFolder.cpp b/mailnews/imap/src/nsImapMailFolder.cpp index 07b13956140c..ebd1bd0a300b 100644 --- a/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mailnews/imap/src/nsImapMailFolder.cpp @@ -97,6 +97,8 @@ #include "nsIMAPNamespace.h" #include "nsHashtable.h" #include "nsMsgMessageFlags.h" +#include "nsIMimeHeaders.h" +#include "nsIMsgMdnGenerator.h" #include static NS_DEFINE_CID(kMsgAccountManagerCID, NS_MSGACCOUNTMANAGER_CID); @@ -113,7 +115,6 @@ static NS_DEFINE_CID(kMsgCopyServiceCID, NS_MSGCOPYSERVICE_CID); static NS_DEFINE_CID(kCopyMessageStreamListenerCID, NS_COPYMESSAGESTREAMLISTENER_CID); static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); - #define FOUR_K 4096 #define MAILNEWS_CUSTOM_HEADERS "mailnews.customHeaders" @@ -620,8 +621,26 @@ nsImapMailFolder::UpdateFolder(nsIMsgWindow *msgWindow) PRBool selectFolder = PR_FALSE; if (mFlags & MSG_FOLDER_FLAG_INBOX && !m_filterList) - { rv = GetFilterList(msgWindow, getter_AddRefs(m_filterList)); + + if (m_filterList) { + nsCOMPtr server; + rv = GetServer(getter_AddRefs(server)); + NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get server"); + + PRBool canFileMessagesOnServer = PR_TRUE; + if (server) { + rv = server->GetCanFileMessagesOnServer(&canFileMessagesOnServer); + NS_ASSERTION(NS_SUCCEEDED(rv), "failed to determine if we could file messages on this server"); + } + + // the mdn filter is for filing return receipts into the sent folder + // some servers (like AOL mail servers) + // can't file to the sent folder, so we don't add the filter for those servers + if (canFileMessagesOnServer) { + rv = server->ConfigureTemporaryReturnReceiptsFilter(m_filterList); + NS_ASSERTION(NS_SUCCEEDED(rv), "failed to add MDN filter"); + } } nsCOMPtr imapService(do_GetService(kCImapService, &rv)); @@ -2827,40 +2846,45 @@ NS_IMETHODIMP nsImapMailFolder::ApplyFilterHit(nsIMsgFilter *filter, nsIMsgWindo !isRead) { -#if DOING_MDN // leave it to the user action - struct message_header to; - struct message_header cc; - GetAggregateHeader (m_toList, &to); - GetAggregateHeader (m_ccList, &cc); msgHdr->SetFlags(msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED); msgHdr->OrFlags(MSG_FLAG_MDN_REPORT_SENT, &newFlags); - if (actionType == nsMsgFilterActionDelete) + + nsCOMPtr mdnGenerator; + nsCOMPtr mimeHeaders; + + mdnGenerator = + do_CreateInstance(NS_MSGMDNGENERATOR_CONTRACTID, &rv); + if (mdnGenerator) { - MSG_ProcessMdnNeededState processMdnNeeded - (MSG_ProcessMdnNeededState::eDeleted, - m_pane, m_folder, msgHdr->GetMessageKey(), - &state->m_return_path, &state->m_mdn_dnt, - &to, &cc, &state->m_subject, - &state->m_date, &state->m_mdn_original_recipient, - &state->m_message_id, state->m_headers, - (PRInt32) state->m_headers_fp, PR_TRUE); + mimeHeaders = do_CreateInstance(NS_IMIMEHEADERS_CONTRACTID, + &rv); + if (NS_SUCCEEDED(rv)) + { + nsXPIDLCString headers; + PRInt32 headersSize; + rv = m_msgParser->GetAllHeaders(getter_Copies(headers), + &headersSize); + if (NS_SUCCEEDED(rv)) + { + mimeHeaders->Initialize(headers, headersSize); + nsMsgKey msgKey; + msgHdr->GetMessageKey(&msgKey); + + if (actionType == nsMsgFilterAction::Delete) + { + mdnGenerator->Process(nsIMsgMdnGenerator::eDeleted, + msgWindow, this, msgKey, + mimeHeaders, PR_TRUE); } else { - MSG_ProcessMdnNeededState processMdnNeeded - (MSG_ProcessMdnNeededState::eProcessed, - m_pane, m_folder, msgHdr->GetMessageKey(), - &state->m_return_path, &state->m_mdn_dnt, - &to, &cc, &state->m_subject, - &state->m_date, &state->m_mdn_original_recipient, - &state->m_message_id, state->m_headers, - (PRInt32) state->m_headers_fp, PR_TRUE); + mdnGenerator->Process(nsIMsgMdnGenerator::eProcessed, + msgWindow, this, msgKey, + mimeHeaders, PR_TRUE); + } + } + } } - char *tmp = (char*) to.value; - PR_FREEIF(tmp); - tmp = (char*) cc.value; - PR_FREEIF(tmp); -#endif } nsresult err = MoveIncorporatedMessage(msgHdr, mDatabase, actionTargetFolderUri, filter, msgWindow); if (NS_SUCCEEDED(err)) @@ -3633,7 +3657,9 @@ nsImapMailFolder::ParseAdoptedMsgLine(const char *adoptedMessageLine, nsMsgKey u } NS_IMETHODIMP -nsImapMailFolder::NormalEndMsgWriteStream(nsMsgKey uidOfMessage, PRBool markRead) +nsImapMailFolder::NormalEndMsgWriteStream(nsMsgKey uidOfMessage, + PRBool markRead, + nsIImapUrl *imapUrl) { nsresult res = NS_OK; PRBool commit = PR_FALSE; @@ -3660,6 +3686,39 @@ nsImapMailFolder::NormalEndMsgWriteStream(nsMsgKey uidOfMessage, PRBool markRead msgHdr->GetIsRead(&isRead); if (!isRead) { + PRUint32 msgFlags, newFlags; + msgHdr->GetFlags(&msgFlags); + if (msgFlags & MSG_FLAG_MDN_REPORT_NEEDED) + { + msgHdr->SetFlags(msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED); + msgHdr->OrFlags(MSG_FLAG_MDN_REPORT_SENT, &newFlags); + nsCOMPtr mdnGenerator; + nsCOMPtr mimeHeaders; + nsCOMPtr + msgUrl(do_QueryInterface(imapUrl, &res)); + if (NS_SUCCEEDED(res)) + { + nsCOMPtr msgWindow; + + mdnGenerator = + do_CreateInstance(NS_MSGMDNGENERATOR_CONTRACTID, &res); + if (mdnGenerator) + { + res = msgUrl->GetMsgWindow(getter_AddRefs(msgWindow)); + if(NS_SUCCEEDED(res)) + { + res = msgUrl->GetMimeHeaders(getter_AddRefs(mimeHeaders)); + if(NS_SUCCEEDED(res)) + { + mdnGenerator->Process(nsIMsgMdnGenerator::eDisplayed, + msgWindow, this, uidOfMessage, + mimeHeaders, PR_FALSE); + msgUrl->SetMimeHeaders(nsnull); + } + } + } + } + } msgHdr->MarkRead(PR_TRUE); commit = PR_TRUE; } diff --git a/mailnews/imap/src/nsImapProtocol.cpp b/mailnews/imap/src/nsImapProtocol.cpp index ea5f65d98d8b..0df6843fae47 100644 --- a/mailnews/imap/src/nsImapProtocol.cpp +++ b/mailnews/imap/src/nsImapProtocol.cpp @@ -3056,7 +3056,7 @@ void nsImapProtocol::NormalMessageEndDownload() m_runningUrl->GetImapAction(&imapAction); if (m_imapMessageSink) - m_imapMessageSink->NormalEndMsgWriteStream(m_downloadLineCache.CurrentUID(), imapAction == nsIImapUrl::nsImapMsgFetch); + m_imapMessageSink->NormalEndMsgWriteStream(m_downloadLineCache.CurrentUID(), imapAction == nsIImapUrl::nsImapMsgFetch, m_runningUrl); if (m_runningUrl && m_imapMailFolderSink) { diff --git a/mailnews/import/eudora/src/Makefile.in b/mailnews/import/eudora/src/Makefile.in index 327a9e226a37..e8a3e49d00c2 100644 --- a/mailnews/import/eudora/src/Makefile.in +++ b/mailnews/import/eudora/src/Makefile.in @@ -51,6 +51,7 @@ REQUIRES = xpcom \ msglocal \ mimetype \ unicharutil \ + mime \ pref \ $(NULL) diff --git a/mailnews/import/eudora/src/makefile.win b/mailnews/import/eudora/src/makefile.win index 33dfc141881a..dc1dc5a5c1e7 100644 --- a/mailnews/import/eudora/src/makefile.win +++ b/mailnews/import/eudora/src/makefile.win @@ -36,6 +36,7 @@ REQUIRES = xpcom \ msglocal \ mimetype \ unicharutil \ + mime \ pref \ $(NULL) LIBRARY_NAME = $(MODULE) diff --git a/mailnews/import/oexpress/Makefile.in b/mailnews/import/oexpress/Makefile.in index 208db94107a4..37da4c8f7102 100644 --- a/mailnews/import/oexpress/Makefile.in +++ b/mailnews/import/oexpress/Makefile.in @@ -46,6 +46,7 @@ REQUIRES = xpcom \ msgbaseutil \ msgcompose \ msglocal \ + mime \ $(NULL) CPPSRCS = \ diff --git a/mailnews/import/oexpress/makefile.win b/mailnews/import/oexpress/makefile.win index 675285359ec9..9d18e95a4937 100644 --- a/mailnews/import/oexpress/makefile.win +++ b/mailnews/import/oexpress/makefile.win @@ -37,6 +37,7 @@ REQUIRES = xpcom \ msgbaseutil \ msgcompo \ msglocal \ + mime \ $(NULL) LIBRARY_NAME = $(MODULE) META_COMPONENT = mail diff --git a/mailnews/import/outlook/src/Makefile.in b/mailnews/import/outlook/src/Makefile.in index b44bbd2870c0..335805aa1bbe 100644 --- a/mailnews/import/outlook/src/Makefile.in +++ b/mailnews/import/outlook/src/Makefile.in @@ -55,6 +55,7 @@ REQUIRES = xpcom \ msgdb \ msglocal \ mimetype \ + mime \ unicharutil \ pref \ $(NULL) diff --git a/mailnews/import/outlook/src/makefile.win b/mailnews/import/outlook/src/makefile.win index 0a797995d270..016c72c66668 100644 --- a/mailnews/import/outlook/src/makefile.win +++ b/mailnews/import/outlook/src/makefile.win @@ -39,6 +39,7 @@ REQUIRES = xpcom \ msgdb \ msglocal \ mimetype \ + mime \ unicharutil \ pref \ $(NULL) diff --git a/mailnews/import/src/Makefile.in b/mailnews/import/src/Makefile.in index eae749937062..613c36df8d13 100644 --- a/mailnews/import/src/Makefile.in +++ b/mailnews/import/src/Makefile.in @@ -45,6 +45,7 @@ REQUIRES = xpcom \ rdf \ msgdb \ unicharutil \ + mime \ $(NULL) ifeq ($(USE_SHORT_LIBNAME),1) diff --git a/mailnews/import/src/makefile.win b/mailnews/import/src/makefile.win index 362850568d06..527cb15e95c8 100644 --- a/mailnews/import/src/makefile.win +++ b/mailnews/import/src/makefile.win @@ -37,6 +37,7 @@ REQUIRES = xpcom \ rdf \ msgdb \ unicharutil \ + mime \ $(NULL) CPP_OBJS=\ diff --git a/mailnews/local/src/nsMailboxProtocol.cpp b/mailnews/local/src/nsMailboxProtocol.cpp index 2d3b583d0400..fff340a47fcc 100644 --- a/mailnews/local/src/nsMailboxProtocol.cpp +++ b/mailnews/local/src/nsMailboxProtocol.cpp @@ -52,7 +52,7 @@ #include "nsMsgDBCID.h" #include "nsIMsgMailNewsUrl.h" #include "nsICopyMsgStreamListener.h" -//#include "allxpstr.h" +#include "nsMsgMessageFlags.h" #include "prtime.h" #include "prlog.h" #include "prerror.h" @@ -69,12 +69,14 @@ PRLogModuleInfo *MAILBOX; #include "nsXPIDLString.h" #include "nsNetUtil.h" #include "nsIMsgWindow.h" +#include "nsIMimeHeaders.h" + +#include "nsIMsgMdnGenerator.h" static NS_DEFINE_CID(kIStreamConverterServiceCID, NS_STREAMCONVERTERSERVICE_CID); static NS_DEFINE_CID(kCMailDB, NS_MAILDB_CID); static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); - /* the output_buffer_size must be larger than the largest possible line * 2000 seems good for news * @@ -385,6 +387,7 @@ PRInt32 nsMailboxProtocol::DoneReadingMessage() { // now mark the message as read nsCOMPtr msgHdr; + nsMsgKey msgKey; if (m_runningUrl) rv = m_runningUrl->GetMessageHeader(getter_AddRefs(msgHdr)); NS_ASSERTION(msgHdr, "no msg hdr!"); @@ -392,7 +395,54 @@ PRInt32 nsMailboxProtocol::DoneReadingMessage() PRBool isRead; msgHdr->GetIsRead(&isRead); if (NS_SUCCEEDED(rv) && !isRead) + { + PRUint32 msgFlags, newFlags; + msgHdr->GetFlags(&msgFlags); + if (msgFlags & MSG_FLAG_MDN_REPORT_NEEDED) + { + nsCOMPtr mdnGenerator; + nsCOMPtr mimeHeaders; + + mdnGenerator = + do_CreateInstance(NS_MSGMDNGENERATOR_CONTRACTID, &rv); + + // To ensure code works w/o MDN enabled + if (NS_SUCCEEDED(rv) && mdnGenerator) + { + mimeHeaders = + do_CreateInstance(NS_IMIMEHEADERS_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv) && mimeHeaders) + { + nsCOMPtr msgFolder; + msgHdr->GetFolder(getter_AddRefs(msgFolder)); + nsCOMPtr msgUrl = + do_QueryInterface(m_runningUrl); + if (msgUrl) + { + nsCOMPtr msgWindow; + msgUrl->GetMsgWindow(getter_AddRefs(msgWindow)); + msgHdr->GetMessageKey(&msgKey); + nsCOMPtr mimeHeaders; + msgUrl->GetMimeHeaders(getter_AddRefs(mimeHeaders)); + mdnGenerator->Process(nsIMsgMdnGenerator::eDisplayed, + msgWindow, msgFolder, msgKey, + mimeHeaders, PR_FALSE); + msgUrl->SetMimeHeaders(nsnull); + // no longer needed + } + } + } + // unsetting MDN_REPORT_NEEDED flag and mark the message as + // MDN_REPORT_SENT + // There are cases that: a) user wishes not to send MDN, b) + // mdn module is not installed, c) the message can be marked + // as unread and force it back to the original mdn + // needed state. + msgHdr->SetFlags(msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED); + msgHdr->OrFlags(MSG_FLAG_MDN_REPORT_SENT, &newFlags); + } msgHdr->MarkRead(PR_TRUE); + } } return rv; diff --git a/mailnews/local/src/nsParseMailbox.cpp b/mailnews/local/src/nsParseMailbox.cpp index 2b242b4f6b9f..ef61a428bd13 100644 --- a/mailnews/local/src/nsParseMailbox.cpp +++ b/mailnews/local/src/nsParseMailbox.cpp @@ -69,6 +69,10 @@ #include "nsMsgUtils.h" #include "prprf.h" #include "nsEscape.h" +#include "nsIMimeHeaders.h" + +#include "nsIMsgMdnGenerator.h" +#include "nsMsgSearchCore.h" static NS_DEFINE_CID(kCMailDB, NS_MAILDB_CID); static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID); @@ -80,8 +84,7 @@ NS_IMPL_ISUPPORTS_INHERITED2(nsMsgMailboxParser, nsParseMailMessageState, nsIStr // Whenever data arrives from the connection, core netlib notifices the protocol by calling // OnDataAvailable. We then read and process the incoming data from the input stream. -NS_IMETHODIMP nsMsgMailboxParser::OnDataAvailable(nsIRequest *request, nsISupports *ctxt, nsIInputStream *aIStream, PRUint32 sourceOffset, - PRUint32 aLength) +NS_IMETHODIMP nsMsgMailboxParser::OnDataAvailable(nsIRequest *request, nsISupports *ctxt, nsIInputStream *aIStream, PRUint32 sourceOffset, PRUint32 aLength) { // right now, this really just means turn around and process the url nsresult rv = NS_OK; @@ -1442,56 +1445,10 @@ nsParseNewMailState::Init(nsIFolder *rootFolder, nsIMsgFolder *downloadFolder, n if (NS_SUCCEEDED(rv)) rv = server->GetFilterList(aMsgWindow, getter_AddRefs(m_filterList)); m_logFile = nsnull; -#ifdef DOING_MDN + if (m_filterList) - { - const char *folderName = nsnull; - PRInt32 int_pref = 0; - PREF_GetIntPref("mail.incorporate.return_receipt", &int_pref); - if (int_pref == 1) - { - nsIMsgFolder *folderInfo = nsnull; - int status = 0; - char *defaultFolderName = - msg_MagicFolderName(master->GetPrefs(), - MSG_FOLDER_FLAG_SENTMAIL, &status); - if (defaultFolderName) - { - folderInfo = master->FindMailFolder(defaultFolderName, PR_FALSE); - if (folderInfo && folderInfo->GetMailFolderInfo()) - folderName = folderInfo->GetMailFolderInfo()->GetPathname(); - XP_FREE(defaultFolderName); - } - } - if (folderName) - { - MSG_Filter *newFilter = new MSG_Filter(filterInboxRule, "receipt"); - if (newFilter) - { - MSG_Rule *rule = nsnull; - MSG_SearchValue value; - newFilter->SetDescription("incorporate mdn report"); - newFilter->SetEnabled(PR_TRUE); - newFilter->GetRule(&rule); - newFilter->SetFilterList(m_filterList); - value.attribute = attribOtherHeader; - value.u.string = "multipart/report"; - rule->AddTerm(attribOtherHeader, opContains, - &value, PR_TRUE, "Content-Type"); - value.u.string = "disposition-notification"; - rule->AddTerm(attribOtherHeader, opContains, - &value, PR_TRUE, "Content-Type"); -#if 0 - value.u.string = "delivery-status"; - rule->AddTerm(attribOtherHeader, opContains, - &value, PR_FALSE, "Content-Type"); -#endif - rule->SetAction(nsMsgFilterActionMoveToFolder, (void*)folderName); - m_filterList->InsertFilterAt(0, newFilter); - } - } - } -#endif // DOING_MDN + rv = server->ConfigureTemporaryReturnReceiptsFilter(m_filterList); + m_usingTempDB = PR_FALSE; m_tmpdbName = nsnull; m_disableFilters = PR_FALSE; @@ -1713,49 +1670,67 @@ NS_IMETHODIMP nsParseNewMailState::ApplyFilterHit(nsIMsgFilter *filter, nsIMsgWi if (msgFlags & MSG_FLAG_MDN_REPORT_NEEDED && !isRead) { - struct message_header to; - struct message_header cc; - GetAggregateHeader (m_toList, &to); - GetAggregateHeader (m_ccList, &cc); - msgHdr->SetFlags(msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED); - msgHdr->OrFlags(MSG_FLAG_MDN_REPORT_SENT, &newFlags); + nsCOMPtr mdnGenerator; + nsCOMPtr mimeHeaders; -#if DOING_MDN // leave it to the user action - if (actionType == nsMsgFilterActionDelete) - { - MSG_ProcessMdnNeededState processMdnNeeded - (MSG_ProcessMdnNeededState::eDeleted, - m_pane, m_folder, msgHdr->GetMessageKey(), - &state->m_return_path, &state->m_mdn_dnt, - &to, &cc, &state->m_subject, - &state->m_date, &state->m_mdn_original_recipient, - &state->m_message_id, state->m_headers, - (PRInt32) state->m_headers_fp, PR_TRUE); - } - else - { - MSG_ProcessMdnNeededState processMdnNeeded - (MSG_ProcessMdnNeededState::eProcessed, - m_pane, m_folder, msgHdr->GetMessageKey(), - &state->m_return_path, &state->m_mdn_dnt, - &to, &cc, &state->m_subject, - &state->m_date, &state->m_mdn_original_recipient, - &state->m_message_id, state->m_headers, - (PRInt32) state->m_headers_fp, PR_TRUE); - } -#endif - char *tmp = (char*) to.value; - PR_FREEIF(tmp); - tmp = (char*) cc.value; - PR_FREEIF(tmp); - } - nsresult err = MoveIncorporatedMessage(msgHdr, m_mailDB, (const char *) actionTargetFolderUri, filter, msgWindow); - if (NS_SUCCEEDED(err)) - m_msgMovedByFilter = PR_TRUE; + mdnGenerator = + do_CreateInstance(NS_MSGMDNGENERATOR_CONTRACTID, &rv); + + // To ensure code works w/o MDN enabled + if (NS_SUCCEEDED(rv) && mdnGenerator) { + mimeHeaders = do_CreateInstance(NS_IMIMEHEADERS_CONTRACTID, &rv); - } + if (NS_SUCCEEDED(rv) && mimeHeaders) { + nsXPIDLCString allHeaders; + PRInt32 allHeadersSize = 0; + + rv = GetAllHeaders(getter_Copies(allHeaders), + &allHeadersSize); + if (NS_SUCCEEDED(rv)) { + rv = mimeHeaders->Initialize(allHeaders, allHeadersSize); + if (NS_SUCCEEDED(rv)) + { + nsCOMPtr rootMsgFolder = + do_QueryInterface(m_rootFolder, &rv); + if (NS_SUCCEEDED(rv) && rootMsgFolder) + { + nsMsgKey msgKey; + msgHdr->GetMessageKey(&msgKey); + + if (actionType == nsMsgFilterAction::Delete) + { + mdnGenerator->Process(nsIMsgMdnGenerator::eDeleted, + msgWindow, rootMsgFolder, + msgKey, + mimeHeaders, PR_TRUE); + } + else + { + mdnGenerator->Process(nsIMsgMdnGenerator::eProcessed, + msgWindow, rootMsgFolder, + msgKey, + mimeHeaders, PR_TRUE); + } + } + } + } + } + } + // unsetting MDN_REPORT_NEEDED flag and mark the message as + // MDN_REPORT_SENT + // There are cases that: a) user wishes not to send MDN, b) + // mdn module is not installed, c) the message can be marked + // as unread and force it back to the original mdn + // needed state. + msgHdr->SetFlags(msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED); + msgHdr->OrFlags(MSG_FLAG_MDN_REPORT_SENT, &newFlags); + } + nsresult err = MoveIncorporatedMessage(msgHdr, m_mailDB, (const char *) actionTargetFolderUri, filter, msgWindow); + if (NS_SUCCEEDED(err)) + m_msgMovedByFilter = PR_TRUE; + } *applyMore = PR_FALSE; - break; + break; case nsMsgFilterAction::MarkRead: MarkFilteredMessageRead(msgHdr); break; diff --git a/mailnews/mime/build/nsMimeModule.cpp b/mailnews/mime/build/nsMimeModule.cpp index d6855f6db188..924ed0c7d236 100644 --- a/mailnews/mime/build/nsMimeModule.cpp +++ b/mailnews/mime/build/nsMimeModule.cpp @@ -68,7 +68,7 @@ static const nsModuleComponentInfo gComponents[] = { nsnull, nsMimeObjectClassAccessConstructor }, { "Mime Converter", NS_MIME_CONVERTER_CID, - nsnull, nsMimeConverterConstructor }, + NS_MIME_CONVERTER_CONTRACTID, nsMimeConverterConstructor }, { "Msg Header Parser", NS_MSGHEADERPARSER_CID, NS_MAILNEWS_MIME_HEADER_PARSER_CONTRACTID, nsMsgHeaderParserConstructor }, @@ -86,7 +86,7 @@ static const nsModuleComponentInfo gComponents[] = { nsStreamConverterConstructor, 0, 0, streamConverterDestructor }, { "Mime Headers", NS_IMIMEHEADERS_CID, - nsnull, nsMimeHeadersConstructor } + NS_IMIMEHEADERS_CONTRACTID, nsMimeHeadersConstructor } }; NS_IMPL_NSGETMODULE(mime_services, gComponents) diff --git a/mailnews/mime/build/nsMsgMimeCID.h b/mailnews/mime/build/nsMsgMimeCID.h index 9950fefabef4..b00a8b725faa 100644 --- a/mailnews/mime/build/nsMsgMimeCID.h +++ b/mailnews/mime/build/nsMsgMimeCID.h @@ -51,6 +51,9 @@ { /* FAF4F9A6-60AD-11d3-989A-001083010E9B */ \ 0xfaf4f9a6, 0x60ad, 0x11d3, { 0x98, 0x9a, 0x0, 0x10, 0x83, 0x1, 0xe, 0x9b } } +#define NS_MIME_CONVERTER_CONTRACTID \ + "@mozilla.org/messenger/mimeconverter;1" + // {866A1E11-D0B9-11d2-B373-525400E2D63A} #define NS_MIME_CONVERTER_CID \ { 0x866a1e11, 0xd0b9, 0x11d2, \ diff --git a/mailnews/mime/emitters/src/nsMimeBaseEmitter.cpp b/mailnews/mime/emitters/src/nsMimeBaseEmitter.cpp index 7aa83aad2dd4..c90536b78969 100644 --- a/mailnews/mime/emitters/src/nsMimeBaseEmitter.cpp +++ b/mailnews/mime/emitters/src/nsMimeBaseEmitter.cpp @@ -62,6 +62,9 @@ #include "nsMsgMimeCID.h" #include "prlog.h" #include "prprf.h" +#include "nsIMimeHeaders.h" +#include "nsIMsgWindow.h" +#include "nsIMsgMailNewsUrl.h" static PRLogModuleInfo * gMimeEmitterLogModule = nsnull; @@ -620,6 +623,22 @@ nsMimeBaseEmitter::AddHeaderField(const char *field, const char *value) return NS_OK; } +NS_IMETHODIMP +nsMimeBaseEmitter::AddAllHeaders(const char *allheaders, + const PRInt32 allheadersize) +{ + nsresult rv; + nsCOMPtr msgurl (do_QueryInterface(mURL)); + if (msgurl) + { + nsCOMPtr mimeHeaders = do_CreateInstance(NS_IMIMEHEADERS_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv,rv); + mimeHeaders->Initialize(allheaders, allheadersize); + msgurl->SetMimeHeaders(mimeHeaders); + } + return NS_OK; +} + //////////////////////////////////////////////////////////////////////////////// // The following code is responsible for formatting headers in a manner that is // identical to the normal XUL output. diff --git a/mailnews/mime/public/nsIMimeEmitter.idl b/mailnews/mime/public/nsIMimeEmitter.idl index d0e188f13b23..11421a267649 100644 --- a/mailnews/mime/public/nsIMimeEmitter.idl +++ b/mailnews/mime/public/nsIMimeEmitter.idl @@ -74,6 +74,7 @@ interface nsIMimeEmitter : nsISupports{ void StartHeader(in PRBool rootMailHeader, in PRBool headerOnly, [const] in string msgID, [const] in string outCharset); void AddHeaderField([const] in string field, [const] in string value); + void addAllHeaders(in string allheaders, in long allheadersize); void WriteHTMLHeaders(); // book case this with a EndHeader call. void EndHeader(); void UpdateCharacterSet([const] in string aCharset); diff --git a/mailnews/mime/public/nsIMimeHeaders.idl b/mailnews/mime/public/nsIMimeHeaders.idl index f23b3f60b057..8cc8d9133b66 100644 --- a/mailnews/mime/public/nsIMimeHeaders.idl +++ b/mailnews/mime/public/nsIMimeHeaders.idl @@ -39,6 +39,8 @@ #include "nsrootidl.idl" %{C++ +#define NS_IMIMEHEADERS_CONTRACTID \ + "@mozilla.org/messenger/mimeheaders;1" // {9C4DA772-07EB-11d3-8EE5-00A024669799} #define NS_IMIMEHEADERS_CID \ { 0x13e16677, 0x6648, 0x11d3, \ @@ -50,9 +52,9 @@ */ [scriptable, uuid(13E16676-6648-11d3-A72F-0060B0EB39B5)] interface nsIMimeHeaders : nsISupports { - - void initialize([const] in string allHeaders, in long allHeadersSize); - string extractHeader ([const] in string headerName, in boolean getAllOfThem); + void initialize([const] in string allHeaders, in long allHeadersSize); + string extractHeader ([const] in string headerName, in boolean getAllOfThem); + readonly attribute string allHeaders; }; %{C++ diff --git a/mailnews/mime/src/mimedrft.cpp b/mailnews/mime/src/mimedrft.cpp index 463f969b4aa6..5cb0e6609308 100644 --- a/mailnews/mime/src/mimedrft.cpp +++ b/mailnews/mime/src/mimedrft.cpp @@ -1350,7 +1350,11 @@ mime_parse_stream_complete (nsMIMESession *stream) int receiptType = 0; fields->SetReturnReceipt(PR_TRUE); sscanf(parm, "%d", &receiptType); - fields->SetReturnReceipt((PRInt32) receiptType); + // slight change compared to 4.x; we used to use receipt= to tell + // whether the draft/template has request for either MDN or DNS or both + // return receipt; since the DNS is out of the picture we now use the + // header type - 1 to tell whether user has requested the return receipt + fields->SetReceiptHeaderType(((PRInt32)receiptType) - 1); } PR_FREEIF(parm); parm = MimeHeaders_get_parameter(draftInfo, "uuencode", NULL, NULL); diff --git a/mailnews/mime/src/mimehdrs.cpp b/mailnews/mime/src/mimehdrs.cpp index d0dafd2cfbaa..8e1bcaf3eac0 100644 --- a/mailnews/mime/src/mimehdrs.cpp +++ b/mailnews/mime/src/mimehdrs.cpp @@ -802,6 +802,7 @@ MimeHeaders_write_all_headers (MimeHeaders *hdrs, MimeDisplayOptions *opt, PRBoo if (!wrote_any_p) wrote_any_p = (status > 0); } + mimeEmitterAddAllHeaders(opt, hdrs->all_headers, hdrs->all_headers_fp); PR_FREEIF(charset); return 1; diff --git a/mailnews/mime/src/mimemoz2.cpp b/mailnews/mime/src/mimemoz2.cpp index dfdecda73e65..57b75d05622e 100644 --- a/mailnews/mime/src/mimemoz2.cpp +++ b/mailnews/mime/src/mimemoz2.cpp @@ -1733,6 +1733,26 @@ mimeEmitterAddHeaderField(MimeDisplayOptions *opt, const char *field, const char return NS_ERROR_FAILURE; } +extern "C" nsresult +mimeEmitterAddAllHeaders(MimeDisplayOptions *opt, const char *allheaders, const PRInt32 allheadersize) +{ + // Check for draft processing... + if (NoEmitterProcessing(opt->format_out)) + return NS_OK; + + mime_stream_data *msd = GetMSD(opt); + if (!msd) + return NS_ERROR_FAILURE; + + if (msd->output_emitter) + { + nsIMimeEmitter *emitter = (nsIMimeEmitter *)msd->output_emitter; + return emitter->AddAllHeaders(allheaders, allheadersize); + } + + return NS_ERROR_FAILURE; +} + extern "C" nsresult mimeEmitterStartAttachment(MimeDisplayOptions *opt, const char *name, const char *contentType, const char *url, PRBool aNotDownloaded) diff --git a/mailnews/mime/src/mimemoz2.h b/mailnews/mime/src/mimemoz2.h index 2e28092520b9..aad0e5e75b85 100644 --- a/mailnews/mime/src/mimemoz2.h +++ b/mailnews/mime/src/mimemoz2.h @@ -176,6 +176,7 @@ extern "C" nsIMimeEmitter *GetMimeEmitter(MimeDisplayOptions *opt); extern "C" nsresult mimeSetNewURL(nsMIMESession *stream, char *url); extern "C" nsresult mimeEmitterAddAttachmentField(MimeDisplayOptions *opt, const char *field, const char *value); extern "C" nsresult mimeEmitterAddHeaderField(MimeDisplayOptions *opt, const char *field, const char *value); +extern "C" nsresult mimeEmitterAddAllHeaders(MimeDisplayOptions *opt, const char *allheaders, const PRInt32 allheadersize); extern "C" nsresult mimeEmitterStartAttachment(MimeDisplayOptions *opt, const char *name, const char *contentType, const char *url, PRBool aNotDownloaded); extern "C" nsresult mimeEmitterEndAttachment(MimeDisplayOptions *opt); diff --git a/mailnews/mime/src/nsMimeHeaders.cpp b/mailnews/mime/src/nsMimeHeaders.cpp index 4fdf816504ed..75246c84a50a 100644 --- a/mailnews/mime/src/nsMimeHeaders.cpp +++ b/mailnews/mime/src/nsMimeHeaders.cpp @@ -38,6 +38,7 @@ #include "msgCore.h" // precompiled header... #include "nsMimeHeaders.h" +#include "prmem.h" nsMimeHeaders::nsMimeHeaders() : mHeaders(nsnull) @@ -76,3 +77,22 @@ nsresult nsMimeHeaders::ExtractHeader(const char *headerName, PRBool getAllOfThe return NS_OK; } +NS_IMETHODIMP nsMimeHeaders::GetAllHeaders(char **_retval) +{ + if (!mHeaders) + return NS_ERROR_NOT_INITIALIZED; + + if (!mHeaders->all_headers) + return NS_ERROR_NULL_POINTER; + + char *allHeaders = (char *) PR_MALLOC(mHeaders->all_headers_fp + 1); + NS_ASSERTION (allHeaders, "nsMimeHeaders - out of memory"); + if (!allHeaders) + return NS_ERROR_OUT_OF_MEMORY; + + memcpy(allHeaders, mHeaders->all_headers, mHeaders->all_headers_fp); + *(allHeaders + mHeaders->all_headers_fp) = 0; + *_retval = allHeaders; + + return NS_OK; +} diff --git a/mailnews/mime/src/nsStreamConverter.cpp b/mailnews/mime/src/nsStreamConverter.cpp index 456ab42cabbe..4dd577a6fb92 100644 --- a/mailnews/mime/src/nsStreamConverter.cpp +++ b/mailnews/mime/src/nsStreamConverter.cpp @@ -992,13 +992,8 @@ nsStreamConverter::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresul if (workHeaders) { - static NS_DEFINE_CID(kCIMimeHeadersCID, NS_IMIMEHEADERS_CID); nsresult rv; - nsCOMPtr mimeHeaders; - - rv = nsComponentManager::CreateInstance(kCIMimeHeadersCID, - nsnull, NS_GET_IID(nsIMimeHeaders), - (void **) getter_AddRefs(mimeHeaders)); + nsCOMPtr mimeHeaders = do_CreateInstance(NS_IMIMEHEADERS_CONTRACTID, &rv); if (NS_SUCCEEDED(rv)) { diff --git a/xpinstall/packager/packages-mac b/xpinstall/packager/packages-mac index 8d2f094c9553..156ea489667b 100644 --- a/xpinstall/packager/packages-mac +++ b/xpinstall/packager/packages-mac @@ -340,6 +340,9 @@ viewer:Essential Files:LDAPClient.shlb viewer:Components:msgsmime.shlb viewer:Components:msgsmime.xpt viewer:Components:smime-service.js +viewer:Components:msgmdn.shlb +viewer:Components:msgmdn.xpt +viewer:Components:mdn-service.js [chatzilla] viewer:Components:chatzilla-service.js diff --git a/xpinstall/packager/packages-static-unix b/xpinstall/packager/packages-static-unix index d5c6901a63c1..2507bf0ab863 100644 --- a/xpinstall/packager/packages-static-unix +++ b/xpinstall/packager/packages-static-unix @@ -254,7 +254,8 @@ bin/components/absync.xpt bin/chrome/messenger.jar bin/components/msgsmime.xpt bin/components/smime-service.js - +bin/components/msgmdn.xpt +bin/components/mdn-service.js [chatzilla] bin/components/chatzilla-service.js diff --git a/xpinstall/packager/packages-static-win b/xpinstall/packager/packages-static-win index 2bbd8604a428..b0c6d749b46a 100644 --- a/xpinstall/packager/packages-static-win +++ b/xpinstall/packager/packages-static-win @@ -271,6 +271,8 @@ bin\components\nsLDAPPrefsService.js bin\components\mozldap.xpt bin\components\msgsmime.xpt bin\components\smime-service.js +bin\components\msgmdn.xpt +bin\components\mdn-service.js bin\components\mapihook.xpt bin\chrome\messenger.jar bin\chrome\messenger\* diff --git a/xpinstall/packager/packages-unix b/xpinstall/packager/packages-unix index e9517fca1bfd..af6887085ed4 100644 --- a/xpinstall/packager/packages-unix +++ b/xpinstall/packager/packages-unix @@ -353,7 +353,9 @@ bin/chrome/messenger.jar bin/components/libmsgsmime.so bin/components/msgsmime.xpt bin/components/smime-service.js - +bin/components/libmsgmdn.so +bin/components/msgmdn.xpt +bin/components/mdn-service.js [chatzilla] bin/components/chatzilla-service.js diff --git a/xpinstall/packager/packages-win b/xpinstall/packager/packages-win index 37e24db68b74..bd927fb1f49a 100644 --- a/xpinstall/packager/packages-win +++ b/xpinstall/packager/packages-win @@ -377,6 +377,9 @@ bin\MapiProxy.dll bin\mozMapi32.dll bin\components\msgMapi.dll bin\components\mapihook.xpt +bin\components\msgmdn.dll +bin\components\msgmdn.xpt +bin\components\mdn-service.js [chatzilla] bin\components\chatzilla-service.js