Bug 20043, attempting to install an older file should not abort rest of install
This commit is contained in:
Родитель
58e41aab5d
Коммит
885a480896
|
@ -27,6 +27,7 @@
|
|||
#--------------------------------------------------------------------
|
||||
InstallFile=Installing: %s
|
||||
ReplaceFile=Replacing: %s
|
||||
SkipFile=Skipping: %s
|
||||
|
||||
DeleteFile=Deleting file: %s
|
||||
DeleteComponent=Deleting component: %s
|
||||
|
@ -42,7 +43,6 @@ Uninstall=Uninstalling: %s
|
|||
#--------------------------------------------------------------------
|
||||
# Dialog Messages
|
||||
#--------------------------------------------------------------------
|
||||
ShouldWeInstallMsg=Attempting to download and install software. Do you feel lucky punk?
|
||||
|
||||
FinishingInstallMsg=Finishing install... please wait.
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#include "prprf.h"
|
||||
#include "nsInstallFile.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "VerReg.h"
|
||||
|
@ -51,28 +52,39 @@ nsInstallFile::nsInstallFile(nsInstall* inInstall,
|
|||
const nsString& inPartialPath,
|
||||
PRBool forceInstall,
|
||||
PRInt32 *error)
|
||||
: nsInstallObject(inInstall)
|
||||
: nsInstallObject(inInstall),
|
||||
mVersionInfo(nsnull),
|
||||
mJarLocation(nsnull),
|
||||
mExtractedFile(nsnull),
|
||||
mFinalFile(nsnull),
|
||||
mVersionRegistryName(nsnull),
|
||||
mForceInstall(forceInstall),
|
||||
mReplaceFile(PR_FALSE),
|
||||
mChildFile(PR_TRUE),
|
||||
mUpgradeFile(PR_FALSE),
|
||||
mSkipInstall(PR_FALSE)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallFile);
|
||||
|
||||
mVersionRegistryName = nsnull;
|
||||
mJarLocation = nsnull;
|
||||
mExtracedFile = nsnull;
|
||||
mFinalFile = nsnull;
|
||||
mVersionInfo = nsnull;
|
||||
|
||||
mUpgradeFile = PR_FALSE;
|
||||
|
||||
if ((folderSpec == nsnull) || (inInstall == NULL))
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
*error = nsInstall::SUCCESS;
|
||||
|
||||
/* Check for existence of the newer version */
|
||||
|
||||
char* qualifiedRegNameString = inComponentName.ToNewCString();
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// we always install if forceInstall is true, or the new file's
|
||||
// version is null, or the file doesn't previously exist.
|
||||
//
|
||||
// IFF it's not force, AND the new file has a version, AND it's been
|
||||
// previously installed, THEN we have to do the version comparing foo.
|
||||
// --------------------------------------------------------------------
|
||||
if ( (forceInstall == PR_FALSE ) && (inVInfo != "") && ( VR_ValidateComponent( qualifiedRegNameString ) == 0 ) )
|
||||
{
|
||||
nsInstallVersion *newVersion = new nsInstallVersion();
|
||||
|
@ -111,14 +123,12 @@ nsInstallFile::nsInstallFile(nsInstall* inInstall,
|
|||
delete oldVersion;
|
||||
delete newVersion;
|
||||
|
||||
if (areTheyEqual == nsIDOMInstallVersion::MAJOR_DIFF_MINUS ||
|
||||
areTheyEqual == nsIDOMInstallVersion::MINOR_DIFF_MINUS ||
|
||||
areTheyEqual == nsIDOMInstallVersion::REL_DIFF_MINUS ||
|
||||
areTheyEqual == nsIDOMInstallVersion::BLD_DIFF_MINUS )
|
||||
if ( areTheyEqual < 0 )
|
||||
{
|
||||
// the file to be installed is OLDER than what is on disk. Return error
|
||||
// the file to be installed is OLDER than what is on disk.
|
||||
// Don't install it.
|
||||
Recycle(qualifiedRegNameString);
|
||||
*error = areTheyEqual;
|
||||
mSkipInstall = PR_TRUE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -172,8 +182,6 @@ nsInstallFile::nsInstallFile(nsInstall* inInstall,
|
|||
nsFileSpec makeDirs(parent.GetCString(), PR_TRUE);
|
||||
}
|
||||
|
||||
mForceInstall = forceInstall;
|
||||
|
||||
mVersionRegistryName = new nsString(inComponentName);
|
||||
mJarLocation = new nsString(inJarLocation);
|
||||
mVersionInfo = new nsString(inVInfo);
|
||||
|
@ -198,19 +206,9 @@ nsInstallFile::nsInstallFile(nsInstall* inInstall,
|
|||
}
|
||||
else
|
||||
{
|
||||
|
||||
// there is no "starts with" api in nsString. LAME!
|
||||
nsString startsWith;
|
||||
mVersionRegistryName->Left(startsWith, regPackageName.Length());
|
||||
|
||||
if (startsWith.Equals(regPackageName))
|
||||
{
|
||||
mChildFile = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
mChildFile = PR_FALSE;
|
||||
}
|
||||
mChildFile = mVersionRegistryName->Equals( regPackageName,
|
||||
PR_FALSE,
|
||||
regPackageName.Length() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -223,8 +221,8 @@ nsInstallFile::~nsInstallFile()
|
|||
if (mJarLocation)
|
||||
delete mJarLocation;
|
||||
|
||||
if (mExtracedFile)
|
||||
delete mExtracedFile;
|
||||
if (mExtractedFile)
|
||||
delete mExtractedFile;
|
||||
|
||||
if (mFinalFile)
|
||||
delete mFinalFile;
|
||||
|
@ -240,10 +238,13 @@ nsInstallFile::~nsInstallFile()
|
|||
*/
|
||||
PRInt32 nsInstallFile::Prepare()
|
||||
{
|
||||
if (mInstall == nsnull || mFinalFile == nsnull || mJarLocation == nsnull )
|
||||
if (mInstall == nsnull || mFinalFile == nsnull || mJarLocation == nsnull )
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
|
||||
return mInstall->ExtractFileFromJar(*mJarLocation, mFinalFile, &mExtracedFile);
|
||||
if (mSkipInstall)
|
||||
return nsInstall::SUCCESS;
|
||||
|
||||
return mInstall->ExtractFileFromJar(*mJarLocation, mFinalFile, &mExtractedFile);
|
||||
}
|
||||
|
||||
/* Complete
|
||||
|
@ -259,6 +260,9 @@ PRInt32 nsInstallFile::Complete()
|
|||
{
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
}
|
||||
|
||||
if (mSkipInstall)
|
||||
return nsInstall::SUCCESS;
|
||||
|
||||
err = CompleteFileMove();
|
||||
|
||||
|
@ -273,48 +277,43 @@ PRInt32 nsInstallFile::Complete()
|
|||
|
||||
void nsInstallFile::Abort()
|
||||
{
|
||||
if (mExtracedFile != nsnull)
|
||||
mExtracedFile->Delete(PR_FALSE);
|
||||
if (mExtractedFile != nsnull)
|
||||
mExtractedFile->Delete(PR_FALSE);
|
||||
}
|
||||
|
||||
#define RESBUFSIZE 1024
|
||||
char* nsInstallFile::toString()
|
||||
{
|
||||
char* buffer = new char[1024];
|
||||
char* rsrcVal = "";
|
||||
char* buffer = new char[RESBUFSIZE];
|
||||
char* rsrcVal = nsnull;
|
||||
const char* fname = nsnull;
|
||||
|
||||
if (buffer == nsnull || !mInstall)
|
||||
return nsnull;
|
||||
else
|
||||
buffer[0] = '\0';
|
||||
|
||||
if (mFinalFile == nsnull)
|
||||
if (mReplaceFile)
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("InstallFile");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, nsnull);
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
}
|
||||
else if (mReplaceFile)
|
||||
{
|
||||
// we are replacing this file.
|
||||
rsrcVal = mInstall->GetResourcedString("ReplaceFile");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, mFinalFile->GetCString());
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
}
|
||||
else if (mSkipInstall)
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("SkipFile");
|
||||
}
|
||||
else
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("InstallFile");
|
||||
}
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, mFinalFile->GetCString());
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
if (rsrcVal)
|
||||
{
|
||||
if (mFinalFile)
|
||||
fname = mFinalFile->GetCString();
|
||||
|
||||
PR_snprintf( buffer, RESBUFSIZE, rsrcVal, fname );
|
||||
|
||||
Recycle(rsrcVal);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
|
@ -325,19 +324,19 @@ PRInt32 nsInstallFile::CompleteFileMove()
|
|||
{
|
||||
int result = 0;
|
||||
|
||||
if (mExtracedFile == nsnull)
|
||||
if (mExtractedFile == nsnull)
|
||||
{
|
||||
return -1;
|
||||
return nsInstall::UNEXPECTED_ERROR;
|
||||
}
|
||||
|
||||
if ( *mExtracedFile == *mFinalFile )
|
||||
if ( *mExtractedFile == *mFinalFile )
|
||||
{
|
||||
/* No need to rename, they are the same */
|
||||
result = 0;
|
||||
result = nsInstall::SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = ReplaceFileNowOrSchedule(*mExtracedFile, *mFinalFile );
|
||||
result = ReplaceFileNowOrSchedule(*mExtractedFile, *mFinalFile );
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
@ -67,23 +67,24 @@ class nsInstallFile : public nsInstallObject
|
|||
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/* Private Fields */
|
||||
nsString* mVersionInfo; /* Version info for this file*/
|
||||
|
||||
nsString* mJarLocation; /* Location in the JAR */
|
||||
nsFileSpec* mExtracedFile; /* temporary file location */
|
||||
nsFileSpec* mExtractedFile; /* temporary file location */
|
||||
nsFileSpec* mFinalFile; /* final file destination */
|
||||
|
||||
nsString* mVersionRegistryName; /* full version path */
|
||||
|
||||
|
||||
PRBool mForceInstall; /* whether install is forced */
|
||||
PRBool mReplaceFile; /* whether file exists */
|
||||
PRBool mChildFile; /* whether file is a child */
|
||||
PRBool mUpgradeFile; /* whether file is an upgrade */
|
||||
PRBool mSkipInstall; /* if true don't install this file */
|
||||
|
||||
|
||||
PRInt32 CompleteFileMove();
|
||||
|
|
|
@ -35,6 +35,7 @@ static nsXPIResourceTableItem XPIResTable[] =
|
|||
*---------------------------------------------------------------------*/
|
||||
{ "InstallFile", "Installing: %s" },
|
||||
{ "ReplaceFile", "Replacing: %s" },
|
||||
{ "SkipFile", "Skipping: %s" },
|
||||
{ "DeleteFile", "Deleting file: %s" },
|
||||
{ "DeleteComponent", "Deleting component: %s" },
|
||||
{ "Execute", "Executing: %s" },
|
||||
|
@ -48,7 +49,6 @@ static nsXPIResourceTableItem XPIResTable[] =
|
|||
/*---------------------------------------------------------------------*
|
||||
* Dialog Messages
|
||||
*---------------------------------------------------------------------*/
|
||||
{ "ShouldWeInstallMsg", "Attempting to download and install software. Do you feel lucky punk?" },
|
||||
{ "FinishingInstallMsg", "Finishing install... please wait." },
|
||||
|
||||
/*---------------------------------------------------------------------*
|
||||
|
|
|
@ -69,9 +69,9 @@ nsLoggingProgressNotifier::BeforeJavascriptEvaluation(const PRUnichar *URL)
|
|||
|
||||
mLogStream->seek(logFile.GetFileSize());
|
||||
|
||||
*mLogStream << "---------------------------------------------------------------------------" << nsEndl;
|
||||
*mLogStream << nsAutoCString(URL) << " -- " << time << nsEndl;
|
||||
*mLogStream << "---------------------------------------------------------------------------" << nsEndl;
|
||||
*mLogStream << "-------------------------------------------------------------------------------" << nsEndl;
|
||||
*mLogStream << nsAutoCString(URL) << " -- " << time << nsEndl;
|
||||
*mLogStream << "-------------------------------------------------------------------------------" << nsEndl;
|
||||
*mLogStream << nsEndl;
|
||||
|
||||
PL_strfree(time);
|
||||
|
@ -135,7 +135,7 @@ nsLoggingProgressNotifier::FinalizeProgress(const PRUnichar* message, PRInt32 it
|
|||
{
|
||||
if (mLogStream == nsnull) return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*mLogStream << " Item [" << (itemNum) << "/" << totNum << "]\t" << nsAutoCString(message) << nsEndl;
|
||||
*mLogStream << " [" << (itemNum) << "/" << totNum << "]\t" << nsAutoCString(message) << nsEndl;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче