nsresult nsMsgAccount::createIncomingServer() { // from here, load mail.account.myaccount.server // Load the incoming server // // ex) mail.account.myaccount.server = "myserver" nsresult rv = getPrefService(); NS_ENSURE_SUCCESS(rv, rv); // get the "server" pref nsCString serverKey; rv = m_prefs->GetCharPref("server", getter_Copies(serverKey)); NS_ENSURE_SUCCESS(rv, rv); // get the server from the account manager nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgIncomingServer> server; rv = accountManager->GetIncomingServer(serverKey, getter_AddRefs(server)); NS_ENSURE_SUCCESS(rv, rv); // store the server in this structure m_incomingServer = server; accountManager->NotifyServerLoaded(server); return NS_OK; }
NS_IMETHODIMP nsMsgAccount::SetIncomingServer(nsIMsgIncomingServer *aIncomingServer) { NS_ENSURE_ARG_POINTER(aIncomingServer); nsCString key; nsresult rv = aIncomingServer->GetKey(key); if (NS_SUCCEEDED(rv)) { rv = getPrefService(); NS_ENSURE_SUCCESS(rv, rv); m_prefs->SetCharPref("server", key.get()); } m_incomingServer = aIncomingServer; bool serverValid; (void) aIncomingServer->GetValid(&serverValid); // only notify server loaded if server is valid so // account manager only gets told about finished accounts. if (serverValid) { // this is the point at which we can notify listeners about the // creation of the root folder, which implies creation of the new server. nsCOMPtr<nsIMsgFolder> rootFolder; rv = aIncomingServer->GetRootFolder(getter_AddRefs(rootFolder)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFolderListener> mailSession = do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); mailSession->OnItemAdded(nullptr, rootFolder); nsCOMPtr<nsIMsgFolderNotificationService> notifier(do_GetService(NS_MSGNOTIFICATIONSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); notifier->NotifyFolderAdded(rootFolder); nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); if (NS_SUCCEEDED(rv)) accountManager->NotifyServerLoaded(aIncomingServer); // Force built-in folders to be created and discovered. Then, notify listeners // about them. nsCOMPtr<nsISimpleEnumerator> enumerator; rv = rootFolder->GetSubFolders(getter_AddRefs(enumerator)); NS_ENSURE_SUCCESS(rv, rv); bool hasMore; while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> item; enumerator->GetNext(getter_AddRefs(item)); nsCOMPtr<nsIMsgFolder> msgFolder(do_QueryInterface(item)); if (!msgFolder) continue; mailSession->OnItemAdded(rootFolder, msgFolder); notifier->NotifyFolderAdded(msgFolder); } } return NS_OK; }
NS_IMETHODIMP nsMsgAccount::ClearAllValues() { nsresult rv; nsCAutoString rootPref("mail.account."); rootPref += m_accountKey; rootPref += '.'; rv = getPrefService(); if (NS_FAILED(rv)) return rv; PRUint32 cntChild, i; char **childArray; rv = m_prefs->GetChildList(rootPref.get(), &cntChild, &childArray); if (NS_SUCCEEDED(rv)) { for (i = 0; i < cntChild; i++) m_prefs->ClearUserPref(childArray[i]); NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(cntChild, childArray); } return rv; }
NS_IMETHODIMP nsMsgAccount::ClearAllValues() { nsresult rv = getPrefService(); NS_ENSURE_SUCCESS(rv, rv); return m_prefs->DeleteBranch(nullptr); }
NS_IMETHODIMP nsMsgAccount::SetKey(const nsACString& accountKey) { // need the prefs service to do anything nsresult rv = getPrefService(); NS_ENSURE_SUCCESS(rv, rv); m_accountKey = accountKey; return Init(); }
/* * set up the m_identities array * do not call this more than once or we'll leak. */ nsresult nsMsgAccount::createIdentities() { NS_ENSURE_TRUE(!m_accountKey.IsEmpty(), NS_ERROR_NOT_INITIALIZED); if (m_identities) return NS_ERROR_FAILURE; NS_NewISupportsArray(getter_AddRefs(m_identities)); // get the pref // ex) mail.account.myaccount.identities = "joe-home,joe-work" nsCAutoString identitiesKeyPref("mail.account."); identitiesKeyPref.Append(m_accountKey); identitiesKeyPref.Append(".identities"); nsCString identityKey; nsresult rv; rv = getPrefService(); NS_ENSURE_SUCCESS(rv, rv); m_prefs->GetCharPref(identitiesKeyPref.get(), getter_Copies(identityKey)); if (identityKey.IsEmpty()) // not an error if no identities, but return NS_OK; // strtok will be unhappy // get the server from the account manager nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); char* newStr = identityKey.BeginWriting(); char* token = NS_strtok(",", &newStr); // temporaries used inside the loop nsCOMPtr<nsIMsgIdentity> identity; nsCAutoString key; // iterate through id1,id2, etc while (token) { key = token; key.StripWhitespace(); // create the account rv = accountManager->GetIdentity(key, getter_AddRefs(identity)); if (NS_SUCCEEDED(rv)) { // ignore error from addIdentityInternal() - if it fails, it fails. rv = addIdentityInternal(identity); NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't create identity"); } // advance to next key, if any token = NS_strtok(",", &newStr); } return rv; }
nsresult nsMsgAccount::SetKey(const char *accountKey) { if (!accountKey) return NS_ERROR_NULL_POINTER; // need the prefs service to do anything nsresult rv = getPrefService(); if (NS_FAILED(rv)) return rv; m_accountKey.Assign(accountKey); return Init(); }
/* * set up the m_identities array * do not call this more than once or we'll leak. */ nsresult nsMsgAccount::createIdentities() { NS_ENSURE_FALSE(m_identities, NS_ERROR_FAILURE); nsresult rv; m_identities = do_CreateInstance(NS_ARRAY_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCString identityKey; rv = getPrefService(); NS_ENSURE_SUCCESS(rv, rv); m_prefs->GetCharPref("identities", identityKey); if (identityKey.IsEmpty()) // not an error if no identities, but return NS_OK; // strtok will be unhappy // get the server from the account manager nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); char* newStr = identityKey.BeginWriting(); char* token = NS_strtok(",", &newStr); // temporaries used inside the loop nsCOMPtr<nsIMsgIdentity> identity; nsAutoCString key; // iterate through id1,id2, etc while (token) { key = token; key.StripWhitespace(); // create the account rv = accountManager->GetIdentity(key, getter_AddRefs(identity)); if (NS_SUCCEEDED(rv)) { // ignore error from addIdentityInternal() - if it fails, it fails. rv = addIdentityInternal(identity); NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't create identity"); } // advance to next key, if any token = NS_strtok(",", &newStr); } return rv; }
nsresult nsMsgAccount::createIncomingServer() { if (!(const char*)m_accountKey) return NS_ERROR_NOT_INITIALIZED; // from here, load mail.account.myaccount.server // Load the incoming server // // ex) mail.account.myaccount.server = "myserver" nsresult rv = getPrefService(); if (NS_FAILED(rv)) return rv; // get the "server" pref nsCAutoString serverKeyPref("mail.account."); serverKeyPref += m_accountKey; serverKeyPref += ".server"; nsXPIDLCString serverKey; rv = m_prefs->GetCharPref(serverKeyPref.get(), getter_Copies(serverKey)); if (NS_FAILED(rv)) return rv; #ifdef DEBUG_alecf printf("\t%s's server: %s\n", (const char*)m_accountKey, (const char*)serverKey); #endif // get the server from the account manager nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgIncomingServer> server; rv = accountManager->GetIncomingServer(serverKey, getter_AddRefs(server)); NS_ENSURE_SUCCESS(rv, rv); // store the server in this structure m_incomingServer = server; accountManager->NotifyServerLoaded(server); return NS_OK; }
/* * set up the m_identities array * do not call this more than once or we'll leak. */ nsresult nsMsgAccount::createIdentities() { NS_ASSERTION(!m_identities, "only call createIdentities() once!"); if (m_identities) return NS_ERROR_FAILURE; NS_ENSURE_TRUE((const char*)m_accountKey, NS_ERROR_NOT_INITIALIZED); NS_NewISupportsArray(getter_AddRefs(m_identities)); // get the pref // ex) mail.account.myaccount.identities = "joe-home,joe-work" nsCAutoString identitiesKeyPref("mail.account."); identitiesKeyPref.Append(m_accountKey); identitiesKeyPref.Append(".identities"); nsXPIDLCString identityKey; nsresult rv; rv = getPrefService(); if (NS_FAILED(rv)) return rv; rv = m_prefs->GetCharPref(identitiesKeyPref.get(), getter_Copies(identityKey)); if (NS_FAILED(rv)) return rv; if (identityKey.IsEmpty()) // not an error if no identities, but return NS_OK; // nsCRT::strtok will be unhappy #ifdef DEBUG_alecf printf("%s's identities: %s\n", (const char*)m_accountKey, (const char*)identityKey); #endif // get the server from the account manager nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; // const-casting because nsCRT::strtok whacks the string, // but safe because identityKey is a copy char* newStr; char* rest = identityKey.BeginWriting(); char* token = nsCRT::strtok(rest, ",", &newStr); // temporaries used inside the loop nsCOMPtr<nsIMsgIdentity> identity; nsCAutoString key; // iterate through id1,id2, etc while (token) { key = token; key.StripWhitespace(); // create the account rv = accountManager->GetIdentity(key.get(), getter_AddRefs(identity)); if (NS_SUCCEEDED(rv)) { // ignore error from addIdentityInternal() - if it fails, it fails. rv = addIdentityInternal(identity); NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't create identity"); } // advance to next key, if any token = nsCRT::strtok(newStr, ",", &newStr); } return rv; }