From b0de2577104353dd8ad53fbc14ee46e7a7e3b87b Mon Sep 17 00:00:00 2001 From: "bsmedberg%covad.net" Date: Mon, 13 Jun 2005 19:54:52 +0000 Subject: [PATCH] Trial backout of just nsCommandLine.cpp from bug 297315. git-svn-id: svn://10.0.0.236/trunk@174523 18797224-902f-48f8-a5cc-f745e15eee43 --- .../commandlines/src/nsCommandLine.cpp | 117 ++++++++++++------ 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/mozilla/toolkit/components/commandlines/src/nsCommandLine.cpp b/mozilla/toolkit/components/commandlines/src/nsCommandLine.cpp index 12b85ef19dd..54612e13df4 100644 --- a/mozilla/toolkit/components/commandlines/src/nsCommandLine.cpp +++ b/mozilla/toolkit/components/commandlines/src/nsCommandLine.cpp @@ -85,12 +85,8 @@ public: protected: ~nsCommandLine() { } - typedef nsresult (*EnumerateCallback)(nsICommandLineHandler* aHandler, - nsICommandLine* aThis, - void *aClosure); - void appendArg(const char* arg); - nsresult EnumerateHandlers(EnumerateCallback aCallback, void *aClosure); + nsresult getHandlers(nsCStringArray& handlers, nsICategoryManager* catman); nsStringArray mArgs; PRUint32 mState; @@ -536,14 +532,10 @@ nsCommandLine::Init(PRInt32 argc, char** argv, nsIFile* aWorkingDir, } nsresult -nsCommandLine::EnumerateHandlers(EnumerateCallback aCallback, void *aClosure) +nsCommandLine::getHandlers(nsCStringArray &handlers, nsICategoryManager* catman) { nsresult rv; - nsCOMPtr catman - (do_GetService(NS_CATEGORYMANAGER_CONTRACTID)); - NS_ENSURE_TRUE(catman, NS_ERROR_UNEXPECTED); - nsCOMPtr entenum; rv = catman->EnumerateCategory("command-line-handler", getter_AddRefs(entenum)); @@ -556,32 +548,37 @@ nsCommandLine::EnumerateHandlers(EnumerateCallback aCallback, void *aClosure) PRBool hasMore; while (NS_SUCCEEDED(strenum->HasMore(&hasMore)) && hasMore) { strenum->GetNext(entry); - - nsXPIDLCString contractID; - rv = catman->GetCategoryEntry("command-line-handler", - entry.get(), - getter_Copies(contractID)); - if (!contractID) - continue; - - nsCOMPtr clh(do_GetService(contractID.get())); - if (!clh) - continue; - - rv = (aCallback)(clh, this, aClosure); - if (rv = NS_ERROR_ABORT) - break; - - rv = NS_OK; + handlers.AppendCString(entry); } - return rv; + handlers.Sort(); + return NS_OK; } -static nsresult -EnumRun(nsICommandLineHandler* aHandler, nsICommandLine* aThis, void*) +struct RunClosure { - return aHandler->Handle(aThis); + nsICommandLine* cl; + nsICategoryManager* catman; +}; + +static PRBool +EnumRun(nsCString& aEntry, void* aData) +{ + nsresult rv; + + RunClosure* closure = NS_STATIC_CAST(RunClosure*, aData); + + nsXPIDLCString value; + rv = closure->catman->GetCategoryEntry("command-line-handler", + aEntry.get(), + getter_Copies(value)); + NS_ENSURE_SUCCESS(rv, PR_TRUE); + + nsCOMPtr clh (do_GetService(value)); + NS_ENSURE_TRUE(clh, PR_TRUE); + + rv = clh->Handle(closure->cl); + return rv != NS_ERROR_ABORT; } NS_IMETHODIMP @@ -589,36 +586,74 @@ nsCommandLine::Run() { nsresult rv; - rv = EnumerateHandlers(EnumRun, nsnull); - if (rv == NS_ERROR_ABORT) - return rv; + nsCOMPtr catman + (do_GetService(NS_CATEGORYMANAGER_CONTRACTID)); + NS_ENSURE_TRUE(catman, NS_ERROR_UNEXPECTED); + + nsCStringArray handlers; + rv = getHandlers(handlers, catman); + NS_ENSURE_SUCCESS(rv, rv); + + RunClosure closure = { this, catman }; + + if (!handlers.EnumerateForwards(&EnumRun, &closure)) + return NS_ERROR_ABORT; return NS_OK; } +struct HelpClosure +{ + HelpClosure(nsACString& aText, nsICategoryManager* aCatman) : + text(aText), catman(aCatman) { } + + nsACString& text; + nsICategoryManager* catman; +}; + static PRBool -EnumHelp(nsICommandLineHandler* aHandler, nsICommandLine* aThis, void* aClosure) +EnumHelp(nsCString& aEntry, void* aData) { nsresult rv; + HelpClosure* closure = NS_STATIC_CAST(HelpClosure*, aData); + + nsXPIDLCString value; + rv = closure->catman->GetCategoryEntry("command-line-handler", + aEntry.get(), + getter_Copies(value)); + NS_ENSURE_SUCCESS(rv, PR_TRUE); + + nsCOMPtr clh (do_GetService(value)); + NS_ENSURE_TRUE(clh, PR_TRUE); + nsCString text; - rv = aHandler->GetHelpInfo(text); + rv = clh->GetHelpInfo(text); if (NS_SUCCEEDED(rv)) { NS_ASSERTION(text.Length() == 0 || text.Last() == '\n', "Help text from command line handlers should end in a newline."); - - nsACString* totalText = NS_REINTERPRET_CAST(nsACString*, aClosure); - totalText->Append(text); + closure->text.Append(text); } - return NS_OK; + return PR_TRUE; } NS_IMETHODIMP nsCommandLine::GetHelpText(nsACString& aResult) { - EnumerateHandlers(EnumRun, &aResult); + nsresult rv; + nsCOMPtr catman + (do_GetService(NS_CATEGORYMANAGER_CONTRACTID)); + NS_ENSURE_TRUE(catman, NS_ERROR_UNEXPECTED); + + nsCStringArray handlers; + rv = getHandlers(handlers, catman); + NS_ENSURE_SUCCESS(rv, rv); + + HelpClosure closure (aResult, catman); + + handlers.EnumerateForwards(EnumHelp, &closure); return NS_OK; }