This commit is contained in:
law%netscape.com 1998-12-17 21:56:06 +00:00
Родитель 3da8ddd767
Коммит 1ac9017ab6
2 изменённых файлов: 107 добавлений и 54 удалений

Просмотреть файл

@ -33,18 +33,20 @@ static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
NS_IMPL_ISUPPORTS(nsAppRunner, kIAppRunnerIID);
// ctor
nsAppRunner::nsAppRunner() {
nsAppRunner::nsAppRunner()
: mArgc( 0 ), mArg( 0 ) {
NS_INIT_REFCNT();
}
// dtor
nsAppRunner::~nsAppRunner() {
delete [] mArg;
}
// main
//
// Initialize, show splash screen, load and run the app shell. All work is
// farmed out to virtual functions to enable customization.
/*---------------------------- nsAppRunner::main -------------------------------
| Initialize, then load and run the app shell. All work is farmed out to |
| virtual functions to enable customization. | |
------------------------------------------------------------------------------*/
NS_IMETHODIMP
nsAppRunner::main( int argc, char *argv[] ) {
#if 0
@ -59,44 +61,30 @@ nsAppRunner::main( int argc, char *argv[] ) {
nsresult rv = Initialize();
if ( rv == NS_OK ) {
// See if we need to manage multiple instances.
if ( IsSingleInstanceOnly() ) {
DisplayMsg( "nsAppRunner error", "SingleInstanceOnly not supported" );
// ??? rv = NS_ERROR_INVALID_REQUEST;
} else {
}
// Show splash screen:
rv = ShowSplashScreen();
// Load app shell.
rv = LoadAppShell();
if ( rv == NS_OK ) {
// Load app shell.
rv = LoadAppShell();
// Execute the shell.
rv = AppShell()->Initialize();
if ( rv == NS_OK ) {
// Execute the shell.
rv = AppShell()->Initialize();
// Run the shell.
rv = AppShell()->Run();
if ( rv == NS_OK ) {
// Run the shell.
rv = AppShell()->Run();
// Shut it down.
AppShell()->Shutdown();
// Shut it down.
AppShell()->Shutdown();
if ( rv != NS_OK ) {
DisplayMsg( "nsAppRunner error", "app shell failed to run, rv=0x%lX", rv );
}
} else {
DisplayMsg( "nsAppRunner error", "app shell initialization failed, rv=0x%lX", rv );
if ( rv != NS_OK ) {
DisplayMsg( "nsAppRunner error", "app shell failed to run, rv=0x%lX", rv );
}
} else {
char *cid = AppShellCID().ToString();
DisplayMsg( "nsAppRunner error", "Unable to load app shell (CID=%s), rv=0x%lX", cid, rv );
delete [] cid;
DisplayMsg( "nsAppRunner error", "app shell initialization failed, rv=0x%lX", rv );
}
} else {
DisplayMsg( "nsAppRunner error", "ShowSplashScreen failed, rv=0x%lX", rv );
char *cid = AppShellCID().ToString();
DisplayMsg( "nsAppRunner error", "Unable to load app shell (CID=%s), rv=0x%lX", cid, rv );
delete [] cid;
}
} else {
DisplayMsg( "nsAppRunner error", "Initialize failed, rv=0x%lX", rv );
@ -106,9 +94,79 @@ nsAppRunner::main( int argc, char *argv[] ) {
#endif
}
virtual PRBool ParseCommandLine( int argc, char *argv[] );
virtual PRBool IsOptionSpecified( const char *key );
virtual const char *ValueForOption( const char *key );
/*---------------------- NSAppRunner::ParseCommandLine -------------------------
| Store the command line arguments in data members with minor twiddling to |
| simplify lookup. |
------------------------------------------------------------------------------*/
PRBool NSAppRunner::ParseCommandLine( int argc, char *argv[] ) { {
mArgc = argc;
// Allocate array of arg info structures.
mArg = new [argc] Arg;
// Fill in structures.
for( int i = 0; i < mArgc; i++ ) {
char *p = argv[i];
// "Key" is always the beginning
mArg[i].key = p;
// Bump pointer till we get to null or double quote.
while ( *p && *p != '"' ) {
p++;
}
// If not null, get value.
if ( *p ) {
*p++ = 0; // Terminate key and advance pointer.
// Value starts here.
mArg[i].value = p;
// Strip trailing '"'.
if ( p[ PR_strlen(p) ] == '"' ) {
p[ PR_strlen(p) ] = 0;
}
} else {
// Have value point to this null string.
mArg[i].value = p;
}
}
return PR_TRUE;
}
/*---------------------- NSAppRunner::IsOptionSpecified ------------------------
| Enumerate array of arg structures, looking for key. |
------------------------------------------------------------------------------*/
PRBool NSAppRunner::IsOptionSpecified( const char *key, PRBool ignoreCase ) {
PRBool result = PR_FALSE;
for( int i = 0; i < mArgc; i++ ) {
if ( ignoreCase ) {
if ( PR_strcmpi( key, mArg[i].key ) == 0 ) {
result = PR_TRUE;
break;
}
} else {
if ( PR_strcmp( key, mArg[i].key ) == 0 ) {
result = PR_TRUE;
break;
}
}
}
return result;
}
/*----------------------- NSAppRunner::*ValueForOption -------------------------
Look up key
------------------------------------------------------------------------------*/
const char *NSAppRunner::ValueForOption( const char *key, PRBool ignoreCase ) {
return 0;
}
// Process management:
// Initialize - Initialize kernel services. Default is to initialize

Просмотреть файл

@ -49,24 +49,11 @@ public:
virtual string ValueForOption( const char *key );
// Process management:
// Initialize - Initialize kernel services. Default is to initialize
// NSPR.
// ShowSplashScreen - Puts up splash screen. Default is to do nothing.
// We will override per platform, probably.
// IsSingleInstanceOnly - Default is PR_FALSE, platforms must override
// if they need to block multiple instances.
// IsAlreadyRunning - Indicate whether another process is already running.
// Default returns PR_FALSE; platforms should override
// if they care about this (i.e., return PR_TRUE from
// PermitsMultipleInstances).
// NotifyServerProcess - Passes request to the server process to be run.
// ...synchronization stuff...TBD
virtual PRBool Initialize();
virtual nsresult Exit( nsresult rv );
virtual PRBool ShowSplashScreen();
virtual PRBool IsSingleInstanceOnly() const;
virtual PRBool IsAlreadyRunning() const;
virtual PRBool NotifyServerProcess( int argc, char *argv[] );
// Initialize - Initialization; default does nothing.
// OnExit - Called just prior to exit; default returns
// input argument.
virtual nsresult Initialize();
virtual nsresult OnExit( nsresult rvIn );
// AppShell loading:
// AppShellCID - Returns CID for app shell to be loaded/started.
@ -88,6 +75,14 @@ public:
protected:
virtual ~nsAppRunner();
private:
int mArgc;
struct Arg {
const char *key;
const char *value;
} *mArg;
int IndexOfArg( const char *key, PRBool ignoreCase );
}; // nsAppRunner
#endif