diff --git a/mozilla/mailnews/base/public/nsIMsgMailNewsUrl.idl b/mozilla/mailnews/base/public/nsIMsgMailNewsUrl.idl index 9b97010282d..63b3d789790 100644 --- a/mozilla/mailnews/base/public/nsIMsgMailNewsUrl.idl +++ b/mozilla/mailnews/base/public/nsIMsgMailNewsUrl.idl @@ -50,6 +50,8 @@ interface nsIMsgMailNewsUrl : nsIURL { // the ownership model for msg feedback void SetStatusFeedback(in nsIMsgStatusFeedback aMsgFeedback); void GetStatusFeedback(out nsIMsgStatusFeedback aMsgFeedback); + + attribute boolean updatingFolder; }; ////////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/mailnews/base/util/nsMsgDBFolder.cpp b/mozilla/mailnews/base/util/nsMsgDBFolder.cpp index b5477666d5f..2f13606f5cc 100644 --- a/mozilla/mailnews/base/util/nsMsgDBFolder.cpp +++ b/mozilla/mailnews/base/util/nsMsgDBFolder.cpp @@ -25,6 +25,7 @@ #include "nsIMsgFolderCacheElement.h" #include "nsIMsgMailSession.h" #include "nsMsgBaseCID.h" +#include "nsIMsgMailNewsUrl.h" static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID); static NS_DEFINE_CID(kMsgMailSessionCID, NS_MSGMAILSESSION_CID); @@ -40,6 +41,10 @@ NS_IMETHODIMP nsMsgDBFolder::QueryInterface(REFNSIID aIID, void** aInstancePtr) { *aInstancePtr = NS_STATIC_CAST(nsIDBChangeListener*, this); } + else if (aIID.Equals(nsCOMTypeInfo::GetIID())) + { + *aInstancePtr = NS_STATIC_CAST(nsIUrlListener*, this); + } if(*aInstancePtr) { @@ -485,3 +490,33 @@ nsMsgDBFolder::MarkAllMessagesRead(void) return rv; } +NS_IMETHODIMP +nsMsgDBFolder::OnStartRunningUrl(nsIURI *aUrl) +{ + NS_PRECONDITION(aUrl, "just a sanity check"); + return NS_OK; +} + +NS_IMETHODIMP +nsMsgDBFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode) +{ + nsresult rv = NS_OK; + + NS_PRECONDITION(aUrl, "just a sanity check"); + nsCOMPtr mailUrl = do_QueryInterface(aUrl); + if (mailUrl) + { + PRBool updatingFolder = PR_FALSE; + if (NS_SUCCEEDED(mailUrl->GetUpdatingFolder(&updatingFolder)) && updatingFolder) + { + PRInt32 i; + for(i = 0; i < mListeners->Count(); i++) + { + //Folderlistener's aren't refcounted. + nsIFolderListener *listener = (nsIFolderListener*)mListeners->ElementAt(i); + listener->OnFolderLoaded(this); + } + } + } + return NS_OK; +} diff --git a/mozilla/mailnews/base/util/nsMsgDBFolder.h b/mozilla/mailnews/base/util/nsMsgDBFolder.h index 06c6da3606a..5491b83613d 100644 --- a/mozilla/mailnews/base/util/nsMsgDBFolder.h +++ b/mozilla/mailnews/base/util/nsMsgDBFolder.h @@ -26,6 +26,7 @@ #include "nsIMessage.h" #include "nsCOMPtr.h" #include "nsIDBChangeListener.h" +#include "nsIUrlListener.h" class nsIMsgFolderCacheElement; /* @@ -33,7 +34,7 @@ class nsIMsgFolderCacheElement; * class derived from nsMsgFolder for those folders that use an nsIMsgDatabase */ -class NS_MSG_BASE nsMsgDBFolder: public nsMsgFolder, public nsIDBChangeListener +class NS_MSG_BASE nsMsgDBFolder: public nsMsgFolder, public nsIDBChangeListener, public nsIUrlListener { public: nsMsgDBFolder(void); @@ -50,6 +51,8 @@ public: NS_DECL_ISUPPORTS_INHERITED + NS_DECL_NSIURLLISTENER + NS_IMETHOD WriteToFolderCache(nsIMsgFolderCache *folderCache); NS_IMETHOD WriteToFolderCacheElem(nsIMsgFolderCacheElement *element); NS_IMETHOD ManyHeadersToDownload(PRBool *_retval); diff --git a/mozilla/mailnews/base/util/nsMsgMailNewsUrl.cpp b/mozilla/mailnews/base/util/nsMsgMailNewsUrl.cpp index 249ec143a42..37fe51dcf1c 100644 --- a/mozilla/mailnews/base/util/nsMsgMailNewsUrl.cpp +++ b/mozilla/mailnews/base/util/nsMsgMailNewsUrl.cpp @@ -33,6 +33,7 @@ nsMsgMailNewsUrl::nsMsgMailNewsUrl() // nsIURI specific state m_errorMessage = nsnull; m_runningUrl = PR_FALSE; + m_updatingFolder = PR_FALSE; nsComponentManager::CreateInstance(kUrlListenerManagerCID, nsnull, nsCOMTypeInfo::GetIID(), (void **) getter_AddRefs(m_urlListeners)); nsComponentManager::CreateInstance(kStandardUrlCID, nsnull, nsCOMTypeInfo::GetIID(), (void **) getter_AddRefs(m_baseURL)); @@ -214,6 +215,21 @@ NS_IMETHODIMP nsMsgMailNewsUrl::GetStatusFeedback(nsIMsgStatusFeedback **aMsgFee return rv; } +NS_IMETHODIMP nsMsgMailNewsUrl::GetUpdatingFolder(PRBool *aResult) +{ + if (!aResult) + return NS_ERROR_NULL_POINTER; + *aResult = m_updatingFolder; + return NS_OK; +} + +NS_IMETHODIMP nsMsgMailNewsUrl::SetUpdatingFolder(PRBool updatingFolder) +{ + m_updatingFolder = updatingFolder; + return NS_OK; +} + + //////////////////////////////////////////////////////////////////////////////////// // End nsIMsgMailNewsUrl specific support //////////////////////////////////////////////////////////////////////////////////// @@ -355,3 +371,4 @@ NS_IMETHODIMP nsMsgMailNewsUrl::DirFile(char **o_DirFile) { return m_baseURL->DirFile(o_DirFile); } + diff --git a/mozilla/mailnews/base/util/nsMsgMailNewsUrl.h b/mozilla/mailnews/base/util/nsMsgMailNewsUrl.h index b3dab436136..74c0b847988 100644 --- a/mozilla/mailnews/base/util/nsMsgMailNewsUrl.h +++ b/mozilla/mailnews/base/util/nsMsgMailNewsUrl.h @@ -56,6 +56,7 @@ protected: nsCOMPtr m_statusFeedback; char *m_errorMessage; PRBool m_runningUrl; + PRBool m_updatingFolder; // manager of all of current url listeners.... nsCOMPtr m_urlListeners; diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp index 151e5c7c567..1e5d8cf1add 100644 --- a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp @@ -2563,6 +2563,8 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode) break; } } + // give base class a chance to send folder loaded notification... + rv = nsMsgDBFolder::OnStopRunningUrl(aUrl, aExitCode); // query it for a mailnews interface for now.... nsCOMPtr mailUrl = do_QueryInterface(aUrl); if (mailUrl) diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.h b/mozilla/mailnews/imap/src/nsImapMailFolder.h index eacb3dce28e..fcea8b5a3a4 100644 --- a/mozilla/mailnews/imap/src/nsImapMailFolder.h +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.h @@ -87,8 +87,7 @@ class nsImapMailFolder : public nsMsgDBFolder, public nsIImapExtensionSink, public nsIImapMiscellaneousSink, public nsICopyMessageListener, - public nsIUrlListener - ,public nsIMsgFilterHitNotify + public nsIMsgFilterHitNotify { public: nsImapMailFolder(); diff --git a/mozilla/mailnews/imap/src/nsImapService.cpp b/mozilla/mailnews/imap/src/nsImapService.cpp index abb26ae39a3..e9dfdd2f961 100644 --- a/mozilla/mailnews/imap/src/nsImapService.cpp +++ b/mozilla/mailnews/imap/src/nsImapService.cpp @@ -122,7 +122,7 @@ nsImapService::SelectFolder(nsIEventQueue * aClientEventQueue, nsCOMPtr mailNewsUrl = do_QueryInterface(imapUrl); mailNewsUrl->SetStatusFeedback(aStatusFeedback); - + mailNewsUrl->SetUpdatingFolder(PR_TRUE); rv = SetImapUrlSink(aImapMailFolder, imapUrl); if (NS_SUCCEEDED(rv)) diff --git a/mozilla/mailnews/local/src/nsLocalMailFolder.cpp b/mozilla/mailnews/local/src/nsLocalMailFolder.cpp index 941cd416fde..71a06014fa2 100644 --- a/mozilla/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mozilla/mailnews/local/src/nsLocalMailFolder.cpp @@ -313,7 +313,7 @@ nsresult nsMsgLocalMailFolder::ParseFolder(nsFileSpec& path) if(!parser) return NS_ERROR_OUT_OF_MEMORY; - rv = mailboxService->ParseMailbox(path, parser, nsnull, nsnull); + rv = mailboxService->ParseMailbox(path, parser, this, nsnull); return rv; } diff --git a/mozilla/mailnews/local/src/nsMailboxService.cpp b/mozilla/mailnews/local/src/nsMailboxService.cpp index bc4f08f3107..e708b86dc4d 100644 --- a/mozilla/mailnews/local/src/nsMailboxService.cpp +++ b/mozilla/mailnews/local/src/nsMailboxService.cpp @@ -99,6 +99,7 @@ nsresult nsMailboxService::ParseMailbox(nsFileSpec& aMailboxPath, nsIStreamListe nsCOMPtr url = do_QueryInterface(mailboxurl); // okay now generate the url string nsFilePath filePath(aMailboxPath); // convert to file url representation... + url->SetUpdatingFolder(PR_TRUE); char * urlSpec = PR_smprintf("mailbox://%s", (const char *) filePath); url->SetSpec(urlSpec); PR_FREEIF(urlSpec);