diff --git a/mozilla/mailnews/base/public/nsIMsgAccountManager.idl b/mozilla/mailnews/base/public/nsIMsgAccountManager.idl index 4fa47e10e38..7a8e5420905 100644 --- a/mozilla/mailnews/base/public/nsIMsgAccountManager.idl +++ b/mozilla/mailnews/base/public/nsIMsgAccountManager.idl @@ -121,6 +121,7 @@ interface nsIMsgAccountManager : nsISupports { void WriteToFolderCache(in nsIMsgFolderCache folderCache); + void CloseCachedConnections(); /* search for 4.x mailnews prefs, and migrate to 5.0 prefs */ void UpgradePrefs(); }; diff --git a/mozilla/mailnews/base/public/nsIMsgIncomingServer.idl b/mozilla/mailnews/base/public/nsIMsgIncomingServer.idl index e448fc6eb49..3ba4443e559 100644 --- a/mozilla/mailnews/base/public/nsIMsgIncomingServer.idl +++ b/mozilla/mailnews/base/public/nsIMsgIncomingServer.idl @@ -83,6 +83,9 @@ interface nsIMsgIncomingServer : nsISupports { void WriteToFolderCache(in nsIMsgFolderCache folderCache); + // either we're going offline, or shutting down. + void CloseCachedConnections(); + /* access to generic attributes */ boolean getBoolValue(in string attr); void setBoolValue(in string attr, in boolean value); diff --git a/mozilla/mailnews/base/src/nsMsgAccountManager.cpp b/mozilla/mailnews/base/src/nsMsgAccountManager.cpp index 4f2234ea365..b47c36f4c9c 100644 --- a/mozilla/mailnews/base/src/nsMsgAccountManager.cpp +++ b/mozilla/mailnews/base/src/nsMsgAccountManager.cpp @@ -398,6 +398,7 @@ private: // write out the server's cache through the given folder cache static PRBool writeFolderCache(nsHashKey *aKey, void *aData, void *closure); + static PRBool closeCachedConnections(nsHashKey *aKey, void *aData, void *closure); // methods for migration / upgrading nsresult MigrateIdentity(nsIMsgIdentity *identity); @@ -474,7 +475,7 @@ nsMsgAccountManager::nsMsgAccountManager() : nsMsgAccountManager::~nsMsgAccountManager() { - + CloseCachedConnections(); if (m_prefs) nsServiceManager::ReleaseService(kPrefServiceCID, m_prefs); UnloadAccounts(); NS_IF_RELEASE(m_accounts); @@ -842,6 +843,16 @@ PRBool nsMsgAccountManager::writeFolderCache(nsHashKey *aKey, void *aData, return PR_TRUE; } +// enumaration for closing cached connections. +PRBool nsMsgAccountManager::closeCachedConnections(nsHashKey *aKey, void *aData, + void *closure) +{ + nsIMsgIncomingServer *server = (nsIMsgIncomingServer*)aData; + + server->CloseCachedConnections(); + return PR_TRUE; +} + /* readonly attribute nsISupportsArray accounts; */ NS_IMETHODIMP @@ -1094,6 +1105,12 @@ nsMsgAccountManager::UnloadAccounts() return NS_OK; } +NS_IMETHODIMP +nsMsgAccountManager::CloseCachedConnections() +{ + m_incomingServers.Enumerate(closeCachedConnections, nsnull); + return NS_OK; +} NS_IMETHODIMP nsMsgAccountManager::WriteToFolderCache(nsIMsgFolderCache *folderCache) diff --git a/mozilla/mailnews/base/src/nsMsgMailSession.cpp b/mozilla/mailnews/base/src/nsMsgMailSession.cpp index e2efbd3b66c..5fbb25c5fcd 100644 --- a/mozilla/mailnews/base/src/nsMsgMailSession.cpp +++ b/mozilla/mailnews/base/src/nsMsgMailSession.cpp @@ -53,6 +53,7 @@ nsMsgMailSession::~nsMsgMailSession() { // if (m_msgFolderCache) // m_accountManager->WriteToFolderCache(m_msgFolderCache); + m_accountManager->CloseCachedConnections(); m_accountManager->UnloadAccounts(); } diff --git a/mozilla/mailnews/base/util/nsMsgIncomingServer.cpp b/mozilla/mailnews/base/util/nsMsgIncomingServer.cpp index 81f9db172fd..2a271675441 100644 --- a/mozilla/mailnews/base/util/nsMsgIncomingServer.cpp +++ b/mozilla/mailnews/base/util/nsMsgIncomingServer.cpp @@ -123,6 +123,14 @@ NS_IMETHODIMP nsMsgIncomingServer::WriteToFolderCache(nsIMsgFolderCache *folderC return rv; } +NS_IMETHODIMP +nsMsgIncomingServer::CloseCachedConnections() +{ + // derived class should override if they cache connections. + return NS_OK; +} + + NS_IMETHODIMP nsMsgIncomingServer::GetServerURI(char **) { diff --git a/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp b/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp index c5c31ab4dc8..94711e64f0b 100644 --- a/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp +++ b/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp @@ -74,6 +74,7 @@ public: NS_DECL_NSIIMAPSERVERSINK NS_IMETHOD PerformBiff(); + NS_IMETHOD CloseCachedConnections(); protected: nsresult GetFolder(const char* name, nsIMsgFolder** pFolder); @@ -524,6 +525,30 @@ NS_IMETHODIMP nsImapIncomingServer::PerformBiff() return rv; } +NS_IMETHODIMP +nsImapIncomingServer::CloseCachedConnections() +{ + + nsCOMPtr connection; + PR_CEnterMonitor(this); + + // iterate through the connection cache closing open connections. + PRUint32 cnt; + nsCOMPtr aSupport; + + nsresult rv = m_connectionCache->Count(&cnt); + if (NS_FAILED(rv)) return rv; + for (PRUint32 i = 0; i < cnt; i++) + { + aSupport = getter_AddRefs(m_connectionCache->ElementAt(i)); + connection = do_QueryInterface(aSupport); + if (connection) + rv = connection->TellThreadToDie(PR_TRUE); + } + + PR_CExitMonitor(this); + return rv; +} nsresult NS_NewImapIncomingServer(const nsIID& iid, void **result) @@ -1323,7 +1348,6 @@ NS_IMETHODIMP nsImapIncomingServer::PseudoInterruptMsgLoad(nsIMsgFolder *aFolder PRBool canRunUrl = PR_FALSE; PRBool hasToWait = PR_FALSE; nsCOMPtr connection; - nsCOMPtr freeConnection; PRBool isBusy = PR_FALSE; PRBool isInboxConnection = PR_FALSE;