Fix for bug 67466 -- don't crash when opening lots of files on startup. r=pinkerton, sr=beard

This commit is contained in:
sfraser%netscape.com 2001-03-08 00:59:54 +00:00
Родитель 9798e10ddf
Коммит cb3e487353
4 изменённых файлов: 58 добавлений и 88 удалений

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

@ -59,7 +59,7 @@ nsMacCommandLine nsMacCommandLine::sMacCommandLine;
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
nsMacCommandLine::nsMacCommandLine() nsMacCommandLine::nsMacCommandLine()
: mArgBuffer(NULL) : mArgsBuffer(NULL)
, mArgs(NULL) , mArgs(NULL)
, mStartedUp(PR_FALSE) , mStartedUp(PR_FALSE)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
@ -72,6 +72,8 @@ nsMacCommandLine::~nsMacCommandLine()
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
ShutdownAEHandlerClasses(); ShutdownAEHandlerClasses();
nsMemory::Free(mArgsBuffer);
mArgsBuffer = NULL;
} }
@ -85,6 +87,9 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
argc = 0; argc = 0;
argv = mArgs; argv = mArgs;
// init the args buffer with the program name
mTempArgsString.Assign("mozilla");
// Set up AppleEvent handling. // Set up AppleEvent handling.
OSErr err = CreateAEHandlerClasses(false); OSErr err = CreateAEHandlerClasses(false);
if (err != noErr) return NS_ERROR_FAILURE; if (err != noErr) return NS_ERROR_FAILURE;
@ -105,25 +110,27 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
{ {
::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull); ::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull);
if (anEvent.what == kHighLevelEvent) if (anEvent.what == kHighLevelEvent)
{
// here we process startup odoc/pdoc events, which can
// add items to the command line.
err = ::AEProcessAppleEvent(&anEvent); err = ::AEProcessAppleEvent(&anEvent);
}
} }
// we've started up now // we've started up now
mStartedUp = PR_TRUE; mStartedUp = PR_TRUE;
// Care! We have to ensure that the addresses we pass out in
// argv continue to point to valid memory. Because we can't guarantee
// anything about the way that nsCString works, we make a copy
// of the buffer, which is never freed until the command line handler
// goes way (and, since it's static, that is at library unload time).
mArgsBuffer = mTempArgsString.ToNewCString();
mTempArgsString.Truncate(); // it's job is done
if (!mArgBuffer) // no arguments from anywhere
return NS_OK;
// Release some unneeded memory
char* oldBuffer = mArgBuffer;
mArgBuffer = new char[PL_strlen(mArgBuffer) + 1];
PL_strcpy(mArgBuffer, oldBuffer);
delete [] oldBuffer;
// Parse the buffer. // Parse the buffer.
int rowNumber = 0; char* strtokFirstParam = mArgsBuffer;
char* strtokFirstParam = mArgBuffer;
while (argc < kMaxTokens) while (argc < kMaxTokens)
{ {
// Get the next token. Initialize strtok by passing the string the // Get the next token. Initialize strtok by passing the string the
@ -147,37 +154,17 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
delete [] oldArgs; delete [] oldArgs;
argv = mArgs; argv = mArgs;
} }
return NS_OK; return NS_OK;
} }
//----------------------------------------------------------------------------------------
PRBool nsMacCommandLine::EnsureCommandLine()
//----------------------------------------------------------------------------------------
{
if (mArgBuffer)
return PR_TRUE;
mArgBuffer = new char[kMaxBufferSize];
if (!mArgBuffer)
return PR_FALSE;
PL_strcpy(mArgBuffer, "mozilla"); // argv[0]
return PR_TRUE;
}
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText) nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
if (!EnsureCommandLine())
return NS_ERROR_OUT_OF_MEMORY;
if (*inArgText != ' ') if (*inArgText != ' ')
PL_strcat(mArgBuffer, " "); mTempArgsString.Append(" ");
PL_strcat(mArgBuffer, inArgText); mTempArgsString.Append(inArgText);
return NS_OK; return NS_OK;
} }
@ -186,13 +173,10 @@ nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec) nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
if (!EnsureCommandLine())
return NS_ERROR_OUT_OF_MEMORY;
// Convert the filespec to a URL // Convert the filespec to a URL
nsFileSpec nsspec(inFileSpec); nsFileSpec nsspec(inFileSpec);
nsFileURL fileAsURL(nsspec); nsFileURL fileAsURL(nsspec);
PL_strcat(mArgBuffer, " "); mTempArgsString.Append(" ");
AddToCommandLine(inOptionString); AddToCommandLine(inOptionString);
AddToCommandLine(fileAsURL.GetAsString()); AddToCommandLine(fileAsURL.GetAsString());
return NS_OK; return NS_OK;

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

@ -29,6 +29,7 @@
#include "nscore.h" #include "nscore.h"
#include "nsError.h" #include "nsError.h"
#include "nsString.h"
#include "nsAEDefs.h" #include "nsAEDefs.h"
@ -41,7 +42,6 @@ public:
enum enum
{ {
kMaxBufferSize = 512,
kMaxTokens = 20 kMaxTokens = 20
}; };
@ -50,7 +50,6 @@ public:
nsresult Initialize(int& argc, char**& argv); nsresult Initialize(int& argc, char**& argv);
PRBool EnsureCommandLine();
nsresult AddToCommandLine(const char* inArgText); nsresult AddToCommandLine(const char* inArgText);
nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec); nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec);
nsresult AddToEnvironmentVars(const char* inArgText); nsresult AddToEnvironmentVars(const char* inArgText);
@ -66,8 +65,10 @@ protected:
nsresult OpenWindow(const char *chrome, const PRUnichar *url); nsresult OpenWindow(const char *chrome, const PRUnichar *url);
char* mArgBuffer; // the command line itself nsCString mTempArgsString; // temp storage for args as we accumulate them
char** mArgs; // array of pointers into argBuffer char* mArgsBuffer; // final, immutable container for args
char** mArgs; // array of pointers into argBuffer
PRBool mStartedUp; PRBool mStartedUp;

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

@ -59,7 +59,7 @@ nsMacCommandLine nsMacCommandLine::sMacCommandLine;
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
nsMacCommandLine::nsMacCommandLine() nsMacCommandLine::nsMacCommandLine()
: mArgBuffer(NULL) : mArgsBuffer(NULL)
, mArgs(NULL) , mArgs(NULL)
, mStartedUp(PR_FALSE) , mStartedUp(PR_FALSE)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
@ -72,6 +72,8 @@ nsMacCommandLine::~nsMacCommandLine()
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
ShutdownAEHandlerClasses(); ShutdownAEHandlerClasses();
nsMemory::Free(mArgsBuffer);
mArgsBuffer = NULL;
} }
@ -85,6 +87,9 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
argc = 0; argc = 0;
argv = mArgs; argv = mArgs;
// init the args buffer with the program name
mTempArgsString.Assign("mozilla");
// Set up AppleEvent handling. // Set up AppleEvent handling.
OSErr err = CreateAEHandlerClasses(false); OSErr err = CreateAEHandlerClasses(false);
if (err != noErr) return NS_ERROR_FAILURE; if (err != noErr) return NS_ERROR_FAILURE;
@ -105,25 +110,27 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
{ {
::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull); ::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull);
if (anEvent.what == kHighLevelEvent) if (anEvent.what == kHighLevelEvent)
{
// here we process startup odoc/pdoc events, which can
// add items to the command line.
err = ::AEProcessAppleEvent(&anEvent); err = ::AEProcessAppleEvent(&anEvent);
}
} }
// we've started up now // we've started up now
mStartedUp = PR_TRUE; mStartedUp = PR_TRUE;
// Care! We have to ensure that the addresses we pass out in
// argv continue to point to valid memory. Because we can't guarantee
// anything about the way that nsCString works, we make a copy
// of the buffer, which is never freed until the command line handler
// goes way (and, since it's static, that is at library unload time).
mArgsBuffer = mTempArgsString.ToNewCString();
mTempArgsString.Truncate(); // it's job is done
if (!mArgBuffer) // no arguments from anywhere
return NS_OK;
// Release some unneeded memory
char* oldBuffer = mArgBuffer;
mArgBuffer = new char[PL_strlen(mArgBuffer) + 1];
PL_strcpy(mArgBuffer, oldBuffer);
delete [] oldBuffer;
// Parse the buffer. // Parse the buffer.
int rowNumber = 0; char* strtokFirstParam = mArgsBuffer;
char* strtokFirstParam = mArgBuffer;
while (argc < kMaxTokens) while (argc < kMaxTokens)
{ {
// Get the next token. Initialize strtok by passing the string the // Get the next token. Initialize strtok by passing the string the
@ -147,37 +154,17 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
delete [] oldArgs; delete [] oldArgs;
argv = mArgs; argv = mArgs;
} }
return NS_OK; return NS_OK;
} }
//----------------------------------------------------------------------------------------
PRBool nsMacCommandLine::EnsureCommandLine()
//----------------------------------------------------------------------------------------
{
if (mArgBuffer)
return PR_TRUE;
mArgBuffer = new char[kMaxBufferSize];
if (!mArgBuffer)
return PR_FALSE;
PL_strcpy(mArgBuffer, "mozilla"); // argv[0]
return PR_TRUE;
}
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText) nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
if (!EnsureCommandLine())
return NS_ERROR_OUT_OF_MEMORY;
if (*inArgText != ' ') if (*inArgText != ' ')
PL_strcat(mArgBuffer, " "); mTempArgsString.Append(" ");
PL_strcat(mArgBuffer, inArgText); mTempArgsString.Append(inArgText);
return NS_OK; return NS_OK;
} }
@ -186,13 +173,10 @@ nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec) nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
if (!EnsureCommandLine())
return NS_ERROR_OUT_OF_MEMORY;
// Convert the filespec to a URL // Convert the filespec to a URL
nsFileSpec nsspec(inFileSpec); nsFileSpec nsspec(inFileSpec);
nsFileURL fileAsURL(nsspec); nsFileURL fileAsURL(nsspec);
PL_strcat(mArgBuffer, " "); mTempArgsString.Append(" ");
AddToCommandLine(inOptionString); AddToCommandLine(inOptionString);
AddToCommandLine(fileAsURL.GetAsString()); AddToCommandLine(fileAsURL.GetAsString());
return NS_OK; return NS_OK;

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

@ -29,6 +29,7 @@
#include "nscore.h" #include "nscore.h"
#include "nsError.h" #include "nsError.h"
#include "nsString.h"
#include "nsAEDefs.h" #include "nsAEDefs.h"
@ -41,7 +42,6 @@ public:
enum enum
{ {
kMaxBufferSize = 512,
kMaxTokens = 20 kMaxTokens = 20
}; };
@ -50,7 +50,6 @@ public:
nsresult Initialize(int& argc, char**& argv); nsresult Initialize(int& argc, char**& argv);
PRBool EnsureCommandLine();
nsresult AddToCommandLine(const char* inArgText); nsresult AddToCommandLine(const char* inArgText);
nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec); nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec);
nsresult AddToEnvironmentVars(const char* inArgText); nsresult AddToEnvironmentVars(const char* inArgText);
@ -66,8 +65,10 @@ protected:
nsresult OpenWindow(const char *chrome, const PRUnichar *url); nsresult OpenWindow(const char *chrome, const PRUnichar *url);
char* mArgBuffer; // the command line itself nsCString mTempArgsString; // temp storage for args as we accumulate them
char** mArgs; // array of pointers into argBuffer char* mArgsBuffer; // final, immutable container for args
char** mArgs; // array of pointers into argBuffer
PRBool mStartedUp; PRBool mStartedUp;