NS_IMETHODIMP nsPop3IncomingServer::GetCanCreateFoldersOnServer(bool *aCanCreateFoldersOnServer) { NS_ENSURE_ARG_POINTER(aCanCreateFoldersOnServer); nsCString deferredToAccount; GetDeferredToAccount(deferredToAccount); *aCanCreateFoldersOnServer = deferredToAccount.IsEmpty(); return NS_OK; }
// user has clicked get new messages on this server. If other servers defer to this server, // we need to get new mail for them. But if this server defers to an other server, // I think we only get new mail for this server. NS_IMETHODIMP nsPop3IncomingServer::GetNewMessages(nsIMsgFolder *aFolder, nsIMsgWindow *aMsgWindow, nsIUrlListener *aUrlListener) { nsresult rv; nsCOMPtr<nsIPop3Service> pop3Service = do_GetService(kCPop3ServiceCID, &rv); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr <nsIMsgFolder> inbox; rv = GetInbox(aMsgWindow, getter_AddRefs(inbox)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr <nsIURI> url; nsCOMPtr <nsIMsgIncomingServer> server; nsCOMPtr <nsISupportsArray> deferredServers; nsCString deferredToAccount; GetDeferredToAccount(deferredToAccount); if (deferredToAccount.IsEmpty()) { aFolder->GetServer(getter_AddRefs(server)); GetDeferredServers(server, getter_AddRefs(deferredServers)); } uint32_t numDeferredServers; if (deferredToAccount.IsEmpty() && deferredServers && NS_SUCCEEDED(deferredServers->Count(&numDeferredServers)) && numDeferredServers > 0) { nsPop3GetMailChainer *getMailChainer = new nsPop3GetMailChainer; NS_ENSURE_TRUE(getMailChainer, NS_ERROR_OUT_OF_MEMORY); getMailChainer->AddRef(); // this object owns itself and releases when done. nsCOMPtr <nsISupports> supports; this->QueryInterface(NS_GET_IID(nsISupports), getter_AddRefs(supports)); deferredServers->InsertElementAt(supports, 0); return getMailChainer->GetNewMailForServers(deferredServers, aMsgWindow, inbox, aUrlListener); } if (m_runningProtocol) return NS_MSG_FOLDER_BUSY; return pop3Service->GetNewMail(aMsgWindow, aUrlListener, inbox, this, getter_AddRefs(url)); }
NS_IMETHODIMP nsPop3IncomingServer::GetRootMsgFolder(nsIMsgFolder **aRootMsgFolder) { NS_ENSURE_ARG_POINTER(aRootMsgFolder); nsresult rv = NS_OK; if (!m_rootMsgFolder) { nsCString deferredToAccount; GetDeferredToAccount(deferredToAccount); if (deferredToAccount.IsEmpty()) { rv = CreateRootFolder(); m_rootMsgFolder = m_rootFolder; } else { nsCOMPtr <nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr <nsIMsgAccount> account; rv = accountManager->GetAccount(deferredToAccount, getter_AddRefs(account)); NS_ENSURE_SUCCESS(rv,rv); if (account) { nsCOMPtr <nsIMsgIncomingServer> incomingServer; rv = account->GetIncomingServer(getter_AddRefs(incomingServer)); NS_ENSURE_SUCCESS(rv,rv); // make sure we're not deferred to ourself... if (incomingServer && incomingServer != this) rv = incomingServer->GetRootMsgFolder(getter_AddRefs(m_rootMsgFolder)); else rv = NS_ERROR_FAILURE; } } } NS_IF_ADDREF(*aRootMsgFolder = m_rootMsgFolder); return m_rootMsgFolder ? rv : NS_ERROR_FAILURE; }
// user has clicked get new messages on this server. If other servers defer to this server, // we need to get new mail for them. But if this server defers to an other server, // I think we only get new mail for this server. NS_IMETHODIMP nsPop3IncomingServer::GetNewMessages(nsIMsgFolder *aFolder, nsIMsgWindow *aMsgWindow, nsIUrlListener *aUrlListener) { nsresult rv; nsCOMPtr<nsIPop3Service> pop3Service = do_GetService(kCPop3ServiceCID, &rv); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr <nsIMsgFolder> inbox; rv = GetInbox(aMsgWindow, getter_AddRefs(inbox)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr <nsIURI> url; nsCOMPtr <nsIMsgIncomingServer> server; nsCOMArray<nsIPop3IncomingServer> deferredServers; nsCString deferredToAccount; GetDeferredToAccount(deferredToAccount); if (deferredToAccount.IsEmpty()) { aFolder->GetServer(getter_AddRefs(server)); GetDeferredServers(server, deferredServers); } if (deferredToAccount.IsEmpty() && !deferredServers.IsEmpty()) { nsPop3GetMailChainer *getMailChainer = new nsPop3GetMailChainer; NS_ENSURE_TRUE(getMailChainer, NS_ERROR_OUT_OF_MEMORY); getMailChainer->AddRef(); // this object owns itself and releases when done. deferredServers.InsertElementAt(0, this); return getMailChainer->GetNewMailForServers(deferredServers.Elements(), deferredServers.Length(), aMsgWindow, inbox, aUrlListener); } if (m_runningProtocol) return NS_MSG_FOLDER_BUSY; return pop3Service->GetNewMail(aMsgWindow, aUrlListener, inbox, this, getter_AddRefs(url)); }
NS_IMETHODIMP nsPop3IncomingServer::SetDeferredToAccount(const nsACString& aAccountKey) { nsCString deferredToAccount; GetDeferredToAccount(deferredToAccount); m_rootMsgFolder = nullptr; // clear this so we'll recalculate it on demand. //Notify listeners who listen to every folder nsresult rv = SetCharValue("deferred_to_account", aAccountKey); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFolderListener> folderListenerManager = do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIMsgFolder> rootFolder; // use GetRootFolder, because that returns the real // root, not the deferred to root. rv = GetRootFolder(getter_AddRefs(rootFolder)); if (rootFolder) { // if isDeferred state has changed, send notification if (aAccountKey.IsEmpty() != deferredToAccount.IsEmpty()) { nsCOMPtr <nsIAtom> deferAtom = MsgGetAtom("isDeferred"); nsCOMPtr <nsIAtom> canFileAtom = MsgGetAtom("CanFileMessages"); folderListenerManager->OnItemBoolPropertyChanged(rootFolder, deferAtom, !deferredToAccount.IsEmpty(), deferredToAccount.IsEmpty()); folderListenerManager->OnItemBoolPropertyChanged(rootFolder, canFileAtom, deferredToAccount.IsEmpty(), !deferredToAccount.IsEmpty()); // this hack causes the account manager ds to send notifications to the // xul content builder that make the changed acct appear or disappear // from the folder pane and related menus. nsCOMPtr<nsIMsgAccountManager> acctMgr = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID); if (acctMgr) { acctMgr->NotifyServerUnloaded(this); acctMgr->NotifyServerLoaded(this); // check if this newly deferred to account is the local folders account // and needs to have a newly created INBOX. if (!aAccountKey.IsEmpty()) { nsCOMPtr <nsIMsgAccount> account; acctMgr->GetAccount(aAccountKey, getter_AddRefs(account)); if (account) { nsCOMPtr <nsIMsgIncomingServer> server; account->GetIncomingServer(getter_AddRefs(server)); if (server) { nsCOMPtr <nsILocalMailIncomingServer> incomingLocalServer = do_QueryInterface(server); if (incomingLocalServer) { nsCOMPtr <nsIMsgFolder> rootFolder; rv = server->GetRootFolder(getter_AddRefs(rootFolder)); NS_ENSURE_SUCCESS(rv, rv); // this will fail if it already exists, which is fine. rootFolder->CreateSubfolder(NS_LITERAL_STRING("Inbox"), nullptr); } } } } } } } } return rv; }