From bd2b3a4d0670f75a955dbbf93b88c59363d2640c Mon Sep 17 00:00:00 2001 From: "dbragg%netscape.com" Date: Sat, 27 Jan 2001 00:05:08 +0000 Subject: [PATCH] This is the XPInstall side of bug 62167 that uses nsIProcess which was checked in earlier. a,r=dvedtiz sr=mscott git-svn-id: svn://10.0.0.236/trunk@85593 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpinstall/src/nsInstall.cpp | 17 +++---- mozilla/xpinstall/src/nsInstall.h | 5 +-- mozilla/xpinstall/src/nsInstallExecute.cpp | 38 +++++++++------- mozilla/xpinstall/src/nsInstallExecute.h | 4 +- mozilla/xpinstall/src/nsInstallFileOpItem.cpp | 23 +++++++--- mozilla/xpinstall/src/nsInstallFileOpItem.h | 2 + mozilla/xpinstall/src/nsJSFile.cpp | 25 +++++++++-- mozilla/xpinstall/src/nsJSInstall.cpp | 44 +++++++++++-------- 8 files changed, 99 insertions(+), 59 deletions(-) diff --git a/mozilla/xpinstall/src/nsInstall.cpp b/mozilla/xpinstall/src/nsInstall.cpp index 56683b774f3..ce131ab2247 100644 --- a/mozilla/xpinstall/src/nsInstall.cpp +++ b/mozilla/xpinstall/src/nsInstall.cpp @@ -726,7 +726,7 @@ nsInstall::DiskSpaceAvailable(const nsString& aFolder, PRInt64* aReturn) } PRInt32 -nsInstall::Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn) +nsInstall::Execute(const nsString& aJarSource, const nsString& aArgs, PRBool aBlocking, PRInt32* aReturn) { PRInt32 result = SanityCheck(); @@ -736,7 +736,7 @@ nsInstall::Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* a return NS_OK; } - nsInstallExecute* ie = new nsInstallExecute(this, aJarSource, aArgs, &result); + nsInstallExecute* ie = new nsInstallExecute(this, aJarSource, aArgs, aBlocking, &result); if (ie == nsnull) { @@ -753,11 +753,6 @@ nsInstall::Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* a return NS_OK; } -PRInt32 -nsInstall::Execute(const nsString& aJarSource, PRInt32* aReturn) -{ - return Execute(aJarSource, nsAutoString(), aReturn); -} PRInt32 nsInstall::FinalizeInstall(PRInt32* aReturn) @@ -1665,7 +1660,7 @@ nsInstall::FileOpDirRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* aR return NS_OK; } - nsInstallFileOpItem* ifop = new nsInstallFileOpItem(this, NS_FOP_DIR_RENAME, localFile, aTarget, aReturn); + nsInstallFileOpItem* ifop = new nsInstallFileOpItem(this, NS_FOP_DIR_RENAME, localFile, aTarget, PR_FALSE, aReturn); if (ifop == nsnull) { *aReturn = SaveError(nsInstall::OUT_OF_MEMORY); @@ -1768,7 +1763,7 @@ nsInstall::FileOpFileDelete(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* a } PRInt32 -nsInstall::FileOpFileExecute(nsInstallFolder& aTarget, nsString& aParams, PRInt32* aReturn) +nsInstall::FileOpFileExecute(nsInstallFolder& aTarget, nsString& aParams, PRBool aBlocking, PRInt32* aReturn) { nsCOMPtr localFile = aTarget.GetFileSpec(); if (localFile == nsnull) @@ -1777,7 +1772,7 @@ nsInstall::FileOpFileExecute(nsInstallFolder& aTarget, nsString& aParams, PRInt3 return NS_OK; } - nsInstallFileOpItem* ifop = new nsInstallFileOpItem(this, NS_FOP_FILE_EXECUTE, localFile, aParams, aReturn); + nsInstallFileOpItem* ifop = new nsInstallFileOpItem(this, NS_FOP_FILE_EXECUTE, localFile, aParams, aBlocking, aReturn); if (ifop == nsnull) { *aReturn = SaveError(nsInstall::OUT_OF_MEMORY); @@ -1948,7 +1943,7 @@ nsInstall::FileOpFileRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* a return NS_OK; } - nsInstallFileOpItem* ifop = new nsInstallFileOpItem(this, NS_FOP_FILE_RENAME, localFile, aTarget, aReturn); + nsInstallFileOpItem* ifop = new nsInstallFileOpItem(this, NS_FOP_FILE_RENAME, localFile, aTarget, PR_FALSE, aReturn); if (ifop == nsnull) { *aReturn = SaveError(nsInstall::OUT_OF_MEMORY); diff --git a/mozilla/xpinstall/src/nsInstall.h b/mozilla/xpinstall/src/nsInstall.h index 9e4b02676c6..c880479da52 100644 --- a/mozilla/xpinstall/src/nsInstall.h +++ b/mozilla/xpinstall/src/nsInstall.h @@ -211,8 +211,7 @@ class nsInstall PRInt32 DeleteComponent(const nsString& aRegistryName, PRInt32* aReturn); PRInt32 DeleteFile(nsInstallFolder* aFolder, const nsString& aRelativeFileName, PRInt32* aReturn); PRInt32 DiskSpaceAvailable(const nsString& aFolder, PRInt64* aReturn); - PRInt32 Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn); - PRInt32 Execute(const nsString& aJarSource, PRInt32* aReturn); + PRInt32 Execute(const nsString& aJarSource, const nsString& aArgs, PRBool aBlocking, PRInt32* aReturn); PRInt32 FinalizeInstall(PRInt32* aReturn); PRInt32 Gestalt(const nsString& aSelector, PRInt32* aReturn); @@ -242,7 +241,7 @@ class nsInstall PRInt32 FileOpFileCopy(nsInstallFolder& aSrc, nsInstallFolder& aTarget, PRInt32* aReturn); PRInt32 FileOpFileDelete(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* aReturn); PRInt32 FileOpFileExists(nsInstallFolder& aTarget, PRBool* aReturn); - PRInt32 FileOpFileExecute(nsInstallFolder& aTarget, nsString& aParams, PRInt32* aReturn); + PRInt32 FileOpFileExecute(nsInstallFolder& aTarget, nsString& aParams, PRBool aBlocking, PRInt32* aReturn); PRInt32 FileOpFileGetNativeVersion(nsInstallFolder& aTarget, nsString* aReturn); PRInt32 FileOpFileGetDiskSpaceAvailable(nsInstallFolder& aTarget, PRInt64* aReturn); PRInt32 FileOpFileGetModDate(nsInstallFolder& aTarget, double* aReturn); diff --git a/mozilla/xpinstall/src/nsInstallExecute.cpp b/mozilla/xpinstall/src/nsInstallExecute.cpp index aeb43b449bc..da23d6652b7 100644 --- a/mozilla/xpinstall/src/nsInstallExecute.cpp +++ b/mozilla/xpinstall/src/nsInstallExecute.cpp @@ -36,12 +36,16 @@ #include "nsInstall.h" #include "nsIDOMInstallVersion.h" +#include "nsProcess.h" + +static NS_DEFINE_CID(kIProcessCID, NS_PROCESS_CID); MOZ_DECL_CTOR_COUNTER(nsInstallExecute); nsInstallExecute:: nsInstallExecute( nsInstall* inInstall, const nsString& inJarLocation, const nsString& inArgs, + const PRBool inBlocking, PRInt32 *error) : nsInstallObject(inInstall) @@ -57,7 +61,8 @@ nsInstallExecute:: nsInstallExecute( nsInstall* inInstall, mJarLocation = inJarLocation; mArgs = inArgs; mExecutableFile = nsnull; - + mBlocking = inBlocking; + mPid = nsnull; } @@ -79,35 +84,36 @@ PRInt32 nsInstallExecute::Prepare() PRInt32 nsInstallExecute::Complete() { - PRBool flagExists; PRInt32 result = NS_OK; + PRInt32 rv = nsInstall::SUCCESS; char *cArgs[1]; if (mExecutableFile == nsnull) return nsInstall::INVALID_ARGUMENTS; - nsCOMPtr app = mExecutableFile; - - app->Exists(&flagExists); - if (!flagExists) - { - return nsInstall::INVALID_ARGUMENTS; - } + nsCOMPtr process = do_CreateInstance(kIProcessCID); - cArgs[0] = nsnull; cArgs[0] = mArgs.ToNewCString(); if(cArgs[0] == nsnull) return nsInstall::OUT_OF_MEMORY; - - app->Spawn((const char **)&cArgs[0], 1); + + result = process->Init(mExecutableFile); + if (NS_SUCCEEDED(result)) + { + result = process->Run(mBlocking, (const char**)&cArgs, 1, mPid); + if (NS_SUCCEEDED(result)) + DeleteFileNowOrSchedule( mExecutableFile ); + else + rv = nsInstall::UNEXPECTED_ERROR; + } + else + rv = nsInstall::UNEXPECTED_ERROR; if(cArgs[0]) - delete(cArgs[0]); + Recycle(cArgs[0]); - ScheduleFileForDeletion( app ); - - return result; + return rv; } void nsInstallExecute::Abort() diff --git a/mozilla/xpinstall/src/nsInstallExecute.h b/mozilla/xpinstall/src/nsInstallExecute.h index a6951eeebf0..881c65f040c 100644 --- a/mozilla/xpinstall/src/nsInstallExecute.h +++ b/mozilla/xpinstall/src/nsInstallExecute.h @@ -43,6 +43,7 @@ class nsInstallExecute : public nsInstallObject nsInstallExecute( nsInstall* inInstall, const nsString& inJarLocation, const nsString& inArgs, + const PRBool inBlocking, PRInt32 *error); @@ -63,7 +64,8 @@ class nsInstallExecute : public nsInstallObject nsString mArgs; // command line arguments nsCOMPtr mExecutableFile; // temporary file location - + PRBool mBlocking; + PRUint32* mPid; PRInt32 NativeComplete(void); void NativeAbort(void); diff --git a/mozilla/xpinstall/src/nsInstallFileOpItem.cpp b/mozilla/xpinstall/src/nsInstallFileOpItem.cpp index aa9b3006c72..ad86c0c936a 100644 --- a/mozilla/xpinstall/src/nsInstallFileOpItem.cpp +++ b/mozilla/xpinstall/src/nsInstallFileOpItem.cpp @@ -25,6 +25,7 @@ #include "nsInstallFileOpEnums.h" #include "nsInstallFileOpItem.h" #include "ScheduledTasks.h" +#include "nsProcess.h" #ifdef _WINDOWS #include @@ -41,6 +42,8 @@ #include "nsILocalFileMac.h" #endif +static NS_DEFINE_CID(kIProcessCID, NS_PROCESS_CID); + /* Public Methods */ MOZ_DECL_CTOR_COUNTER(nsInstallFileOpItem); @@ -122,6 +125,7 @@ nsInstallFileOpItem::nsInstallFileOpItem(nsInstall* aInstallObj, PRInt32 aCommand, nsIFile* a1, nsString& a2, + PRBool aBlocking, PRInt32* aReturn) :nsInstallObject(aInstallObj) { @@ -153,6 +157,7 @@ nsInstallFileOpItem::nsInstallFileOpItem(nsInstall* aInstallObj, break; case NS_FOP_FILE_EXECUTE: + mBlocking = aBlocking; default: mSrc = nsnull; mTarget = a1; @@ -948,22 +953,28 @@ nsInstallFileOpItem::NativeFileOpFileExecuteComplete() char *cParams[1]; + nsCOMPtr process = do_CreateInstance(kIProcessCID); + cParams[0] = nsnull; cParams[0] = mParams->ToNewCString(); if(cParams[0] == nsnull) return nsInstall::OUT_OF_MEMORY; - mTarget->Spawn((const char **)&cParams[0], 1); + nsresult rv = process->Init(mTarget); + if (NS_FAILED(rv)) + { + if(cParams[0]) + Recycle(cParams[0]); + return rv; + } + + rv = process->Run(mBlocking, (const char **)&cParams[0], 1, nsnull); if(cParams[0]) Recycle(cParams[0]); - // We don't care if it succeeded or not since we - // don't wait for the process to end anyways. - // If the file doesn't exist, it was already detected - // during the prepare phase. - return nsInstall::SUCCESS; + return rv; } PRInt32 diff --git a/mozilla/xpinstall/src/nsInstallFileOpItem.h b/mozilla/xpinstall/src/nsInstallFileOpItem.h index 2b1a135e6b0..e837bd8018b 100644 --- a/mozilla/xpinstall/src/nsInstallFileOpItem.h +++ b/mozilla/xpinstall/src/nsInstallFileOpItem.h @@ -77,6 +77,7 @@ class nsInstallFileOpItem : public nsInstallObject PRInt32 aCommand, nsIFile* a1, nsString& a2, + PRBool aBlocking, PRInt32* aReturn); // used by: @@ -121,6 +122,7 @@ class nsInstallFileOpItem : public nsInstallObject PRInt32 mIconId; PRInt32 mCommand; PRInt32 mAction; + PRBool mBlocking; /* Private Methods */ diff --git a/mozilla/xpinstall/src/nsJSFile.cpp b/mozilla/xpinstall/src/nsJSFile.cpp index 17ffb4dde5e..9c1225ab070 100644 --- a/mozilla/xpinstall/src/nsJSFile.cpp +++ b/mozilla/xpinstall/src/nsJSFile.cpp @@ -466,6 +466,7 @@ InstallFileOpFileExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj); PRInt32 nativeRet; nsAutoString b1; + PRBool blocking = PR_FALSE; JSObject *jsObj; nsInstallFolder *folder; @@ -477,12 +478,30 @@ InstallFileOpFileExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, return JS_TRUE; } - if(argc >= 2) + if(argc >= 3) { // public int FileExecute (nsInstallFolder aSourceFolder, - // String aParameters); + // String aParameters + // PRBool aBlocking); ConvertJSValToStr(b1, cx, argv[1]); + ConvertJSValToBool(&blocking, cx, argv[2]); + } + else if(argc >= 2) + { + if(JSVAL_IS_BOOLEAN(argv[1])) + { + // public int FileExecute (nsInstallFolder aSourceFolder, + // PRBool aBlocking); + ConvertJSValToBool(&blocking, cx, argv[1]); + b1.SetLength(0); + } + else + { + // public int FileExecute (nsInstallFolder aSourceFolder, + // String aParameters); + ConvertJSValToStr(b1, cx, argv[1]); + } } else b1.SetLength(0); @@ -503,7 +522,7 @@ InstallFileOpFileExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj); - if(NS_OK != nativeThis->FileOpFileExecute(*folder, b1, &nativeRet)) + if(NS_OK != nativeThis->FileOpFileExecute(*folder, b1, blocking, &nativeRet)) { return JS_TRUE; } diff --git a/mozilla/xpinstall/src/nsJSInstall.cpp b/mozilla/xpinstall/src/nsJSInstall.cpp index 393971afafd..e7d26e53fb3 100644 --- a/mozilla/xpinstall/src/nsJSInstall.cpp +++ b/mozilla/xpinstall/src/nsJSInstall.cpp @@ -868,6 +868,7 @@ InstallExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva PRInt32 nativeRet; nsAutoString b0; nsAutoString b1; + PRBool blocking = PR_FALSE; *rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR); @@ -876,37 +877,42 @@ InstallExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva return JS_TRUE; } - if(argc >= 2) + if(argc >= 3) { // public int Execute ( String jarSourcePath, - // String args); - - ConvertJSValToStr(b0, cx, argv[0]); + // String args, + // Bool blocking); + ConvertJSValToStr(b1, cx, argv[1]); - - if(NS_OK != nativeThis->Execute(b0, b1, &nativeRet)) - { - return JS_FALSE; - } - - *rval = INT_TO_JSVAL(nativeRet); + ConvertJSValToBool(&blocking, cx,argv[2]); } - else if(argc >= 1) + else if(argc >= 2) + { + if(JSVAL_IS_BOOLEAN(argv[1])) + { + // public int Execute ( String jarSourcePath, + // Bool blocking); + ConvertJSValToBool(&blocking, cx, argv[1]); + } + else + { + // public int Execute ( String jarSourcePath, + // String args); + ConvertJSValToStr(b1, cx, argv[1]); + } + } + + if(argc >= 1) { // public int Execute ( String jarSourcePath); - ConvertJSValToStr(b0, cx, argv[0]); - - if(NS_OK != nativeThis->Execute(b0, &nativeRet)) - { - return JS_FALSE; - } + nativeThis->Execute(b0, b1, blocking, &nativeRet); *rval = INT_TO_JSVAL(nativeRet); } else { - JS_ReportError(cx, "Function Execute requires 2 parameters"); + JS_ReportError(cx, "Function Execute requires 1 parameter"); return JS_FALSE; }