1998-12-03 04:37:46 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* The contents of this file are subject to the Netscape Public
|
|
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.mozilla.org/NPL/
|
1998-12-03 04:37:46 +03:00
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* Software distributed under the License is distributed on an "AS
|
|
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
* implied. See the License for the specific language governing
|
|
|
|
* rights and limitations under the License.
|
1998-12-03 04:37:46 +03:00
|
|
|
*
|
|
|
|
* The Original Code is Mozilla Communicator client code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
1999-11-06 06:43:54 +03:00
|
|
|
* Corporation. Portions created by Netscape are
|
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
2000-05-17 08:44:14 +04:00
|
|
|
* Contributor(s):
|
2000-01-11 23:49:15 +03:00
|
|
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
1998-12-03 04:37:46 +03:00
|
|
|
*/
|
|
|
|
#include "nsIServiceManager.h"
|
1999-03-09 12:44:27 +03:00
|
|
|
#include "nsIComponentManager.h"
|
1998-12-03 04:37:46 +03:00
|
|
|
#include "nsIURL.h"
|
1999-11-30 07:50:42 +03:00
|
|
|
#include "nsNetUtil.h"
|
1998-12-03 04:37:46 +03:00
|
|
|
#include "nsIWidget.h"
|
1999-03-16 10:15:37 +03:00
|
|
|
#include "nsIPref.h"
|
1998-12-03 04:37:46 +03:00
|
|
|
#include "plevent.h"
|
1999-04-16 02:45:43 +04:00
|
|
|
#include "prmem.h"
|
2000-02-14 04:28:11 +03:00
|
|
|
#include "prnetdb.h"
|
1998-12-03 04:37:46 +03:00
|
|
|
|
|
|
|
#include "nsIAppShell.h"
|
1999-01-23 01:22:33 +03:00
|
|
|
#include "nsICmdLineService.h"
|
1999-06-13 07:30:38 +04:00
|
|
|
#include "nsIThread.h"
|
1998-12-03 04:37:46 +03:00
|
|
|
#include "nsIAppShellService.h"
|
1999-05-05 09:14:16 +04:00
|
|
|
#include "nsIAppShellComponent.h"
|
2000-05-17 05:55:46 +04:00
|
|
|
#include "nsIObserverService.h"
|
1999-01-21 10:29:53 +03:00
|
|
|
#include "nsAppShellCIDs.h"
|
1999-02-19 00:53:31 +03:00
|
|
|
#include "prprf.h"
|
1999-03-11 08:24:29 +03:00
|
|
|
#include "nsCRT.h"
|
1999-04-10 10:41:59 +04:00
|
|
|
#include "nsFileSpec.h"
|
1999-06-15 09:51:29 +04:00
|
|
|
#include "nsIFileSpec.h"
|
1999-04-16 02:45:43 +04:00
|
|
|
#include "nsIFileLocator.h"
|
|
|
|
#include "nsFileLocations.h"
|
|
|
|
#include "nsFileStream.h"
|
|
|
|
#include "nsSpecialSystemDirectory.h"
|
1999-10-07 06:48:27 +04:00
|
|
|
#include "nsIWalletService.h"
|
1999-08-27 16:32:19 +04:00
|
|
|
#include "nsIWebShell.h"
|
1999-08-31 06:49:12 +04:00
|
|
|
#include "nsIWindowMediator.h"
|
1999-10-19 01:33:29 +04:00
|
|
|
#include "nsIDOMWindow.h"
|
1999-11-04 03:08:59 +03:00
|
|
|
#include "nsIClipboard.h"
|
1999-12-03 16:39:18 +03:00
|
|
|
#include "nsISoftwareUpdate.h"
|
|
|
|
#include "nsSoftwareUpdateIIDs.h"
|
2000-02-06 14:08:00 +03:00
|
|
|
#include "nsISupportsPrimitives.h"
|
2000-02-05 02:11:19 +03:00
|
|
|
#include "nsICmdLineHandler.h"
|
|
|
|
#include "nsICategoryManager.h"
|
|
|
|
#include "nsXPIDLString.h"
|
2000-03-08 00:02:50 +03:00
|
|
|
#include "nsIXULWindow.h"
|
2000-05-14 01:43:39 +04:00
|
|
|
#include "nsIChromeRegistry.h"
|
2000-02-16 09:22:03 +03:00
|
|
|
#include "nsIContentHandler.h"
|
|
|
|
#include "nsIBrowserInstance.h"
|
|
|
|
|
2000-03-11 03:21:27 +03:00
|
|
|
// Interfaces Needed
|
|
|
|
#include "nsIXULWindow.h"
|
|
|
|
#include "nsIWebBrowserChrome.h"
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
#ifdef NS_TRACE_MALLOC
|
|
|
|
#include "nsTraceMalloc.h"
|
|
|
|
#endif
|
|
|
|
|
2000-03-11 03:21:27 +03:00
|
|
|
|
2000-03-11 08:18:48 +03:00
|
|
|
#if !defined(XP_MAC) && !defined(RHAPSODY)
|
2000-03-11 03:21:27 +03:00
|
|
|
#include "nsTimeBomb.h"
|
|
|
|
#endif
|
|
|
|
|
2000-03-11 06:08:04 +03:00
|
|
|
#ifdef RHAPSODY
|
|
|
|
// XXX hack because we can't link against libraptorwebwidget (pav)
|
|
|
|
#undef DETECT_WEBSHELL_LEAKS
|
|
|
|
#endif
|
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
#if defined(DEBUG_sspitzer) || defined(DEBUG_seth)
|
2000-02-08 04:11:13 +03:00
|
|
|
#define DEBUG_CMD_LINE
|
|
|
|
#endif
|
|
|
|
|
2000-03-08 00:02:50 +03:00
|
|
|
|
1999-12-03 16:39:18 +03:00
|
|
|
static NS_DEFINE_CID(kSoftUpdateCID, NS_SoftwareUpdate_CID);
|
1999-08-31 06:49:12 +04:00
|
|
|
static NS_DEFINE_IID(kIWindowMediatorIID,NS_IWINDOWMEDIATOR_IID);
|
|
|
|
static NS_DEFINE_CID(kWindowMediatorCID, NS_WINDOWMEDIATOR_CID);
|
2000-01-29 02:12:24 +03:00
|
|
|
static NS_DEFINE_CID(kWalletServiceCID, NS_WALLETSERVICE_CID);
|
2000-02-16 09:22:03 +03:00
|
|
|
static NS_DEFINE_CID(kBrowserContentHandlerCID, NS_BROWSERCONTENTHANDLER_CID);
|
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
#define HELP_SPACER_1 "\t"
|
|
|
|
#define HELP_SPACER_2 "\t\t"
|
|
|
|
|
1999-08-25 09:26:25 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
#include "prlog.h"
|
|
|
|
#endif
|
1999-04-10 10:41:59 +04:00
|
|
|
|
2000-01-18 05:45:07 +03:00
|
|
|
#ifdef MOZ_JPROF
|
|
|
|
#include "jprof.h"
|
|
|
|
#endif
|
|
|
|
|
1999-04-10 10:41:59 +04:00
|
|
|
// header file for profile manager
|
1999-04-16 02:45:43 +04:00
|
|
|
#include "nsIProfile.h"
|
1998-12-03 04:37:46 +03:00
|
|
|
|
1999-11-19 04:55:19 +03:00
|
|
|
#if defined(XP_UNIX)
|
|
|
|
extern void InstallUnixSignalHandlers(const char *ProgramName);
|
|
|
|
#endif
|
|
|
|
|
1999-01-27 05:11:56 +03:00
|
|
|
#if defined(XP_MAC)
|
1999-08-31 06:49:12 +04:00
|
|
|
|
1999-01-27 05:11:56 +03:00
|
|
|
#include "macstdlibextras.h"
|
1999-05-28 09:06:54 +04:00
|
|
|
#include <TextServices.h>
|
1999-08-31 06:49:12 +04:00
|
|
|
|
2000-05-14 01:43:39 +04:00
|
|
|
static nsresult CheckForNewChrome(void);
|
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
// Set up the toolbox and (if DEBUG) the console. Do this in a static initializer,
|
|
|
|
// to make it as unlikely as possible that somebody calls printf() before we get initialized.
|
1999-01-27 05:11:56 +03:00
|
|
|
static struct MacInitializer { MacInitializer() { InitializeMacToolbox(); } } gInitializer;
|
1999-08-31 06:49:12 +04:00
|
|
|
|
|
|
|
|
|
|
|
class stTSMCloser
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
stTSMCloser()
|
1999-08-31 11:36:02 +04:00
|
|
|
{
|
|
|
|
// TSM is initialized in InitializeMacToolbox
|
|
|
|
};
|
1999-08-31 06:49:12 +04:00
|
|
|
|
|
|
|
~stTSMCloser()
|
|
|
|
{
|
2000-06-21 03:10:06 +04:00
|
|
|
#if !TARGET_CARBON
|
1999-08-31 06:49:12 +04:00
|
|
|
(void)CloseTSMAwareApplication();
|
2000-06-21 03:10:06 +04:00
|
|
|
#endif
|
1999-08-31 06:49:12 +04:00
|
|
|
}
|
|
|
|
};
|
1999-01-27 05:11:56 +03:00
|
|
|
#endif // XP_MAC
|
|
|
|
|
1998-12-03 04:37:46 +03:00
|
|
|
/* Define Class IDs */
|
1999-06-23 04:24:02 +04:00
|
|
|
static NS_DEFINE_CID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID);
|
|
|
|
static NS_DEFINE_CID(kCmdLineServiceCID, NS_COMMANDLINE_SERVICE_CID);
|
1999-03-16 10:15:37 +03:00
|
|
|
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
1999-04-16 02:45:43 +04:00
|
|
|
static NS_DEFINE_CID(kFileLocatorCID, NS_FILELOCATOR_CID);
|
1999-04-10 10:41:59 +04:00
|
|
|
static NS_DEFINE_CID(kProfileCID, NS_PROFILE_CID);
|
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
#include "nsNativeAppSupport.h"
|
1999-10-28 05:39:33 +04:00
|
|
|
|
1999-02-03 19:50:05 +03:00
|
|
|
/*********************************************/
|
1999-08-31 06:49:12 +04:00
|
|
|
// Default implemenations for nativeAppSupport
|
|
|
|
// If your platform implements these functions if def out this code.
|
2000-02-14 01:24:14 +03:00
|
|
|
#if !defined (XP_MAC ) && !defined(NTO) && ( !defined( XP_PC ) || !defined( WIN32 ) )
|
2000-02-13 18:23:28 +03:00
|
|
|
|
2000-02-04 17:40:08 +03:00
|
|
|
nsresult NS_CreateSplashScreen( nsISplashScreen **aResult )
|
1999-08-31 06:49:12 +04:00
|
|
|
{
|
2000-02-04 17:40:08 +03:00
|
|
|
nsresult rv = NS_OK;
|
|
|
|
if ( aResult ) {
|
|
|
|
*aResult = 0;
|
|
|
|
} else {
|
|
|
|
rv = NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
return rv;
|
1999-08-31 06:49:12 +04:00
|
|
|
}
|
1998-12-03 04:37:46 +03:00
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
PRBool NS_CanRun()
|
1999-08-31 06:49:12 +04:00
|
|
|
{
|
1999-09-04 03:41:26 +04:00
|
|
|
return PR_TRUE;
|
1999-08-31 06:49:12 +04:00
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
#endif
|
2000-02-14 04:28:11 +03:00
|
|
|
|
2000-05-13 02:37:20 +04:00
|
|
|
/*********************************************/
|
|
|
|
// Default implementation for new and improved
|
|
|
|
// native app support. If your platform
|
|
|
|
// implements nsINativeAppSupport then implement
|
|
|
|
// this function and if def out this code.
|
|
|
|
//
|
|
|
|
// Note: For now, the default imiplementation returns 0 and
|
|
|
|
// the code that calls this will defalt to use the old
|
|
|
|
// nsISplashScreen interface directly. At some point
|
|
|
|
// this function will return an instance of
|
|
|
|
// nsNativeAppSupportBase which will use the older
|
|
|
|
// "splash screen" interface. The code below will
|
|
|
|
// then rely on nsINativeAppSupport and its use of
|
|
|
|
// nsISplashScreen will be removed.
|
2000-05-17 08:44:14 +04:00
|
|
|
//
|
2000-05-13 02:37:20 +04:00
|
|
|
#if !defined( NS_WIN32 )
|
|
|
|
|
|
|
|
nsresult NS_CreateNativeAppSupport( nsINativeAppSupport **aResult )
|
|
|
|
{
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
if ( aResult ) {
|
|
|
|
*aResult = 0;
|
|
|
|
} else {
|
|
|
|
rv = NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
1998-12-03 04:37:46 +03:00
|
|
|
/*
|
|
|
|
* This routine translates the nsresult into a platform specific return
|
|
|
|
* code for the application...
|
|
|
|
*/
|
|
|
|
static int TranslateReturnValue(nsresult aResult)
|
|
|
|
{
|
|
|
|
if (NS_SUCCEEDED(aResult)) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
1999-09-04 03:41:26 +04:00
|
|
|
#ifdef XP_MAC
|
|
|
|
#include "nsCommandLineServiceMac.h"
|
|
|
|
#endif
|
1998-12-03 04:37:46 +03:00
|
|
|
|
2000-02-15 04:32:12 +03:00
|
|
|
extern "C" void NS_SetupRegistry_1(PRBool aNeedAutoreg);
|
1998-12-03 04:37:46 +03:00
|
|
|
|
1999-01-27 05:11:56 +03:00
|
|
|
static void
|
1999-01-23 01:22:33 +03:00
|
|
|
PrintUsage(void)
|
|
|
|
{
|
1999-08-31 11:36:02 +04:00
|
|
|
fprintf(stderr, "Usage: apprunner <url>\n");
|
|
|
|
fprintf(stderr, "\t<url>: a fully defined url string like http:// etc..\n");
|
1999-01-23 01:22:33 +03:00
|
|
|
}
|
1998-12-03 04:37:46 +03:00
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
static nsresult OpenWindow( const char*urlstr, const PRUnichar *args )
|
2000-03-12 11:10:23 +03:00
|
|
|
{
|
|
|
|
#ifdef DEBUG_CMD_LINE
|
|
|
|
printf("OpenWindow(%s,?)\n",urlstr);
|
|
|
|
#endif /* DEBUG_CMD_LINE */
|
1999-10-19 01:33:29 +04:00
|
|
|
nsresult rv;
|
|
|
|
NS_WITH_SERVICE(nsIAppShellService, appShellService, kAppShellServiceCID, &rv)
|
|
|
|
if ( NS_SUCCEEDED( rv ) ) {
|
|
|
|
nsCOMPtr<nsIDOMWindow> hiddenWindow;
|
|
|
|
JSContext *jsContext;
|
|
|
|
rv = appShellService->GetHiddenWindowAndJSContext( getter_AddRefs( hiddenWindow ),
|
|
|
|
&jsContext );
|
|
|
|
if ( NS_SUCCEEDED( rv ) ) {
|
|
|
|
void *stackPtr;
|
|
|
|
jsval *argv = JS_PushArguments( jsContext,
|
|
|
|
&stackPtr,
|
|
|
|
"sssW",
|
|
|
|
urlstr,
|
|
|
|
"_blank",
|
|
|
|
"chrome,dialog=no,all",
|
|
|
|
args );
|
|
|
|
if( argv ) {
|
|
|
|
nsCOMPtr<nsIDOMWindow> newWindow;
|
|
|
|
rv = hiddenWindow->OpenDialog( jsContext,
|
|
|
|
argv,
|
|
|
|
4,
|
|
|
|
getter_AddRefs( newWindow ) );
|
|
|
|
JS_PopArguments( jsContext, stackPtr );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
static nsresult OpenChromURL( const char * urlstr, PRInt32 height = NS_SIZETOCONTENT, PRInt32 width = NS_SIZETOCONTENT )
|
1999-08-31 06:49:12 +04:00
|
|
|
{
|
2000-03-12 11:10:23 +03:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
|
|
|
printf("OpenChromURL(%s,%d,%d)\n",urlstr,height,width);
|
|
|
|
#endif /* DEBUG_CMD_LINE */
|
|
|
|
|
2000-02-29 03:20:55 +03:00
|
|
|
nsCOMPtr<nsIURI> url;
|
1999-08-31 06:49:12 +04:00
|
|
|
nsresult rv;
|
2000-02-29 03:20:55 +03:00
|
|
|
rv = NS_NewURI(getter_AddRefs(url), urlstr);
|
1999-08-31 06:49:12 +04:00
|
|
|
if ( NS_FAILED( rv ) )
|
|
|
|
return rv;
|
2000-02-29 03:20:55 +03:00
|
|
|
|
|
|
|
nsCOMPtr<nsIAppShellService> appShell(do_GetService(kAppShellServiceCID));
|
|
|
|
NS_ENSURE_TRUE(appShell, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXULWindow> newWindow;
|
1999-08-31 06:49:12 +04:00
|
|
|
rv = appShell->CreateTopLevelWindow(nsnull, url,
|
2000-03-11 03:21:27 +03:00
|
|
|
PR_TRUE, PR_TRUE, nsIWebBrowserChrome::allChrome,
|
2000-03-01 01:03:49 +03:00
|
|
|
width, height,
|
1999-08-31 11:36:02 +04:00
|
|
|
getter_AddRefs(newWindow));
|
|
|
|
return rv;
|
1999-08-31 06:49:12 +04:00
|
|
|
}
|
1999-02-19 00:53:31 +03:00
|
|
|
|
2000-02-15 04:32:12 +03:00
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
static void DumpArbitraryHelp()
|
2000-02-05 02:11:19 +03:00
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
NS_WITH_SERVICE(nsICategoryManager, catman, "mozilla.categorymanager.1", &rv);
|
|
|
|
if(NS_SUCCEEDED(rv) && catman) {
|
|
|
|
nsCOMPtr<nsISimpleEnumerator> e;
|
|
|
|
rv = catman->EnumerateCategory(COMMAND_LINE_ARGUMENT_HANDLERS, getter_AddRefs(e));
|
|
|
|
if(NS_SUCCEEDED(rv) && e) {
|
2000-02-16 05:45:22 +03:00
|
|
|
while (PR_TRUE) {
|
2000-06-01 08:14:34 +04:00
|
|
|
nsCOMPtr<nsISupportsString> catEntry;
|
|
|
|
rv = e->GetNext(getter_AddRefs(catEntry));
|
|
|
|
if (NS_FAILED(rv) || !catEntry) break;
|
2000-02-16 05:45:22 +03:00
|
|
|
|
2000-06-01 08:14:34 +04:00
|
|
|
nsXPIDLCString entryString;
|
|
|
|
rv = catEntry->GetData(getter_Copies(entryString));
|
|
|
|
if (NS_FAILED(rv) || !((const char *)entryString)) break;
|
|
|
|
|
|
|
|
nsXPIDLCString progidString;
|
|
|
|
rv = catman->GetCategoryEntry(COMMAND_LINE_ARGUMENT_HANDLERS,(const char *)entryString, getter_Copies(progidString));
|
|
|
|
if (NS_FAILED(rv) || !((const char *)progidString)) break;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-08 04:11:13 +03:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
2000-02-27 23:51:11 +03:00
|
|
|
printf("cmd line handler progid = %s\n", (const char *)progidString);
|
2000-02-08 04:11:13 +03:00
|
|
|
#endif /* DEBUG_CMD_LINE */
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-16 05:45:22 +03:00
|
|
|
nsCOMPtr <nsICmdLineHandler> handler = do_GetService((const char *)progidString, &rv);
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
if (handler) {
|
|
|
|
nsXPIDLCString commandLineArg;
|
|
|
|
rv = handler->GetCommandLineArgument(getter_Copies(commandLineArg));
|
|
|
|
if (NS_FAILED(rv)) continue;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
nsXPIDLCString helpText;
|
|
|
|
rv = handler->GetHelpText(getter_Copies(helpText));
|
|
|
|
if (NS_FAILED(rv)) continue;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
if ((const char *)commandLineArg) {
|
|
|
|
printf("%s%s", HELP_SPACER_1,(const char *)commandLineArg);
|
2000-02-16 09:22:03 +03:00
|
|
|
|
|
|
|
PRBool handlesArgs = PR_FALSE;
|
|
|
|
rv = handler->GetHandlesArgs(&handlesArgs);
|
|
|
|
if (NS_SUCCEEDED(rv) && handlesArgs) {
|
|
|
|
printf(" <url>");
|
|
|
|
}
|
2000-02-05 02:11:19 +03:00
|
|
|
if ((const char *)helpText) {
|
|
|
|
printf("%s%s\n",HELP_SPACER_2,(const char *)helpText);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
return;
|
2000-02-05 02:11:19 +03:00
|
|
|
}
|
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
static
|
|
|
|
nsresult LaunchApplication(const char *progID, PRInt32 height, PRInt32 width)
|
|
|
|
{
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
|
|
|
|
nsCOMPtr <nsICmdLineHandler> handler = do_GetService(progID, &rv);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
2000-05-14 01:43:39 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
if (!handler) return NS_ERROR_FAILURE;
|
2000-05-14 01:43:39 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
nsXPIDLCString chromeUrlForTask;
|
|
|
|
rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
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 <nsICmdLineHandler> handler = do_GetService(progID, &rv);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
if (!handler) return NS_ERROR_FAILURE;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
nsXPIDLCString chromeUrlForTask;
|
|
|
|
rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
|
|
|
printf("XXX got this one:\t%s\n\t%s\n\n",commandLineArg,(const char *)chromeUrlForTask);
|
|
|
|
#endif /* DEBUG_CMD_LINE */
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
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) {
|
2000-04-24 09:19:20 +04:00
|
|
|
nsString cmdArgs; cmdArgs.AssignWithConversion(NS_STATIC_CAST(const char *, cmdResult));
|
2000-02-26 06:52:06 +03:00
|
|
|
#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;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
|
|
|
#ifdef DEBUG_CMD_LINE
|
2000-02-26 06:52:06 +03:00
|
|
|
printf("getting %s\n", prefName);
|
|
|
|
#endif /* DEBUG_CMD_LINE */
|
|
|
|
|
|
|
|
rv = closure->prefs->GetBoolPref(prefName, &prefValue);
|
|
|
|
if (NS_FAILED(rv)) return;
|
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
2000-02-26 06:52:06 +03:00
|
|
|
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;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
if (prefValue) {
|
2000-02-27 23:51:11 +03:00
|
|
|
// this is the progid prefix that all the command line handlers register
|
|
|
|
nsCAutoString progID = "component://netscape/commandlinehandler/general-startup-";
|
2000-02-26 06:52:06 +03:00
|
|
|
progID += (prefName + prefixLen);
|
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
2000-02-26 06:52:06 +03:00
|
|
|
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;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
if (PL_strlen(arg) <= 1) return PR_FALSE;
|
|
|
|
|
|
|
|
// windows allows /mail or -mail
|
2000-05-17 08:44:14 +04:00
|
|
|
if ((arg[0] == '-')
|
|
|
|
#ifdef XP_PC
|
2000-02-26 06:52:06 +03:00
|
|
|
|| (arg[0] == '/')
|
|
|
|
#endif /* XP_PC */
|
|
|
|
) {
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
static nsresult HandleArbitraryStartup( nsICmdLineService* cmdLineArgs, nsIPref *prefs, PRBool heedGeneralStartupPrefs)
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
PRInt32 height = NS_SIZETOCONTENT;
|
|
|
|
PRInt32 width = NS_SIZETOCONTENT;
|
2000-06-10 00:58:59 +04:00
|
|
|
nsXPIDLCString tempString;
|
2000-02-05 02:11:19 +03:00
|
|
|
|
|
|
|
// Get the value of -width option
|
2000-06-10 00:58:59 +04:00
|
|
|
rv = cmdLineArgs->GetCmdLineValue("-width", getter_Copies(tempString));
|
2000-02-05 02:11:19 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-06-10 00:58:59 +04:00
|
|
|
if ((const char*)tempString) PR_sscanf(tempString, "%d", &width);
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
// Get the value of -height option
|
2000-06-10 00:58:59 +04:00
|
|
|
rv = cmdLineArgs->GetCmdLineValue("-height", getter_Copies(tempString));
|
2000-02-05 02:11:19 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-06-10 00:58:59 +04:00
|
|
|
if ((const char*)tempString) PR_sscanf(tempString, "%d", &height);
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
if (heedGeneralStartupPrefs) {
|
2000-02-08 04:29:22 +03:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
2000-02-26 06:52:06 +03:00
|
|
|
printf("XXX iterate over all the general.startup.* prefs\n");
|
2000-02-08 04:29:22 +03:00
|
|
|
#endif /* DEBUG_CMD_LINE */
|
2000-02-26 06:52:06 +03:00
|
|
|
StartupClosure closure;
|
2000-02-08 04:29:22 +03:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
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);
|
2000-02-26 11:29:40 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
2000-02-26 06:52:06 +03:00
|
|
|
|
|
|
|
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;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
PRInt32 i = 0;
|
|
|
|
for (i=1;i<argc;i++) {
|
2000-02-08 06:12:39 +03:00
|
|
|
#ifdef DEBUG_CMD_LINE
|
2000-02-26 06:52:06 +03:00
|
|
|
printf("XXX argv[%d] = %s\n",i,argv[i]);
|
2000-02-08 06:12:39 +03:00
|
|
|
#endif /* DEBUG_CMD_LINE */
|
2000-02-26 06:52:06 +03:00
|
|
|
if (IsStartupCommand(argv[i])) {
|
2000-02-27 23:51:11 +03:00
|
|
|
nsCAutoString progID = "component://netscape/commandlinehandler/general-startup-";
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
// 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;
|
2000-02-05 02:11:19 +03:00
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
#endif /* XP_UNIX */
|
2000-02-26 06:52:06 +03:00
|
|
|
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);
|
2000-02-05 02:11:19 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-02-26 06:52:06 +03:00
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
return NS_OK;
|
2000-02-05 02:11:19 +03:00
|
|
|
}
|
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
// This should be done by app shell enumeration someday
|
1999-09-16 10:50:17 +04:00
|
|
|
static nsresult DoCommandLines( nsICmdLineService* cmdLine, PRBool heedGeneralStartupPrefs )
|
1999-08-31 06:49:12 +04:00
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
NS_WITH_SERVICE(nsIPref, prefs, kPrefCID, &rv);
|
1999-09-16 10:50:17 +04:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-02-05 02:11:19 +03:00
|
|
|
rv = HandleArbitraryStartup( cmdLine, prefs, heedGeneralStartupPrefs);
|
1999-08-31 06:49:12 +04:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
static nsresult DoOnShutdown()
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
{
|
2000-05-17 08:44:14 +04:00
|
|
|
// Scoping this in a block to force the pref service to be
|
|
|
|
// released.
|
2000-05-17 02:14:55 +04:00
|
|
|
//
|
|
|
|
// save the prefs, in case they weren't saved
|
|
|
|
NS_WITH_SERVICE(nsIPref, prefs, kPrefCID, &rv);
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get prefs, so unable to save them");
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
prefs->SavePrefFile();
|
2000-05-17 08:44:14 +04:00
|
|
|
}
|
2000-05-17 02:14:55 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// at this point, all that is on the clipboard is a proxy object, but that object
|
|
|
|
// won't be valid once the app goes away. As a result, we need to force the data
|
|
|
|
// out of that proxy and properly onto the clipboard. This can't be done in the
|
|
|
|
// clipboard service's shutdown routine because it requires the parser/etc which
|
|
|
|
// has already been shutdown by the time the clipboard is shut down.
|
|
|
|
{
|
|
|
|
// scoping this in a block to force release
|
|
|
|
NS_WITH_SERVICE(nsIClipboard, clipService, "component://netscape/widget/clipboard", &rv);
|
|
|
|
if ( clipService )
|
|
|
|
clipService->ForceDataToClipboard(nsIClipboard::kGlobalClipboard);
|
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-02-16 09:22:03 +03:00
|
|
|
static nsresult OpenBrowserWindow(PRInt32 height, PRInt32 width)
|
|
|
|
{
|
|
|
|
nsresult rv;
|
2000-02-26 06:52:06 +03:00
|
|
|
NS_WITH_SERVICE(nsICmdLineHandler, handler, NS_BROWSERSTARTUPHANDLER_PROGID, &rv);
|
2000-02-16 09:22:03 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
nsXPIDLCString chromeUrlForTask;
|
|
|
|
rv = handler->GetChromeUrlForTask(getter_Copies(chromeUrlForTask));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-02-26 06:52:06 +03:00
|
|
|
rv = OpenChromURL((const char *)chromeUrlForTask, height, width );
|
2000-02-16 09:22:03 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-05-17 01:57:23 +04:00
|
|
|
|
|
|
|
static void InitCachePrefs()
|
|
|
|
{
|
|
|
|
const char * const CACHE_DIR_PREF = "browser.cache.directory";
|
|
|
|
nsresult rv;
|
|
|
|
NS_WITH_SERVICE(nsIPref, prefs, NS_PREF_PROGID, &rv);
|
2000-05-17 02:14:55 +04:00
|
|
|
if (NS_FAILED(rv)) return;
|
2000-05-17 01:57:23 +04:00
|
|
|
|
|
|
|
// If the pref is already set don't do anything
|
|
|
|
nsCOMPtr<nsIFileSpec> cacheSubDir;
|
2000-05-17 02:14:55 +04:00
|
|
|
rv = prefs->GetFilePref(CACHE_DIR_PREF, getter_AddRefs(cacheSubDir));
|
|
|
|
if (NS_SUCCEEDED(rv) && cacheSubDir.get()) return;
|
2000-05-17 01:57:23 +04:00
|
|
|
|
|
|
|
// Set up the new pref
|
|
|
|
rv = NS_NewFileSpec(getter_AddRefs(cacheSubDir));
|
2000-05-17 02:14:55 +04:00
|
|
|
if(NS_FAILED(rv)) return;
|
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
nsCOMPtr<nsIFileSpec> spec(dont_AddRef(NS_LocateFileOrDirectory(nsSpecialFileSpec::App_UserProfileDirectory50)));
|
2000-05-17 01:57:23 +04:00
|
|
|
rv = cacheSubDir->FromFileSpec(spec);
|
2000-05-17 02:14:55 +04:00
|
|
|
if(NS_FAILED(rv)) return;
|
2000-05-17 01:57:23 +04:00
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
rv = cacheSubDir->AppendRelativeUnixPath("Cache") ;
|
|
|
|
if(NS_FAILED(rv)) return;
|
|
|
|
|
|
|
|
prefs->SetFilePref(CACHE_DIR_PREF, cacheSubDir, PR_FALSE);
|
2000-05-17 01:57:23 +04:00
|
|
|
}
|
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
static nsresult Ensure1Window( nsICmdLineService* cmdLineArgs)
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
NS_WITH_SERVICE(nsIWindowMediator, windowMediator, kWindowMediatorCID, &rv);
|
|
|
|
nsCOMPtr<nsISimpleEnumerator> windowEnumerator;
|
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
if (NS_SUCCEEDED(windowMediator->GetEnumerator(nsnull, getter_AddRefs(windowEnumerator))))
|
|
|
|
{
|
|
|
|
PRBool more;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
windowEnumerator->HasMoreElements(&more);
|
|
|
|
if ( !more )
|
|
|
|
{
|
|
|
|
// No window exists so lets create a browser one
|
|
|
|
PRInt32 height = NS_SIZETOCONTENT;
|
|
|
|
PRInt32 width = NS_SIZETOCONTENT;
|
1999-08-31 06:49:12 +04:00
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
// Get the value of -width option
|
2000-06-10 00:58:59 +04:00
|
|
|
nsXPIDLCString tempString;
|
|
|
|
rv = cmdLineArgs->GetCmdLineValue("-width", getter_Copies(tempString));
|
1999-08-31 11:36:02 +04:00
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
2000-06-10 00:58:59 +04:00
|
|
|
if ((const char*)tempString)
|
1999-08-31 11:36:02 +04:00
|
|
|
PR_sscanf(tempString, "%d", &width);
|
1999-08-31 06:49:12 +04:00
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
// Get the value of -height option
|
2000-06-10 00:58:59 +04:00
|
|
|
rv = cmdLineArgs->GetCmdLineValue("-height", getter_Copies(tempString));
|
1999-08-31 11:36:02 +04:00
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
1999-08-31 06:49:12 +04:00
|
|
|
|
2000-06-10 00:58:59 +04:00
|
|
|
if ((const char*)tempString)
|
1999-08-31 11:36:02 +04:00
|
|
|
PR_sscanf(tempString, "%d", &height);
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-16 09:22:03 +03:00
|
|
|
rv = OpenBrowserWindow(height, width);
|
1999-08-31 11:36:02 +04:00
|
|
|
}
|
1999-08-31 06:49:12 +04:00
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-05-14 01:43:39 +04:00
|
|
|
nsresult CheckForNewChrome(void) {
|
|
|
|
|
|
|
|
nsCOMPtr <nsIChromeRegistry> chromeReg = do_GetService("component://netscape/chrome/chrome-registry");
|
|
|
|
NS_ASSERTION(chromeReg, "chrome check couldn't get the chrome registry");
|
|
|
|
|
|
|
|
if (chromeReg)
|
|
|
|
return chromeReg->CheckForNewChrome();
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
1999-11-30 07:50:42 +03:00
|
|
|
#ifdef DEBUG_warren
|
|
|
|
#ifdef XP_PC
|
|
|
|
#define _CRTDBG_MAP_ALLOC
|
|
|
|
#include <crtdbg.h>
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2000-01-11 05:30:12 +03:00
|
|
|
#if defined(FREEBSD)
|
|
|
|
// pick up fpsetmask prototype.
|
|
|
|
#include <floatingpoint.h>
|
|
|
|
#endif
|
|
|
|
|
2000-05-13 02:37:20 +04:00
|
|
|
// Note: nativeApp is an owning reference that this function has responsibility
|
2000-02-04 17:40:08 +03:00
|
|
|
// to release. This responsibility is delegated to the app shell service
|
|
|
|
// (see nsAppShellService::Initialize call, below).
|
2000-05-13 02:37:20 +04:00
|
|
|
static nsresult main1(int argc, char* argv[], nsISupports *nativeApp )
|
1999-08-31 06:49:12 +04:00
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
|
1999-11-30 07:50:42 +03:00
|
|
|
#ifdef DEBUG_warren
|
|
|
|
// _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);
|
|
|
|
#endif
|
|
|
|
|
2000-01-25 00:28:28 +03:00
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
#ifndef XP_MAC
|
|
|
|
// Unbuffer debug output (necessary for automated QA performance scripts).
|
|
|
|
setbuf( stdout, 0 );
|
|
|
|
#endif
|
2000-01-11 05:30:12 +03:00
|
|
|
|
|
|
|
#if defined(FREEBSD)
|
|
|
|
// Disable all SIGFPE's on FreeBSD, as it has non-IEEE-conformant fp
|
|
|
|
// trap behavior that trips up on floating-point tests performed by
|
|
|
|
// the JS engine. See bugzilla bug 9967 details.
|
|
|
|
fpsetmask(0);
|
|
|
|
#endif
|
2000-02-15 04:32:12 +03:00
|
|
|
|
2000-05-17 05:55:46 +04:00
|
|
|
// Setup an autoreg obserer, so that we can update a progress
|
|
|
|
// string in the splash screen
|
|
|
|
nsCOMPtr<nsIObserverService> obsService = do_GetService(NS_OBSERVERSERVICE_PROGID);
|
|
|
|
if (obsService)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIObserver> splashScreenObserver = do_QueryInterface(nativeApp);
|
|
|
|
if (splashScreenObserver)
|
|
|
|
{
|
|
|
|
obsService->AddObserver(splashScreenObserver, NS_ConvertASCIItoUCS2(NS_XPCOM_AUTOREGISTRATION_OBSERVER_ID).GetUnicode());
|
|
|
|
}
|
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-15 04:32:12 +03:00
|
|
|
//----------------------------------------------------------------
|
|
|
|
// XPInstall needs to clean up after any updates that couldn't
|
2000-05-17 08:44:14 +04:00
|
|
|
// be completed because components were in use. This must be done
|
2000-02-15 04:32:12 +03:00
|
|
|
// **BEFORE** any other libraries are loaded!
|
|
|
|
//
|
|
|
|
// Will also check to see if AutoReg is required due to version
|
|
|
|
// change or installation of new components. If for some reason
|
|
|
|
// XPInstall can't be loaded we assume Autoreg is required.
|
|
|
|
//
|
|
|
|
// (scoped in a block to force release of COMPtr)
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
PRBool needAutoreg = PR_TRUE;
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsISoftwareUpdate> su = do_GetService(kSoftUpdateCID,&rv);
|
|
|
|
if (NS_SUCCEEDED(rv))
|
|
|
|
{
|
|
|
|
su->StartupTasks( &needAutoreg );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// nsServiceManager::UnregisterService(kSoftUpdateCID);
|
2000-05-17 08:44:14 +04:00
|
|
|
|
|
|
|
#if XP_MAC
|
2000-05-17 02:14:55 +04:00
|
|
|
stTSMCloser tsmCloser;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-02-12 01:10:43 +03:00
|
|
|
rv = InitializeMacCommandLine( argc, argv);
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "Initializing AppleEvents failed");
|
2000-05-17 02:14:55 +04:00
|
|
|
#endif
|
1999-09-04 03:41:26 +04:00
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
// XXX: This call will be replaced by a registry initialization...
|
2000-02-15 04:32:12 +03:00
|
|
|
NS_SetupRegistry_1( needAutoreg );
|
|
|
|
|
2000-05-17 05:55:46 +04:00
|
|
|
// remove the nativeApp as an XPCOM autoreg observer
|
|
|
|
if (obsService)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIObserver> splashScreenObserver = do_QueryInterface(nativeApp);
|
|
|
|
if (splashScreenObserver)
|
|
|
|
{
|
|
|
|
obsService->RemoveObserver(splashScreenObserver, NS_ConvertASCIItoUCS2(NS_XPCOM_AUTOREGISTRATION_OBSERVER_ID).GetUnicode());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-02-15 04:32:12 +03:00
|
|
|
// Start up the core services:
|
1999-08-31 06:49:12 +04:00
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
// Initialize the cmd line service
|
1999-08-31 06:49:12 +04:00
|
|
|
NS_WITH_SERVICE(nsICmdLineService, cmdLineArgs, kCmdLineServiceCID, &rv);
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get command line service");
|
2000-05-17 08:44:14 +04:00
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
fprintf(stderr, "Could not obtain CmdLine processing service\n");
|
|
|
|
return rv;
|
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
rv = cmdLineArgs->Initialize(argc, argv);
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to initialize command line args");
|
1999-08-31 06:49:12 +04:00
|
|
|
if (rv == NS_ERROR_INVALID_ARG) {
|
|
|
|
PrintUsage();
|
|
|
|
return rv;
|
|
|
|
}
|
1999-08-31 11:36:02 +04:00
|
|
|
|
2000-05-14 01:43:39 +04:00
|
|
|
CheckForNewChrome();
|
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
// Create the Application Shell instance...
|
|
|
|
NS_WITH_SERVICE(nsIAppShellService, appShell, kAppShellServiceCID, &rv);
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get the appshell service");
|
1999-08-31 06:49:12 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
2000-05-13 02:37:20 +04:00
|
|
|
// See if platform supports nsINativeAppSupport.
|
|
|
|
nsCOMPtr<nsINativeAppSupport> nativeAppSupport = do_QueryInterface( nativeApp );
|
|
|
|
if ( nativeAppSupport ) {
|
|
|
|
// Use that interface to remove splash screen.
|
|
|
|
nativeAppSupport->HideSplashScreen();
|
|
|
|
} else {
|
|
|
|
// See if platform supports nsISplashScreen, instead.
|
|
|
|
nsCOMPtr<nsISplashScreen> splashScreen = do_QueryInterface( nativeApp );
|
|
|
|
if ( splashScreen ) {
|
|
|
|
splashScreen->Hide();
|
|
|
|
}
|
|
|
|
}
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-05-13 02:37:20 +04:00
|
|
|
// Release argument object.
|
|
|
|
NS_IF_RELEASE( nativeApp );
|
1999-08-31 11:36:02 +04:00
|
|
|
return rv;
|
1999-08-31 06:49:12 +04:00
|
|
|
}
|
|
|
|
|
2000-05-13 02:37:20 +04:00
|
|
|
rv = appShell->Initialize( cmdLineArgs, nativeApp );
|
|
|
|
// We are done with the native app (or splash screen) object here;
|
|
|
|
// the app shell owns it now.
|
|
|
|
NS_IF_RELEASE( nativeApp );
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to initialize appshell");
|
2000-05-17 08:44:14 +04:00
|
|
|
if ( NS_FAILED(rv) ) return rv;
|
1999-10-05 08:12:58 +04:00
|
|
|
|
1999-09-10 05:05:31 +04:00
|
|
|
NS_WITH_SERVICE(nsIProfile, profileMgr, kProfileCID, &rv);
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get profile manager");
|
2000-05-17 08:44:14 +04:00
|
|
|
if ( NS_FAILED(rv) ) return rv;
|
1999-10-05 08:12:58 +04:00
|
|
|
|
|
|
|
rv = profileMgr->StartupWithArgs(cmdLineArgs);
|
2000-05-17 02:14:55 +04:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
1999-08-31 06:49:12 +04:00
|
|
|
|
1999-10-07 07:10:18 +04:00
|
|
|
// if we get here, and we don't have a current profile, return a failure so we will exit
|
1999-10-07 13:12:27 +04:00
|
|
|
// this can happen, if the user hits Cancel or Exit in the profile manager dialogs
|
2000-03-30 05:35:15 +04:00
|
|
|
nsXPIDLString currentProfileStr;
|
2000-02-08 04:11:13 +03:00
|
|
|
rv = profileMgr->GetCurrentProfile(getter_Copies(currentProfileStr));
|
2000-05-17 08:44:14 +04:00
|
|
|
if (NS_FAILED(rv) || !((const PRUnichar *)currentProfileStr) ||
|
2000-03-30 05:35:15 +04:00
|
|
|
(nsCRT::strlen((const PRUnichar *)currentProfileStr) == 0)) {
|
1999-10-07 07:10:18 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
1999-10-13 02:20:28 +04:00
|
|
|
// rjc: now must explicitly call appshell's CreateHiddenWindow() function AFTER profile manager.
|
|
|
|
// if the profile manager ever switches to using nsIDOMWindow stuff, this might have to change
|
|
|
|
appShell->CreateHiddenWindow();
|
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
// Enumerate AppShellComponenets
|
|
|
|
appShell->EnumerateAndInitializeComponents();
|
|
|
|
|
|
|
|
// This will go away once Components are handling there own commandlines
|
1999-09-16 10:50:17 +04:00
|
|
|
// if we have no command line arguments, we need to heed the
|
|
|
|
// "general.startup.*" prefs
|
|
|
|
// if we had no command line arguments, argc == 1.
|
2000-02-26 11:29:40 +03:00
|
|
|
#ifdef XP_MAC
|
|
|
|
// if we do no command line args on the mac, it says argc is 0, and not 1
|
|
|
|
rv = DoCommandLines( cmdLineArgs, ((argc == 1) || (argc == 0)) );
|
|
|
|
#else
|
1999-09-16 10:50:17 +04:00
|
|
|
rv = DoCommandLines( cmdLineArgs, (argc == 1) );
|
2000-02-26 11:29:40 +03:00
|
|
|
#endif /* XP_MAC */
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to process command line");
|
1999-08-31 06:49:12 +04:00
|
|
|
if ( NS_FAILED(rv) )
|
1999-08-31 11:36:02 +04:00
|
|
|
return rv;
|
2000-03-08 00:02:50 +03:00
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
// Make sure there exists at least 1 window.
|
1999-11-30 07:50:42 +03:00
|
|
|
rv = Ensure1Window( cmdLineArgs );
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to Ensure1Window");
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
// Fire up the walletService. Why the heck is this here?
|
1999-10-07 06:48:27 +04:00
|
|
|
NS_WITH_SERVICE(nsIWalletService, walletService, kWalletServiceCID, &rv);
|
2000-03-06 00:26:01 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "wallet failed");
|
2000-05-17 02:14:55 +04:00
|
|
|
if (NS_SUCCEEDED(rv))
|
|
|
|
{
|
|
|
|
// this is a no-op. What is going on?
|
|
|
|
walletService->WALLET_FetchFromNetCenter();
|
|
|
|
}
|
1999-02-19 00:53:31 +03:00
|
|
|
|
2000-05-17 01:57:23 +04:00
|
|
|
InitCachePrefs();
|
2000-05-17 02:14:55 +04:00
|
|
|
|
1999-08-31 06:49:12 +04:00
|
|
|
// Start main event loop
|
1999-02-23 10:17:10 +03:00
|
|
|
rv = appShell->Run();
|
1999-11-30 07:50:42 +03:00
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to run appshell");
|
2000-04-27 08:02:22 +04:00
|
|
|
|
|
|
|
#ifdef NS_TRACE_MALLOC
|
|
|
|
// XXX we crash somewhere under nsAppShellService::Shutdown...
|
|
|
|
NS_TraceMallocShutdown();
|
|
|
|
#endif
|
2000-05-17 08:44:14 +04:00
|
|
|
|
1998-12-03 04:37:46 +03:00
|
|
|
/*
|
1999-01-27 05:11:56 +03:00
|
|
|
* Shut down the Shell instance... This is done even if the Run(...)
|
1998-12-03 04:37:46 +03:00
|
|
|
* method returned an error.
|
|
|
|
*/
|
|
|
|
(void) appShell->Shutdown();
|
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
return rv;
|
1998-12-03 04:37:46 +03:00
|
|
|
}
|
1999-07-28 12:42:53 +04:00
|
|
|
|
2000-01-04 06:06:25 +03:00
|
|
|
|
|
|
|
// English text needs to go into a dtd file.
|
2000-05-17 02:14:55 +04:00
|
|
|
// But when this is called we have no components etc. These strings must either be
|
|
|
|
// here, or in a native resource file.
|
|
|
|
static void DumpHelp(char *appname)
|
1999-09-16 15:30:18 +04:00
|
|
|
{
|
2000-02-05 02:11:19 +03:00
|
|
|
printf("Usage: %s [ options ... ] [URL]\n", appname);
|
1999-12-28 10:41:05 +03:00
|
|
|
printf(" where options include:\n");
|
|
|
|
printf("\n");
|
2000-02-05 02:11:19 +03:00
|
|
|
printf("%s-height <value>%sSet height of startup window to <value>.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-h or -help%sPrint this message.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-installer%sStart with 4.x migration window.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-pref%sStart with pref window.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-width <value>%sSet width of startup window to <value>.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-v or -version%sPrint %s version.\n",HELP_SPACER_1,HELP_SPACER_2, appname);
|
|
|
|
printf("%s-CreateProfile <profile>%sCreate and start with <profile>.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-P <profile>%sStart with <profile>.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-ProfileWizard%sStart with profile wizard.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-ProfileManager%sStart with profile manager.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
printf("%s-SelectProfile%sStart with profile selection dialog.\n",HELP_SPACER_1,HELP_SPACER_2);
|
2000-02-14 01:24:14 +03:00
|
|
|
#ifdef XP_UNIX
|
|
|
|
printf("%s-splash%sEnable splash screen.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
#else
|
2000-02-13 19:49:41 +03:00
|
|
|
printf("%s-nosplash%sDisable splash screen.\n",HELP_SPACER_1,HELP_SPACER_2);
|
2000-05-17 09:44:05 +04:00
|
|
|
#ifdef XP_PC
|
|
|
|
printf("%s-quiet%sDisable splash screen.\n",HELP_SPACER_1,HELP_SPACER_2);
|
|
|
|
#endif
|
2000-02-14 01:24:14 +03:00
|
|
|
#endif
|
2000-02-05 02:11:19 +03:00
|
|
|
|
2000-02-27 23:51:11 +03:00
|
|
|
// this works, but only after the components have registered. so if you drop in a new command line handler, -help
|
2000-02-26 06:52:06 +03:00
|
|
|
// won't not until the second run.
|
|
|
|
// out of the bug, because we ship a component.reg file, it works correctly.
|
2000-02-05 02:11:19 +03:00
|
|
|
DumpArbitraryHelp();
|
1999-09-16 15:30:18 +04:00
|
|
|
}
|
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
static void DumpVersion(char *appname)
|
1999-09-16 15:30:18 +04:00
|
|
|
{
|
|
|
|
printf("%s: version info\n", appname);
|
|
|
|
}
|
1999-08-31 06:49:12 +04:00
|
|
|
|
1999-09-18 05:43:35 +04:00
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
static PRBool HandleDumpArguments(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
int i = 0;
|
1999-09-16 15:30:18 +04:00
|
|
|
|
2000-03-28 12:20:38 +04:00
|
|
|
for (i=1; i<argc; i++) {
|
2000-04-20 08:35:07 +04:00
|
|
|
if ((PL_strcasecmp(argv[i], "-h") == 0)
|
2000-05-17 08:44:14 +04:00
|
|
|
|| (PL_strcasecmp(argv[i], "-help") == 0)
|
2000-04-25 06:15:55 +04:00
|
|
|
#if defined(XP_UNIX) || defined(XP_BEOS)
|
2000-04-20 08:35:07 +04:00
|
|
|
|| (PL_strcasecmp(argv[i], "--help") == 0)
|
2000-04-25 06:15:55 +04:00
|
|
|
#endif /* XP_UNIX || XP_BEOS*/
|
2000-02-08 15:10:22 +03:00
|
|
|
#ifdef XP_PC
|
2000-04-20 08:35:07 +04:00
|
|
|
|| (PL_strcasecmp(argv[i], "/h") == 0)
|
|
|
|
|| (PL_strcasecmp(argv[i], "/help") == 0)
|
|
|
|
|| (PL_strcasecmp(argv[i], "/?") == 0)
|
2000-02-08 15:10:22 +03:00
|
|
|
#endif /* XP_PC */
|
2000-04-20 08:35:07 +04:00
|
|
|
) {
|
|
|
|
DumpHelp(argv[0]);
|
2000-05-17 02:14:55 +04:00
|
|
|
return PR_TRUE;
|
2000-04-20 08:35:07 +04:00
|
|
|
}
|
|
|
|
if ((PL_strcasecmp(argv[i], "-v") == 0)
|
2000-05-17 08:44:14 +04:00
|
|
|
|| (PL_strcasecmp(argv[i], "-version") == 0)
|
2000-04-25 06:15:55 +04:00
|
|
|
#if defined(XP_UNIX) || defined(XP_BEOS)
|
2000-04-20 08:35:07 +04:00
|
|
|
|| (PL_strcasecmp(argv[i], "--version") == 0)
|
2000-04-25 06:15:55 +04:00
|
|
|
#endif /* XP_UNIX || XP_BEOS */
|
2000-02-08 15:10:22 +03:00
|
|
|
#ifdef XP_PC
|
2000-04-20 08:35:07 +04:00
|
|
|
|| (PL_strcasecmp(argv[i], "/v") == 0)
|
|
|
|
|| (PL_strcasecmp(argv[i], "/version") == 0)
|
2000-02-08 15:10:22 +03:00
|
|
|
#endif /* XP_PC */
|
2000-04-20 08:35:07 +04:00
|
|
|
) {
|
|
|
|
DumpVersion(argv[0]);
|
2000-05-17 02:14:55 +04:00
|
|
|
return PR_TRUE;
|
2000-04-20 08:35:07 +04:00
|
|
|
}
|
1999-09-16 15:30:18 +04:00
|
|
|
}
|
2000-04-20 08:35:07 +04:00
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PRBool GetWantSplashScreen(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
PRBool dosplash;
|
|
|
|
// We can't use the command line service here because it isn't running yet
|
|
|
|
#if defined(XP_UNIX) && !defined(NTO)
|
|
|
|
dosplash = PR_FALSE;
|
|
|
|
for (i=1; i<argc; i++)
|
|
|
|
if ((PL_strcasecmp(argv[i], "-splash") == 0)
|
|
|
|
|| (PL_strcasecmp(argv[i], "--splash") == 0))
|
|
|
|
dosplash = PR_TRUE;
|
|
|
|
#else
|
|
|
|
dosplash = PR_TRUE;
|
|
|
|
for (i=1; i<argc; i++)
|
|
|
|
if ((PL_strcasecmp(argv[i], "-nosplash") == 0)
|
|
|
|
#ifdef XP_BEOS
|
|
|
|
|| (PL_strcasecmp(argv[i], "--nosplash") == 0)
|
|
|
|
#endif /* XP_BEOS */
|
|
|
|
#ifdef XP_PC
|
|
|
|
|| (PL_strcasecmp(argv[i], "/nosplash") == 0)
|
|
|
|
#endif /* XP_PC */
|
|
|
|
) {
|
|
|
|
dosplash = PR_FALSE;
|
|
|
|
}
|
|
|
|
#endif
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
return dosplash;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
#if defined(XP_UNIX)
|
|
|
|
InstallUnixSignalHandlers(argv[0]);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Handle -help and -version command line arguments.
|
|
|
|
// They should return quick, so we deal with them here.
|
|
|
|
if (HandleDumpArguments(argc, argv))
|
|
|
|
return 0;
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-06-01 06:10:53 +04:00
|
|
|
#ifdef NS_TRACE_MALLOC
|
|
|
|
argc = NS_TraceMallocStartupArgs(argc, argv);
|
|
|
|
#endif
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-01-18 05:45:07 +03:00
|
|
|
// Call the code to install our handler
|
|
|
|
#ifdef MOZ_JPROF
|
|
|
|
setupProfilingStuff();
|
|
|
|
#endif
|
|
|
|
|
2000-05-13 02:37:20 +04:00
|
|
|
// Try to allocate "native app support."
|
|
|
|
// Note: this object is not released here. It is passed to main1 which
|
|
|
|
// has responsibility to release it.
|
|
|
|
nsINativeAppSupport *nativeApp = 0;
|
2000-05-17 02:14:55 +04:00
|
|
|
nsresult rv = NS_CreateNativeAppSupport( &nativeApp );
|
2000-05-13 02:37:20 +04:00
|
|
|
|
|
|
|
// See if we can run.
|
2000-05-17 02:14:55 +04:00
|
|
|
if (nativeApp)
|
|
|
|
{
|
2000-05-13 02:37:20 +04:00
|
|
|
PRBool canRun = PR_FALSE;
|
|
|
|
rv = nativeApp->Start( &canRun );
|
2000-05-17 02:14:55 +04:00
|
|
|
if (!canRun) {
|
2000-05-13 02:37:20 +04:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// If platform doesn't implement nsINativeAppSupport, fall
|
|
|
|
// back to old method.
|
2000-05-17 02:14:55 +04:00
|
|
|
if (!NS_CanRun())
|
2000-05-17 08:44:14 +04:00
|
|
|
return 1;
|
2000-05-13 02:37:20 +04:00
|
|
|
}
|
2000-02-04 17:40:08 +03:00
|
|
|
// Note: this object is not released here. It is passed to main1 which
|
|
|
|
// has responsibility to release it.
|
|
|
|
nsISplashScreen *splash = 0;
|
2000-05-17 02:14:55 +04:00
|
|
|
PRBool dosplash = GetWantSplashScreen(argc, argv);
|
2000-05-17 08:44:14 +04:00
|
|
|
|
2000-05-13 02:37:20 +04:00
|
|
|
if (dosplash && !nativeApp) {
|
|
|
|
// If showing splash screen and platform doesn't implement
|
|
|
|
// nsINativeAppSupport, then use older nsISplashScreen interface.
|
2000-05-17 02:14:55 +04:00
|
|
|
rv = NS_CreateSplashScreen(&splash);
|
2000-02-13 19:49:41 +03:00
|
|
|
NS_ASSERTION( NS_SUCCEEDED(rv), "NS_CreateSplashScreen failed" );
|
|
|
|
}
|
2000-02-04 17:40:08 +03:00
|
|
|
// If the platform has a splash screen, show it ASAP.
|
2000-05-17 02:14:55 +04:00
|
|
|
if (dosplash && nativeApp) {
|
2000-05-13 02:37:20 +04:00
|
|
|
nativeApp->ShowSplashScreen();
|
2000-05-17 02:14:55 +04:00
|
|
|
} else if (splash) {
|
2000-02-04 17:40:08 +03:00
|
|
|
splash->Show();
|
|
|
|
}
|
2000-01-06 04:05:13 +03:00
|
|
|
rv = NS_InitXPCOM(NULL, NULL);
|
1999-08-31 11:36:02 +04:00
|
|
|
NS_ASSERTION( NS_SUCCEEDED(rv), "NS_InitXPCOM failed" );
|
1999-07-28 12:42:53 +04:00
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
nsresult mainResult = main1(argc, argv, nativeApp ? (nsISupports*)nativeApp : (nsISupports*)splash);
|
2000-02-15 04:32:12 +03:00
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
rv = DoOnShutdown();
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "DoOnShutdown failed");
|
1999-11-04 03:08:59 +03:00
|
|
|
|
1999-08-31 11:36:02 +04:00
|
|
|
rv = NS_ShutdownXPCOM( NULL );
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed");
|
2000-03-21 06:31:20 +03:00
|
|
|
|
|
|
|
#ifdef DETECT_WEBSHELL_LEAKS
|
|
|
|
unsigned long count;
|
|
|
|
count = NS_TotalWebShellsInExistence();
|
|
|
|
if (count) {
|
|
|
|
printf("XXX WARNING: Number of webshells being leaked: %d \n", (int)count);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2000-05-17 02:14:55 +04:00
|
|
|
return TranslateReturnValue(mainResult);
|
1999-07-28 12:42:53 +04:00
|
|
|
}
|
2000-02-04 17:40:08 +03:00
|
|
|
|
|
|
|
#if defined( XP_PC ) && defined( WIN32 )
|
|
|
|
// We need WinMain in order to not be a console app. This function is
|
|
|
|
// unused if we are a console application.
|
2000-05-17 02:14:55 +04:00
|
|
|
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR args, int )
|
|
|
|
{
|
2000-02-04 17:40:08 +03:00
|
|
|
// Do the real work.
|
|
|
|
return main( __argc, __argv );
|
|
|
|
}
|
|
|
|
#endif // XP_PC && WIN32
|