diff --git a/mozilla/mailnews/base/public/nsIIncomingServerListener.idl b/mozilla/mailnews/base/public/nsIIncomingServerListener.idl index b770c9d7854..a81cd5b8bd0 100644 --- a/mozilla/mailnews/base/public/nsIIncomingServerListener.idl +++ b/mozilla/mailnews/base/public/nsIIncomingServerListener.idl @@ -21,11 +21,11 @@ [scriptable, uuid(E6B64B86-90CB-11d3-8B02-0060B0FC04D2)] interface nsIIncomingServerListener : nsISupports { - /* Notification sent when a server is first loaded into the account manager */ - void OnServerLoaded(in nsIMsgIncomingServer server); - + void onServerLoaded(in nsIMsgIncomingServer server); /* Notification sent when a server is unloaded from the account manager*/ - void OnServerUnloaded(in nsIMsgIncomingServer server); + void onServerUnloaded(in nsIMsgIncomingServer server); + /* Notification sent when a server hostname or username changes */ + void onServerChanged(in nsIMsgIncomingServer server); }; diff --git a/mozilla/mailnews/base/public/nsIMsgAccountManager.idl b/mozilla/mailnews/base/public/nsIMsgAccountManager.idl index d35b085db95..801a31911b1 100644 --- a/mozilla/mailnews/base/public/nsIMsgAccountManager.idl +++ b/mozilla/mailnews/base/public/nsIMsgAccountManager.idl @@ -151,12 +151,13 @@ interface nsIMsgAccountManager : nsISupports { void removeRootFolderListener(in nsIFolderListener listener); // these are going away in favor of add/removeRootFolderListener - void AddIncomingServerListener(in nsIIncomingServerListener serverListener); - void RemoveIncomingServerListener(in nsIIncomingServerListener serverListener); + void addIncomingServerListener(in nsIIncomingServerListener serverListener); + void removeIncomingServerListener(in nsIIncomingServerListener serverListener); // these are going away in favor of nsIFolder::NotifyEvent(in nsIAtom event); - void NotifyServerLoaded(in nsIMsgIncomingServer server); - void NotifyServerUnloaded(in nsIMsgIncomingServer server); + void notifyServerLoaded(in nsIMsgIncomingServer server); + void notifyServerUnloaded(in nsIMsgIncomingServer server); + void notifyServerChanged(in nsIMsgIncomingServer server); // force account info out to prefs file void saveAccountInfo(); diff --git a/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js b/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js index 1b1bee3c398..c8a40226c1a 100644 --- a/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js +++ b/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js @@ -349,6 +349,65 @@ function IsCurrentLoadedFolder(folder) return false; } +function ServerContainsFolder(server, folder) +{ + if (!folder || !server) + return false; + + return server.equals(folder.server); +} + +function SelectServer(server) +{ + SelectFolder(server.RootFolder.URI); +} + +// we have this incoming server listener in case we need to +// alter the folder pane selection when a server is removed +// or changed (currently, when the real username or real hostname change) +var gThreePaneIncomingServerListener = { + onServerLoaded: function(server) {}, + onServerUnloaded: function(server) { + var selectedFolders = GetSelectedMsgFolders(); + for (var i = 0; i < selectedFolders.length; i++) { + if (ServerContainsFolder(server, selectedFolders[i])) { + SelectServer(accountManager.defaultAccount.incomingServer); + // we've made a new selection, we're done + return; + } + } + + // if nothing is selected at this point, better go select the default + // this could happen if nothing was selected when the server was removed + selectedFolders = GetSelectedMsgFolders(); + if (selectedFolders.length == 0) { + SelectServer(accountManager.defaultAccount.incomingServer); + } + }, + onServerChanged: function(server) { + // if the current selected folder is on the server that changed + // and that server is an imap or news server, + // we need to update the selection. + // on those server types, we'll be reconnecting to the server + // and our currently selected folder will need to be reloaded + // or worse, be invalid. + if (server.type != "imap" && server.type !="nntp") + return; + + var selectedFolders = GetSelectedMsgFolders(); + for (var i = 0; i < selectedFolders.length; i++) { + // if the selected item is a server, we don't have to update + // the selection + if (!(selectedFolders[i].isServer) && ServerContainsFolder(server, selectedFolders[i])) { + SelectServer(server); + // we've made a new selection, we're done + return; + } + } + } +} + + /* Functions related to startup */ function OnLoadMessenger() { @@ -373,6 +432,7 @@ function OnLoadMessenger() InitPanes(); accountManager.SetSpecialFoldersForIdentities(); + accountManager.addIncomingServerListener(gThreePaneIncomingServerListener); AddToSession(); //need to add to session before trying to load start folder otherwise listeners aren't @@ -444,6 +504,7 @@ function OnLoadMessenger() function OnUnloadMessenger() { + accountManager.removeIncomingServerListener(gThreePaneIncomingServerListener); OnMailWindowUnload(); } diff --git a/mozilla/mailnews/base/src/nsMsgAccountManager.cpp b/mozilla/mailnews/base/src/nsMsgAccountManager.cpp index cb38d558f38..0549d54d2cf 100644 --- a/mozilla/mailnews/base/src/nsMsgAccountManager.cpp +++ b/mozilla/mailnews/base/src/nsMsgAccountManager.cpp @@ -1625,6 +1625,24 @@ NS_IMETHODIMP nsMsgAccountManager::NotifyServerUnloaded(nsIMsgIncomingServer *se return NS_OK; } +NS_IMETHODIMP nsMsgAccountManager::NotifyServerChanged(nsIMsgIncomingServer *server) +{ + nsresult rv; + PRUint32 count; + rv = m_incomingServerListeners->Count(&count); + if (NS_FAILED(rv)) return rv; + + + for(PRUint32 i = 0; i < count; i++) + { + nsCOMPtr listener = + getter_AddRefs((nsIIncomingServerListener*)m_incomingServerListeners->ElementAt(i)); + listener->OnServerChanged(server); + } + + return NS_OK; +} + NS_IMETHODIMP nsMsgAccountManager::FindServer(const char* username, const char* hostname, diff --git a/mozilla/mailnews/base/src/nsMsgAccountManagerDS.cpp b/mozilla/mailnews/base/src/nsMsgAccountManagerDS.cpp index 6f8cf130787..204e8e7b888 100644 --- a/mozilla/mailnews/base/src/nsMsgAccountManagerDS.cpp +++ b/mozilla/mailnews/base/src/nsMsgAccountManagerDS.cpp @@ -1015,6 +1015,12 @@ nsMsgAccountManagerDataSource::OnServerUnloaded(nsIMsgIncomingServer* aServer) return NS_OK; } +NS_IMETHODIMP +nsMsgAccountManagerDataSource::OnServerChanged(nsIMsgIncomingServer *server) +{ + return NS_OK; +} + nsresult nsMsgAccountManagerDataSource::OnItemPropertyChanged(nsISupports *, nsIAtom *, char const *, char const *) { diff --git a/mozilla/mailnews/base/src/nsMsgBiffManager.cpp b/mozilla/mailnews/base/src/nsMsgBiffManager.cpp index e6d830b53f5..e2ab53b026d 100644 --- a/mozilla/mailnews/base/src/nsMsgBiffManager.cpp +++ b/mozilla/mailnews/base/src/nsMsgBiffManager.cpp @@ -211,6 +211,13 @@ NS_IMETHODIMP nsMsgBiffManager::OnServerUnloaded(nsIMsgIncomingServer *server) return rv; } +NS_IMETHODIMP nsMsgBiffManager::OnServerChanged(nsIMsgIncomingServer *server) +{ + // nothing required. If the hostname or username changed + // the next time biff fires, we'll ping the right server + return NS_OK; +} + NS_IMETHODIMP nsMsgBiffManager::Observe(nsISupports *aSubject, const PRUnichar *aTopic, const PRUnichar *someData) { nsAutoString topicString(aTopic);