gecko-dev/xpfe/bootstrap/nsAppRunner.cpp

725 строки
21 KiB
C++
Исходник Обычный вид История

1998-12-03 04:37:46 +03:00
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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
*
* 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
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
1998-12-03 04:37:46 +03:00
*/
#include "nsIServiceManager.h"
#include "nsIComponentManager.h"
1998-12-03 04:37:46 +03:00
#include "nsIURL.h"
#include "nsNetUtil.h"
1998-12-03 04:37:46 +03:00
#include "nsIWidget.h"
#include "nsIBrowserWindow.h"
#include "nsIWebShellWindow.h"
#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"
1998-12-03 04:37:46 +03:00
#include "nsIAppShell.h"
#include "nsICmdLineService.h"
#include "nsIThread.h"
1998-12-03 04:37:46 +03:00
#include "nsIAppShellService.h"
#include "nsIAppShellComponent.h"
#include "nsAppShellCIDs.h"
1999-02-19 00:53:31 +03:00
#include "prprf.h"
#include "nsCRT.h"
1999-04-10 10:41:59 +04:00
#include "nsFileSpec.h"
#include "nsIFileSpec.h"
1999-04-16 02:45:43 +04:00
#include "nsIFileLocator.h"
#include "nsFileLocations.h"
#include "nsFileStream.h"
#include "nsSpecialSystemDirectory.h"
#include "nsIWalletService.h"
#include "nsIWebShell.h"
#include "nsICookieService.h"
#include "nsIWindowMediator.h"
#include "nsIDOMWindow.h"
#include "nsIClipboard.h"
#include "nsISoftwareUpdate.h"
#include "nsSoftwareUpdateIIDs.h"
static NS_DEFINE_CID(kSoftUpdateCID, NS_SoftwareUpdate_CID);
static NS_DEFINE_IID(kIWindowMediatorIID,NS_IWINDOWMEDIATOR_IID);
static NS_DEFINE_CID(kWindowMediatorCID, NS_WINDOWMEDIATOR_CID);
static NS_DEFINE_CID(kWalletServiceCID, NS_WALLETSERVICE_CID);
#define PREF_GENERAL_STARTUP_BROWSER "general.startup.browser"
#define PREF_GENERAL_STARTUP_MAIL "general.startup.mail"
#define PREF_GENERAL_STARTUP_NEWS "general.startup.news"
#define PREF_GENERAL_STARTUP_EDITOR "general.startup.editor"
#define PREF_GENERAL_STARTUP_CALENDAR "general.startup.calendar"
1999-07-20 01:19:13 +04:00
#ifdef DEBUG
#include "prlog.h"
#endif
1999-04-10 10:41:59 +04:00
#ifdef MOZ_FULLCIRCLE
#include "fullsoft.h"
#endif
#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
#if defined(XP_UNIX)
extern void InstallUnixSignalHandlers(const char *ProgramName);
#endif
#if defined(XP_MAC)
#include "macstdlibextras.h"
#include <TextServices.h>
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.
static struct MacInitializer { MacInitializer() { InitializeMacToolbox(); } } gInitializer;
class stTSMCloser
{
public:
stTSMCloser()
1999-08-31 11:36:02 +04:00
{
// TSM is initialized in InitializeMacToolbox
};
~stTSMCloser()
{
(void)CloseTSMAwareApplication();
}
};
#endif // XP_MAC
1998-12-03 04:37:46 +03:00
/* Define Class IDs */
static NS_DEFINE_CID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID);
static NS_DEFINE_CID(kCmdLineServiceCID, NS_COMMANDLINE_SERVICE_CID);
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);
#include "nsNativeAppSupport.h"
/*********************************************/
// Default implemenations for nativeAppSupport
// If your platform implements these functions if def out this code.
#if !defined (XP_MAC )
void NS_ShowSplashScreen()
{
}
void NS_HideSplashScreen()
{
}
1998-12-03 04:37:46 +03:00
PRBool NS_CanRun()
{
return PR_TRUE;
}
#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;
}
#ifdef XP_MAC
#include "nsCommandLineServiceMac.h"
#endif
1998-12-03 04:37:46 +03:00
extern "C" void NS_SetupRegistry_1();
1998-12-03 04:37:46 +03:00
static void
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");
}
1998-12-03 04:37:46 +03:00
//----------------------------------------------------------------------------------------
static void InitFullCircle()
1998-12-03 04:37:46 +03:00
{
1999-08-31 11:36:02 +04:00
// initialization for Full Circle
#ifdef MOZ_FULLCIRCLE
1999-08-31 11:36:02 +04:00
FC_ERROR fcstatus = FC_ERROR_FAILED;
fcstatus = FCInitialize();
1999-08-31 11:36:02 +04:00
// Print out error status.
switch(fcstatus)
{
case FC_ERROR_OK:
printf("Talkback loaded Ok.\n");
break;
case FC_ERROR_CANT_INITIALIZE:
printf("Talkback error: Can't initialize.\n");
break;
case FC_ERROR_NOT_INITIALIZED:
printf("Talkback error: Not initialized.\n");
break;
case FC_ERROR_ALREADY_INITIALIZED:
printf("Talkback error: Already initialized.\n");
break;
case FC_ERROR_FAILED:
printf("Talkback error: Failure.\n");
break;
case FC_ERROR_OUT_OF_MEMORY:
printf("Talkback error: Out of memory.\n");
break;
case FC_ERROR_INVALID_PARAMETER:
printf("Talkback error: Invalid parameter.\n");
break;
default:
printf("Talkback error: Unknown error status.\n");
break;
}
1999-07-03 01:37:48 +04:00
#endif
}
static nsresult OpenWindow( const char*urlstr, const PRUnichar *args ) {
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;
}
static nsresult HandleEditorStartup( nsICmdLineService* cmdLineArgs, nsIPref *prefs, PRBool heedGeneralStartupPrefs)
{
char* cmdResult = nsnull;
char * urlstr=nsnull;
nsString withArgs;
nsresult rv;
PRBool forceLaunchEditor = PR_FALSE;
if (heedGeneralStartupPrefs) {
prefs->GetBoolPref(PREF_GENERAL_STARTUP_EDITOR,&forceLaunchEditor);
}
rv = cmdLineArgs->GetCmdLineValue("-edit", &cmdResult);
1999-08-31 11:36:02 +04:00
if (NS_SUCCEEDED(rv))
{
1999-10-21 03:50:20 +04:00
if (forceLaunchEditor || cmdResult) {
1999-08-31 11:36:02 +04:00
urlstr = "chrome://editor/content/";
1999-10-21 03:50:20 +04:00
if (cmdResult) {
if (PL_strcmp("1",cmdResult)==0) {
// this signals no URL after "-edit"?
withArgs = "about:blank";
} else {
// We have a URL -- Should we do some URL validating here?
withArgs = cmdResult;
}
1999-10-21 03:50:20 +04:00
}
OpenWindow( urlstr, withArgs.GetUnicode() );
}
}
return NS_OK;
}
static nsresult OpenChromURL( char * urlstr, PRInt32 height = NS_SIZETOCONTENT, PRInt32 width = NS_SIZETOCONTENT )
{
nsIURI* url = nsnull;
nsresult rv;
rv = NS_NewURI(&url, urlstr);
if ( NS_FAILED( rv ) )
return rv;
nsCOMPtr<nsIWebShellWindow> newWindow;
NS_WITH_SERVICE(nsIAppShellService, appShell, kAppShellServiceCID, &rv);
rv = appShell->CreateTopLevelWindow(nsnull, url,
1999-08-31 11:36:02 +04:00
PR_TRUE, PR_TRUE, NS_CHROME_ALL_CHROME,
nsnull, width, height,
getter_AddRefs(newWindow));
NS_IF_RELEASE( url );
return rv;
}
1999-02-19 00:53:31 +03:00
static nsresult HandleMailStartup( nsICmdLineService* cmdLineArgs, nsIPref *prefs, PRBool heedGeneralStartupPrefs)
{
char* cmdResult = nsnull;
char * urlstr=nsnull;
nsString withArgs;
nsresult rv;
PRBool forceLaunchMail = PR_FALSE;
PRBool forceLaunchNews = PR_FALSE;
PRInt32 height = NS_SIZETOCONTENT;
PRInt32 width = NS_SIZETOCONTENT;
// Get the value of -width option
char* tempString = NULL;
rv = cmdLineArgs->GetCmdLineValue("-width", &tempString);
if (NS_FAILED(rv))
1999-08-31 11:36:02 +04:00
return rv;
if (tempString)
1999-08-31 11:36:02 +04:00
PR_sscanf(tempString, "%d", &width);
// Get the value of -height option
rv = cmdLineArgs->GetCmdLineValue("-height", &tempString);
if (NS_FAILED(rv))
return rv;
if (tempString)
PR_sscanf(tempString, "%d", &height);
if (heedGeneralStartupPrefs) {
prefs->GetBoolPref(PREF_GENERAL_STARTUP_MAIL,&forceLaunchMail);
}
rv = cmdLineArgs->GetCmdLineValue("-mail", &cmdResult);
if (NS_SUCCEEDED(rv))
{
if (forceLaunchMail || (cmdResult && (PL_strcmp("1",cmdResult)==0)))
{
1999-08-31 11:36:02 +04:00
OpenChromURL("chrome://messenger/content/", height, width);
1999-08-31 11:36:02 +04:00
}
}
if (heedGeneralStartupPrefs) {
prefs->GetBoolPref(PREF_GENERAL_STARTUP_NEWS,&forceLaunchNews);
}
rv = cmdLineArgs->GetCmdLineValue("-news", &cmdResult);
if (NS_SUCCEEDED(rv))
{
if (forceLaunchNews || (cmdResult && (PL_strcmp("1",cmdResult)==0)))
1999-08-31 11:36:02 +04:00
OpenChromURL("chrome://messenger/content/", height, width);
}
rv = cmdLineArgs->GetCmdLineValue("-compose", &cmdResult);
if (NS_SUCCEEDED(rv))
{
if (cmdResult && (PL_strcmp("1",cmdResult)==0))
{
urlstr = "chrome://messengercompose/content/";
withArgs = "about:blank";
OpenWindow( urlstr, withArgs.GetUnicode() );
1999-08-31 11:36:02 +04:00
}
}
rv = cmdLineArgs->GetCmdLineValue("-addressbook", &cmdResult);
if (NS_SUCCEEDED(rv))
{
if (cmdResult && (PL_strcmp("1",cmdResult)==0))
1999-08-31 11:36:02 +04:00
OpenChromURL("chrome://addressbook/content/",height, width);
}
return NS_OK;
}
static nsresult HandleBrowserStartup( nsICmdLineService* cmdLineArgs, nsIPref *prefs, PRBool heedGeneralStartupPrefs)
{
char* cmdResult = nsnull;
nsString withArgs;
nsresult rv;
PRBool forceLaunchBrowser = PR_FALSE;
PRInt32 height = NS_SIZETOCONTENT;
PRInt32 width = NS_SIZETOCONTENT;
// Get the value of -width option
char* tempString = NULL;
rv = cmdLineArgs->GetCmdLineValue("-width", &tempString);
if (NS_FAILED(rv))
1999-08-31 11:36:02 +04:00
return rv;
if (tempString)
1999-08-31 11:36:02 +04:00
PR_sscanf(tempString, "%d", &width);
// Get the value of -height option
rv = cmdLineArgs->GetCmdLineValue("-height", &tempString);
if (NS_FAILED(rv))
return rv;
if (tempString)
PR_sscanf(tempString, "%d", &height);
if (heedGeneralStartupPrefs) {
prefs->GetBoolPref(PREF_GENERAL_STARTUP_BROWSER,&forceLaunchBrowser);
}
1999-08-31 11:36:02 +04:00
rv = cmdLineArgs->GetCmdLineValue("-chrome", &cmdResult);
if (forceLaunchBrowser) {
rv = OpenChromURL("chrome://navigator/content/", height, width );
}
else if (NS_SUCCEEDED(rv) && cmdResult) {
rv = OpenChromURL(cmdResult, height, width);
}
return rv;
}
// This should be done by app shell enumeration someday
static nsresult DoCommandLines( nsICmdLineService* cmdLine, PRBool heedGeneralStartupPrefs )
{
nsresult rv;
NS_WITH_SERVICE(nsIPref, prefs, kPrefCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = HandleEditorStartup( cmdLine, prefs, heedGeneralStartupPrefs);
if ( NS_FAILED( rv ) ) return rv;
rv = HandleMailStartup( cmdLine, prefs, heedGeneralStartupPrefs);
if ( NS_FAILED( rv ) ) return rv;
rv = HandleBrowserStartup( cmdLine, prefs, heedGeneralStartupPrefs);
return rv;
}
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;
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 11:36:02 +04:00
// Get the value of -width option
char* tempString = NULL;
rv = cmdLineArgs->GetCmdLineValue("-width", &tempString);
if (NS_FAILED(rv))
return rv;
if (tempString)
PR_sscanf(tempString, "%d", &width);
1999-08-31 11:36:02 +04:00
// Get the value of -height option
rv = cmdLineArgs->GetCmdLineValue("-height", &tempString);
if (NS_FAILED(rv))
return rv;
1999-08-31 11:36:02 +04:00
if (tempString)
PR_sscanf(tempString, "%d", &height);
1999-08-31 11:36:02 +04:00
rv = OpenChromURL("chrome://navigator/content/", height, width );
}
}
return rv;
}
#ifdef DEBUG_warren
#ifdef XP_PC
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#endif
#endif
#if defined(FREEBSD)
// pick up fpsetmask prototype.
#include <floatingpoint.h>
#endif
static nsresult main1(int argc, char* argv[])
{
nsresult rv;
#ifdef DEBUG_warren
// _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);
#endif
2000-01-25 00:28:28 +03:00
#ifndef XP_MAC
// Unbuffer debug output (necessary for automated QA performance scripts).
setbuf( stdout, 0 );
#endif
#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
InitFullCircle();
#if XP_MAC
stTSMCloser tsmCloser;
InitializeMacCommandLine( argc, argv);
#endif
// XXX: This call will be replaced by a registry initialization...
NS_SetupRegistry_1();
// Start up the core services:
1999-08-31 11:36:02 +04:00
// Initialize the cmd line service
NS_WITH_SERVICE(nsICmdLineService, cmdLineArgs, kCmdLineServiceCID, &rv);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get command line service");
if (NS_FAILED(rv)) {
fprintf(stderr, "Could not obtain CmdLine processing service\n");
return rv;
}
rv = cmdLineArgs->Initialize(argc, argv);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to initialize command line args");
if (rv == NS_ERROR_INVALID_ARG) {
PrintUsage();
return rv;
}
1999-08-31 11:36:02 +04:00
// Create the Application Shell instance...
NS_WITH_SERVICE(nsIAppShellService, appShell, kAppShellServiceCID, &rv);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get the appshell service");
if (NS_FAILED(rv)) {
1999-08-31 11:36:02 +04:00
return rv;
}
rv = appShell->Initialize( cmdLineArgs );
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to initialize appshell");
if ( NS_FAILED(rv) ) return rv;
#ifdef DEBUG
printf("initialized appshell\n");
#endif
NS_WITH_SERVICE(nsIProfile, profileMgr, kProfileCID, &rv);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get profile manager");
if ( NS_FAILED(rv) ) return rv;
rv = profileMgr->StartupWithArgs(cmdLineArgs);
if (NS_FAILED(rv)) {
return rv;
}
// 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
char *currentProfileStr = nsnull;
rv = profileMgr->GetCurrentProfile(&currentProfileStr);
if (NS_FAILED(rv) || !currentProfileStr || (PL_strlen(currentProfileStr) == 0)) {
return NS_ERROR_FAILURE;
}
PR_FREEIF(currentProfileStr);
// 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();
#ifdef NS_BUILD_REFCNT_LOGGING
nsTraceRefcnt::SetPrefServiceAvailability(PR_TRUE);
#endif
// fire up an instance of the cookie manager.
// I'm doing this using the serviceManager for convenience's sake.
// Presumably an application will init it's own cookie service a
// different way (this way works too though).
nsCOMPtr<nsICookieService> cookieService = do_GetService(NS_COOKIESERVICE_PROGID, &rv);
// quiet the compiler
(void)cookieService;
// Enumerate AppShellComponenets
appShell->EnumerateAndInitializeComponents();
// This will go away once Components are handling there own commandlines
// if we have no command line arguments, we need to heed the
// "general.startup.*" prefs
// if we had no command line arguments, argc == 1.
rv = DoCommandLines( cmdLineArgs, (argc == 1) );
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to process command line");
if ( NS_FAILED(rv) )
1999-08-31 11:36:02 +04:00
return rv;
1999-08-31 11:36:02 +04:00
// Make sure there exists at least 1 window.
rv = Ensure1Window( cmdLineArgs );
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to Ensure1Window");
if (NS_FAILED(rv)) return rv;
// Fire up the walletService
NS_WITH_SERVICE(nsIWalletService, walletService, kWalletServiceCID, &rv);
if ( NS_SUCCEEDED(rv) )
walletService->WALLET_FetchFromNetCenter();
1999-02-19 00:53:31 +03:00
NS_HideSplashScreen();
// Start main event loop
rv = appShell->Run();
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to run appshell");
1998-12-03 04:37:46 +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();
return rv ;
1998-12-03 04:37:46 +03:00
}
// English text needs to go into a dtd file.
static
void DumpHelp(char *appname)
{
printf("Usage: %s [ options ... ] [URL]\n", appname);
1999-12-28 10:41:05 +03:00
printf(" where options include:\n");
printf("\n");
printf(" -addressbook Start with AddressBook window.\n");
printf(" -chrome <url> Open chrome url..\n");
printf(" -compose Start with mail compose window.\n");
printf(" -edit Start with editor.\n");
printf(" -height <value> Set height of startup window to <value>.\n");
printf(" -h or -help Print this message.\n");
printf(" -installer Start with 4.x migration window.\n");
1999-12-28 10:41:05 +03:00
printf(" -mail Start with mail window.\n");
printf(" -news Start with news window.\n");
printf(" -pref Start with pref window.\n");
printf(" -width <value> Set width of startup window to <value>.\n");
printf(" -v or -version Print %s version.\n", appname);
printf(" -CreateProfile <profile> Create and start with <profile>.\n");
printf(" -P <profile> Start with <profile>.\n");
printf(" -ProfileWizard Start with profile wizard.\n");
printf(" -ProfileManager Start with profile manager.\n");
printf(" -SelectProfile Start with profile selection dialog.\n");
}
static
void DumpVersion(char *appname)
{
printf("%s: version info\n", appname);
}
1999-09-18 05:43:35 +04:00
int main(int argc, char* argv[])
{
#if defined(XP_UNIX)
InstallUnixSignalHandlers(argv[0]);
#endif
1999-09-18 05:43:35 +04:00
1999-08-31 11:36:02 +04:00
nsresult rv;
/* -help and -version should return quick */
if (argc == 2) {
if ((PL_strcmp(argv[1], "-h") == 0) || (PL_strcmp(argv[1], "-help") == 0) || (PL_strcmp(argv[1], "--help") == 0)) {
DumpHelp(argv[0]);
return 0;
}
else if ((PL_strcmp(argv[1], "-v") == 0) || (PL_strcmp(argv[1], "-version") == 0) || (PL_strcmp(argv[1], "--version") == 0)) {
DumpVersion(argv[0]);
return 0;
}
}
// Call the code to install our handler
#ifdef MOZ_JPROF
setupProfilingStuff();
#endif
1999-08-31 11:36:02 +04:00
if( !NS_CanRun() )
return 1;
NS_ShowSplashScreen();
I know it's unorthodox to do a top level checkin like this, but I've got so many files in so many different directories, that I think it's the best way. I've pulled and clobber_all'd my tree and got r=dp on this checkin. Here are the touched files: M mozilla/embedding/browser/activex/src/control/MozillaBrowser.cpp M mozilla/embedding/browser/activex/src/control/MozillaBrowser.h M mozilla/js/src/xpconnect/shell/xpcshell.cpp M mozilla/netwerk/protocol/res/src/nsResProtocolHandler.cpp M mozilla/xpcom/build/nsXPComInit.cpp M mozilla/xpcom/components/nsComponentManager.cpp M mozilla/xpcom/components/nsIServiceManager.h M mozilla/xpcom/components/nsServiceManager.cpp M mozilla/xpcom/io/nsSpecialSystemDirectory.cpp M mozilla/xpcom/io/nsSpecialSystemDirectory.h M mozilla/xpcom/tests/TestBuffers.cpp M mozilla/xpcom/tests/TestPipes.cpp M mozilla/xpcom/tests/TestShutdown.cpp M mozilla/xpcom/tests/windows/TestHelloXPLoop.cpp M mozilla/xpcom/tools/registry/regExport.cpp M mozilla/xpcom/tools/registry/regxpcom.cpp M mozilla/xpinstall/stub/xpistub.cpp M mozilla/webshell/embed/ActiveX/MozillaBrowser.cpp M mozilla/webshell/embed/ActiveX/MozillaBrowser.h M mozilla/webshell/tests/viewer/nsMacMain.cpp M mozilla/webshell/tests/viewer/nsPhMain.cpp M mozilla/webshell/tests/viewer/nsWinMain.cpp M mozilla/webshell/tests/viewer/unix/gtk/nsGtkMain.cpp M mozilla/xpfe/appshell/src/nsFileLocations.cpp M mozilla/xpfe/bootstrap/nsAppRunner.cpp The heart of this checkin is a change in the signature and symantics of NS_InitXPCOM. The new signature is extern NS_COM nsresult NS_InitXPCOM(nsIServiceManager* *result, nsFileSpec* binDirectory); I filed a bug for this problem: b=23157 The original manifestation of this bug was in mozilla/netwerk/protocol/res/src/nsResProtocolHandler.cpp It used the current process directory to find resources, which is not correct when the current process is not mozilla.exe. I have added a new type to nsSpecialSystemDirectory, Moz_BinDirectory, and made nsResProtocolHandler use that value.
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" );
{
//----------------------------------------------------------------
// XPInstall needs to clean up after any updates that couldn't
// be completed because components were in use. This must be done
// **BEFORE** any other components are loaded!
//
// Will also check to see if AutoReg is required due to version
// change or installation of new components
//
// (scoped in a block to force release of COMPtr)
//----------------------------------------------------------------
nsCOMPtr<nsISoftwareUpdate> su = do_GetService(kSoftUpdateCID,&rv);
if (NS_SUCCEEDED(rv))
su->StartupTasks();
}
1999-08-31 11:36:02 +04:00
nsresult result = main1( argc, argv );
{
// Scoping this in a block to force the pref service to be
// released.
//
// 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();
}
}
#ifdef DETECT_WEBSHELL_LEAKS
if ( unsigned long count = NS_TotalWebShellsInExistence() ) {
printf("XXX WARNING: Number of webshells being leaked: %d \n", count);
1999-08-31 11:36:02 +04:00
}
#endif
// 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.
NS_WITH_SERVICE(nsIClipboard, clipService, "component://netscape/widget/clipboard", &rv);
if ( clipService )
clipService->ForceDataToClipboard();
1999-08-31 11:36:02 +04:00
rv = NS_ShutdownXPCOM( NULL );
NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed");
return TranslateReturnValue( result );
}