From 3de383ee7acaa7b89f2505fc1c028984c9a06573 Mon Sep 17 00:00:00 2001 From: Neil Rashbrook Date: Mon, 2 Mar 2009 16:41:22 +0000 Subject: [PATCH] Bug 476150 Move more ParseString users from nsCStringArray to nsTArray r=Standard8 sr=bienvenu --- mailnews/base/src/nsMsgAccountManager.cpp | 30 ++- mailnews/base/util/nsMsgUtils.cpp | 18 -- mailnews/base/util/nsMsgUtils.h | 14 -- mailnews/compose/src/nsMsgComposeService.cpp | 41 ++-- mailnews/compose/src/nsSmtpService.cpp | 186 +++++++------------ mailnews/local/src/nsPop3Protocol.cpp | 18 +- 6 files changed, 102 insertions(+), 205 deletions(-) diff --git a/mailnews/base/src/nsMsgAccountManager.cpp b/mailnews/base/src/nsMsgAccountManager.cpp index a5c0b9da9e..d3b91c96e5 100644 --- a/mailnews/base/src/nsMsgAccountManager.cpp +++ b/mailnews/base/src/nsMsgAccountManager.cpp @@ -104,7 +104,7 @@ #define SERVER_PREFIX "server" #define ID_PREFIX "id" #define ABOUT_TO_GO_OFFLINE_TOPIC "network:offline-about-to-go-offline" -#define ACCOUNT_DELIMITER "," +#define ACCOUNT_DELIMITER ',' #define APPEND_ACCOUNTS_VERSION_PREF_NAME "append_preconfig_accounts.version" #define MAILNEWS_ROOT_PREF "mailnews." #define PREF_MAIL_ACCOUNTMANAGER_APPEND_ACCOUNTS "mail.accountmanager.appendaccounts" @@ -1258,30 +1258,26 @@ nsMsgAccountManager::LoadAccounts() // Get a list of pre-configured accounts nsCString appendAccountList; rv = m_prefs->GetCharPref(PREF_MAIL_ACCOUNTMANAGER_APPEND_ACCOUNTS, getter_Copies(appendAccountList)); + appendAccountList.StripWhitespace(); // If there are pre-configured accounts, we need to add them to the existing list. if (!appendAccountList.IsEmpty()) { if (!accountList.IsEmpty()) { - nsCStringArray existingAccountsArray; - ParseString(accountList.get(), ACCOUNT_DELIMITER, existingAccountsArray); - - // Tokenize the data and add each account if it is not already there + // Tokenize the data and add each account // in the user's current mailnews account list - char *newAccountStr = appendAccountList.BeginWriting(); - char *token = NS_strtok(ACCOUNT_DELIMITER, &newAccountStr); + nsTArray accountsArray; + ParseString(accountList, ACCOUNT_DELIMITER, accountsArray); + PRUint32 i = accountsArray.Length(); - nsCAutoString newAccount; - while (token) { - if (token && *token) { - newAccount.Assign(token); - newAccount.StripWhitespace(); + // Append each account in the pre-configured account list + ParseString(appendAccountList, ACCOUNT_DELIMITER, accountsArray); - if (existingAccountsArray.IndexOf(newAccount) == -1) { - accountList.Append(','); - accountList.Append(newAccount); - } + // Now add each account that does not already appear in the list + for (; i < accountsArray.Length(); i++) { + if (accountsArray.IndexOf(accountsArray[i]) == i) { + accountList.Append(','); + accountList.Append(accountsArray[i]); } - token = NS_strtok(ACCOUNT_DELIMITER, &newAccountStr); } } else { diff --git a/mailnews/base/util/nsMsgUtils.cpp b/mailnews/base/util/nsMsgUtils.cpp index f77ca2bd7c..d0b031acfc 100644 --- a/mailnews/base/util/nsMsgUtils.cpp +++ b/mailnews/base/util/nsMsgUtils.cpp @@ -1862,24 +1862,6 @@ NS_MSG_BASE nsresult MsgGetHeadersFromKeys(nsIMsgDatabase *aDB, const nsTArray count) - array.RemoveCStringAt(array.Count() - 1); - return PR_FALSE; - } - } - } - return PR_TRUE; -} - #ifdef MOZILLA_1_9_1_BRANCH NS_MSG_BASE PRBool ParseString(const nsACString& string, char delimiter, nsTArray& array) { diff --git a/mailnews/base/util/nsMsgUtils.h b/mailnews/base/util/nsMsgUtils.h index 32a54c302f..c5fb0ba6e3 100644 --- a/mailnews/base/util/nsMsgUtils.h +++ b/mailnews/base/util/nsMsgUtils.h @@ -212,20 +212,6 @@ NS_MSG_BASE PRUnichar *MsgEscapeHTML(const PRUnichar *aSourceBuffer, NS_MSG_BASE nsresult MsgGetHeadersFromKeys(nsIMsgDatabase *aDB, const nsTArray &aKeys, nsIMutableArray *aHeaders); -/** - * Parses a given string using the delimiters passed in. Items parsed from the - * string will be appended to the array. - * - * @param string - * The string to parse. - * @param delims - * A set of delimter characters. - * @param array - * The array to append tokens to. - * @deprecated This call needs to be converted to the nsTArray api. - */ -NS_MSG_BASE PRBool ParseString(const char *string, const char *delims, nsCStringArray& array); - #ifdef MOZILLA_1_9_1_BRANCH /** * Parses a given string using the delimiter passed in. Items parsed from the diff --git a/mailnews/compose/src/nsMsgComposeService.cpp b/mailnews/compose/src/nsMsgComposeService.cpp index 40151c9221..f48457bafe 100644 --- a/mailnews/compose/src/nsMsgComposeService.cpp +++ b/mailnews/compose/src/nsMsgComposeService.cpp @@ -133,7 +133,7 @@ static PRBool _just_to_be_sure_we_create_only_one_compose_service_ = PR_FALSE; #define HTMLDOMAINUPDATE_DOMAINLIST_PREF_NAME "global_html_domains" #define USER_CURRENT_HTMLDOMAINLIST_PREF_NAME "html_domains" #define USER_CURRENT_PLAINTEXTDOMAINLIST_PREF_NAME "plaintext_domains" -#define DOMAIN_DELIMITER "," +#define DOMAIN_DELIMITER ',' #ifdef MSGCOMP_TRACE_PERFORMANCE static PRLogModuleInfo *MsgComposeLogModule = nsnull; @@ -1383,6 +1383,7 @@ nsresult nsMsgComposeService::AddGlobalHtmlDomains() rv = prefBranch->GetCharPref(HTMLDOMAINUPDATE_DOMAINLIST_PREF_NAME, getter_Copies(globalHtmlDomainList)); if (NS_SUCCEEDED(rv) && !globalHtmlDomainList.IsEmpty()) { + nsTArray domainArray; // Get user's current HTML domain set for send format nsCString currentHtmlDomainList; @@ -1391,9 +1392,7 @@ nsresult nsMsgComposeService::AddGlobalHtmlDomains() nsCAutoString newHtmlDomainList(currentHtmlDomainList); // Get the current html domain list into new list var - nsCStringArray htmlDomainArray; - if (!currentHtmlDomainList.IsEmpty()) - ParseString(currentHtmlDomainList.get(), DOMAIN_DELIMITER, htmlDomainArray); + ParseString(currentHtmlDomainList, DOMAIN_DELIMITER, domainArray); // Get user's current Plaintext domain set for send format nsCString currentPlaintextDomainList; @@ -1401,30 +1400,22 @@ nsresult nsMsgComposeService::AddGlobalHtmlDomains() NS_ENSURE_SUCCESS(rv,rv); // Get the current plaintext domain list into new list var - nsCStringArray plaintextDomainArray; - if (!currentPlaintextDomainList.IsEmpty()) - ParseString(currentPlaintextDomainList.get(), DOMAIN_DELIMITER, plaintextDomainArray); + ParseString(currentPlaintextDomainList, DOMAIN_DELIMITER, domainArray); - if (htmlDomainArray.Count() || plaintextDomainArray.Count()) { - // Tokenize the data and add each html domain if it is not alredy there in + PRUint32 i = domainArray.Length(); + if (i > 0) { + // Append each domain in the preconfigured html domain list + globalHtmlDomainList.StripWhitespace(); + ParseString(globalHtmlDomainList, DOMAIN_DELIMITER, domainArray); + + // Now add each domain that does not already appear in // the user's current html or plaintext domain lists - char *newData = globalHtmlDomainList.BeginWriting(); - char *token = NS_strtok(DOMAIN_DELIMITER, &newData); - - nsCAutoString htmlDomain; - while (token) { - if (token && *token) { - htmlDomain.Assign(token); - htmlDomain.StripWhitespace(); - - if (htmlDomainArray.IndexOf(htmlDomain) == -1 && - plaintextDomainArray.IndexOf(htmlDomain) == -1) { - if (!newHtmlDomainList.IsEmpty()) - newHtmlDomainList += DOMAIN_DELIMITER; - newHtmlDomainList += htmlDomain; - } + for (; i < domainArray.Length(); i++) { + if (domainArray.IndexOf(domainArray[i]) == i) { + if (!newHtmlDomainList.IsEmpty()) + newHtmlDomainList += DOMAIN_DELIMITER; + newHtmlDomainList += domainArray[i]; } - token = NS_strtok(DOMAIN_DELIMITER, &newData); } } else diff --git a/mailnews/compose/src/nsSmtpService.cpp b/mailnews/compose/src/nsSmtpService.cpp index 96cc99dc91..70e4d3592b 100644 --- a/mailnews/compose/src/nsSmtpService.cpp +++ b/mailnews/compose/src/nsSmtpService.cpp @@ -62,7 +62,7 @@ #include "nsComposeStrings.h" -#define SERVER_DELIMITER "," +#define SERVER_DELIMITER ',' #define APPEND_SERVERS_VERSION_PREF_NAME "append_preconfig_smtpservers.version" #define MAIL_ROOT_PREF "mail." #define PREF_MAIL_SMTPSERVERS "mail.smtpservers" @@ -384,140 +384,80 @@ nsSmtpService::GetSmtpServers(nsISimpleEnumerator **aResult) nsresult nsSmtpService::loadSmtpServers() { - if (mSmtpServersLoaded) - return NS_OK; + if (mSmtpServersLoaded) + return NS_OK; - nsresult rv; - nsCOMPtr prefService(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); - if (NS_FAILED(rv)) return rv; - nsCOMPtr prefRootBranch; - prefService->GetBranch(nsnull, getter_AddRefs(prefRootBranch)); - if (NS_FAILED(rv)) return rv; + nsresult rv; + nsCOMPtr prefService(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); + if (NS_FAILED(rv)) + return rv; + nsCOMPtr prefRootBranch; + prefService->GetBranch(nsnull, getter_AddRefs(prefRootBranch)); + if (NS_FAILED(rv)) + return rv; - nsCString tempServerList; - nsCString serverList; - rv = prefRootBranch->GetCharPref(PREF_MAIL_SMTPSERVERS, getter_Copies(tempServerList)); + nsCString serverList; + rv = prefRootBranch->GetCharPref(PREF_MAIL_SMTPSERVERS, getter_Copies(serverList)); + serverList.StripWhitespace(); - //Get the pref in a tempServerList and then parse it to see if it has dupes. - //if so remove the dupes and then create the serverList. - if (!tempServerList.IsEmpty()) { + nsTArray servers; + ParseString(serverList, SERVER_DELIMITER, servers); - // Tokenize the data and add each smtp server if it is not already there - // in the user's current smtp server list - nsCStringArray servers; - ParseString(tempServerList.get(), SERVER_DELIMITER, servers); - nsCAutoString tempSmtpServer; - for (PRInt32 i = 0; i < servers.Count(); i++) - { - if (servers.IndexOf(* (servers[i])) == i) { - tempSmtpServer.Assign(* (servers[i])); - tempSmtpServer.StripWhitespace(); - if (!serverList.IsEmpty()) - serverList += SERVER_DELIMITER; - serverList += tempSmtpServer; - } - } - } - else { - serverList = tempServerList; - } + /** + * Check to see if we need to add pre-configured smtp servers. + * Following prefs are important to note in understanding the procedure here. + * + * 1. pref("mailnews.append_preconfig_smtpservers.version", version number); + * This pref registers the current version in the user prefs file. A default value + * is stored in mailnews.js file. If a given vendor needs to add more preconfigured + * smtp servers, the default version number can be increased. Comparing version + * number from user's prefs file and the default one from mailnews.js, we + * can add new smtp servers and any other version level changes that need to be done. + * + * 2. pref("mail.smtpservers.appendsmtpservers", ); + * This pref contains the list of pre-configured smp servers that ISP/Vendor wants to + * to add to the existing servers list. + */ + nsCOMPtr defaultsPrefBranch; + rv = prefService->GetDefaultBranch(MAIL_ROOT_PREF, getter_AddRefs(defaultsPrefBranch)); + NS_ENSURE_SUCCESS(rv, rv); - // We need to check if we have any pre-configured smtp servers so that - // those servers can be appended to the list. + nsCOMPtr prefBranch; + rv = prefService->GetBranch(MAIL_ROOT_PREF, getter_AddRefs(prefBranch)); + NS_ENSURE_SUCCESS(rv,rv); + + PRInt32 appendSmtpServersCurrentVersion = 0; + PRInt32 appendSmtpServersDefaultVersion = 0; + rv = prefBranch->GetIntPref(APPEND_SERVERS_VERSION_PREF_NAME, &appendSmtpServersCurrentVersion); + NS_ENSURE_SUCCESS(rv,rv); + + rv = defaultsPrefBranch->GetIntPref(APPEND_SERVERS_VERSION_PREF_NAME, &appendSmtpServersDefaultVersion); + NS_ENSURE_SUCCESS(rv,rv); + + // Update the smtp server list if needed + if (appendSmtpServersCurrentVersion <= appendSmtpServersDefaultVersion) { + // If there are pre-configured servers, add them to the existing server list nsCString appendServerList; rv = prefRootBranch->GetCharPref(PREF_MAIL_SMTPSERVERS_APPEND_SERVERS, getter_Copies(appendServerList)); + appendServerList.StripWhitespace(); + ParseString(appendServerList, SERVER_DELIMITER, servers); - // Get the list of smtp servers (either from regular pref i.e, mail.smtpservers or - // from preconfigured pref mail.smtpservers.appendsmtpservers) and create a keyed - // server list. - if (!serverList.IsEmpty() || !appendServerList.IsEmpty()) { - /** - * Check to see if we need to add pre-configured smtp servers. - * Following prefs are important to note in understanding the procedure here. - * - * 1. pref("mailnews.append_preconfig_smtpservers.version", version number); - * This pref registers the current version in the user prefs file. A default value - * is stored in mailnews.js file. If a given vendor needs to add more preconfigured - * smtp servers, the default version number can be increased. Comparing version - * number from user's prefs file and the default one from mailnews.js, we - * can add new smtp servers and any other version level changes that need to be done. - * - * 2. pref("mail.smtpservers.appendsmtpservers", ); - * This pref contains the list of pre-configured smp servers that ISP/Vendor wants to - * to add to the existing servers list. - */ - nsCOMPtr defaultsPrefBranch; - rv = prefService->GetDefaultBranch(MAIL_ROOT_PREF, getter_AddRefs(defaultsPrefBranch)); - NS_ENSURE_SUCCESS(rv,rv); + // Increase the version number so that updates will happen as and when needed + prefBranch->SetIntPref(APPEND_SERVERS_VERSION_PREF_NAME, appendSmtpServersCurrentVersion + 1); + } - nsCOMPtr prefBranch; - rv = prefService->GetBranch(MAIL_ROOT_PREF, getter_AddRefs(prefBranch)); - NS_ENSURE_SUCCESS(rv,rv); + // use GetServerByKey to check if the key (pref) is already in + // in the list. If not it calls createKeyedServer directly. - PRInt32 appendSmtpServersCurrentVersion = 0; - PRInt32 appendSmtpServersDefaultVersion = 0; - rv = prefBranch->GetIntPref(APPEND_SERVERS_VERSION_PREF_NAME, &appendSmtpServersCurrentVersion); - NS_ENSURE_SUCCESS(rv,rv); + for (PRUint32 i = 0; i < servers.Length(); i++) { + nsCOMPtr server; + GetServerByKey(servers[i].get(), getter_AddRefs(server)); + } - rv = defaultsPrefBranch->GetIntPref(APPEND_SERVERS_VERSION_PREF_NAME, &appendSmtpServersDefaultVersion); - NS_ENSURE_SUCCESS(rv,rv); + saveKeyList(); - // Update the smtp server list if needed - if ((appendSmtpServersCurrentVersion <= appendSmtpServersDefaultVersion)) { - // If there are pre-configured servers, add them to the existing server list - if (!appendServerList.IsEmpty()) { - if (!serverList.IsEmpty()) { - nsCStringArray existingSmtpServersArray; - ParseString(serverList.get(), SERVER_DELIMITER, existingSmtpServersArray); - - // Tokenize the data and add each smtp server if it is not already there - // in the user's current smtp server list - char *newSmtpServerStr = appendServerList.BeginWriting(); - char *token = NS_strtok(SERVER_DELIMITER, &newSmtpServerStr); - - nsCAutoString newSmtpServer; - while (token) { - if (token && *token) { - newSmtpServer.Assign(token); - newSmtpServer.StripWhitespace(); - if (existingSmtpServersArray.IndexOf(newSmtpServer) == -1) { - serverList += ","; - serverList += newSmtpServer; - } - } - token = NS_strtok(SERVER_DELIMITER, &newSmtpServerStr); - } - } - else { - serverList = appendServerList; - } - // Increase the version number so that updates will happen as and when needed - rv = prefBranch->SetIntPref(APPEND_SERVERS_VERSION_PREF_NAME, appendSmtpServersCurrentVersion + 1); - } - } - - char *newStr = serverList.BeginWriting(); - char *pref = NS_strtok(", ", &newStr); - - while (pref) { - // fix for bug #96207 - // code above makes sure that no duplicate entries in mail.smtpservers find - // their way to the mSmtpServers list. But it doesn't check, if a server to be - // added already is in mSmtpServers. That can happen in mail has been sent before - // opening the settings (loading the list). - // use GetServerByKey to check if the key (pref) is already in - // in the list. If not it calls createKeyedServer directly. - nsCOMPtr server; - rv = GetServerByKey(pref, getter_AddRefs(server)); - NS_ASSERTION(NS_SUCCEEDED(rv), "GetServerByKey failed"); - pref = NS_strtok(", ", &newStr); - } - } - - saveKeyList(); - - mSmtpServersLoaded = PR_TRUE; - return NS_OK; + mSmtpServersLoaded = PR_TRUE; + return NS_OK; } // save the list of keys diff --git a/mailnews/local/src/nsPop3Protocol.cpp b/mailnews/local/src/nsPop3Protocol.cpp index e0e07713fa..bf31ab55cf 100644 --- a/mailnews/local/src/nsPop3Protocol.cpp +++ b/mailnews/local/src/nsPop3Protocol.cpp @@ -275,16 +275,18 @@ net_pop3_load_state(const char* searchhost, /* It's a line with a UIDL on it. */ if (current) { - nsCStringArray lineElems; - ParseString(line.get(), " \t", lineElems); - if (lineElems.Count() < 2) + for (PRInt32 pos = line.FindChar('\t'); pos != -1; pos = line.FindChar('\t', pos)) + line.Replace(pos, 1, ' '); + + nsTArray lineElems; + ParseString(line, ' ', lineElems); + if (lineElems.Length() < 2) continue; - nsCString *flags = lineElems[0]; - nsCString *uidl = lineElems[1]; - nsCString *dateReceivedStr = lineElems[2]; // will be null if only 2 elements. + nsCString *flags = &lineElems[0]; + nsCString *uidl = &lineElems[1]; PRUint32 dateReceived = TimeInSecondsFromPRTime(PR_Now()); // if we don't find a date str, assume now. - if (dateReceivedStr && !dateReceivedStr->IsEmpty()) - dateReceived = atoi(dateReceivedStr->get()); + if (lineElems.Length() > 2) + dateReceived = atoi(lineElems[2].get()); if (!flags->IsEmpty() && !uidl->IsEmpty()) { char flag = flags->CharAt(0);