Mozilla/mozilla/xpinstall/src/nsJSFile.cpp
ssu%netscape.com 7f30e74836 added bit field in nsInstallFile for Windows Shared File and Do No Uninstall.
added support in fileop for registering ole server files.

changed the way logging is done in install.log to write to the log file *before* the attempt to complete() the file installation process.  This helps with debugging because is shows what file the installation probably stopped on.


git-svn-id: svn://10.0.0.236/trunk@69622 18797224-902f-48f8-a5cc-f745e15eee43
2000-05-14 03:07:05 +00:00

1409 lines
36 KiB
C++

/* -*- 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/
*
* 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.
*
* The Original Code is mozilla.org 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):
*/
#include "jsapi.h"
#include "nsJSUtils.h"
#include "nscore.h"
#include "nsIScriptContext.h"
#include "nsString.h"
#include "nsInstall.h"
#include "nsIDOMInstallVersion.h"
#include "stdio.h"
#ifdef _WINDOWS
#include "nsJSWinReg.h"
#include "nsJSWinProfile.h"
extern JSClass WinRegClass;
extern JSClass WinProfileClass;
#endif
#include "nsJSFileSpecObj.h"
extern JSClass FileSpecObjectClass;
/* externs from nsJSInstall.cpp */
extern void ConvertJSValToStr(nsString& aString,
JSContext* aContext,
jsval aValue);
extern void ConvertStrToJSVal(const nsString& aProp,
JSContext* aContext,
jsval* aReturn);
extern PRBool ConvertJSValToBool(PRBool* aProp,
JSContext* aContext,
jsval aValue);
extern PRBool ConvertJSValToObj(nsISupports** aSupports,
REFNSIID aIID,
const nsString& aTypeName,
JSContext* aContext,
jsval aValue);
//
// Native method DirCreate
//
JSBool PR_CALLBACK
InstallFileOpDirCreate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int DirCreate (nsInstallFolder aNativeFolderPath);
if ( argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpDirCreate(*folder, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method DirGetParent
//
JSBool PR_CALLBACK
InstallFileOpDirGetParent(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
nsCOMPtr<nsIFile> nativeRet;
nsString nativeRetNSStr;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = JSVAL_NULL;
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int DirGetParent (nsInstallFolder NativeFolderPath);
if ( argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
// error, return NULL
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
// error, return NULL
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpDirGetParent(*folder, getter_AddRefs(nativeRet)))
{
// error, return NULL
return JS_TRUE;
}
char* temp;
nativeRet->GetPath(&temp);
nativeRetNSStr.AssignWithConversion(temp);
*rval = STRING_TO_JSVAL(JS_NewUCStringCopyN(cx, nativeRetNSStr.GetUnicode(), nativeRetNSStr.Length()));
return JS_TRUE;
}
//
// Native method DirRemove
//
JSBool PR_CALLBACK
InstallFileOpDirRemove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
PRBool bRecursive = PR_FALSE;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int DirRemove (nsInstallFolder aNativeFolderPath,
// Bool aRecursive);
if ( argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if( argc > 1 && !ConvertJSValToBool(&bRecursive, cx, argv[1]))
{
JS_ReportError(cx, "2nd parameter needs to be a Boolean value");
return JS_TRUE;
}
if(!folder || NS_OK != nativeThis->FileOpDirRemove(*folder, bRecursive, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method DirRename
//
JSBool PR_CALLBACK
InstallFileOpDirRename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
nsAutoString b1;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int DirRename (String aSourceFolder,
// String aTargetFolder);
ConvertJSValToStr(b1, cx, argv[1]);
// fix: nsFileSpec::Rename() does not accept new name as a
// nsFileSpec type. It only accepts a char* type for the new name
// This is a bug with nsFileSpec. A char* will be used until
// nsFileSpec if fixed.
// nsFileSpec fsB1(b1);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpDirRename(*folder, b1, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function DirRename requires 2 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileCopy
//
JSBool PR_CALLBACK
InstallFileOpFileCopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsSrcObj, *jsTargetObj;
nsInstallFolder *srcFolder, *targetFolder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int FileCopy (nsInstallFolder aSourceFolder,
// nsInstallFolder aTargetFolder);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
if (argv[1] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[1])) //argv[1] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsSrcObj = JSVAL_TO_OBJECT(argv[0]);
jsTargetObj = JSVAL_TO_OBJECT(argv[1]);
if (!JS_InstanceOf(cx, jsSrcObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
if (!JS_InstanceOf(cx, jsTargetObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
srcFolder = (nsInstallFolder*)JS_GetPrivate(cx, jsSrcObj);
targetFolder = (nsInstallFolder*)JS_GetPrivate(cx, jsTargetObj);
PRInt32 tempRet;
tempRet = nativeThis->FileOpFileCopy(*srcFolder, *targetFolder, &nativeRet);
if(!srcFolder || !targetFolder || NS_OK != tempRet)
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileCopy requires 2 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileDelete
//
JSBool PR_CALLBACK
InstallFileOpFileRemove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileDelete (nsInstallFolder aSourceFolder);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileDelete(*folder, PR_FALSE, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method FileExists
//
JSBool PR_CALLBACK
InstallFileOpFileExists(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileExists (nsInstallFolder NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileExists(*folder, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method FileExecute
//
JSBool PR_CALLBACK
InstallFileOpFileExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
nsAutoString b1;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int FileExecute (nsInstallFolder aSourceFolder,
// String aParameters);
ConvertJSValToStr(b1, cx, argv[1]);
}
else
b1.SetLength(0);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(NS_OK != nativeThis->FileOpFileExecute(*folder, b1, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method FileGetNativeVersion
//
JSBool PR_CALLBACK
InstallFileOpFileGetNativeVersion(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
nsAutoString nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = JSVAL_NULL;
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileGetNativeVersion (nsInstallFolder NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = JSVAL_NULL;
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = JSVAL_NULL;
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileGetNativeVersion(*folder, &nativeRet))
{
return JS_TRUE;
}
*rval = STRING_TO_JSVAL(JS_NewUCStringCopyN(cx, nativeRet.GetUnicode(), nativeRet.Length()));
return JS_TRUE;
}
//
// Native method FileGetDiskSpaceAvailable
//
JSBool PR_CALLBACK
InstallFileOpFileGetDiskSpaceAvailable(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt64 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileGetDiskSpaceAvailable (String NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileGetDiskSpaceAvailable(*folder, &nativeRet))
{
return JS_TRUE;
}
double d;
LL_L2D(d, nativeRet);
JS_NewDoubleValue( cx, d, rval );
return JS_TRUE;
}
//
// Native method FileGetModDate
//
JSBool PR_CALLBACK
InstallFileOpFileGetModDate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRUint32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);;
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileGetModDate (nsInstallFolder NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileGetModDate(*folder, &nativeRet))
{
return JS_TRUE;
}
if ( nativeRet <= JSVAL_INT_MAX )
*rval = INT_TO_JSVAL(nativeRet);
else
{
JSInt64 l;
jsdouble d;
JSLL_UI2L( l, nativeRet );
JSLL_L2D( d, l );
JS_NewDoubleValue( cx, d, rval );
}
return JS_TRUE;
}
//
// Native method FileGetSize
//
JSBool PR_CALLBACK
InstallFileOpFileGetSize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt64 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileGetSize (String NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileGetSize(*folder, &nativeRet))
{
return JS_TRUE;
}
PRFloat64 f; /* jsdouble's *are* PRFloat64's */
LL_L2F( f, nativeRet ); /* make float which is same type for js and nspr (native double) */
JS_NewDoubleValue( cx, f, rval );
return JS_TRUE;
}
//
// Native method FileIsDirectory
//
JSBool PR_CALLBACK
InstallFileOpFileIsDirectory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileIsDirectory (String NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileIsDirectory(*folder, &nativeRet))
{
return JS_TRUE;
}
*rval = BOOLEAN_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method FileIsFile
//
JSBool PR_CALLBACK
InstallFileOpFileIsFile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int FileIsFile (nsInstallFolder NativeFolderPath);
if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileIsFile(*folder, &nativeRet))
{
return JS_TRUE;
}
*rval = BOOLEAN_TO_JSVAL(nativeRet);
return JS_TRUE;
}
//
// Native method FileModDateChanged
//
JSBool PR_CALLBACK
InstallFileOpFileModDateChanged(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
PRUint32 b1;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int FileModDateChanged (nsInstallFolder aSourceFolder,
// Number aOldDate);
b1 = JSVAL_TO_INT(argv[1]);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = *rval = BOOLEAN_TO_JSVAL(PR_FALSE);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = BOOLEAN_TO_JSVAL(PR_FALSE);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileModDateChanged(*folder, b1, &nativeRet))
{
return JS_TRUE;
}
*rval = BOOLEAN_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileModDateChanged requires 2 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileMove
//
JSBool PR_CALLBACK
InstallFileOpFileMove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsSrcObj, *jsTargetObj;
nsInstallFolder *srcFolder, *targetFolder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int FileMove (nsInstallFolder aSourceFolder,
// nsInstallFolder aTargetFolder);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
if (argv[1] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[1])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsSrcObj = JSVAL_TO_OBJECT(argv[0]);
jsTargetObj = JSVAL_TO_OBJECT(argv[1]);
if (!JS_InstanceOf(cx, jsSrcObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
if (!JS_InstanceOf(cx, jsTargetObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
srcFolder = (nsInstallFolder*)JS_GetPrivate(cx, jsSrcObj);
targetFolder = (nsInstallFolder*)JS_GetPrivate(cx, jsTargetObj);
if(!srcFolder || !targetFolder || NS_OK != nativeThis->FileOpFileMove(*srcFolder, *targetFolder, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileMove requires 2 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileRename
//
JSBool PR_CALLBACK
InstallFileOpFileRename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
nsAutoString b1;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int FileRename (nsInstallFolder aSourceFolder,
// String aTargetFolder);
ConvertJSValToStr(b1, cx, argv[1]);
// fix: nsFileSpec::Rename() does not accept new name as a
// nsFileSpec type. It only accepts a char* type for the new name
// This is a bug with nsFileSpec. A char* will be used until
// nsFileSpec if fixed.
// nsFileSpec fsB1(b1);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpFileRename(*folder, b1, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileRename requires 2 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileWindowsShortcut
//
JSBool PR_CALLBACK
InstallFileOpFileWindowsShortcut(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
nsAutoString b0;
nsAutoString b1;
nsAutoString b2;
nsAutoString b3;
nsAutoString b4;
nsAutoString b5;
nsCOMPtr<nsILocalFile> nsfsB0;
nsCOMPtr<nsILocalFile> nsfsB1;
nsCOMPtr<nsILocalFile> nsfsB3;
nsCOMPtr<nsILocalFile> nsfsB5;
PRInt32 b6;
//JSObject *jsObj;
//nsInstallFolder *folder;
*rval = JSVAL_NULL;
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 7)
{
// public int FileWindowsShortcut(String aTarget,
// String aShortcutPath,
// String aDescription,
// String aWorkingPath,
// String aParams,
// String aIcon,
// Number aIconId);
ConvertJSValToStr(b0, cx, argv[0]);
NS_NewLocalFile(nsAutoCString(b0), getter_AddRefs(nsfsB0));
ConvertJSValToStr(b1, cx, argv[1]);
NS_NewLocalFile(nsAutoCString(b1), getter_AddRefs(nsfsB1));
ConvertJSValToStr(b2, cx, argv[2]);
ConvertJSValToStr(b3, cx, argv[3]);
NS_NewLocalFile(nsAutoCString(b3), getter_AddRefs(nsfsB3));
ConvertJSValToStr(b4, cx, argv[4]);
ConvertJSValToStr(b5, cx, argv[5]);
NS_NewLocalFile(nsAutoCString(b5), getter_AddRefs(nsfsB5));
if(JSVAL_IS_NULL(argv[6]))
{
b6 = 0;
}
else
{
b6 = JSVAL_TO_INT(argv[6]);
}
if(NS_OK != nativeThis->FileOpFileWindowsShortcut(nsfsB0, nsfsB1, b2, nsfsB3, b4, nsfsB5, b6, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileWindowsShortcut requires 7 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileMacAlias
//
JSBool PR_CALLBACK
InstallFileOpFileMacAlias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall *)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
nsAutoString sourceLeaf, aliasLeaf;
JSObject *jsoSourceFolder, *jsoAliasFolder;
nsInstallFolder *nsifSourceFolder, *nsifAliasFolder;
nsresult rv1 = NS_OK, rv2 = NS_OK;
*rval = JSVAL_NULL;
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 3)
{
// public int FileMacAlias( InstallFolder aSourceFolder,
// String aSourceName,
// InstallFolder aAliasFolder );
// where
// aSourceFolder -- the folder of the installed file from Get*Folder() APIs
// aSourceName -- the installed file's name
// aAliasFolder -- the folder of the new alias from Get*Folder() APIs
//
// NOTE:
// The destination alias name is aSourceName + " alias" (Mac-like behavior).
//
// returns SUCCESS for successful scheduling of operation
// UNEXPECTED_ERROR for failure
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0]) || // InstallFolder aSourceFolder
argv[2] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[2])) // InstallFolder aAliasFolder
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsoSourceFolder = JSVAL_TO_OBJECT(argv[0]);
jsoAliasFolder = JSVAL_TO_OBJECT(argv[2]);
if ((!JS_InstanceOf(cx, jsoSourceFolder, &FileSpecObjectClass, nsnull)) ||
(!JS_InstanceOf(cx, jsoAliasFolder, &FileSpecObjectClass, nsnull)))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
nsifSourceFolder = (nsInstallFolder *) JS_GetPrivate(cx, jsoSourceFolder);
nsifAliasFolder = (nsInstallFolder *) JS_GetPrivate(cx, jsoAliasFolder);
if (!nsifSourceFolder || !nsifAliasFolder)
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
// make copies of the InstallFolders leaving originals uncontaminated
nsCOMPtr<nsIFile> iFileSourceOrig = nsifSourceFolder->GetFileSpec();
nsCOMPtr<nsIFile> iFileAliasOrig = nsifAliasFolder->GetFileSpec();
nsCOMPtr<nsIFile> iFileSource;
nsCOMPtr<nsIFile> iFileAlias;
rv1 = iFileSourceOrig->Clone(getter_AddRefs(iFileSource));
rv2 = iFileAliasOrig->Clone(getter_AddRefs(iFileAlias));
if (!NS_SUCCEEDED(rv1) || !NS_SUCCEEDED(rv2))
{
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
return JS_TRUE;
}
ConvertJSValToStr(sourceLeaf, cx, argv[1]);
rv1 = iFileSource->Append(nsAutoCString(sourceLeaf));
// public int FileMacAlias( InstallFolder aSourceFolder,
// String aSourceFileName,
// InstallFolder aAliasFolder,
// String aAliasName );
// where
// aSourceFolder -- the folder of the installed file from Get*Folder() APIs
// aSourceName -- the installed file's name
// aAliasFolder -- the folder of the new alias from Get*Folder() APIs
// aAliasName -- the actual name of the new alias
//
// returns SUCCESS for successful scheduling of operation
// UNEXPECTED_ERROR for failure
if (argc >= 4)
{
ConvertJSValToStr(aliasLeaf, cx, argv[3]);
}
else
{
aliasLeaf = sourceLeaf;
aliasLeaf.AppendWithConversion(" alias"); // XXX use GetResourcedString(id)
}
rv2 = iFileAlias->Append(nsAutoCString(aliasLeaf));
if (!NS_SUCCEEDED(rv1) || !NS_SUCCEEDED(rv2))
{
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
return JS_TRUE;
}
if(NS_OK != nativeThis->FileOpFileMacAlias(iFileSource, iFileAlias, &nativeRet))
{
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileMacAlias requires 3 or 4 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method FileUnixLinkCreate
//
JSBool PR_CALLBACK
InstallFileOpFileUnixLink(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
//nsAutoString b0;
PRInt32 b1;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = JSVAL_NULL;
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
if(argc >= 2)
{
// public int FileUnixLinkCreate (String aSourceFolder,
// Number aFlags);
b1 = JSVAL_TO_INT(argv[1]);
if (argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(NS_OK != nativeThis->FileOpFileUnixLink(*folder, b1, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function FileUnixLink requires 2 parameters");
return JS_TRUE;
}
return JS_TRUE;
}
//
// Native method WindowsRegisterServer
//
JSBool PR_CALLBACK
InstallFileOpWinRegisterServer(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
PRInt32 nativeRet;
JSObject *jsObj;
nsInstallFolder *folder;
*rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR);
// If there's no private data, this must be the prototype, so ignore
if(nsnull == nativeThis)
{
return JS_TRUE;
}
// public int WinRegisterServer (nsInstallFolder aNativeFolderPath);
if ( argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
jsObj = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
{
*rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS);
return JS_TRUE;
}
folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
if(!folder || NS_OK != nativeThis->FileOpWinRegisterServer(*folder, &nativeRet))
{
return JS_TRUE;
}
*rval = INT_TO_JSVAL(nativeRet);
return JS_TRUE;
}
/***********************************************************************/
//
// Install Properties Getter
//
JSBool PR_CALLBACK
GetFileProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
return PR_TRUE;
}
/***********************************************************************/
//
// File Properties Setter
//
JSBool PR_CALLBACK
SetFileProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
return PR_TRUE;
}
/***********************************************************************/
//
// class for FileOp operations
//
JSClass FileOpClass = {
"File",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub,
JS_PropertyStub,
GetFileProperty,
SetFileProperty,
JS_EnumerateStub,
JS_ResolveStub,
JS_ConvertStub,
JS_FinalizeStub
};
//
// File class methods
//
static JSFunctionSpec FileOpMethods[] =
{
{"dirCreate", InstallFileOpDirCreate, 1},
{"dirGetParent", InstallFileOpDirGetParent, 1},
{"dirRemove", InstallFileOpDirRemove, 2},
{"dirRename", InstallFileOpDirRename, 2},
{"copy", InstallFileOpFileCopy, 2},
{"remove", InstallFileOpFileRemove, 1},
{"exists", InstallFileOpFileExists, 1},
{"execute", InstallFileOpFileExecute, 2},
{"nativeVersion", InstallFileOpFileGetNativeVersion, 1},
{"diskSpaceAvailable", InstallFileOpFileGetDiskSpaceAvailable,1},
{"modDate", InstallFileOpFileGetModDate, 1},
{"size", InstallFileOpFileGetSize, 1},
{"isDirectory", InstallFileOpFileIsDirectory, 1},
{"isFile", InstallFileOpFileIsFile, 1},
{"modDateChanged", InstallFileOpFileModDateChanged, 2},
{"move", InstallFileOpFileMove, 2},
{"rename", InstallFileOpFileRename, 2},
{"windowsShortcut", InstallFileOpFileWindowsShortcut, 7},
{"macAlias", InstallFileOpFileMacAlias, 2},
{"unixLink", InstallFileOpFileUnixLink, 2},
{"windowsRegisterServer", InstallFileOpWinRegisterServer, 1},
{0}
};
PRInt32 InitXPFileOpObjectPrototype(JSContext *jscontext,
JSObject *global,
JSObject **fileOpObjectPrototype)
{
if (global == nsnull)
{
return NS_ERROR_FAILURE;
}
*fileOpObjectPrototype = JS_InitClass( jscontext, // context
global, // global object
nsnull, // parent proto
&FileOpClass, // JSClass
nsnull, // JSNative ctor
0, // ctor args
nsnull, // proto props
nsnull, // proto funcs
nsnull, // ctor props (static)
FileOpMethods); // ctor funcs (static)
if (nsnull == fileOpObjectPrototype)
{
return NS_ERROR_FAILURE;
}
return NS_OK;
}