From 7cb570ad1bd7fa00ac2012d885aec8dd2b181e74 Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Sat, 26 Feb 2000 03:52:06 +0000 Subject: [PATCH] fix for #28911, r=alecf, a=jar. avoid loading in unnecessary dlls at startup. --- editor/base/nsEditorRegistration.cpp | 8 +- editor/base/nsEditorService.cpp | 2 +- editor/libeditor/base/nsEditorService.cpp | 2 +- .../libeditor/build/nsEditorRegistration.cpp | 8 +- mailnews/addrbook/build/nsAbBaseCID.h | 3 + mailnews/addrbook/build/nsAbFactory.cpp | 6 +- mailnews/addrbook/src/nsAddressBook.cpp | 2 +- mailnews/base/build/nsMsgBaseCID.h | 2 + mailnews/base/build/nsMsgFactory.cpp | 4 +- mailnews/base/src/nsMessengerBootstrap.cpp | 9 +- mailnews/compose/build/nsMsgCompCID.h | 2 + mailnews/compose/build/nsMsgCompFactory.cpp | 4 + mailnews/compose/src/nsMsgComposeService.cpp | 2 +- mailnews/news/build/nsMsgNewsCID.h | 3 + mailnews/news/build/nsMsgNewsFactory.cpp | 4 + mailnews/news/src/nsNntpService.cpp | 2 +- xpfe/appshell/public/nsICmdLineHandler.idl | 1 + xpfe/bootstrap/nsAppRunner.cpp | 326 ++++++++++++------ xpfe/browser/public/nsIBrowserInstance.idl | 4 +- xpfe/browser/src/nsBrowserInstance.cpp | 16 +- .../startup/public/nsICmdLineHandler.idl | 1 + 21 files changed, 284 insertions(+), 127 deletions(-) diff --git a/editor/base/nsEditorRegistration.cpp b/editor/base/nsEditorRegistration.cpp index 2ff6bd0d49a3..b6702bb9d77f 100644 --- a/editor/base/nsEditorRegistration.cpp +++ b/editor/base/nsEditorRegistration.cpp @@ -65,9 +65,15 @@ static nsModuleComponentInfo components[] = { { "Editor Shell Spell Checker", NS_EDITORSHELL_CID, "component://netscape/editor/editorspellcheck", nsEditorShellConstructor, }, { "Editor Service", NS_EDITORSERVICE_CID, - "component://netscape/editor/editorservice", nsEditorServiceConstructor, + "component://netscape/editor/editorservice", nsEditorServiceConstructor,}, + { "Editor Startup Handler", NS_EDITORSERVICE_CID, + "component://netscape/commandlinehander/general-startup-editor", + nsEditorServiceConstructor, nsEditorService::RegisterProc, nsEditorService::UnregisterProc, }, + { "Edit Startup Handler", NS_EDITORSERVICE_CID, + "component://netscape/commandlinehander/general-startup-edit", + nsEditorServiceConstructor, }, }; //////////////////////////////////////////////////////////////////////// diff --git a/editor/base/nsEditorService.cpp b/editor/base/nsEditorService.cpp index ae711420308f..dd71a8e6699c 100644 --- a/editor/base/nsEditorService.cpp +++ b/editor/base/nsEditorService.cpp @@ -38,4 +38,4 @@ NS_IMPL_QUERY_INTERFACE2(nsEditorService, nsIEditorService, nsICmdLineHandler) -CMDLINEHANDLER_IMPL(nsEditorService,"-edit","general.startup.editor","chrome://editor/content/","Start with editor.","component://netscape/editor/editorservice","Editor Cmd Line Handler", PR_TRUE,"about:blank", PR_TRUE) +CMDLINEHANDLER_IMPL(nsEditorService,"-edit","general.startup.editor","chrome://editor/content/","Start with editor.","component://netscape/commandlinehander/general-startup-editor","Editor Startup Handler", PR_TRUE,"about:blank", PR_TRUE) diff --git a/editor/libeditor/base/nsEditorService.cpp b/editor/libeditor/base/nsEditorService.cpp index ae711420308f..dd71a8e6699c 100644 --- a/editor/libeditor/base/nsEditorService.cpp +++ b/editor/libeditor/base/nsEditorService.cpp @@ -38,4 +38,4 @@ NS_IMPL_QUERY_INTERFACE2(nsEditorService, nsIEditorService, nsICmdLineHandler) -CMDLINEHANDLER_IMPL(nsEditorService,"-edit","general.startup.editor","chrome://editor/content/","Start with editor.","component://netscape/editor/editorservice","Editor Cmd Line Handler", PR_TRUE,"about:blank", PR_TRUE) +CMDLINEHANDLER_IMPL(nsEditorService,"-edit","general.startup.editor","chrome://editor/content/","Start with editor.","component://netscape/commandlinehander/general-startup-editor","Editor Startup Handler", PR_TRUE,"about:blank", PR_TRUE) diff --git a/editor/libeditor/build/nsEditorRegistration.cpp b/editor/libeditor/build/nsEditorRegistration.cpp index 2ff6bd0d49a3..b6702bb9d77f 100644 --- a/editor/libeditor/build/nsEditorRegistration.cpp +++ b/editor/libeditor/build/nsEditorRegistration.cpp @@ -65,9 +65,15 @@ static nsModuleComponentInfo components[] = { { "Editor Shell Spell Checker", NS_EDITORSHELL_CID, "component://netscape/editor/editorspellcheck", nsEditorShellConstructor, }, { "Editor Service", NS_EDITORSERVICE_CID, - "component://netscape/editor/editorservice", nsEditorServiceConstructor, + "component://netscape/editor/editorservice", nsEditorServiceConstructor,}, + { "Editor Startup Handler", NS_EDITORSERVICE_CID, + "component://netscape/commandlinehander/general-startup-editor", + nsEditorServiceConstructor, nsEditorService::RegisterProc, nsEditorService::UnregisterProc, }, + { "Edit Startup Handler", NS_EDITORSERVICE_CID, + "component://netscape/commandlinehander/general-startup-edit", + nsEditorServiceConstructor, }, }; //////////////////////////////////////////////////////////////////////// diff --git a/mailnews/addrbook/build/nsAbBaseCID.h b/mailnews/addrbook/build/nsAbBaseCID.h index 30b13db3a002..16d639df7fdb 100644 --- a/mailnews/addrbook/build/nsAbBaseCID.h +++ b/mailnews/addrbook/build/nsAbBaseCID.h @@ -33,6 +33,9 @@ #define NS_ADDRESSBOOK_PROGID \ "component://netscape/addressbook" +#define NS_ADDRESSBOOKSTARTUPHANDLER_PROGID \ + "component://netscape/commandlinehander/general-startup-addressbook" + #define NS_ADDRESSBOOK_CID \ { /* {D60B84F2-2A8C-11d3-9E07-00A0C92B5F0D} */ \ 0xd60b84f2, 0x2a8c, 0x11d3, \ diff --git a/mailnews/addrbook/build/nsAbFactory.cpp b/mailnews/addrbook/build/nsAbFactory.cpp index 5ca628537b44..4bf5c323dff8 100644 --- a/mailnews/addrbook/build/nsAbFactory.cpp +++ b/mailnews/addrbook/build/nsAbFactory.cpp @@ -64,9 +64,13 @@ static nsModuleComponentInfo components[] = { "Address Book", NS_ADDRESSBOOK_CID, NS_ADDRESSBOOK_PROGID, + nsAddressBookConstructor }, + { "Address Book Startup Handler", + NS_ADDRESSBOOK_CID, + NS_ADDRESSBOOKSTARTUPHANDLER_PROGID, nsAddressBookConstructor, nsAddressBook::RegisterProc, - nsAddressBook::UnregisterProc }, + nsAddressBook::UnregisterProc }, { "Address Book Directory Datasource", NS_ABDIRECTORYDATASOURCE_CID, NS_ABDIRECTORYDATASOURCE_PROGID, diff --git a/mailnews/addrbook/src/nsAddressBook.cpp b/mailnews/addrbook/src/nsAddressBook.cpp index ef8b2cc33cfa..cfd55dd2bd68 100644 --- a/mailnews/addrbook/src/nsAddressBook.cpp +++ b/mailnews/addrbook/src/nsAddressBook.cpp @@ -1272,4 +1272,4 @@ NS_IMETHODIMP nsAddressBook::ImportAddressBook() return rv; } -CMDLINEHANDLER_IMPL(nsAddressBook,"-addressbook","general.startup.addressbook","chrome://addressbook/content/","Start with the addressbook.",NS_ADDRESSBOOK_PROGID,"Addressbook Cmd Line Handler",PR_FALSE,"", PR_TRUE) +CMDLINEHANDLER_IMPL(nsAddressBook,"-addressbook","general.startup.addressbook","chrome://addressbook/content/","Start with the addressbook.",NS_ADDRESSBOOKSTARTUPHANDLER_PROGID,"Addressbook Startup Handler",PR_FALSE,"", PR_TRUE) diff --git a/mailnews/base/build/nsMsgBaseCID.h b/mailnews/base/build/nsMsgBaseCID.h index e5d70c7ac5f2..b64ee026b061 100644 --- a/mailnews/base/build/nsMsgBaseCID.h +++ b/mailnews/base/build/nsMsgBaseCID.h @@ -235,6 +235,8 @@ // #define NS_MESSENGERBOOTSTRAP_PROGID \ "component://netscape/appshell/component/messenger" +#define NS_MAILSTARTUPHANDLER_PROGID \ + "component://netscape/commandlinehander/general-startup-mail" // // nsMessenger diff --git a/mailnews/base/build/nsMsgFactory.cpp b/mailnews/base/build/nsMsgFactory.cpp index 463862370a84..a0d931e54f82 100644 --- a/mailnews/base/build/nsMsgFactory.cpp +++ b/mailnews/base/build/nsMsgFactory.cpp @@ -440,7 +440,9 @@ struct Components { // The list of components we register static Components gComponents[] = { { "Netscape Messenger Bootstrapper", &kCMessengerBootstrapCID, - NS_MESSENGERBOOTSTRAP_PROGID, + NS_MESSENGERBOOTSTRAP_PROGID }, + { "Mail Startup Handler", &kCMessengerBootstrapCID, + NS_MAILSTARTUPHANDLER_PROGID, nsMessengerBootstrap::RegisterProc, nsMessengerBootstrap::UnregisterProc }, { "UrlListenerManager", &kCUrlListenerManagerCID, diff --git a/mailnews/base/src/nsMessengerBootstrap.cpp b/mailnews/base/src/nsMessengerBootstrap.cpp index 30926f555edf..8bc90100e0ce 100644 --- a/mailnews/base/src/nsMessengerBootstrap.cpp +++ b/mailnews/base/src/nsMessengerBootstrap.cpp @@ -50,14 +50,19 @@ nsresult nsMessengerBootstrap::Initialize(nsIAppShellService*, nsICmdLineService*) { +#if 0 + // not needed? nsresult rv; nsCOMPtr bootstrapper; rv = this->QueryInterface(kISupportsIID, getter_AddRefs(bootstrapper)); if (NS_SUCCEEDED(rv) && bootstrapper) { - rv = nsServiceManager::RegisterService( "component://netscape/appshell/component/messenger", bootstrapper); + rv = nsServiceManager::RegisterService(NS_MESSENGERBOOTSTRAP_PROGID, bootstrapper); } return rv; +#else + return NS_OK; +#endif } nsresult @@ -68,4 +73,4 @@ nsMessengerBootstrap::Shutdown() } -CMDLINEHANDLER_IMPL(nsMessengerBootstrap,"-mail","general.startup.mail","chrome://messenger/content/","Start with mail.",NS_MESSENGERBOOTSTRAP_PROGID,"Mail Cmd Line Handler",PR_FALSE,"", PR_TRUE) +CMDLINEHANDLER_IMPL(nsMessengerBootstrap,"-mail","general.startup.mail","chrome://messenger/content/","Start with mail.",NS_MAILSTARTUPHANDLER_PROGID,"Mail Cmd Line Handler",PR_FALSE,"", PR_TRUE) diff --git a/mailnews/compose/build/nsMsgCompCID.h b/mailnews/compose/build/nsMsgCompCID.h index 4a7cfc9e2da7..15ddb2411fbd 100644 --- a/mailnews/compose/build/nsMsgCompCID.h +++ b/mailnews/compose/build/nsMsgCompCID.h @@ -37,6 +37,8 @@ #define NS_MSGCOMPOSESERVICE_PROGID \ "component://netscape/messengercompose" +#define NS_MSGCOMPOSESTARTUPHANDLER_PROGID \ + "component://netscape/commandlinehander/general-startup-compose" // // nsMsgCompose diff --git a/mailnews/compose/build/nsMsgCompFactory.cpp b/mailnews/compose/build/nsMsgCompFactory.cpp index 3278b2f06f76..5ea2c1422cbd 100644 --- a/mailnews/compose/build/nsMsgCompFactory.cpp +++ b/mailnews/compose/build/nsMsgCompFactory.cpp @@ -82,6 +82,10 @@ static nsModuleComponentInfo components[] = { "Msg Compose Service", NS_MSGCOMPOSESERVICE_CID, NS_MSGCOMPOSESERVICE_PROGID, + nsMsgComposeServiceConstructor }, + { "Msg Compose Startup Handler", + NS_MSGCOMPOSESERVICE_CID, + NS_MSGCOMPOSESTARTUPHANDLER_PROGID, nsMsgComposeServiceConstructor, nsMsgComposeService::RegisterProc, nsMsgComposeService::UnregisterProc }, diff --git a/mailnews/compose/src/nsMsgComposeService.cpp b/mailnews/compose/src/nsMsgComposeService.cpp index e9d9cbe66c29..f085b9489cec 100644 --- a/mailnews/compose/src/nsMsgComposeService.cpp +++ b/mailnews/compose/src/nsMsgComposeService.cpp @@ -370,5 +370,5 @@ NS_IMETHODIMP nsMsgComposeService::HandleContent(const char * aContentType, cons return rv; } -CMDLINEHANDLER_IMPL(nsMsgComposeService,"-compose","general.startup.messengercompose","chrome://messengercompose/content/","Start with messenger compose.",NS_MSGCOMPOSESERVICE_PROGID,"Messenger Compose Cmd Line Handler", PR_FALSE, "", PR_TRUE) +CMDLINEHANDLER_IMPL(nsMsgComposeService,"-compose","general.startup.messengercompose","chrome://messengercompose/content/","Start with messenger compose.",NS_MSGCOMPOSESTARTUPHANDLER_PROGID,"Messenger Compose Startup Handler", PR_FALSE, "", PR_TRUE) diff --git a/mailnews/news/build/nsMsgNewsCID.h b/mailnews/news/build/nsMsgNewsCID.h index dd20d7a9f86f..55a5a6b736e4 100644 --- a/mailnews/news/build/nsMsgNewsCID.h +++ b/mailnews/news/build/nsMsgNewsCID.h @@ -74,6 +74,9 @@ "component://netscape/messenger/messageservice;type=news" #define NS_NNTPSERVICE_PROGID \ "component://netscape/messenger/nntpservice" +#define NS_NEWSSTARTUPHANDLER_PROGID \ + "component://netscape/commandlinehander/general-startup-news" + #define NS_NNTPSERVICE_CID \ { /* 4C9F90E1-E19B-11d2-806E-006008128C4E */ \ 0x4c9f90e1, 0xe19b, 0x11d2, \ diff --git a/mailnews/news/build/nsMsgNewsFactory.cpp b/mailnews/news/build/nsMsgNewsFactory.cpp index c4ed6e6703b3..64c4e08e6af5 100644 --- a/mailnews/news/build/nsMsgNewsFactory.cpp +++ b/mailnews/news/build/nsMsgNewsFactory.cpp @@ -66,6 +66,10 @@ static nsModuleComponentInfo components[] = { "NNTP Service", NS_NNTPSERVICE_CID, NS_NNTPSERVICE_PROGID, + nsNntpServiceConstructor }, + { "News Startup Handler", + NS_NNTPSERVICE_CID, + NS_NEWSSTARTUPHANDLER_PROGID, nsNntpServiceConstructor, nsNntpService::RegisterProc, nsNntpService::UnregisterProc }, diff --git a/mailnews/news/src/nsNntpService.cpp b/mailnews/news/src/nsNntpService.cpp index f11380551f19..66a5463be641 100644 --- a/mailnews/news/src/nsNntpService.cpp +++ b/mailnews/news/src/nsNntpService.cpp @@ -1165,4 +1165,4 @@ nsresult nsNntpService::DisplayMessageForPrinting(const char* aMessageURI, nsISu return rv; } -CMDLINEHANDLER_IMPL(nsNntpService,"-news","general.startup.news","chrome://messenger/content/","Start with news.",NS_NNTPSERVICE_PROGID,"News Cmd Line Handler", PR_FALSE,"", PR_TRUE) +CMDLINEHANDLER_IMPL(nsNntpService,"-news","general.startup.news","chrome://messenger/content/","Start with news.",NS_NEWSSTARTUPHANDLER_PROGID,"News Cmd Line Handler", PR_FALSE,"", PR_TRUE) diff --git a/xpfe/appshell/public/nsICmdLineHandler.idl b/xpfe/appshell/public/nsICmdLineHandler.idl index 77d642cc0e6a..94d8d491c676 100644 --- a/xpfe/appshell/public/nsICmdLineHandler.idl +++ b/xpfe/appshell/public/nsICmdLineHandler.idl @@ -27,6 +27,7 @@ %{C++ #define COMMAND_LINE_ARGUMENT_HANDLERS "command-line-argument-handlers" +#define PREF_STARTUP_PREFIX "general.startup." #include "nsCOMPtr.h" #include "nsIComponentManager.h" diff --git a/xpfe/bootstrap/nsAppRunner.cpp b/xpfe/bootstrap/nsAppRunner.cpp index 0e972c5b99e2..2214a30a8568 100644 --- a/xpfe/bootstrap/nsAppRunner.cpp +++ b/xpfe/bootstrap/nsAppRunner.cpp @@ -65,7 +65,7 @@ #include "nsTimeBomb.h" #endif -#if defined(DEBUG_sspitzer_) || defined(DEBUG_seth_) +#if defined(DEBUG_sspitzer) || defined(DEBUG_seth) #define DEBUG_CMD_LINE #endif @@ -278,11 +278,179 @@ static void DumpArbitraryHelp() return; } +static +nsresult LaunchApplication(const char *progID, PRInt32 height, PRInt32 width) +{ + nsresult rv = NS_OK; + + nsCOMPtr handler = do_GetService(progID, &rv); + if (NS_FAILED(rv)) return rv; + + if (!handler) return NS_ERROR_FAILURE; + + nsXPIDLCString chromeUrlForTask; + rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask)); + if (NS_FAILED(rv)) return rv; + + PRBool handlesArgs = PR_FALSE; + rv = handler->GetHandlesArgs(&handlesArgs); + if (handlesArgs) { + PRUnichar *defaultArgs = nsnull; + rv = handler->GetDefaultArgs(&defaultArgs); + if (NS_FAILED(rv)) return rv; + rv = OpenWindow((const char *)chromeUrlForTask, defaultArgs); + Recycle(defaultArgs); + } + else { + rv = OpenChromURL((const char *)chromeUrlForTask, height, width); + } + + return rv; +} + +static nsresult LaunchApplicationWithArgs(const char *commandLineArg, nsICmdLineService *cmdLineArgs, const char *progID, PRInt32 height, PRInt32 width) +{ + nsresult rv; + if (!progID || !commandLineArg || !cmdLineArgs) return NS_ERROR_FAILURE; + nsXPIDLCString cmdResult; + + nsCOMPtr handler = do_GetService(progID, &rv); + if (NS_FAILED(rv)) return rv; + + if (!handler) return NS_ERROR_FAILURE; + + nsXPIDLCString chromeUrlForTask; + rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask)); + if (NS_FAILED(rv)) return rv; + +#ifdef DEBUG_CMD_LINE + printf("XXX got this one:\t%s\n\t%s\n\n",commandLineArg,(const char *)chromeUrlForTask); +#endif /* DEBUG_CMD_LINE */ + + rv = cmdLineArgs->GetCmdLineValue(commandLineArg, getter_Copies(cmdResult)); + if (NS_FAILED(rv)) return rv; +#ifdef DEBUG_CMD_LINE + printf("%s, cmdResult = %s\n",commandLineArg,(const char *)cmdResult); +#endif /* DEBUG_CMD_LINE */ + + PRBool handlesArgs = PR_FALSE; + rv = handler->GetHandlesArgs(&handlesArgs); + if (handlesArgs) { + if ((const char *)cmdResult) { + if (PL_strcmp("1",(const char *)cmdResult)) { + PRBool openWindowWithArgs = PR_TRUE; + rv = handler->GetOpenWindowWithArgs(&openWindowWithArgs); + if (NS_FAILED(rv)) return rv; + + if (openWindowWithArgs) { + nsString cmdArgs((const char *)cmdResult); +#ifdef DEBUG_CMD_LINE + printf("opening %s with %s\n",(const char *)chromeUrlForTask,"OpenWindow"); +#endif /* DEBUG_CMD_LINE */ + rv = OpenWindow((const char *)chromeUrlForTask, cmdArgs.GetUnicode()); + } + else { +#ifdef DEBUG_CMD_LINE + printf("opening %s with %s\n",(const char *)cmdResult,"OpenChromURL"); +#endif /* DEBUG_CMD_LINE */ + rv = OpenChromURL((const char *)cmdResult,height, width); + if (NS_FAILED(rv)) return rv; + } + } + else { + PRUnichar *defaultArgs; + rv = handler->GetDefaultArgs(&defaultArgs); + if (NS_FAILED(rv)) return rv; + + rv = OpenWindow((const char *)chromeUrlForTask, defaultArgs); + Recycle(defaultArgs); + if (NS_FAILED(rv)) return rv; + } + } + } + else { + if (NS_SUCCEEDED(rv) && (const char*)cmdResult) { + if (PL_strcmp("1",(const char *)cmdResult) == 0) { + rv = OpenChromURL((const char *)chromeUrlForTask,height, width); + if (NS_FAILED(rv)) return rv; + } + else { + rv = OpenChromURL((const char *)cmdResult, height, width); + if (NS_FAILED(rv)) return rv; + } + } + } + + return NS_OK; +} + +typedef struct +{ + nsIPref *prefs; + PRInt32 height; + PRInt32 width; +} StartupClosure; + +static +void startupPrefEnumerationFunction(const char *prefName, void *data) +{ + nsresult rv; + PRBool prefValue = PR_FALSE; + + if (!data || !prefName) return; + + StartupClosure *closure = (StartupClosure *)data; + +#ifdef DEBUG_CMD_LINE + printf("getting %s\n", prefName); +#endif /* DEBUG_CMD_LINE */ + + rv = closure->prefs->GetBoolPref(prefName, &prefValue); + if (NS_FAILED(rv)) return; + +#ifdef DEBUG_CMD_LINE + printf("%s = %d\n", prefName, prefValue); +#endif /* DEBUG_CMD_LINE */ + + PRUint32 prefixLen = PL_strlen(PREF_STARTUP_PREFIX); + + // if the pref is "general.startup.", ignore it. + if (PL_strlen(prefName) <= prefixLen) return; + + if (prefValue) { + // this is the progid prefix that all the command line handers register + nsCAutoString progID = "component://netscape/commandlinehander/general-startup-"; + progID += (prefName + prefixLen); + +#ifdef DEBUG_CMD_LINE + printf("progid = %s\n", (const char *)progID); +#endif /* DEBUG_CMD_LINE */ + rv = LaunchApplication((const char *)progID, closure->height, closure->width); + } + return; +} + +static PRBool IsStartupCommand(const char *arg) +{ + if (!arg) return PR_FALSE; + + if (PL_strlen(arg) <= 1) return PR_FALSE; + + // windows allows /mail or -mail + if ((arg[0] == '-') +#ifdef XP_PC + || (arg[0] == '/') +#endif /* XP_PC */ + ) { + return PR_TRUE; + } + + return PR_FALSE; +} + static nsresult HandleArbitraryStartup( nsICmdLineService* cmdLineArgs, nsIPref *prefs, PRBool heedGeneralStartupPrefs) { - char* cmdResult = nsnull; nsresult rv; - PRBool forceLaunchTask = PR_FALSE; PRInt32 height = NS_SIZETOCONTENT; PRInt32 width = NS_SIZETOCONTENT; char* tempString = NULL; @@ -299,104 +467,53 @@ static nsresult HandleArbitraryStartup( nsICmdLineService* cmdLineArgs, nsIPref if (tempString) PR_sscanf(tempString, "%d", &height); - NS_WITH_SERVICE(nsICategoryManager, catman, "mozilla.categorymanager.1", &rv); - if(NS_SUCCEEDED(rv) && catman) { + if (heedGeneralStartupPrefs) { +#ifdef DEBUG_CMD_LINE + printf("XXX iterate over all the general.startup.* prefs\n"); +#endif /* DEBUG_CMD_LINE */ + StartupClosure closure; + + closure.prefs = prefs; + closure.height = height; + closure.width = width; + + prefs->EnumerateChildren(PREF_STARTUP_PREFIX, startupPrefEnumerationFunction,(void *)(&closure)); + } + else { + PRInt32 argc = 0; + rv = cmdLineArgs->GetArgc(&argc); + if (NS_FAILED(rv)) return rv; + + NS_ASSERTION(argc > 1, "we shouldn't be here if there were no command line arguments"); + if (argc <= 1) return NS_ERROR_FAILURE; + + char **argv = nsnull; + rv = cmdLineArgs->GetArgv(&argv); + if (NS_FAILED(rv)) return rv; - nsCOMPtr e; - rv = catman->EnumerateCategory(COMMAND_LINE_ARGUMENT_HANDLERS, getter_AddRefs(e)); - if(NS_SUCCEEDED(rv) && e) { - while (PR_TRUE) { - nsCOMPtr progid; - rv = e->GetNext(getter_AddRefs(progid)); - if (NS_FAILED(rv) || !progid) break; - - nsXPIDLCString progidString; - progid->ToString(getter_Copies(progidString)); + PRInt32 i = 0; + for (i=1;i handler = do_GetService((const char *)progidString, &rv); - if (NS_FAILED(rv)) continue; - - if (handler) { - - nsXPIDLCString commandLineArg; - rv = handler->GetCommandLineArgument(getter_Copies(commandLineArg)); - if (NS_FAILED(rv)) continue; - - nsXPIDLCString chromeUrlForTask; - rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask)); - if (NS_FAILED(rv)) continue; - - nsXPIDLCString prefNameForStartup; - rv = handler->GetPrefNameForStartup(getter_Copies(prefNameForStartup)); - if (NS_FAILED(rv)) continue; - -#ifdef DEBUG_CMD_LINE - printf("got this one:\t%s\n\t%s\n\t%s\n\n",(const char *)commandLineArg,(const char *)chromeUrlForTask,(const char *)prefNameForStartup); -#endif /* DEBUG_CMD_LINE */ - - if (heedGeneralStartupPrefs) { - rv = prefs->GetBoolPref((const char *)prefNameForStartup,&forceLaunchTask); - if (NS_FAILED(rv)) { - forceLaunchTask = PR_FALSE; - } - } - - rv = cmdLineArgs->GetCmdLineValue((const char *)commandLineArg, &cmdResult); -#ifdef DEBUG_CMD_LINE - printf("%s, cmdResult = %s\n",(const char *)commandLineArg,cmdResult); -#endif /* DEBUG_CMD_LINE */ - - PRBool handlesArgs = PR_FALSE; - rv = handler->GetHandlesArgs(&handlesArgs); - if (handlesArgs) { - if (forceLaunchTask || cmdResult) { - if (cmdResult && PL_strcmp("1",cmdResult)) { - PRBool openWindowWithArgs = PR_TRUE; - rv = handler->GetOpenWindowWithArgs(&openWindowWithArgs); - if (openWindowWithArgs) { - nsString cmdArgs(cmdResult); -#ifdef DEBUG_CMD_LINE - printf("opening %s with %s\n",(const char *)chromeUrlForTask,"OpenWindow"); -#endif /* DEBUG_CMD_LINE */ - OpenWindow((const char *)chromeUrlForTask, cmdArgs.GetUnicode()); - } - else { -#ifdef DEBUG_CMD_LINE - printf("opening %s with %s\n",cmdResult,"OpenChromURL"); -#endif /* DEBUG_CMD_LINE */ - OpenChromURL(cmdResult,height, width); - } - } - else { - PRUnichar *defaultArgs; - rv = handler->GetDefaultArgs(&defaultArgs); - OpenWindow((const char *)chromeUrlForTask, defaultArgs); - Recycle(defaultArgs); - } - } - } - else { - if (forceLaunchTask) { - OpenChromURL((const char *)chromeUrlForTask,height, width); - } - else if (NS_SUCCEEDED(rv) && cmdResult) { - if (PL_strcmp("1",cmdResult) == 0) { - OpenChromURL((const char *)chromeUrlForTask,height, width); - } - else { - OpenChromURL(cmdResult, height, width); - } - } - } + // skip over the - (or / on windows) + char *command = argv[i] + 1; +#ifdef XP_UNIX + // unix allows -mail and --mail + if ((argv[i][0] == '-') && (argv[i][1] == '-')) { + command = argv[i] + 2; } +#endif /* XP_UNIX */ + progID += (const char *)command; + // this can fail, as someone could do -foo, where -foo is not handled + rv = LaunchApplicationWithArgs((const char *)(argv[i]), cmdLineArgs, (const char *)progID, height, width); } } } - + return NS_OK; } @@ -414,23 +531,17 @@ static nsresult DoCommandLines( nsICmdLineService* cmdLine, PRBool heedGeneralSt static nsresult OpenBrowserWindow(PRInt32 height, PRInt32 width) { - printf("XXX: OpenBrowserWindow()\n"); - nsresult rv; - NS_WITH_SERVICE(nsICmdLineHandler, handler, NS_IBROWSERCMDLINEHANDLER_PROGID, &rv); + NS_WITH_SERVICE(nsICmdLineHandler, handler, NS_BROWSERSTARTUPHANDLER_PROGID, &rv); if (NS_FAILED(rv)) return rv; nsXPIDLCString chromeUrlForTask; rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask)); if (NS_FAILED(rv)) return rv; - PRUnichar *defaultArgs; - rv = handler->GetDefaultArgs(&defaultArgs); - if (NS_FAILED(rv)) return rv; - rv = OpenWindow((const char *)chromeUrlForTask, defaultArgs); + rv = OpenChromURL((const char *)chromeUrlForTask, height, width ); if (NS_FAILED(rv)) return rv; - Recycle(defaultArgs); return rv; } @@ -468,11 +579,7 @@ static nsresult Ensure1Window( nsICmdLineService* cmdLineArgs) if (tempString) PR_sscanf(tempString, "%d", &height); -#if 0 rv = OpenBrowserWindow(height, width); -#else - rv = OpenChromURL("chrome://navigator/content/", height, width ); -#endif } } return rv; @@ -685,8 +792,9 @@ void DumpHelp(char *appname) printf("%s-nosplash%sDisable splash screen.\n",HELP_SPACER_1,HELP_SPACER_2); #endif - // not working yet, because we handle -h too early, and components - // havent registered yet + // this works, but only after the components have registered. so if you drop in a new command line hander, -help + // won't not until the second run. + // out of the bug, because we ship a component.reg file, it works correctly. DumpArbitraryHelp(); } diff --git a/xpfe/browser/public/nsIBrowserInstance.idl b/xpfe/browser/public/nsIBrowserInstance.idl index 37d51a54e4a6..090d475d3e8b 100644 --- a/xpfe/browser/public/nsIBrowserInstance.idl +++ b/xpfe/browser/public/nsIBrowserInstance.idl @@ -76,8 +76,8 @@ interface nsIBrowserInstance : nsISupports { %{C++ -#define NS_IBROWSERINSTANCE_PROGID "component://netscape/appshell/component/browser/instance" -#define NS_IBROWSERCMDLINEHANDLER_PROGID "component://netscape/appshell/component/browser/cmdhandler" +#define NS_BROWSERINSTANCE_PROGID "component://netscape/appshell/component/browser/instance" +#define NS_BROWSERSTARTUPHANDLER_PROGID "component://netscape/commandlinehander/general-startup-browser" // {c7bee75a-1dd1-11b2-9333-a38e085287cf} #define NS_BROWSERCONTROLLER_CID { 0xc7bee75a, 0x1dd1, 0x11b2, { 0x93, 0x33, 0xa3, 0x8e, 0x08, 0x52, 0x87, 0xcf } } diff --git a/xpfe/browser/src/nsBrowserInstance.cpp b/xpfe/browser/src/nsBrowserInstance.cpp index 659838906a16..7f6b6c5d08ba 100644 --- a/xpfe/browser/src/nsBrowserInstance.cpp +++ b/xpfe/browser/src/nsBrowserInstance.cpp @@ -2525,7 +2525,7 @@ nsBrowserContentHandler::~nsBrowserContentHandler() { } -CMDLINEHANDLER2_IMPL(nsBrowserContentHandler,"-chrome","general.startup.browser","chrome://navigator/content/","Start with browser.",NS_IBROWSERCMDLINEHANDLER_PROGID,"Browser Cmd Line Handler", PR_TRUE, PR_FALSE) +CMDLINEHANDLER2_IMPL(nsBrowserContentHandler,"-chrome","general.startup.browser","chrome://navigator/content/","Start with browser.",NS_BROWSERSTARTUPHANDLER_PROGID,"Browser Startup Handler", PR_TRUE, PR_FALSE) NS_IMETHODIMP nsBrowserContentHandler::GetDefaultArgs(PRUnichar **aDefaultArgs) { @@ -2643,7 +2643,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsBrowserContentHandler) static nsModuleComponentInfo components[] = { { "nsBrowserInstance", NS_BROWSERINSTANCE_CID, - NS_IBROWSERINSTANCE_PROGID, + NS_BROWSERINSTANCE_PROGID, nsBrowserInstanceConstructor }, { "Browser Content Handler", @@ -2651,13 +2651,19 @@ static nsModuleComponentInfo components[] = { NS_CONTENT_HANDLER_PROGID_PREFIX"text/html", nsBrowserContentHandlerConstructor }, - { "Browser Cmd Line Handler", + { "Browser Startup Handler", NS_BROWSERCONTENTHANDLER_CID, - NS_IBROWSERCMDLINEHANDLER_PROGID, + NS_BROWSERSTARTUPHANDLER_PROGID, nsBrowserContentHandlerConstructor, nsBrowserContentHandler::RegisterProc, nsBrowserContentHandler::UnregisterProc, - } + }, + { "Chrome Startup Handler", + NS_BROWSERCONTENTHANDLER_CID, + "component://netscape/commandlinehander/general-startup-chrome", + nsBrowserContentHandlerConstructor, + } + }; NS_IMPL_NSGETMODULE("nsBrowserModule", components) diff --git a/xpfe/components/startup/public/nsICmdLineHandler.idl b/xpfe/components/startup/public/nsICmdLineHandler.idl index 77d642cc0e6a..94d8d491c676 100644 --- a/xpfe/components/startup/public/nsICmdLineHandler.idl +++ b/xpfe/components/startup/public/nsICmdLineHandler.idl @@ -27,6 +27,7 @@ %{C++ #define COMMAND_LINE_ARGUMENT_HANDLERS "command-line-argument-handlers" +#define PREF_STARTUP_PREFIX "general.startup." #include "nsCOMPtr.h" #include "nsIComponentManager.h"