This commit is contained in:
dougt%netscape.com 1999-05-07 00:05:54 +00:00
Родитель d6083ce608
Коммит aad9ece5e5
28 изменённых файлов: 4106 добавлений и 687 удалений

Двоичные данные
xpinstall/macbuild/xpinstall.mcp

Двоичный файл не отображается.

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

@ -1,171 +1 @@
/* -*- 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.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/* AUTO-GENERATED. DO NOT EDIT!!! */
#ifndef nsIDOMInstall_h__
#define nsIDOMInstall_h__
#include "nsISupports.h"
#include "nsString.h"
#include "nsIScriptContext.h"
class nsIDOMInstallFolder;
#define NS_IDOMINSTALL_IID \
{ 0x18c2f988, 0xb09f, 0x11d2, \
{0xbc, 0xde, 0x00, 0x80, 0x5f, 0x0e, 0x13, 0x53}}
class nsIDOMInstall : public nsISupports {
public:
static const nsIID& IID() { static nsIID iid = NS_IDOMINSTALL_IID; return iid; }
enum {
SUERR_BAD_PACKAGE_NAME = -200,
SUERR_UNEXPECTED_ERROR = -201,
SUERR_ACCESS_DENIED = -202,
SUERR_TOO_MANY_CERTIFICATES = -203,
SUERR_NO_INSTALLER_CERTIFICATE = -204,
SUERR_NO_CERTIFICATE = -205,
SUERR_NO_MATCHING_CERTIFICATE = -206,
SUERR_UNKNOWN_JAR_FILE = -207,
SUERR_INVALID_ARGUMENTS = -208,
SUERR_ILLEGAL_RELATIVE_PATH = -209,
SUERR_USER_CANCELLED = -210,
SUERR_INSTALL_NOT_STARTED = -211,
SUERR_SILENT_MODE_DENIED = -212,
SUERR_NO_SUCH_COMPONENT = -213,
SUERR_FILE_DOES_NOT_EXIST = -214,
SUERR_FILE_READ_ONLY = -215,
SUERR_FILE_IS_DIRECTORY = -216,
SUERR_NETWORK_FILE_IS_IN_USE = -217,
SUERR_APPLE_SINGLE_ERR = -218,
SUERR_INVALID_PATH_ERR = -219,
SUERR_PATCH_BAD_DIFF = -220,
SUERR_PATCH_BAD_CHECKSUM_TARGET = -221,
SUERR_PATCH_BAD_CHECKSUM_RESULT = -222,
SUERR_UNINSTALL_FAILED = -223,
SUERR_GESTALT_UNKNOWN_ERR = -5550,
SUERR_GESTALT_INVALID_ARGUMENT = -5551,
SU_SUCCESS = 0,
SU_REBOOT_NEEDED = 999,
SU_LIMITED_INSTALL = 0,
SU_FULL_INSTALL = 1,
SU_NO_STATUS_DLG = 2,
SU_NO_FINALIZE_DLG = 4,
SU_INSTALL_FILE_UNEXPECTED_MSG_ID = 0,
SU_DETAILS_REPLACE_FILE_MSG_ID = 1,
SU_DETAILS_INSTALL_FILE_MSG_ID = 2
};
NS_IMETHOD GetUserPackageName(nsString& aUserPackageName)=0;
NS_IMETHOD GetRegPackageName(nsString& aRegPackageName)=0;
NS_IMETHOD AbortInstall()=0;
NS_IMETHOD AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aSubdir, PRBool aForceMode, PRInt32* aReturn)=0;
NS_IMETHOD AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aTargetName, PRBool aForceMode, PRInt32* aReturn)=0;
NS_IMETHOD DeleteComponent(const nsString& aRegistryName, PRInt32* aReturn)=0;
NS_IMETHOD DeleteFile(nsIDOMInstallFolder* aFolder, const nsString& aRelativeFileName, PRInt32* aReturn)=0;
NS_IMETHOD DiskSpaceAvailable(nsIDOMInstallFolder* aFolder, PRInt32* aReturn)=0;
NS_IMETHOD Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn)=0;
NS_IMETHOD FinalizeInstall(PRInt32* aReturn)=0;
NS_IMETHOD Gestalt(const nsString& aSelector, PRInt32* aReturn)=0;
NS_IMETHOD GetComponentFolder(const nsString& aRegName, const nsString& aSubdirectory, nsIDOMInstallFolder** aReturn)=0;
NS_IMETHOD GetFolder(const nsString& aTargetFolder, const nsString& aSubdirectory, nsIDOMInstallFolder** aReturn)=0;
NS_IMETHOD GetLastError(PRInt32* aReturn)=0;
NS_IMETHOD GetWinProfile(nsIDOMInstallFolder* aFolder, const nsString& aFile, PRInt32* aReturn)=0;
NS_IMETHOD GetWinRegistry(PRInt32* aReturn)=0;
NS_IMETHOD Patch(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aTargetName, PRInt32* aReturn)=0;
NS_IMETHOD ResetError()=0;
NS_IMETHOD SetPackageFolder(nsIDOMInstallFolder* aFolder)=0;
NS_IMETHOD StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, const nsString& aVersion, PRInt32 aFlags, PRInt32* aReturn)=0;
NS_IMETHOD Uninstall(const nsString& aPackageName, PRInt32* aReturn)=0;
};
#define NS_DECL_IDOMINSTALL \
NS_IMETHOD GetUserPackageName(nsString& aUserPackageName); \
NS_IMETHOD GetRegPackageName(nsString& aRegPackageName); \
NS_IMETHOD AbortInstall(); \
NS_IMETHOD AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aSubdir, PRBool aForceMode, PRInt32* aReturn); \
NS_IMETHOD AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aTargetName, PRBool aForceMode, PRInt32* aReturn); \
NS_IMETHOD DeleteComponent(const nsString& aRegistryName, PRInt32* aReturn); \
NS_IMETHOD DeleteFile(nsIDOMInstallFolder* aFolder, const nsString& aRelativeFileName, PRInt32* aReturn); \
NS_IMETHOD DiskSpaceAvailable(nsIDOMInstallFolder* aFolder, PRInt32* aReturn); \
NS_IMETHOD Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn); \
NS_IMETHOD FinalizeInstall(PRInt32* aReturn); \
NS_IMETHOD Gestalt(const nsString& aSelector, PRInt32* aReturn); \
NS_IMETHOD GetComponentFolder(const nsString& aRegName, const nsString& aSubdirectory, nsIDOMInstallFolder** aReturn); \
NS_IMETHOD GetFolder(const nsString& aTargetFolder, const nsString& aSubdirectory, nsIDOMInstallFolder** aReturn); \
NS_IMETHOD GetLastError(PRInt32* aReturn); \
NS_IMETHOD GetWinProfile(nsIDOMInstallFolder* aFolder, const nsString& aFile, PRInt32* aReturn); \
NS_IMETHOD GetWinRegistry(PRInt32* aReturn); \
NS_IMETHOD Patch(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aTargetName, PRInt32* aReturn); \
NS_IMETHOD ResetError(); \
NS_IMETHOD SetPackageFolder(nsIDOMInstallFolder* aFolder); \
NS_IMETHOD StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, const nsString& aVersion, PRInt32 aFlags, PRInt32* aReturn); \
NS_IMETHOD Uninstall(const nsString& aPackageName, PRInt32* aReturn); \
#define NS_FORWARD_IDOMINSTALL(_to) \
NS_IMETHOD GetUserPackageName(nsString& aUserPackageName) { return _to##GetUserPackageName(aUserPackageName); } \
NS_IMETHOD GetRegPackageName(nsString& aRegPackageName) { return _to##GetRegPackageName(aRegPackageName); } \
NS_IMETHOD AbortInstall() { return _to##AbortInstall(); } \
NS_IMETHOD AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aSubdir, PRBool aForceMode, PRInt32* aReturn) { return _to##AddDirectory(aRegName, aVersion, aJarSource, aFolder, aSubdir, aForceMode, aReturn); } \
NS_IMETHOD AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aTargetName, PRBool aForceMode, PRInt32* aReturn) { return _to##AddSubcomponent(aRegName, aVersion, aJarSource, aFolder, aTargetName, aForceMode, aReturn); } \
NS_IMETHOD DeleteComponent(const nsString& aRegistryName, PRInt32* aReturn) { return _to##DeleteComponent(aRegistryName, aReturn); } \
NS_IMETHOD DeleteFile(nsIDOMInstallFolder* aFolder, const nsString& aRelativeFileName, PRInt32* aReturn) { return _to##DeleteFile(aFolder, aRelativeFileName, aReturn); } \
NS_IMETHOD DiskSpaceAvailable(nsIDOMInstallFolder* aFolder, PRInt32* aReturn) { return _to##DiskSpaceAvailable(aFolder, aReturn); } \
NS_IMETHOD Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn) { return _to##Execute(aJarSource, aArgs, aReturn); } \
NS_IMETHOD FinalizeInstall(PRInt32* aReturn) { return _to##FinalizeInstall(aReturn); } \
NS_IMETHOD Gestalt(const nsString& aSelector, PRInt32* aReturn) { return _to##Gestalt(aSelector, aReturn); } \
NS_IMETHOD GetComponentFolder(const nsString& aRegName, const nsString& aSubdirectory, nsIDOMInstallFolder** aReturn) { return _to##GetComponentFolder(aRegName, aSubdirectory, aReturn); } \
NS_IMETHOD GetFolder(const nsString& aTargetFolder, const nsString& aSubdirectory, nsIDOMInstallFolder** aReturn) { return _to##GetFolder(aTargetFolder, aSubdirectory, aReturn); } \
NS_IMETHOD GetLastError(PRInt32* aReturn) { return _to##GetLastError(aReturn); } \
NS_IMETHOD GetWinProfile(nsIDOMInstallFolder* aFolder, const nsString& aFile, PRInt32* aReturn) { return _to##GetWinProfile(aFolder, aFile, aReturn); } \
NS_IMETHOD GetWinRegistry(PRInt32* aReturn) { return _to##GetWinRegistry(aReturn); } \
NS_IMETHOD Patch(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsIDOMInstallFolder* aFolder, const nsString& aTargetName, PRInt32* aReturn) { return _to##Patch(aRegName, aVersion, aJarSource, aFolder, aTargetName, aReturn); } \
NS_IMETHOD ResetError() { return _to##ResetError(); } \
NS_IMETHOD SetPackageFolder(nsIDOMInstallFolder* aFolder) { return _to##SetPackageFolder(aFolder); } \
NS_IMETHOD StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, const nsString& aVersion, PRInt32 aFlags, PRInt32* aReturn) { return _to##StartInstall(aUserPackageName, aPackageName, aVersion, aFlags, aReturn); } \
NS_IMETHOD Uninstall(const nsString& aPackageName, PRInt32* aReturn) { return _to##Uninstall(aPackageName, aReturn); } \
extern nsresult NS_InitInstallClass(nsIScriptContext *aContext, void **aPrototype);
extern "C" NS_DOM nsresult NS_NewScriptInstall(nsIScriptContext *aContext, nsISupports *aSupports, nsISupports *aParent, void **aReturn);
#endif // nsIDOMInstall_h__
#error

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

@ -43,26 +43,50 @@ public:
NS_IMETHOD UpdateEnabled(PRBool* aReturn)=0;
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32* aReturn)=0;
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRInt32* aReturn)=0;
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn)=0;
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn)=0;
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn)=0;
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn)=0;
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn)=0;
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn)=0;
NS_IMETHOD CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn)=0;
NS_IMETHOD CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn)=0;
NS_IMETHOD CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn)=0;
};
#define NS_DECL_IDOMINSTALLTRIGGERGLOBAL \
NS_IMETHOD UpdateEnabled(PRBool* aReturn); \
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRInt32* aReturn); \
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32* aReturn); \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn); \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn); \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn); \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn); \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn); \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn); \
NS_IMETHOD CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn); \
NS_IMETHOD CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn); \
NS_IMETHOD CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn); \
#define NS_FORWARD_IDOMINSTALLTRIGGERGLOBAL(_to) \
NS_IMETHOD UpdateEnabled(PRBool* aReturn) { return _to##UpdateEnabled(aReturn); } \
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRInt32* aReturn) { return _to##StartSoftwareUpdate(aURL, aFlags, aReturn); } \
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32* aReturn) { return _to##StartSoftwareUpdate(aURL, aReturn); } \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn) { return _to##ConditionalSoftwareUpdate(aURL, aRegName, aDiffLevel, aVersion, aMode, aReturn); } \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn) { return _to##ConditionalSoftwareUpdate(aURL, aRegName, aDiffLevel, aVersion, aMode, aReturn); } \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, nsIDOMInstallVersion* aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn) { return _to##ConditionalSoftwareUpdate(aURL, aDiffLevel, aVersion, aMode, aReturn); } \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn) { return _to##ConditionalSoftwareUpdate(aURL, aDiffLevel, aVersion, aMode, aReturn); } \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn) { return _to##ConditionalSoftwareUpdate(aURL, aDiffLevel, aVersion, aReturn); } \
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn) { return _to##ConditionalSoftwareUpdate(aURL, aDiffLevel, aVersion, aReturn); } \
NS_IMETHOD CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn) { return _to##CompareVersion(aRegName, aMajor, aMinor, aRelease, aBuild, aReturn); } \
NS_IMETHOD CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn) { return _to##CompareVersion(aRegName, aVersion, aReturn); } \
NS_IMETHOD CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn) { return _to##CompareVersion(aRegName, aVersion, aReturn); } \
extern nsresult NS_InitInstallTriggerGlobalClass(nsIScriptContext *aContext, void **aPrototype);

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

@ -62,6 +62,8 @@ public:
NS_IMETHOD ToString(nsString& aReturn)=0;
NS_IMETHOD CompareTo(nsIDOMInstallVersion* aVersionObject, PRInt32* aReturn)=0;
NS_IMETHOD CompareTo(const nsString& aString, PRInt32* aReturn)=0;
NS_IMETHOD CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn)=0;
};
@ -77,6 +79,8 @@ public:
NS_IMETHOD Init(const nsString& aVersionString); \
NS_IMETHOD ToString(nsString& aReturn); \
NS_IMETHOD CompareTo(nsIDOMInstallVersion* aVersionObject, PRInt32* aReturn); \
NS_IMETHOD CompareTo(const nsString& aString, PRInt32* aReturn); \
NS_IMETHOD CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn); \
@ -92,6 +96,8 @@ public:
NS_IMETHOD Init(const nsString& aVersionString) { return _to##Init(aVersionString); } \
NS_IMETHOD ToString(nsString& aReturn) { return _to##ToString(aReturn); } \
NS_IMETHOD CompareTo(nsIDOMInstallVersion* aVersionObject, PRInt32* aReturn) { return _to##CompareTo(aVersionObject, aReturn); } \
NS_IMETHOD CompareTo(const nsString& aString, PRInt32* aReturn) { return _to##CompareTo(aString, aReturn); } \
NS_IMETHOD CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn) { return _to##CompareTo(aMajor, aMinor, aRelease, aBuild, aReturn); } \
extern nsresult NS_InitInstallVersionClass(nsIScriptContext *aContext, void **aPrototype);

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

@ -46,7 +46,7 @@ class nsISoftwareUpdate : public nsISupports
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISOFTWAREUPDATE_IID)
NS_IMETHOD InstallJar(nsInstallInfo *installInfo) = 0;
NS_IMETHOD InstallJar(const nsString& fromURL,
const nsString& flags,
const nsString& args) = 0;

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

@ -42,7 +42,9 @@ CPPSRCS = \
nsInstallFile.cpp \
nsInstallFolder.cpp \
nsInstallPatch.cpp \
nsInstallUninstall.cpp \
nsInstallTrigger.cpp \
nsInstallResources.cpp \
nsJSInstall.cpp \
nsJSInstallTriggerGlobal.cpp\
nsSoftwareUpdateRun.cpp \
@ -50,7 +52,6 @@ CPPSRCS = \
ScheduledTasks.cpp \
$(NULL)
INCLUDES += -I$(srcdir)/../public
include $(topsrcdir)/config/rules.mk

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

@ -26,46 +26,103 @@
#include "nscore.h"
#include "NSReg.h"
#include "nsFileSpec.h"
#include "nsFileStream.h"
#include "nsInstall.h" // for error codes
#include "prmem.h"
REGERR DeleteFileLater(const char * filename)
REGERR DeleteFileLater(nsFileSpec& filename)
{
RKEY newkey;
REGERR result = -1;
HREG reg;
if ( REGERR_OK == NR_RegOpen("", &reg) )
{
if (REGERR_OK == NR_RegAddKey( reg, ROOTKEY_PRIVATE, REG_DELETE_LIST_KEY, &newkey) )
{
result = NR_RegSetEntryString( reg, newkey, (char*)filename, "" );
}
NR_RegClose(reg);
REGERR result = 0;
filename.Delete(false);
if (filename.Exists())
{
RKEY newkey;
HREG reg;
if ( REGERR_OK == NR_RegOpen("", &reg) )
{
if (REGERR_OK == NR_RegAddKey( reg, ROOTKEY_PRIVATE, REG_DELETE_LIST_KEY, &newkey) )
{
nsPersistentFileDescriptor savethis(filename);
char* buffer = nsnull;
nsOutputStringStream s(buffer);
s << savethis;
result = NR_RegSetEntry( reg, newkey, "", REGTYPE_ENTRY_BYTES, buffer, strlen(buffer));
if (result == REGERR_OK)
result = nsInstall::REBOOT_NEEDED;
}
NR_RegClose(reg);
}
}
return result;
}
REGERR ReplaceFileLater(const char *tmpfile, const char *target )
REGERR ReplaceFileLater(nsFileSpec& tmpfile, nsFileSpec& target )
{
RKEY newkey;
REGERR err;
HREG reg;
if ( REGERR_OK == NR_RegOpen("", &reg) )
REGERR result = 0;
if (! target.Exists() )
{
err = NR_RegAddKey( reg, ROOTKEY_PRIVATE, REG_REPLACE_LIST_KEY, &newkey);
if ( err == REGERR_OK )
{
err = NR_RegSetEntryString( reg, newkey, (char*)tmpfile, (char*)target );
}
NR_RegClose(reg);
// Now that we have move the existing file, we can move the mExtracedFile into place.
nsFileSpec parentofFinalFile;
target.GetParent(parentofFinalFile);
result = tmpfile.Move(parentofFinalFile);
char* leafName = target.GetLeafName();
tmpfile.Rename(leafName);
nsCRT::free(leafName);
}
return err;
else
{
RKEY newkey;
HREG reg;
if ( REGERR_OK == NR_RegOpen("", &reg) )
{
result = NR_RegAddKey( reg, ROOTKEY_PRIVATE, REG_REPLACE_LIST_KEY, &newkey);
if ( result == REGERR_OK )
{
nsPersistentFileDescriptor tempDesc(tmpfile);
nsPersistentFileDescriptor targDesc(target);
char* tempBuffer = nsnull;
char* targBuffer = nsnull;
nsOutputStringStream tempStream(tempBuffer);
nsOutputStringStream targStream(targBuffer);
tempStream << tempDesc;
targStream << targDesc;
result = NR_RegSetEntry( reg, newkey, tempBuffer, REGTYPE_ENTRY_BYTES, targBuffer, strlen(targBuffer));
if (result == REGERR_OK)
result = nsInstall::REBOOT_NEEDED;
}
NR_RegClose(reg);
}
}
return result;
}
void DeleteScheduledFiles(void);
void ReplaceScheduledFiles(void);
extern "C" void PerformScheduledTasks(void *data)
{
DeleteScheduledFiles();
ReplaceScheduledFiles();
}
void DeleteScheduledFiles(void)
{
HREG reg;
@ -78,11 +135,16 @@ void DeleteScheduledFiles(void)
/* perform scheduled file deletions and replacements (PC only) */
if (REGERR_OK == NR_RegGetKey(reg, ROOTKEY_PRIVATE, REG_DELETE_LIST_KEY,&key))
{
char buf[MAXREGNAMELEN];
char buf[MAXREGNAMELEN]; // what about the mac? FIX
while (REGERR_OK == NR_RegEnumEntries(reg, key, &state, buf, sizeof(buf), NULL ))
{
nsFileSpec doomedFile(buf);
nsPersistentFileDescriptor doomedDesc;
nsInputStringStream tempStream(buf);
tempStream >> doomedDesc;
nsFileSpec doomedFile(doomedDesc);
doomedFile.Delete(PR_FALSE);
@ -121,7 +183,13 @@ void ReplaceScheduledFiles(void)
state = 0;
while (REGERR_OK == NR_RegEnumEntries(reg, key, &state, tmpfile, sizeof(tmpfile), NULL ))
{
nsFileSpec replaceFile(tmpfile);
nsPersistentFileDescriptor doomedDesc;
nsInputStringStream tempStream(tmpfile);
tempStream >> doomedDesc;
nsFileSpec replaceFile(doomedDesc);
if (! replaceFile.Exists() )
{
@ -134,7 +202,12 @@ void ReplaceScheduledFiles(void)
}
else
{
nsFileSpec targetFile(target);
nsPersistentFileDescriptor targetDesc;
nsInputStringStream anotherStream(target);
anotherStream >> targetDesc;
nsFileSpec targetFile(targetDesc);
targetFile.Delete(PR_FALSE);
if (!targetFile.Exists())

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

@ -29,12 +29,14 @@
#include "NSReg.h"
#include "nsFileSpec.h"
REGERR DeleteFileLater(const char * filename);
REGERR ReplaceFileLater(const char *tmpfile, const char *target );
void DeleteScheduledFiles(void);
void ReplaceScheduledFiles(void);
REGERR DeleteFileLater(nsFileSpec& filename);
REGERR ReplaceFileLater(nsFileSpec& tmpfile, nsFileSpec& target );
extern "C" void PerformScheduledTasks(void *data);
#endif

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

@ -38,17 +38,21 @@ LCFLAGS = \
$(DEFINES) \
$(NULL)
LINCS= \
-I$(XPDIST)\public\xpinstall \
-I$(XPDIST)\public\jar \
-I$(XPDIST)\public\libreg \
-I$(XPDIST)\public\netlib \
-I$(XPDIST)\public\xpcom \
-I$(XPDIST)\public\pref \
-I$(XPDIST)\public\js \
-I$(XPDIST)\public\dom \
-I$(XPDIST)\public\raptor \
-I$(XPDIST)\public\nspr2 \
LINCS= \
-I$(PUBLIC)\libxpt \
-I$(PUBLIC)\xptinfo \
-I$(PUBLIC)\xptcall \
-I$(PUBLIC)\xpinstall \
-I$(PUBLIC)\jar \
-I$(PUBLIC)\libreg \
-I$(PUBLIC)\netlib \
-I$(PUBLIC)\xpcom \
-I$(PUBLIC)\pref \
-I$(PUBLIC)\js \
-I$(PUBLIC)\dom \
-I$(PUBLIC)\raptor \
-I$(PUBLIC)\nspr2 \
-I$(PUBLIC)\zlib \
$(NULL)
LLIBS = \
@ -59,10 +63,11 @@ LLIBS = \
$(DIST)\lib\xppref32.lib \
$(DIST)\lib\js3250.lib \
$(DIST)\lib\jsdombase_s.lib \
$(DIST)\lib\jsdomevents_s.lib \
$(DIST)\lib\jsdomevents_s.lib \
$(DIST)\lib\raptorbase.lib \
$(DIST)\lib\zlib.lib \
$(DIST)\lib\plc3.lib \
$(LIBNSPR) \
$(DIST)\lib\plc3.lib \
$(NULL)
@ -81,7 +86,9 @@ OBJS = \
.\$(OBJDIR)\nsInstallDelete.obj \
.\$(OBJDIR)\nsInstallExecute.obj \
.\$(OBJDIR)\nsInstallPatch.obj \
.\$(OBJDIR)\ScheduledTasks.obj \
.\$(OBJDIR)\nsInstallUninstall.obj \
.\$(OBJDIR)\nsInstallResources.obj \
.\$(OBJDIR)\ScheduledTasks.obj \
$(NULL)
include <$(DEPTH)\config\rules.mak>

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@ -32,6 +32,8 @@
#include "jsapi.h"
#include "plevent.h"
#include "nsString.h"
#include "nsFileSpec.h"
#include "nsVector.h"
@ -61,6 +63,9 @@ class nsInstallInfo
PRBool IsMultipleTrigger();
PLEventQueue* GetUIEventQueue(void) const { return mUIEventQueue; }
void SetUIEventQueue(PLEventQueue* queue) { mUIEventQueue = queue; }
private:
void DeleteVector(nsVector* vector);
@ -77,6 +82,8 @@ class nsInstallInfo
nsVector *mFromURLs;
nsVector *mLocalFiles;
PLEventQueue *mUIEventQueue; // this should be moved to private and have accessors
};
@ -139,22 +146,40 @@ class nsInstall
PRInt32 AbortInstall();
PRInt32 AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aSubdir, PRBool aForceMode, PRInt32* aReturn);
PRInt32 AddDirectory(const nsString& aRegName, nsIDOMInstallVersion* aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aSubdir, PRBool aForceMode, PRInt32* aReturn);
PRInt32 AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aSubdir, PRInt32* aReturn);
PRInt32 AddDirectory(const nsString& aRegName, nsIDOMInstallVersion* aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aSubdir, PRInt32* aReturn);
PRInt32 AddDirectory(const nsString& aRegName, const nsString& aJarSource, const nsString& aFolder, const nsString& aSubdir, PRInt32* aReturn);
PRInt32 AddDirectory(const nsString& aJarSource, PRInt32* aReturn);
PRInt32 AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRBool aForceMode, PRInt32* aReturn);
PRInt32 AddSubcomponent(const nsString& aRegName, nsIDOMInstallVersion* aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRBool aForceMode, PRInt32* aReturn);
PRInt32 AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRInt32* aReturn);
PRInt32 AddSubcomponent(const nsString& aRegName, nsIDOMInstallVersion* aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRInt32* aReturn);
PRInt32 AddSubcomponent(const nsString& aRegName, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRInt32* aReturn);
PRInt32 AddSubcomponent(const nsString& aJarSource, PRInt32* aReturn);
PRInt32 DeleteComponent(const nsString& aRegistryName, PRInt32* aReturn);
PRInt32 DeleteFile(const nsString& aFolder, const nsString& aRelativeFileName, PRInt32* aReturn);
PRInt32 DiskSpaceAvailable(const nsString& aFolder, PRInt32* aReturn);
PRInt32 Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn);
PRInt32 Execute(const nsString& aJarSource, PRInt32* aReturn);
PRInt32 FinalizeInstall(PRInt32* aReturn);
PRInt32 Gestalt(const nsString& aSelector, PRInt32* aReturn);
PRInt32 GetComponentFolder(const nsString& aComponentName, const nsString& aSubdirectory, nsString** aFolder);
PRInt32 GetComponentFolder(const nsString& aComponentName, nsString** aFolder);
PRInt32 GetFolder(const nsString& aTargetFolder, const nsString& aSubdirectory, nsString** aFolder);
PRInt32 GetFolder(const nsString& aTargetFolder, nsString** aFolder);
PRInt32 GetLastError(PRInt32* aReturn);
PRInt32 GetWinProfile(const nsString& aFolder, const nsString& aFile, PRInt32* aReturn);
PRInt32 GetWinRegistry(PRInt32* aReturn);
PRInt32 Patch(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRInt32* aReturn);
PRInt32 Patch(const nsString& aRegName, nsIDOMInstallVersion* aVersion, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRInt32* aReturn);
PRInt32 Patch(const nsString& aRegName, const nsString& aJarSource, const nsString& aFolder, const nsString& aTargetName, PRInt32* aReturn);
PRInt32 ResetError();
PRInt32 SetPackageFolder(const nsString& aFolder);
PRInt32 StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, const nsString& aVersion, PRInt32 aFlags, PRInt32* aReturn);
PRInt32 StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, nsIDOMInstallVersion* aVersion, PRInt32 aFlags, PRInt32* aReturn);
PRInt32 StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, const nsString& aVersion, PRInt32* aReturn);
PRInt32 StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
PRInt32 Uninstall(const nsString& aPackageName, PRInt32* aReturn);
@ -186,18 +211,19 @@ class nsInstall
nsString mRegistryPackageName; /* Name of the package we are installing */
nsString mUIName; /* User-readable package name */
nsInstallVersion* mVersionInfo; /* Component version info */
nsString* mPackageFolder;
nsInstallVersion* mVersionInfo; /* Component version info */
nsVector* mInstalledFiles;
nsHashtable* mPatchList;
nsOutputFileStream *mLogStream;
PRInt32 mLastError;
void ParseFlags(int flags);
PRInt32 SanityCheck(void);
void GetTime(nsString &aString);
nsString * GetQualifiedRegName( const nsString& name );
nsString* GetQualifiedPackageName( const nsString& name );
nsString* CurrentUserNode();
@ -215,4 +241,4 @@ class nsInstall
};
#endif
#endif

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

@ -31,6 +31,7 @@
#include "VerReg.h"
#include "ScheduledTasks.h"
#include "nsInstallDelete.h"
#include "nsInstallResources.h"
#include "nsInstall.h"
#include "nsIDOMInstallVersion.h"
@ -125,7 +126,19 @@ void nsInstallDelete::Abort()
char* nsInstallDelete::toString()
{
return nsnull;
char* buffer = new char[1024];
if (mDeleteStatus == DELETE_COMPONENT)
{
sprintf( buffer, nsInstallResources::GetDeleteComponentString(), nsAutoCString(mRegistryName));
}
else
{
if (mFinalFile)
sprintf( buffer, nsInstallResources::GetDeleteFileString(), mFinalFile->GetCString());
}
return buffer;
}
@ -209,14 +222,7 @@ PRInt32 nsInstallDelete::NativeComplete()
{
if (mFinalFile->IsFile())
{
mFinalFile->Delete(false);
if (mFinalFile->Exists())
{
// If file still exists, we need to delete it later!
DeleteFileLater(mFinalFile->GetCString());
return nsInstall::REBOOT_NEEDED;
}
return DeleteFileLater(*mFinalFile);
}
else
{

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

@ -31,7 +31,7 @@
#include "VerReg.h"
#include "nsInstallExecute.h"
#include "nsInstallResources.h"
#include "ScheduledTasks.h"
#include "nsInstall.h"
@ -87,7 +87,7 @@ PRInt32 nsInstallExecute::Complete()
PRInt32 result = app.Execute( mArgs );
DeleteFileLater(app.GetCString());
DeleteFileLater( app );
return result;
}
@ -98,17 +98,17 @@ void nsInstallExecute::Abort()
if (mExecutableFile == nsnull)
return;
mExecutableFile->Delete(PR_FALSE);
if ( mExecutableFile->Exists() )
{
DeleteFileLater(mExecutableFile->GetCString());
}
DeleteFileLater(*mExecutableFile);
}
char* nsInstallExecute::toString()
{
return nsnull;
char* buffer = new char[1024];
sprintf( buffer, nsInstallResources::GetExecuteString(), mExecutableFile->GetCString());
return buffer;
}

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

@ -29,6 +29,7 @@
#include "ScheduledTasks.h"
#include "nsInstall.h"
#include "nsInstallVersion.h"
#include "nsInstallResources.h"
/* Public Methods */
@ -62,6 +63,8 @@ nsInstallFile::nsInstallFile(nsInstall* inInstall,
mFinalFile = new nsFileSpec(folderSpec);
*mFinalFile += inPartialPath;
mReplaceFile = mFinalFile->Exists();
mForceInstall = forceInstall;
mVersionRegistryName = new nsString(inComponentName);
@ -162,7 +165,24 @@ void nsInstallFile::Abort()
char* nsInstallFile::toString()
{
return nsnull;
char* buffer = new char[1024];
if (mFinalFile == nsnull)
{
sprintf( buffer, nsInstallResources::GetInstallFileString(), nsnull);
}
else if (mReplaceFile)
{
// we are replacing this file.
sprintf( buffer, nsInstallResources::GetReplaceFileString(), mFinalFile->GetCString());
}
else
{
sprintf( buffer, nsInstallResources::GetInstallFileString(), mFinalFile->GetCString());
}
return buffer;
}
@ -182,41 +202,7 @@ PRInt32 nsInstallFile::CompleteFileMove()
}
else
{
if (mFinalFile->Exists() == PR_FALSE)
{
// We can simple move the extracted file to the mFinalFile's parent
nsFileSpec parentofFinalFile;
mFinalFile->GetParent(parentofFinalFile);
result = mExtracedFile->Move(parentofFinalFile);
char* leafName = mFinalFile->GetLeafName();
mExtracedFile->Rename(leafName);
nsCRT::free(leafName);
}
else
{
mFinalFile->Delete(PR_FALSE);
if (! mFinalFile->Exists())
{
// Now that we have move the existing file, we can move the mExtracedFile into place.
nsFileSpec parentofFinalFile;
mFinalFile->GetParent(parentofFinalFile);
result = mExtracedFile->Move(parentofFinalFile);
char* leafName = mFinalFile->GetLeafName();
mExtracedFile->Rename(leafName);
nsCRT::free(leafName);
}
else
{
ReplaceFileLater(mExtracedFile->GetCString(), mFinalFile->GetCString() );
result = nsInstall::REBOOT_NEEDED;
}
}
result = ReplaceFileLater(*mExtracedFile, *mFinalFile );
}
return result;
@ -225,33 +211,24 @@ PRInt32 nsInstallFile::CompleteFileMove()
PRInt32
nsInstallFile::RegisterInVersionRegistry()
{
PRInt32 err;
int refCount;
int rc;
char* tempCString;
char *final_file = (char*)mFinalFile->GetCString(); // FIX: mac? What should we be passing to the version registry: native of unix???
char *vr_name = mVersionRegistryName->ToNewCString();
nsString regPackageName;
mInstall->GetRegPackageName(regPackageName);
// Register file and log for Uninstall
// we ignore all registry errors because they're not
// important enough to abort an otherwise OK install.
if (!mChildFile)
{
int found;
if (regPackageName != "")
{
tempCString = regPackageName.ToNewCString();
found = VR_UninstallFileExistsInList( tempCString , vr_name );
found = VR_UninstallFileExistsInList( (char*)(const char*)nsAutoCString(regPackageName) ,
(char*)(const char*)nsAutoCString(*mVersionRegistryName));
}
else
{
found = VR_UninstallFileExistsInList( "", vr_name );
found = VR_UninstallFileExistsInList( "", (char*)(const char*)nsAutoCString(*mVersionRegistryName) );
}
if (found != REGERR_OK)
@ -259,7 +236,7 @@ nsInstallFile::RegisterInVersionRegistry()
else
mUpgradeFile = PR_TRUE;
}
else if (REGERR_OK == VR_InRegistry(vr_name))
else if (REGERR_OK == VR_InRegistry( (char*)(const char*)nsAutoCString(*mVersionRegistryName)))
{
mUpgradeFile = PR_TRUE;
}
@ -268,89 +245,52 @@ nsInstallFile::RegisterInVersionRegistry()
mUpgradeFile = PR_FALSE;
}
err = VR_GetRefCount( vr_name, &refCount );
if ( err != REGERR_OK )
if ( REGERR_OK != VR_GetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), &refCount ))
{
refCount = 0;
}
VR_Install( (char*)(const char*)nsAutoCString(*mVersionRegistryName),
(char*)(const char*)nsprPath(*mFinalFile),
(char*)(const char*)nsAutoCString(regPackageName),
PR_FALSE );
if (!mUpgradeFile)
{
if (refCount != 0)
{
rc = 1 + refCount;
nsString tempString;
mVersionInfo->ToString(tempString);
tempCString = regPackageName.ToNewCString();
VR_Install( vr_name, final_file, tempCString, PR_FALSE );
VR_SetRefCount( vr_name, rc );
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), refCount + 1 );
}
else
{
if (mFinalFile->Exists())
{
nsString tempString;
mVersionInfo->ToString(tempString);
tempCString = regPackageName.ToNewCString();
VR_Install( vr_name, final_file, tempCString, PR_FALSE);
VR_SetRefCount( vr_name, 2 );
}
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 2 );
else
{
nsString tempString;
mVersionInfo->ToString(tempString);
tempCString = regPackageName.ToNewCString();
VR_Install( vr_name, final_file, tempCString, PR_FALSE );
VR_SetRefCount( vr_name, 1 );
}
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 1 );
}
}
else if (mUpgradeFile)
else
{
if (refCount == 0)
{
nsString tempString;
mVersionInfo->ToString(tempString);
tempCString = regPackageName.ToNewCString();
VR_Install( vr_name, final_file, tempCString, PR_FALSE );
VR_SetRefCount( vr_name, 1 );
}
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 1 );
else
{
nsString tempString;
mVersionInfo->ToString(tempString);
tempCString = regPackageName.ToNewCString();
VR_Install( vr_name, final_file, tempCString, PR_FALSE );
VR_SetRefCount( vr_name, 0 );
}
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 0 );
}
if ( !mChildFile && !mUpgradeFile )
{
if (regPackageName != "")
{
if (tempCString == nsnull)
tempCString = regPackageName.ToNewCString();
VR_UninstallAddFileToList( tempCString, vr_name );
{
VR_UninstallAddFileToList( (char*)(const char*)nsAutoCString(regPackageName),
(char*)(const char*)nsAutoCString(*mVersionRegistryName));
}
else
{
VR_UninstallAddFileToList( "", vr_name );
VR_UninstallAddFileToList( "", (char*)(const char*)nsAutoCString(*mVersionRegistryName) );
}
}
if (vr_name != nsnull)
delete [] vr_name;
if (tempCString != nsnull)
delete [] tempCString;
if ( err != 0 )
return nsInstall::UNEXPECTED_ERROR;
return nsInstall::SUCCESS;
}
/* CanUninstall

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

@ -81,7 +81,6 @@ class nsInstallFile : public nsInstallObject
nsString* mVersionRegistryName; /* full version path */
PRBool mForceInstall; /* whether install is forced */
PRBool mJavaInstall; /* whether file is installed to a Java directory */
PRBool mReplaceFile; /* whether file exists */
PRBool mChildFile; /* whether file is a child */
PRBool mUpgradeFile; /* whether file is an upgrade */

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

@ -82,42 +82,41 @@ nsInstallFolder::nsInstallFolder(const nsString& aFolderID)
nsInstallFolder::nsInstallFolder(const nsString& aFolderID, const nsString& aRelativePath)
{
mUrlPath = nsnull;
if ( aFolderID == "null")
{
return;
}
mFileSpec = nsnull;
SetDirectoryPath( aFolderID, aRelativePath);
}
nsInstallFolder::~nsInstallFolder()
{
if (mUrlPath != nsnull)
delete mUrlPath;
if (mFileSpec != nsnull)
delete mFileSpec;
}
void
nsInstallFolder::GetDirectoryPath(nsString& aDirectoryPath)
{
// We want the a NATIVE path.
aDirectoryPath.SetLength(0);
aDirectoryPath.Append(mUrlPath->GetCString());
if (mFileSpec != nsnull)
{
// We want the a NATIVE path.
aDirectoryPath.SetString(mFileSpec->GetCString());
}
}
void
nsInstallFolder::SetDirectoryPath(const nsString& aFolderID, const nsString& aRelativePath)
{
if ( aFolderID.EqualsIgnoreCase("User Pick") )
{
PickDefaultDirectory();
return;
}
else if ( aFolderID.EqualsIgnoreCase("Installed") )
{
mUrlPath = new nsFileSpec(aRelativePath, PR_TRUE); // creates the directories to the relative path.
mFileSpec = new nsFileSpec(aRelativePath, PR_TRUE); // creates the directories to the relative path.
return;
}
else
{
@ -134,7 +133,7 @@ nsInstallFolder::SetDirectoryPath(const nsString& aFolderID, const nsString& aRe
break;
case 102: /////////////////////////////////////////////////////////// Communicator
// FIX
*this = nsSpecialSystemDirectory::OS_CurrentProcessDirectory; // FIX?
break;
case 103: /////////////////////////////////////////////////////////// User Pick
@ -228,14 +227,27 @@ nsInstallFolder::SetDirectoryPath(const nsString& aFolderID, const nsString& aRe
case -1:
default:
break;
return;
}
#ifndef XP_MAC
if (aRelativePath.Length() > 0)
{
nsString tempPath(aRelativePath);
if (aRelativePath.Last() != '/' || aRelativePath.Last() != '\\')
tempPath += '/';
*mFileSpec += tempPath;
}
#endif
// make sure that the directory is created.
nsFileSpec(mFileSpec->GetCString(), PR_TRUE);
}
}
void nsInstallFolder::PickDefaultDirectory()
{
//FIX: Need to put up a dialog here and set mUrlPath
//FIX: Need to put up a dialog here and set mFileSpec
return;
}
@ -265,5 +277,5 @@ void nsInstallFolder::operator = (enum nsSpecialSystemDirectory::SystemDirectori
//----------------------------------------------------------------------------------------
{
nsSpecialSystemDirectory temp(aSystemSystemDirectory);
mUrlPath = new nsFileSpec(temp);
}
mFileSpec = new nsFileSpec(temp);
}

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

@ -46,7 +46,7 @@ class nsInstallFolder
private:
nsFileSpec* mUrlPath;
nsFileSpec* mFileSpec;
void SetDirectoryPath(const nsString& aFolderID, const nsString& aRelativePath);
void PickDefaultDirectory();

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

@ -20,10 +20,44 @@
#include "prmem.h"
#include "nsInstall.h"
#include "nsInstallPatch.h"
#include "nsInstallResources.h"
#include "nsIDOMInstallVersion.h"
#include "zlib.h"
#include "gdiff.h"
#include "VerReg.h"
#include "ScheduledTasks.h"
#include "plstr.h"
#include "xp_file.h" /* for XP_PlatformFileToURL */
#ifdef XP_MAC
#include "PatchableAppleSingle.h"
#endif
#define BUFSIZE 32768
#define OPSIZE 1
#define MAXCMDSIZE 12
#define SRCFILE 0
#define OUTFILE 1
#define getshort(s) (uint16)( ((uchar)*(s) << 8) + ((uchar)*((s)+1)) )
#define getlong(s) \
(uint32)( ((uchar)*(s) << 24) + ((uchar)*((s)+1) << 16 ) + \
((uchar)*((s)+2) << 8) + ((uchar)*((s)+3)) )
static int32 gdiff_parseHeader( pDIFFDATA dd );
static int32 gdiff_validateFile( pDIFFDATA dd, int file );
static int32 gdiff_valCRC32( pDIFFDATA dd, PRFileDesc* fh, uint32 chksum );
static int32 gdiff_ApplyPatch( pDIFFDATA dd );
static int32 gdiff_getdiff( pDIFFDATA dd, uchar *buffer, uint32 length );
static int32 gdiff_add( pDIFFDATA dd, uint32 count );
static int32 gdiff_copy( pDIFFDATA dd, uint32 position, uint32 count );
static int32 gdiff_validateFile( pDIFFDATA dd, int file );
nsInstallPatch::nsInstallPatch( nsInstall* inInstall,
@ -34,7 +68,7 @@ nsInstallPatch::nsInstallPatch( nsInstall* inInstall,
: nsInstallObject(inInstall)
{
char* tempTargetFile = new char[MAXREGPATHLEN];
char tempTargetFile[MAXREGPATHLEN];
char* tempVersionString = inVRName.ToNewCString();
PRInt32 err = VR_GetPath(tempVersionString, MAXREGPATHLEN, tempTargetFile );
@ -43,17 +77,25 @@ nsInstallPatch::nsInstallPatch( nsInstall* inInstall,
if (err != REGERR_OK)
{
if(tempTargetFile)
delete [] tempTargetFile;
*error = nsInstall::NO_SUCH_COMPONENT;
return;
}
nsString folderSpec(tempTargetFile);
mPatchFile = nsnull;
mTargetFile = nsnull;
mPatchedFile = nsnull;
mRegistryName = new nsString(inVRName);
mJarLocation = new nsString(inJarLocation);
nsString tempString;
inVInfo->ToString(tempString);
mVersionInfo = new nsInstallVersion();
mVersionInfo->Init(tempString);
nsInstallPatch( inInstall, inVRName, inVInfo, inJarLocation, nsString(tempTargetFile), "null", error);
mTargetFile = new nsFileSpec(folderSpec);
delete [] tempTargetFile;
}
@ -169,20 +211,12 @@ PRInt32 nsInstallPatch::Prepare()
return err;
}
if ( mPatchedFile != nsnull )
{
mInstall->AddPatch(&ikey, mPatchedFile );
}
else
{
// This is a wierd state. NativePatch should have generated an error here. Is there any
// reason why we return a Invalid_Arg error here?
err = nsInstall::INVALID_ARGUMENTS;
}
PR_ASSERT(mPatchedFile != nsnull);
mInstall->AddPatch(&ikey, mPatchedFile );
if ( deleteOldSrc )
{
NativeDeleteFile( fileName );
DeleteFileLater(*fileName );
}
return err;
@ -205,7 +239,7 @@ PRInt32 nsInstallPatch::Complete()
if (fileName != nsnull && (*fileName == *mPatchedFile) )
{
// the patch has not been superceded--do final replacement
err = NativeReplace( *mTargetFile, *mPatchedFile );
err = ReplaceFileLater( *mTargetFile, *mPatchedFile);
if ( 0 == err || nsInstall::REBOOT_NEEDED == err )
{
nsString tempVersionString;
@ -215,7 +249,7 @@ PRInt32 nsInstallPatch::Complete()
char* tempVersion = tempVersionString.ToNewCString();
err = VR_Install( tempRegName,
(char*)mTargetFile->GetCString(),
(char*) (const char *) nsprPath(*mTargetFile),
tempVersion,
PR_FALSE );
@ -246,14 +280,17 @@ void nsInstallPatch::Abort()
if (fileName != nsnull && (*fileName == *mPatchedFile) )
{
NativeDeleteFile( mPatchedFile );
DeleteFileLater( *mPatchedFile );
}
}
char* nsInstallPatch::toString()
{
//return GetString1(DETAILS_PATCH, targetfile);
return nsnull;
char* buffer = new char[1024];
// FIX! sprintf( buffer, nsInstallResources::GetPatchFileString(), mPatchedFile->GetCString());
return buffer;
}
@ -269,61 +306,248 @@ nsInstallPatch::RegisterPackageNode()
return PR_FALSE;
}
PRInt32
nsInstallPatch::NativePatch(const nsFileSpec &sourceFile, const nsFileSpec &patchfile, nsFileSpec **newFile)
{
return -1;
}
PRInt32
nsInstallPatch::NativeDeleteFile(nsFileSpec* doomedFile)
nsInstallPatch::NativePatch(const nsFileSpec &sourceFile, const nsFileSpec &patchFile, nsFileSpec **newFile)
{
if (doomedFile->Exists())
{
if (doomedFile->IsFile())
{
doomedFile->Delete(false);
if (doomedFile->Exists())
{
// If file still exists, we need to delete it later!
DeleteFileLater(doomedFile->GetCString());
return nsInstall::REBOOT_NEEDED;
}
DIFFDATA *dd;
PRInt32 status = GDIFF_ERR_MEM;
char *tmpurl = NULL;
char *realfile = PL_strdup(nsprPath(sourceFile)); // needs to be sourceFile!!!
nsFileSpec outFileSpec = sourceFile;
dd = (DIFFDATA *)PR_Calloc( 1, sizeof(DIFFDATA));
if (dd != NULL)
{
dd->databuf = (uchar*)PR_Malloc(BUFSIZE);
if (dd->databuf == NULL)
{
status = GDIFF_ERR_MEM;
goto cleanup;
}
dd->bufsize = BUFSIZE;
// validate patch header & check for special instructions
dd->fDiff = PR_Open (nsprPath(patchFile), PR_RDONLY, 0666);
if (dd->fDiff != NULL)
{
status = gdiff_parseHeader(dd);
} else {
status = GDIFF_ERR_ACCESS;
}
#ifdef dono
#ifdef WIN32
/* unbind Win32 images */
if ( dd->bWin32BoundImage && status == GDIFF_OK ) {
tmpurl = WH_TempName( xpURL, NULL );
if ( tmpurl != NULL ) {
if (su_unbind( srcfile, srctype, tmpurl, xpURL ))
{
PL_strfree(realfile);
realfile = tmpurl;
realtype = xpURL;
}
}
else
status = GDIFF_ERR_MEM;
}
else
{
return nsInstall::FILE_IS_DIRECTORY;
#endif
#endif
#ifdef XP_MAC
if ( dd->bMacAppleSingle && status == GDIFF_OK )
{
// create a tmp file, so that we can AppleSingle the src file
nsSpecialSystemDirectory tempMacFile(nsSpecialSystemDirectory::OS_TemporaryDirectory);
nsString srcName = sourceFile.GetLeafName();
tempMacFile.SetLeafName(srcName);
tempMacFile.MakeUnique();
// Encode!
// Encode src file, and put into temp file
FSSpec sourceSpec = sourceFile.GetFSSpec();
FSSpec tempSpec = tempMacFile.GetFSSpec();
status = PAS_EncodeFile(&sourceSpec, &tempSpec);
if (status == noErr)
{
// set
PL_strfree(realfile);
realfile = PL_strdup(nsprPath(tempMacFile));
}
}
#endif
if (status != NS_OK)
goto cleanup;
// make a unique file at the same location of our source file (FILENAME-ptch.EXT)
nsString patchFileName = "-ptch";
nsString newFileName = sourceFile.GetLeafName();
PRInt32 index;
if ((index = newFileName.RFind(".")) > 0)
{
nsString extention;
nsString fileName;
newFileName.Right(extention, (newFileName.Length() - index) );
newFileName.Left(fileName, (newFileName.Length() - (newFileName.Length() - index)));
newFileName = fileName + patchFileName + extention;
} else {
newFileName += patchFileName;
}
}
return nsInstall::FILE_DOES_NOT_EXIST;
}
PRInt32
nsInstallPatch::NativeReplace(const nsFileSpec& oldfile, nsFileSpec& newFile)
{
oldfile.Delete(PR_FALSE);
if (oldfile.Exists())
{
ReplaceFileLater(newFile.GetCString(), oldfile.GetCString() );
return nsInstall::REBOOT_NEEDED;
}
else
{
// We can simple move the extracted file to the mFinalFile's parent
nsFileSpec parentofFinalFile;
oldfile.GetParent(parentofFinalFile);
newFile.Move(parentofFinalFile);
char* leafName = newFile.GetLeafName();
newFile.Rename(leafName);
nsCRT::free(leafName);
outFileSpec.SetLeafName(newFileName); //????
outFileSpec.MakeUnique();
char *outFile = PL_strdup(nsprPath(outFileSpec));
// apply patch to the source file
dd->fSrc = PR_Open ( realfile, PR_RDONLY, 0666);
dd->fOut = PR_Open ( outFile, PR_RDWR|PR_CREATE_FILE|PR_TRUNCATE, 0666);
if (dd->fSrc != NULL && dd->fOut != NULL)
{
status = gdiff_validateFile (dd, SRCFILE);
// specify why diff failed
if (status == GDIFF_ERR_CHECKSUM)
status = GDIFF_ERR_CHECKSUM_TARGET;
if (status == GDIFF_OK)
status = gdiff_ApplyPatch(dd);
if (status == GDIFF_OK)
status = gdiff_validateFile (dd, OUTFILE);
if (status == GDIFF_ERR_CHECKSUM)
status = GDIFF_ERR_CHECKSUM_RESULT;
if (status == GDIFF_OK)
{
*newFile = &outFileSpec;
if ( outFile != nsnull)
PL_strfree( outFile );
}
} else {
status = GDIFF_ERR_ACCESS;
}
}
#ifdef XP_MAC
if ( dd->bMacAppleSingle && status == GDIFF_OK )
{
// create another file, so that we can decode somewhere
nsFileSpec anotherName = outFileSpec;
anotherName.MakeUnique();
// Close the out file so that we can read it
PR_Close( dd->fOut );
dd->fOut = NULL;
FSSpec outSpec = outFileSpec.GetFSSpec();
FSSpec anotherSpec = anotherName.GetFSSpec();
status = PAS_DecodeFile(&outSpec, &anotherSpec);
if (status != noErr)
{
goto cleanup;
}
nsFileSpec parent;
outFileSpec.GetParent(parent);
outFileSpec.Delete(PR_FALSE);
anotherName.Copy(parent);
*newFile = &anotherName;
}
#endif
cleanup:
if ( dd != NULL )
{
if ( dd->fSrc != nsnull )
PR_Close( dd->fSrc );
if ( dd->fDiff != nsnull )
PR_Close( dd->fDiff );
if ( dd->fOut != nsnull )
{
PR_Close( dd->fOut );
}
if ( status != GDIFF_OK )
//XP_FileRemove( outfile, outtype );
newFile = NULL;
PR_FREEIF( dd->databuf );
PR_FREEIF( dd->oldChecksum );
PR_FREEIF( dd->newChecksum );
PR_DELETE(dd);
}
if ( tmpurl != NULL ) {
//XP_FileRemove( tmpurl, xpURL );
tmpurl = NULL;
PR_DELETE( tmpurl );
}
return nsInstall::SUCCESS;
/* lets map any GDIFF error to nice SU errors */
switch (status)
{
case GDIFF_OK:
break;
case GDIFF_ERR_HEADER:
case GDIFF_ERR_BADDIFF:
case GDIFF_ERR_OPCODE:
case GDIFF_ERR_CHKSUMTYPE:
status = nsInstall::PATCH_BAD_DIFF;
break;
case GDIFF_ERR_CHECKSUM_TARGET:
status = nsInstall::PATCH_BAD_CHECKSUM_TARGET;
break;
case GDIFF_ERR_CHECKSUM_RESULT:
status = nsInstall::PATCH_BAD_CHECKSUM_RESULT;
break;
case GDIFF_ERR_OLDFILE:
case GDIFF_ERR_ACCESS:
case GDIFF_ERR_MEM:
case GDIFF_ERR_UNKNOWN:
default:
status = nsInstall::UNEXPECTED_ERROR;
break;
}
return status;
// return -1; //old return value
}
@ -331,20 +555,438 @@ void*
nsInstallPatch::HashFilePath(const nsFilePath& aPath)
{
PRUint32 rv = 0;
const char* cPath = aPath;
char* cPath = PL_strdup(nsprPath(aPath));
if(cPath != nsnull)
{
char ch;
char* filePath = nsnull;
strcpy(filePath, cPath);
char* filePath = PL_strdup(cPath);
PRUint32 cnt=0;
while ((ch = *filePath++) != 0)
{
// FYI: rv = rv*37 + ch
rv = ((rv << 5) + (rv << 2) + rv) + ch;
cnt++;
}
PR_Free(filePath);
for (PRUint32 i=0; i<=cnt; i++)
*filePath--;
PL_strfree(filePath);
}
PL_strfree(cPath);
return (void*)rv;
}
/*---------------------------------------------------------
* gdiff_parseHeader()
*
* reads and validates the GDIFF header info
*---------------------------------------------------------
*/
static
int32 gdiff_parseHeader( pDIFFDATA dd )
{
int32 err = GDIFF_OK;
uint8 cslen;
uint8 oldcslen;
uint8 newcslen;
uint32 nRead;
uchar header[GDIFF_HEADERSIZE];
/* Read the fixed-size part of the header */
nRead = PR_Read (dd->fDiff, header, GDIFF_HEADERSIZE);
if ( nRead != GDIFF_HEADERSIZE ||
memcmp( header, GDIFF_MAGIC, GDIFF_MAGIC_LEN ) != 0 ||
header[GDIFF_VER_POS] != GDIFF_VER )
{
err = GDIFF_ERR_HEADER;
}
else
{
/* get the checksum information */
dd->checksumType = header[GDIFF_CS_POS];
cslen = header[GDIFF_CSLEN_POS];
if ( cslen > 0 )
{
oldcslen = cslen / 2;
newcslen = cslen - oldcslen;
PR_ASSERT( newcslen == oldcslen );
dd->checksumLength = oldcslen;
dd->oldChecksum = (uchar*)PR_MALLOC(oldcslen);
dd->newChecksum = (uchar*)PR_MALLOC(newcslen);
if ( dd->oldChecksum != NULL && dd->newChecksum != NULL )
{
nRead = PR_Read (dd->fDiff, dd->oldChecksum, oldcslen);
if ( nRead == oldcslen )
{
nRead = PR_Read (dd->fDiff, dd->newChecksum, newcslen);
if ( nRead != newcslen ) {
err = GDIFF_ERR_HEADER;
}
}
else {
err = GDIFF_ERR_HEADER;
}
}
else {
err = GDIFF_ERR_MEM;
}
}
/* get application data, if any */
if ( err == GDIFF_OK )
{
uint32 appdataSize;
uchar *buf;
uchar lenbuf[GDIFF_APPDATALEN];
nRead = PR_Read(dd->fDiff, lenbuf, GDIFF_APPDATALEN);
if ( nRead == GDIFF_APPDATALEN )
{
appdataSize = getlong(lenbuf);
if ( appdataSize > 0 )
{
buf = (uchar *)PR_MALLOC( appdataSize );
if ( buf != NULL )
{
nRead = PR_Read (dd->fDiff, buf, appdataSize);
if ( nRead == appdataSize )
{
if ( 0 == memcmp( buf, APPFLAG_W32BOUND, appdataSize ) )
dd->bWin32BoundImage = TRUE;
if ( 0 == memcmp( buf, APPFLAG_APPLESINGLE, appdataSize ) )
dd->bMacAppleSingle = TRUE;
}
else {
err = GDIFF_ERR_HEADER;
}
PR_DELETE( buf );
}
else {
err = GDIFF_ERR_MEM;
}
}
}
else {
err = GDIFF_ERR_HEADER;
}
}
}
return (err);
}
/*---------------------------------------------------------
* gdiff_validateFile()
*
* computes the checksum of the file and compares it to
* the value stored in the GDIFF header
*---------------------------------------------------------
*/
static
int32 gdiff_validateFile( pDIFFDATA dd, int file )
{
int32 result;
PRFileDesc* fh;
uchar* chksum;
/* which file are we dealing with? */
if ( file == SRCFILE ) {
fh = dd->fSrc;
chksum = dd->oldChecksum;
}
else { /* OUTFILE */
fh = dd->fOut;
chksum = dd->newChecksum;
}
/* make sure file's at beginning */
PR_Seek( fh, 0, PR_SEEK_SET );
/* calculate appropriate checksum */
switch (dd->checksumType)
{
case GDIFF_CS_NONE:
result = GDIFF_OK;
break;
case GDIFF_CS_CRC32:
if ( dd->checksumLength == CRC32_LEN )
result = gdiff_valCRC32( dd, fh, getlong(chksum) );
else
result = GDIFF_ERR_HEADER;
break;
case GDIFF_CS_MD5:
case GDIFF_CS_SHA:
default:
/* unsupported checksum type */
result = GDIFF_ERR_CHKSUMTYPE;
break;
}
/* reset file position to beginning and return status */
PR_Seek( fh, 0, PR_SEEK_SET );
return (result);
}
/*---------------------------------------------------------
* gdiff_valCRC32()
*
* computes the checksum of the file and compares it to
* the passed in checksum. Assumes file is positioned at
* beginning.
*---------------------------------------------------------
*/
static
int32 gdiff_valCRC32( pDIFFDATA dd, PRFileDesc* fh, uint32 chksum )
{
uint32 crc;
uint32 nRead;
crc = crc32(0L, Z_NULL, 0);
nRead = PR_Read (fh, dd->databuf, dd->bufsize);
while ( nRead > 0 )
{
crc = crc32( crc, dd->databuf, nRead );
nRead = PR_Read (fh, dd->databuf, dd->bufsize);
}
if ( crc == chksum )
return GDIFF_OK;
else
return GDIFF_ERR_CHECKSUM;
}
/*---------------------------------------------------------
* gdiff_ApplyPatch()
*
* Combines patch data with source file to produce the
* new target file. Assumes all three files have been
* opened, GDIFF header read, and all other setup complete
*
* The GDIFF patch is processed sequentially which random
* access is neccessary for the source file.
*---------------------------------------------------------
*/
static
int32 gdiff_ApplyPatch( pDIFFDATA dd )
{
int32 err;
XP_Bool done;
uint32 position;
uint32 count;
uchar opcode;
uchar cmdbuf[MAXCMDSIZE];
done = FALSE;
while ( !done ) {
err = gdiff_getdiff( dd, &opcode, OPSIZE );
if ( err != GDIFF_OK )
break;
switch (opcode)
{
case ENDDIFF:
done = TRUE;
break;
case ADD16:
err = gdiff_getdiff( dd, cmdbuf, ADD16SIZE );
if ( err == GDIFF_OK ) {
err = gdiff_add( dd, getshort( cmdbuf ) );
}
break;
case ADD32:
err = gdiff_getdiff( dd, cmdbuf, ADD32SIZE );
if ( err == GDIFF_OK ) {
err = gdiff_add( dd, getlong( cmdbuf ) );
}
break;
case COPY16BYTE:
err = gdiff_getdiff( dd, cmdbuf, COPY16BYTESIZE );
if ( err == GDIFF_OK ) {
position = getshort( cmdbuf );
count = *(cmdbuf + sizeof(short));
err = gdiff_copy( dd, position, count );
}
break;
case COPY16SHORT:
err = gdiff_getdiff( dd, cmdbuf, COPY16SHORTSIZE );
if ( err == GDIFF_OK ) {
position = getshort( cmdbuf );
count = getshort(cmdbuf + sizeof(short));
err = gdiff_copy( dd, position, count );
}
break;
case COPY16LONG:
err = gdiff_getdiff( dd, cmdbuf, COPY16LONGSIZE );
if ( err == GDIFF_OK ) {
position = getshort( cmdbuf );
count = getlong(cmdbuf + sizeof(short));
err = gdiff_copy( dd, position, count );
}
break;
case COPY32BYTE:
err = gdiff_getdiff( dd, cmdbuf, COPY32BYTESIZE );
if ( err == GDIFF_OK ) {
position = getlong( cmdbuf );
count = *(cmdbuf + sizeof(long));
err = gdiff_copy( dd, position, count );
}
break;
case COPY32SHORT:
err = gdiff_getdiff( dd, cmdbuf, COPY32SHORTSIZE );
if ( err == GDIFF_OK ) {
position = getlong( cmdbuf );
count = getshort(cmdbuf + sizeof(long));
err = gdiff_copy( dd, position, count );
}
break;
case COPY32LONG:
err = gdiff_getdiff( dd, cmdbuf, COPY32LONGSIZE );
if ( err == GDIFF_OK ) {
position = getlong( cmdbuf );
count = getlong(cmdbuf + sizeof(long));
err = gdiff_copy( dd, position, count );
}
break;
case COPY64:
/* we don't support 64-bit file positioning yet */
err = GDIFF_ERR_OPCODE;
break;
default:
err = gdiff_add( dd, opcode );
break;
}
if ( err != GDIFF_OK )
done = TRUE;
}
/* return status */
return (err);
}
/*---------------------------------------------------------
* gdiff_getdiff()
*
* reads the next "length" bytes of the diff into "buffer"
*
* XXX: need a diff buffer to optimize reads!
*---------------------------------------------------------
*/
static
int32 gdiff_getdiff( pDIFFDATA dd, uchar *buffer, uint32 length )
{
uint32 bytesRead;
bytesRead = PR_Read (dd->fDiff, buffer, length);
if ( bytesRead != length )
return GDIFF_ERR_BADDIFF;
return GDIFF_OK;
}
/*---------------------------------------------------------
* gdiff_add()
*
* append "count" bytes from diff file to new file
*---------------------------------------------------------
*/
static
int32 gdiff_add( pDIFFDATA dd, uint32 count )
{
int32 err = GDIFF_OK;
uint32 nRead;
uint32 chunksize;
while ( count > 0 ) {
chunksize = ( count > dd->bufsize) ? dd->bufsize : count;
nRead = PR_Read (dd->fDiff, dd->databuf, chunksize);
if ( nRead != chunksize ) {
err = GDIFF_ERR_BADDIFF;
break;
}
PR_Write (dd->fOut, dd->databuf, chunksize);
count -= chunksize;
}
return (err);
}
/*---------------------------------------------------------
* gdiff_copy()
*
* copy "count" bytes from "position" in source file
*---------------------------------------------------------
*/
static
int32 gdiff_copy( pDIFFDATA dd, uint32 position, uint32 count )
{
int32 err = GDIFF_OK;
uint32 nRead;
uint32 chunksize;
PR_Seek (dd->fSrc, position, PR_SEEK_SET);
while ( count > 0 ) {
chunksize = (count > dd->bufsize) ? dd->bufsize : count;
nRead = PR_Read (dd->fSrc, dd->databuf, chunksize);
if ( nRead != chunksize ) {
err = GDIFF_ERR_OLDFILE;
break;
}
PR_Write (dd->fOut, dd->databuf, chunksize);
count -= chunksize;
}
return (err);
}

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

@ -73,8 +73,6 @@ class nsInstallPatch : public nsInstallObject
PRInt32 NativePatch(const nsFileSpec &sourceFile, const nsFileSpec &patchfile, nsFileSpec **newFile);
PRInt32 NativeReplace (const nsFileSpec& target, nsFileSpec& tempFile);
PRInt32 NativeDeleteFile(nsFileSpec* doomedFile);
void* HashFilePath(const nsFilePath& aPath);
};

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

@ -123,9 +123,26 @@ nsInstallTrigger::UpdateEnabled(PRBool* aReturn)
}
NS_IMETHODIMP
nsInstallTrigger::StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRInt32* aReturn)
{
// fix: aFlags is not processed!
nsInstallInfo *nextInstall = new nsInstallInfo( aURL, "", "");
// start the download (this will clean itself up)
nsSoftwareUpdateListener *downloader = new nsSoftwareUpdateListener(nextInstall);
*aReturn = NS_OK; // maybe we should do something more.
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::StartSoftwareUpdate(const nsString& aURL, PRInt32* aReturn)
{
PRInt32 aFlags = 0;
// fix: aFlags is not processed!
nsInstallInfo *nextInstall = new nsInstallInfo( aURL, "", "");
// start the download (this will clean itself up)
@ -142,12 +159,54 @@ nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn)
{
return NS_OK;
}
NS_IMETHODIMP
nsInstallTrigger::CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn)
{
return NS_OK;
}
/////////////////////////////////////////////////////////////////////////
//
@ -249,4 +308,4 @@ nsInstallTriggerFactory::LockFactory(PRBool aLock)
PR_AtomicDecrement(&gInstallTriggerLock);
return NS_OK;
}
}

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

@ -28,9 +28,17 @@ class nsInstallTrigger: public nsIScriptObjectOwner, public nsIDOMInstallTrigger
NS_IMETHOD SetScriptObject(void* aScriptObject);
NS_IMETHOD UpdateEnabled(PRBool* aReturn);
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRInt32* aReturn);
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32* aReturn);
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn);
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn);
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn);
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn);
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn);
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
NS_IMETHOD CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn);
NS_IMETHOD CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn);
NS_IMETHOD CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
private:
@ -56,4 +64,4 @@ class nsInstallTriggerFactory : public nsIFactory
};
#endif
#endif

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

@ -42,8 +42,8 @@ class nsInstallVersion: public nsIScriptObjectOwner, public nsIDOMInstallVersion
NS_IMETHOD ToString(nsString& aReturn);
NS_IMETHOD CompareTo(nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
NS_IMETHOD CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn);
NS_IMETHOD CompareTo(const nsString& aString, PRInt32* aReturn);
NS_IMETHOD CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn);
static nsresult StringToVersionNumbers(const nsString& version, PRInt32 *aMajor, PRInt32 *aMinor, PRInt32 *aRelease, PRInt32 *aBuild);
@ -73,4 +73,4 @@ class nsInstallVersionFactory : public nsIFactory
};
#endif
#endif

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

@ -24,6 +24,8 @@
#include "nsString.h"
#include "nsInstall.h"
#include "nsIDOMInstallVersion.h"
//
// Install property ids
//
@ -142,6 +144,86 @@ SetInstallProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static void PR_CALLBACK FinalizeInstall(JSContext *cx, JSObject *obj)
{
nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
delete nativeThis;
}
void nsCvrtJSValToStr(nsString& aString,
JSContext* aContext,
jsval aValue)
{
JSString *jsstring;
if((jsstring = JS_ValueToString(aContext, aValue)) != nsnull)
{
aString.SetString(JS_GetStringChars(jsstring));
}
else
{
aString.Truncate();
}
}
void nsCvrtStrToJSVal(const nsString& aProp,
JSContext* aContext,
jsval* aReturn)
{
JSString *jsstring = JS_NewUCStringCopyN(aContext, aProp.GetUnicode(), aProp.Length());
// set the return value
*aReturn = STRING_TO_JSVAL(jsstring);
}
PRBool nsCvrtJSValToBool(PRBool* aProp,
JSContext* aContext,
jsval aValue)
{
JSBool temp;
if(JSVAL_IS_BOOLEAN(aValue) && JS_ValueToBoolean(aContext, aValue, &temp))
{
*aProp = (PRBool)temp;
}
else
{
JS_ReportError(aContext, "Parameter must be a boolean");
return JS_FALSE;
}
return JS_TRUE;
}
PRBool nsCvrtJSValToObj(nsISupports** aSupports,
REFNSIID aIID,
const nsString& aTypeName,
JSContext* aContext,
jsval aValue)
{
if (JSVAL_IS_NULL(aValue)) {
*aSupports = nsnull;
}
else if (JSVAL_IS_OBJECT(aValue)) {
JSObject* jsobj = JSVAL_TO_OBJECT(aValue);
JSClass* jsclass = JS_GetClass(aContext, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE)) {
nsISupports *supports = (nsISupports *)JS_GetPrivate(aContext, jsobj);
if (NS_OK != supports->QueryInterface(aIID, (void **)aSupports)) {
char buf[128];
char typeName[128];
aTypeName.ToCString(typeName, sizeof(typeName));
sprintf(buf, "Parameter must of type %s", typeName);
JS_ReportError(aContext, buf);
return JS_FALSE;
}
}
else {
JS_ReportError(aContext, "Parameter isn't a object");
return JS_FALSE;
}
}
else {
JS_ReportError(aContext, "Parameter must be an object");
return JS_FALSE;
}
return JS_TRUE;
}
@ -161,15 +243,19 @@ InstallAbortInstall(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
return JS_TRUE;
}
if (argc >= 0) {
if(argc >= 0)
{
// public int AbortInstall(void);
if (NS_OK != nativeThis->AbortInstall()) {
if(NS_OK != nativeThis->AbortInstall())
{
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
else
{
JS_ReportError(cx, "Function AbortInstall requires 0 parameters");
return JS_FALSE;
}
@ -201,30 +287,123 @@ InstallAddDirectory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
return JS_TRUE;
}
if (argc >= 6) {
if (argc == 1)
{
// public int AddDirectory (String jarSourcePath)
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b2, cx, argv[2]);
nsJSUtils::nsConvertJSValToString(b3, cx, argv[3]);
nsJSUtils::nsConvertJSValToString(b4, cx, argv[4]);
if (!nsJSUtils::nsConvertJSValToBool(&b5, cx, argv[5])) {
return JS_FALSE;
}
if (NS_OK != nativeThis->AddDirectory(b0, b1, b2, b3, b4, b5, &nativeRet)) {
nsCvrtJSValToStr(b0, cx, argv[0]);
if(NS_OK != nativeThis->AddDirectory(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
JS_ReportError(cx, "Function AddDirectory requires 6 parameters");
else if (argc == 4)
{
// public int AddDirectory ( String registryName,
// String jarSourcePath,
// String localDirSpec,
// String relativeLocalPath);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
if(NS_OK != nativeThis->AddDirectory(b0, b1, b2, b3, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else if (argc == 5)
{
// public int AddDirectory ( String registryName,
// String version, --OR-- VersionInfo version
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
nsCvrtJSValToStr(b4, cx, argv[4]);
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[1]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->AddDirectory(b0, version, b2, b3, b4, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->AddDirectory(b0, b1, b2, b3, b4, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else if (argc == 6)
{
// public int AddDirectory ( String registryName,
// String version, --OR-- VersionInfo version,
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath,
// Boolean forceUpdate);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
nsCvrtJSValToStr(b4, cx, argv[4]);
if(!nsCvrtJSValToBool(&b5, cx, argv[5]))
{
return JS_FALSE;
}
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[1]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->AddDirectory(b0, version, b2, b3, b4, b5, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->AddDirectory(b0, b1, b2, b3, b4, b5, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Install.AddDirectory() parameters error");
return JS_FALSE;
}
@ -255,29 +434,122 @@ InstallAddSubcomponent(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
return JS_TRUE;
}
if (argc >= 6) {
if(argc >= 6)
{
// public int AddSubcomponent ( String registryName,
// String version, --OR-- VersionInfo version,
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath,
// Boolean forceUpdate);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
nsCvrtJSValToStr(b4, cx, argv[4]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b2, cx, argv[2]);
nsJSUtils::nsConvertJSValToString(b3, cx, argv[3]);
nsJSUtils::nsConvertJSValToString(b4, cx, argv[4]);
if (!nsJSUtils::nsConvertJSValToBool(&b5, cx, argv[5])) {
if(!nsCvrtJSValToBool(&b5, cx, argv[5]))
{
return JS_FALSE;
}
if (NS_OK != nativeThis->AddSubcomponent(b0, b1, b2, b3, b4, b5, &nativeRet)) {
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[1]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->AddSubcomponent(b0, version, b2, b3, b4, b5, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->AddSubcomponent(b0, b1, b2, b3, b4, b5, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else if(argc >= 5)
{
// public int AddSubcomponent ( String registryName,
// String version, --OR-- VersionInfo version
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
nsCvrtJSValToStr(b4, cx, argv[4]);
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[1]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->AddSubcomponent(b0, version, b2, b3, b4, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->AddSubcomponent(b0, b1, b2, b3, b4, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else if(argc >= 4)
{
// public int AddSubcomponent ( String registryName,
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
if(NS_OK != nativeThis->AddSubcomponent(b0, b1, b2, b3, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else if(argc >= 1)
{
// public int AddSubcomponent ( String jarSourcePath);
nsCvrtJSValToStr(b0, cx, argv[0]);
if(NS_OK != nativeThis->AddSubcomponent(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function AddSubcomponent requires 6 parameters");
return JS_FALSE;
}
@ -304,17 +576,21 @@ InstallDeleteComponent(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
return JS_TRUE;
}
if (argc >= 1) {
if(argc >= 1)
{
// public int DeleteComponent ( String registryName);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
if (NS_OK != nativeThis->DeleteComponent(b0, &nativeRet)) {
if(NS_OK != nativeThis->DeleteComponent(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function DeleteComponent requires 1 parameters");
return JS_FALSE;
}
@ -342,19 +618,23 @@ InstallDeleteFile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
return JS_TRUE;
}
if (argc >= 2) {
if(argc >= 2)
{
// public int DeleteFile ( Object folder,
// String relativeFileName);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if (NS_OK != nativeThis->DeleteFile(b0, b1, &nativeRet)) {
if(NS_OK != nativeThis->DeleteFile(b0, b1, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function DeleteFile requires 2 parameters");
return JS_FALSE;
}
@ -381,17 +661,21 @@ InstallDiskSpaceAvailable(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
return JS_TRUE;
}
if (argc >= 1) {
if(argc >= 1)
{
// public int DiskSpaceAvailable ( Object localDirSpec);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
if (NS_OK != nativeThis->DiskSpaceAvailable(b0, &nativeRet)) {
if(NS_OK != nativeThis->DiskSpaceAvailable(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function DiskSpaceAvailable requires 1 parameters");
return JS_FALSE;
}
@ -419,19 +703,36 @@ InstallExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
return JS_TRUE;
}
if (argc >= 2) {
if(argc >= 2)
{
// public int Execute ( String jarSourcePath,
// String args);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if (NS_OK != nativeThis->Execute(b0, b1, &nativeRet)) {
if(NS_OK != nativeThis->Execute(b0, b1, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else if(argc >= 1)
{
// public int Execute ( String jarSourcePath);
nsCvrtJSValToStr(b0, cx, argv[0]);
if(NS_OK != nativeThis->Execute(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function Execute requires 2 parameters");
return JS_FALSE;
}
@ -457,15 +758,19 @@ InstallFinalizeInstall(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
return JS_TRUE;
}
if (argc >= 0) {
if(argc >= 0)
{
// public int FinalizeInstall (void);
if (NS_OK != nativeThis->FinalizeInstall(&nativeRet)) {
if(NS_OK != nativeThis->FinalizeInstall(&nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function FinalizeInstall requires 0 parameters");
return JS_FALSE;
}
@ -492,17 +797,22 @@ InstallGestalt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
return JS_TRUE;
}
if (argc >= 1) {
if(argc >= 1)
{
// public int Gestalt ( String selector,
// long *response);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
if (NS_OK != nativeThis->Gestalt(b0, &nativeRet)) {
if(NS_OK != nativeThis->Gestalt(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function Gestalt requires 1 parameters");
return JS_FALSE;
}
@ -530,19 +840,36 @@ InstallGetComponentFolder(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
return JS_TRUE;
}
if (argc >= 2) {
if(argc >= 2)
{
// public int GetComponentFolder ( String registryName,
// String subDirectory);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if (NS_OK != nativeThis->GetComponentFolder(b0, b1, &nativeRet)) {
if(NS_OK != nativeThis->GetComponentFolder(b0, b1, &nativeRet))
{
return JS_FALSE;
}
nsJSUtils::nsConvertStringToJSVal(*nativeRet, cx, rval);
nsCvrtStrToJSVal(*nativeRet, cx, rval);
}
else {
else if(argc >= 1)
{
// public int GetComponentFolder ( String registryName);
nsCvrtJSValToStr(b0, cx, argv[0]);
if(NS_OK != nativeThis->GetComponentFolder(b0, &nativeRet))
{
return JS_FALSE;
}
nsCvrtStrToJSVal(*nativeRet, cx, rval);
}
else
{
JS_ReportError(cx, "Function GetComponentFolder requires 2 parameters");
return JS_FALSE;
}
@ -570,19 +897,36 @@ InstallGetFolder(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
return JS_TRUE;
}
if (argc >= 2) {
if(argc >= 2)
{
// public int GetFolder ( String folderName, --OR-- Object localDirSpec,
// String subDirectory);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if (NS_OK != nativeThis->GetFolder(b0, b1, &nativeRet)) {
if(NS_OK != nativeThis->GetFolder(b0, b1, &nativeRet))
{
return JS_FALSE;
}
nsJSUtils::nsConvertStringToJSVal(*nativeRet, cx, rval);
nsCvrtStrToJSVal(*nativeRet, cx, rval);
}
else {
else if(argc >= 1)
{
// public int GetFolder ( String folderName);
nsCvrtJSValToStr(b0, cx, argv[0]);
if(NS_OK != nativeThis->GetFolder(b0, &nativeRet))
{
return JS_FALSE;
}
nsCvrtStrToJSVal(*nativeRet, cx, rval);
}
else
{
JS_ReportError(cx, "Function GetFolder requires 2 parameters");
return JS_FALSE;
}
@ -601,6 +945,7 @@ InstallGetLastError(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
JSBool rBool = JS_FALSE;
PRInt32 nativeRet;
*rval = JSVAL_NULL;
// If there's no private data, this must be the prototype, so ignore
@ -608,15 +953,19 @@ InstallGetLastError(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
return JS_TRUE;
}
if (argc >= 0) {
if(argc >= 0)
{
// public int GetLastError (void);
if (NS_OK != nativeThis->GetLastError(&nativeRet)) {
if(NS_OK != nativeThis->GetLastError(&nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function GetLastError requires 0 parameters");
return JS_FALSE;
}
@ -644,19 +993,23 @@ InstallGetWinProfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsva
return JS_TRUE;
}
if (argc >= 2) {
if(argc >= 2)
{
// public int GetWinProfile (Object folder,
// String file);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if (NS_OK != nativeThis->GetWinProfile(b0, b1, &nativeRet)) {
if(NS_OK != nativeThis->GetWinProfile(b0, b1, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function GetWinProfile requires 2 parameters");
return JS_FALSE;
}
@ -682,15 +1035,19 @@ InstallGetWinRegistry(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsv
return JS_TRUE;
}
if (argc >= 0) {
if(argc >= 0)
{
// public int GetWinRegistry (void);
if (NS_OK != nativeThis->GetWinRegistry(&nativeRet)) {
if(NS_OK != nativeThis->GetWinRegistry(&nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function GetWinRegistry requires 0 parameters");
return JS_FALSE;
}
@ -721,25 +1078,65 @@ InstallPatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
return JS_TRUE;
}
if (argc >= 5) {
if(argc >= 5)
{
// public int Patch (String registryName,
// String version, --OR-- VersionInfo version,
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
nsCvrtJSValToStr(b4, cx, argv[4]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[1]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
nsJSUtils::nsConvertJSValToString(b2, cx, argv[2]);
if(NS_OK != nativeThis->Patch(b0, version, b2, b3, b4, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->Patch(b0, b1, b2, b3, b4, &nativeRet))
{
return JS_FALSE;
}
}
nsJSUtils::nsConvertJSValToString(b3, cx, argv[3]);
*rval = INT_TO_JSVAL(nativeRet);
}
else if(argc >= 4)
{
// public int Patch (String registryName,
// String jarSourcePath,
// Object localDirSpec,
// String relativeLocalPath);
nsJSUtils::nsConvertJSValToString(b4, cx, argv[4]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsCvrtJSValToStr(b2, cx, argv[2]);
nsCvrtJSValToStr(b3, cx, argv[3]);
if (NS_OK != nativeThis->Patch(b0, b1, b2, b3, b4, &nativeRet)) {
if(NS_OK != nativeThis->Patch(b0, b1, b2, b3, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function Patch requires 5 parameters");
return JS_FALSE;
}
@ -764,15 +1161,19 @@ InstallResetError(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
return JS_TRUE;
}
if (argc >= 0) {
if(argc >= 0)
{
// public int ResetError (void);
if (NS_OK != nativeThis->ResetError()) {
if(NS_OK != nativeThis->ResetError())
{
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
else
{
JS_ReportError(cx, "Function ResetError requires 0 parameters");
return JS_FALSE;
}
@ -798,17 +1199,21 @@ InstallSetPackageFolder(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, j
return JS_TRUE;
}
if (argc >= 1) {
if(argc >= 1)
{
// public int SetPackageFolder (Object folder);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
if (NS_OK != nativeThis->SetPackageFolder(b0)) {
if(NS_OK != nativeThis->SetPackageFolder(b0))
{
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
else
{
JS_ReportError(cx, "Function SetPackageFolder requires 1 parameters");
return JS_FALSE;
}
@ -816,7 +1221,6 @@ InstallSetPackageFolder(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, j
return JS_TRUE;
}
//
// Native method StartInstall
//
@ -838,26 +1242,83 @@ InstallStartInstall(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
return JS_TRUE;
}
if (argc >= 4) {
if(argc >= 4)
{
// public int StartInstall (String userPackageName,
// String package,
// String version, --OR-- VersionInfo version,
// int flags);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b2, cx, argv[2]);
if (!JS_ValueToInt32(cx, argv[3], (int32 *)&b3)) {
if(!JS_ValueToInt32(cx, argv[3], (int32 *)&b3))
{
JS_ReportError(cx, "Parameter must be a number");
return JS_FALSE;
}
if (NS_OK != nativeThis->StartInstall(b0, b1, b2, b3, &nativeRet)) {
return JS_FALSE;
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[2]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->StartInstall(b0, b1, version, b3, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->StartInstall(b0, b1, b2, b3, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else if(argc >= 3)
{
// public int StartInstall (String userPackageName,
// String package,
// String version); --OR-- VersionInfo version
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[2]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if ((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->StartInstall(b0, b1, version, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1, cx, argv[1]);
if(NS_OK != nativeThis->StartInstall(b0, b1, b2, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function StartInstall requires 4 parameters");
return JS_FALSE;
}
@ -884,17 +1345,21 @@ InstallUninstall(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
return JS_TRUE;
}
if (argc >= 1) {
if(argc >= 1)
{
// public int Uninstall (String packageName);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
if (NS_OK != nativeThis->Uninstall(b0, &nativeRet)) {
if(NS_OK != nativeThis->Uninstall(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else
{
JS_ReportError(cx, "Function Uninstall requires 1 parameters");
return JS_FALSE;
}

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

@ -26,8 +26,26 @@
#include "nsIScriptGlobalObject.h"
#include "nsIPtr.h"
#include "nsString.h"
#include "nsIDOMInstallVersion.h"
#include "nsIDOMInstallTriggerGlobal.h"
extern void nsCvrtJSValToStr(nsString& aString,
JSContext* aContext,
jsval aValue);
extern void nsCvrtStrToJSVal(const nsString& aProp,
JSContext* aContext,
jsval* aReturn);
extern PRBool nsCvrtJSValToBool(PRBool* aProp,
JSContext* aContext,
jsval aValue);
extern PRBool nsCvrtJSValToObj(nsISupports** aSupports,
REFNSIID aIID,
const nsString& aTypeName,
JSContext* aContext,
jsval aValue);
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
static NS_DEFINE_IID(kIJSScriptObjectIID, NS_IJSSCRIPTOBJECT_IID);
@ -123,7 +141,6 @@ ResolveInstallTriggerGlobal(JSContext *cx, JSObject *obj, jsval id)
return nsJSUtils::nsGenericResolve(cx, obj, id);
}
//
// Native method UpdateEnabled
//
@ -165,9 +182,10 @@ PR_STATIC_CALLBACK(JSBool)
InstallTriggerGlobalStartSoftwareUpdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*)JS_GetPrivate(cx, obj);
JSBool rBool = JS_FALSE;
PRInt32 nativeRet;
JSBool rBool = JS_FALSE;
PRInt32 nativeRet;
nsAutoString b0;
PRInt32 b1;
*rval = JSVAL_NULL;
@ -176,18 +194,42 @@ InstallTriggerGlobalStartSoftwareUpdate(JSContext *cx, JSObject *obj, uintN argc
return JS_TRUE;
}
if (argc >= 1) {
if (argc >= 2)
{
// public int StartSoftwareUpdate(String url,
// int flag);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
if (NS_OK != nativeThis->StartSoftwareUpdate(b0, &nativeRet)) {
if(!JS_ValueToInt32(cx, argv[1], (int32 *)&b1))
{
JS_ReportError(cx, "2nd parameter must be a number");
return JS_FALSE;
}
if(NS_OK != nativeThis->StartSoftwareUpdate(b0, b1, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
JS_ReportError(cx, "Function StartSoftwareUpdate requires 1 parameters");
else if(argc >= 1)
{
// public int StartSoftwareUpdate(String url);
nsCvrtJSValToStr(b0, cx, argv[0]);
if(NS_OK != nativeThis->StartSoftwareUpdate(b0, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function StartSoftwareUpdate requires 2 parameters");
return JS_FALSE;
}
@ -206,9 +248,11 @@ InstallTriggerGlobalConditionalSoftwareUpdate(JSContext *cx, JSObject *obj, uint
PRInt32 nativeRet;
nsAutoString b0;
nsAutoString b1;
PRInt32 b2;
nsAutoString b3;
PRInt32 b4;
nsAutoString b2str;
PRInt32 b2int;
nsAutoString b3str;
PRInt32 b3int;
PRInt32 b4;
*rval = JSVAL_NULL;
@ -217,31 +261,131 @@ InstallTriggerGlobalConditionalSoftwareUpdate(JSContext *cx, JSObject *obj, uint
return JS_TRUE;
}
if (argc >= 5) {
if(argc >= 5)
{
// public int ConditionalSoftwareUpdate(String url,
// String registryName,
// int diffLevel,
// String version, --OR-- VersionInfo version
// int mode);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if (!JS_ValueToInt32(cx, argv[2], (int32 *)&b2)) {
JS_ReportError(cx, "Parameter must be a number");
if(!JS_ValueToInt32(cx, argv[2], (int32 *)&b2int))
{
JS_ReportError(cx, "3rd parameter must be a number");
return JS_FALSE;
}
nsJSUtils::nsConvertJSValToString(b3, cx, argv[3]);
if (!JS_ValueToInt32(cx, argv[4], (int32 *)&b4)) {
JS_ReportError(cx, "Parameter must be a number");
if(!JS_ValueToInt32(cx, argv[4], (int32 *)&b4))
{
JS_ReportError(cx, "5th parameter must be a number");
return JS_FALSE;
}
if (NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, b2, b3, b4, &nativeRet)) {
return JS_FALSE;
if(JSVAL_IS_OBJECT(argv[3]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[3]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, b2int, version, b4, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b3str, cx, argv[3]);
if(NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, b2int, b3str, b4, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
else if(argc >= 4)
{
// public int ConditionalSoftwareUpdate(String url,
// String registryName,
// String version, --OR-- VersionInfo version
// int mode);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
if(!JS_ValueToInt32(cx, argv[3], (int32 *)&b3int))
{
JS_ReportError(cx, "4th parameter must be a number");
return JS_FALSE;
}
if(JSVAL_IS_OBJECT(argv[2]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[2]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, version, b3int, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b2str, cx, argv[2]);
if(NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, b2str, b3int, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else if(argc >= 3)
{
// public int ConditionalSoftwareUpdate(String url,
// String registryName,
// String version); --OR-- VersionInfo version
nsCvrtJSValToStr(b0, cx, argv[0]);
nsCvrtJSValToStr(b1, cx, argv[1]);
if(JSVAL_IS_OBJECT(argv[2]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[2]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, version, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b2str, cx, argv[2]);
if(NS_OK != nativeThis->ConditionalSoftwareUpdate(b0, b1, b2str, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function ConditionalSoftwareUpdate requires 5 parameters");
return JS_FALSE;
}
@ -260,7 +404,11 @@ InstallTriggerGlobalCompareVersion(JSContext *cx, JSObject *obj, uintN argc, jsv
JSBool rBool = JS_FALSE;
PRInt32 nativeRet;
nsAutoString b0;
nsAutoString b1;
nsAutoString b1str;
PRInt32 b1int;
PRInt32 b2int;
PRInt32 b3int;
PRInt32 b4int;
*rval = JSVAL_NULL;
@ -269,20 +417,79 @@ InstallTriggerGlobalCompareVersion(JSContext *cx, JSObject *obj, uintN argc, jsv
return JS_TRUE;
}
if (argc >= 2) {
if(argc >= 5)
{
// public int CompareVersion(String registryName,
// int major,
// int minor,
// int release,
// int build);
nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]);
nsCvrtJSValToStr(b0, cx, argv[0]);
nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]);
if(!JS_ValueToInt32(cx, argv[1], (int32 *)&b1int))
{
JS_ReportError(cx, "2th parameter must be a number");
return JS_FALSE;
}
if(!JS_ValueToInt32(cx, argv[2], (int32 *)&b2int))
{
JS_ReportError(cx, "3th parameter must be a number");
return JS_FALSE;
}
if(!JS_ValueToInt32(cx, argv[3], (int32 *)&b3int))
{
JS_ReportError(cx, "4th parameter must be a number");
return JS_FALSE;
}
if(!JS_ValueToInt32(cx, argv[4], (int32 *)&b4int))
{
JS_ReportError(cx, "5th parameter must be a number");
return JS_FALSE;
}
if (NS_OK != nativeThis->CompareVersion(b0, b1, &nativeRet)) {
if(NS_OK != nativeThis->CompareVersion(b0, b1int, b2int, b3int, b4int, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
JS_ReportError(cx, "Function CompareVersion requires 2 parameters");
else if(argc >= 2)
{
// public int CompareVersion(String registryName,
// String version); --OR-- VersionInfo version
nsCvrtJSValToStr(b0, cx, argv[0]);
if(JSVAL_IS_OBJECT(argv[1]))
{
JSObject* jsobj = JSVAL_TO_OBJECT(argv[1]);
JSClass* jsclass = JS_GetClass(cx, jsobj);
if((nsnull != jsclass) && (jsclass->flags & JSCLASS_HAS_PRIVATE))
{
nsIDOMInstallVersion* version = (nsIDOMInstallVersion*)JS_GetPrivate(cx, jsobj);
if(NS_OK != nativeThis->CompareVersion(b0, version, &nativeRet))
{
return JS_FALSE;
}
}
}
else
{
nsCvrtJSValToStr(b1str, cx, argv[1]);
if(NS_OK != nativeThis->CompareVersion(b0, b1str, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function CompareVersion requires 5 parameters");
return JS_FALSE;
}
@ -323,9 +530,9 @@ static JSPropertySpec InstallTriggerGlobalProperties[] =
static JSFunctionSpec InstallTriggerGlobalMethods[] =
{
{"UpdateEnabled", InstallTriggerGlobalUpdateEnabled, 0},
{"StartSoftwareUpdate", InstallTriggerGlobalStartSoftwareUpdate, 1},
{"StartSoftwareUpdate", InstallTriggerGlobalStartSoftwareUpdate, 2},
{"ConditionalSoftwareUpdate", InstallTriggerGlobalConditionalSoftwareUpdate, 5},
{"CompareVersion", InstallTriggerGlobalCompareVersion, 2},
{"CompareVersion", InstallTriggerGlobalCompareVersion, 5},
{0}
};

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

@ -31,6 +31,24 @@
#include "nsRepository.h"
#include "nsDOMCID.h"
extern void nsCvrtJSValToStr(nsString& aString,
JSContext* aContext,
jsval aValue);
extern void nsCvrtStrToJSVal(const nsString& aProp,
JSContext* aContext,
jsval* aReturn);
extern PRBool nsCvrtJSValToBool(PRBool* aProp,
JSContext* aContext,
jsval aValue);
extern PRBool nsCvrtJSValToObj(nsISupports** aSupports,
REFNSIID aIID,
const nsString& aTypeName,
JSContext* aContext,
jsval aValue);
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
static NS_DEFINE_IID(kIJSScriptObjectIID, NS_IJSSCRIPTOBJECT_IID);
@ -319,9 +337,14 @@ PR_STATIC_CALLBACK(JSBool)
InstallVersionCompareTo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMInstallVersion *nativeThis = (nsIDOMInstallVersion*)JS_GetPrivate(cx, obj);
JSBool rBool = JS_FALSE;
PRInt32 nativeRet;
nsIDOMInstallVersionPtr b0;
JSBool rBool = JS_FALSE;
PRInt32 nativeRet;
nsString b0str;
PRInt32 b0int;
PRInt32 b1int;
PRInt32 b2int;
PRInt32 b3int;
nsIDOMInstallVersionPtr versionObj;
*rval = JSVAL_NULL;
@ -330,24 +353,81 @@ InstallVersionCompareTo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, j
return JS_TRUE;
}
if (argc >= 1) {
if(argc >= 4)
{
// public int CompareTo(int major,
// int minor,
// int release,
// int build);
if (JS_FALSE == nsJSUtils::nsConvertJSValToObject((nsISupports **)&b0,
kIInstallVersionIID,
"InstallVersion",
cx,
argv[0])) {
return JS_FALSE;
if(!JSVAL_IS_INT(argv[0]))
{
JS_ReportError(cx, "1st parameter must be a number");
return JS_FALSE;
}
else if(!JSVAL_IS_INT(argv[1]))
{
JS_ReportError(cx, "2nd parameter must be a number");
return JS_FALSE;
}
else if(!JSVAL_IS_INT(argv[2]))
{
JS_ReportError(cx, "3rd parameter must be a number");
return JS_FALSE;
}
else if(!JSVAL_IS_INT(argv[3]))
{
JS_ReportError(cx, "4th parameter must be a number");
return JS_FALSE;
}
if (NS_OK != nativeThis->CompareTo(b0, &nativeRet)) {
b0int = JSVAL_TO_INT(argv[0]);
b1int = JSVAL_TO_INT(argv[1]);
b2int = JSVAL_TO_INT(argv[2]);
b3int = JSVAL_TO_INT(argv[3]);
if(NS_OK != nativeThis->CompareTo(b0int, b1int, b2int, b3int, &nativeRet))
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL(nativeRet);
}
else {
JS_ReportError(cx, "Function compareTo requires 1 parameters");
else if(argc >= 1)
{
// public int AddDirectory(String version); --OR-- VersionInfo version
if(JSVAL_IS_OBJECT(argv[0]))
{
if(JS_FALSE == nsCvrtJSValToObj((nsISupports **)&versionObj,
kIInstallVersionIID,
"InstallVersion",
cx,
argv[0]))
{
return JS_FALSE;
}
if(NS_OK != nativeThis->CompareTo(versionObj, &nativeRet))
{
return JS_FALSE;
}
}
else
{
nsCvrtJSValToStr(b0str, cx, argv[0]);
if(NS_OK != nativeThis->CompareTo(b0str, &nativeRet))
{
return JS_FALSE;
}
}
*rval = INT_TO_JSVAL(nativeRet);
}
else
{
JS_ReportError(cx, "Function compareTo requires 4 parameters");
return JS_FALSE;
}

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

@ -21,10 +21,11 @@
#include "nscore.h"
#include "nsIFactory.h"
#include "nsISupports.h"
#include "nsRepository.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsCOMPtr.h"
#include "pratom.h"
#include "nspr.h"
#include "nsVector.h"
#include "VerReg.h"
#include "nsSpecialSystemDirectory.h"
@ -32,7 +33,6 @@
#include "nsInstall.h"
#include "nsSoftwareUpdateIIDs.h"
#include "nsSoftwareUpdate.h"
#include "nsSoftwareUpdateStream.h"
#include "nsSoftwareUpdateRun.h"
#include "nsInstallTrigger.h"
#include "nsInstallVersion.h"
@ -55,6 +55,8 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID);
static NS_DEFINE_IID(kIScriptNameSetRegistryIID, NS_ISCRIPTNAMESETREGISTRY_IID);
static NS_DEFINE_IID(kCScriptNameSetRegistryCID, NS_SCRIPT_NAMESET_REGISTRY_CID);
static NS_DEFINE_IID(kIScriptExternalNameSetIID, NS_ISCRIPTEXTERNALNAMESET_IID);
@ -124,7 +126,7 @@ nsSoftwareUpdate::Startup()
/***************************************/
nsSpecialSystemDirectory appDir(nsSpecialSystemDirectory::OS_CurrentProcessDirectory);
VR_SetRegDirectory(appDir.GetCString());
VR_SetRegDirectory( nsprPath(appDir) );
NR_StartupRegistry(); /* startup the registry; if already started, this will essentially be a noop */
@ -132,21 +134,28 @@ nsSoftwareUpdate::Startup()
/* Stupid Hack to test js env*/
/***************************************/
// FIX: HACK HACK HACK!
#if 1
#if 0
nsSpecialSystemDirectory jarFile(nsSpecialSystemDirectory::OS_TemporaryDirectory);
jarFile += "test.jar";
if (jarFile.Exists())
{
InstallJar(nsString(nsFileURL(jarFile).GetAsString()), "", "");
InstallJar(nsString(nsFileURL(jarFile)), "", "");
}
#endif
/***************************************/
/* Preform Scheduled Tasks */
/* Perform Scheduled Tasks */
/***************************************/
DeleteScheduledFiles();
ReplaceScheduledFiles();
#if 1
PR_CreateThread(PR_USER_THREAD,
PerformScheduledTasks,
nsnull,
PR_PRIORITY_NORMAL,
PR_GLOBAL_THREAD,
PR_UNJOINABLE_THREAD,
0);
#endif
// PerformScheduledTasks(nsnull);
return NS_OK;
}
@ -373,33 +382,67 @@ nsSoftwareUpdateNameSet::AddNameSet(nsIScriptContext* aScriptContext)
////////////////////////////////////////////////////////////////////////////////
extern "C" NS_EXPORT PRBool
NSCanUnload(nsISupports* serviceMgr)
NSCanUnload(nsISupports* aServMgr)
{
return PR_FALSE;
}
extern "C" NS_EXPORT nsresult
NSRegisterSelf(nsISupports* serviceMgr, const char *path)
NSRegisterSelf(nsISupports* aServMgr, const char *path)
{
printf("*** XPInstall is being registered\n");
nsRepository::RegisterComponent(kSoftwareUpdate_CID, NULL, NULL, path, PR_TRUE, PR_TRUE);
nsRepository::RegisterComponent(kInstallTrigger_CID, NULL, NULL, path, PR_TRUE, PR_TRUE);
nsRepository::RegisterComponent(kInstallVersion_CID, NULL, NULL, path, PR_TRUE, PR_TRUE);
nsresult rv;
return NS_OK;
nsCOMPtr<nsIServiceManager> servMgr(do_QueryInterface(aServMgr, &rv));
if (NS_FAILED(rv)) return rv;
nsIComponentManager* compMgr;
rv = servMgr->GetService(kComponentManagerCID,
nsIComponentManager::GetIID(),
(nsISupports**)&compMgr);
if (NS_FAILED(rv)) return rv;
#ifdef NS_DEBUG
printf("*** XPInstall is being registered\n");
#endif
rv = compMgr->RegisterComponent(kSoftwareUpdate_CID, NULL, NULL, path, PR_TRUE, PR_TRUE);
if (NS_FAILED(rv)) goto done;
rv = compMgr->RegisterComponent(kInstallTrigger_CID, NULL, NULL, path, PR_TRUE, PR_TRUE);
if (NS_FAILED(rv)) goto done;
rv = compMgr->RegisterComponent(kInstallVersion_CID, NULL, NULL, path, PR_TRUE, PR_TRUE);
done:
(void)servMgr->ReleaseService(kComponentManagerCID, compMgr);
return rv;
}
extern "C" NS_EXPORT nsresult
NSUnregisterSelf(nsISupports* serviceMgr, const char *path)
NSUnregisterSelf(nsISupports* aServMgr, const char *path)
{
nsresult rv;
nsCOMPtr<nsIServiceManager> servMgr(do_QueryInterface(aServMgr, &rv));
if (NS_FAILED(rv)) return rv;
nsIComponentManager* compMgr;
rv = servMgr->GetService(kComponentManagerCID,
nsIComponentManager::GetIID(),
(nsISupports**)&compMgr);
if (NS_FAILED(rv)) return rv;
#ifdef NS_DEBUG
printf("*** XPInstall is being unregistered\n");
#endif
rv = compMgr->UnregisterComponent(kSoftwareUpdate_CID, path);
if (NS_FAILED(rv)) goto done;
rv = compMgr->UnregisterComponent(kInstallTrigger_CID, path);
if (NS_FAILED(rv)) goto done;
rv = compMgr->UnregisterComponent(kInstallVersion_CID, path);
nsRepository::UnregisterComponent(kSoftwareUpdate_CID, path);
nsRepository::UnregisterComponent(kInstallTrigger_CID, path);
nsRepository::UnregisterComponent(kInstallVersion_CID, path);
return NS_OK;
done:
(void)servMgr->ReleaseService(kComponentManagerCID, compMgr);
return rv;
}

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

@ -1,22 +1,66 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (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 Communicator client code,
* released March 31, 1998.
*
* 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.
*
* Contributors:
* Daniel Veditz <dveditz@netscape.com>
* Douglas Turner <dougt@netscape.com>
*/
#include "nsSoftwareUpdate.h"
#include "nsSoftwareUpdateRun.h"
#include "nsSoftwareUpdateIIDs.h"
#include "nsInstall.h"
#include "zipfile.h"
#include "nsRepository.h"
#include "nsIServiceManager.h"
#include "nsSpecialSystemDirectory.h"
#include "nsFileStream.h"
#include "nspr.h"
#include "jsapi.h"
#include "nsISoftwareUpdate.h"
#include "nsSoftwareUpdateIIDs.h"
#if 0
#include "nsIEventQueueService.h"
#include "nsXPComCIID.h"
#include "nsIURL.h"
#include "nsAppShellProxy.h"
static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID);
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
static NS_DEFINE_IID(kIAppShellServiceIID, NS_IAPPSHELL_SERVICE_IID);
static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID);
#endif
static NS_DEFINE_IID(kISoftwareUpdateIID, NS_ISOFTWAREUPDATE_IID);
static NS_DEFINE_IID(kSoftwareUpdateCID, NS_SoftwareUpdate_CID);
static JSClass global_class =
{
"global", JSCLASS_HAS_PRIVATE,
@ -24,6 +68,7 @@ static JSClass global_class =
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
};
extern PRInt32 InitXPInstallObjects(JSContext *jscontext, JSObject *global, const char* jarfile, const char* args);
// Defined in this file:
@ -119,7 +164,7 @@ GetInstallScriptFromJarfile(const char* jarFile, char** scriptBuffer, PRUint32 *
installJSFileSpec.MakeUnique();
// Extract the install.js file.
rv = ZIP_ExtractFile( hZip, "install.js", installJSFileSpec.GetCString() );
rv = ZIP_ExtractFile( hZip, "install.js", nsprPath(installJSFileSpec) );
if (rv != ZIP_OK)
{
ZIP_CloseArchive(&hZip);
@ -146,8 +191,9 @@ GetInstallScriptFromJarfile(const char* jarFile, char** scriptBuffer, PRUint32 *
{
delete [] buffer;
}
ZIP_CloseArchive(&hZip);
fileStream.close();
installJSFileSpec.Delete(PR_FALSE);
return rv;
@ -223,6 +269,24 @@ static nsresult SetupInstallContext(const char* jarFile,
///////////////////////////////////////////////////////////////////////////////////////////////
PRInt32 RunInstall(nsInstallInfo *installInfo)
{
#if 0
// We are one the UI Thread. Get and save the eventQueue.
// Create the Event Queue for the UI thread...
nsIEventQueueService* eventQService;
nsresult rv = nsServiceManager::GetService(kEventQueueServiceCID,
kIEventQueueServiceIID,
(nsISupports **)&eventQService);
PLEventQueue* thisEventQueue;
if (NS_OK == rv)
{
rv = eventQService->GetThreadEventQueue(PR_GetCurrentThread(),
&thisEventQueue);
}
installInfo->SetUIEventQueue(thisEventQueue);
#endif
PR_CreateThread(PR_USER_THREAD,
RunInstallOnThread,
(void*)installInfo,
@ -245,20 +309,62 @@ PRInt32 RunInstall(nsInstallInfo *installInfo)
extern "C" void RunInstallOnThread(void *data)
{
nsInstallInfo *installInfo = (nsInstallInfo*)data;
nsresult rv;
#if 0
/*
* Create the Application Shell instance...
*/
nsIAppShellService* appShell;
rv = nsServiceManager::GetService(kAppShellServiceCID,
kIAppShellServiceIID,
(nsISupports**)&appShell);
if (NS_FAILED(rv))
{
return;
}
nsAppShellProxy *appShellProxy = new nsAppShellProxy(installInfo->GetUIEventQueue(), appShell);
// DO NOT CALL INIT! appShellProxy->Initialize();
nsString *aCID = new nsString("00000000-dead-beef-0000-000000000000");
nsIWebShellWindow* newWindow;
nsIURL* url;
char* urlstr = "resource:/res/samples/xpinstallprogress.xul";
NS_NewURL(&url, urlstr);
appShellProxy->CreateDialogWindow(nsnull,
url,
*aCID,
newWindow,
nsnull,
nsnull,
250,
125);
#endif
RunInstall( (const char*) nsAutoCString( installInfo->GetLocalFile() ),
(const char*) nsAutoCString( installInfo->GetFlags() ),
(const char*) nsAutoCString( installInfo->GetArguments() ),
(const char*) nsAutoCString( installInfo->GetFromURL() ));
#if 0
appShellProxy->CloseTopLevelWindow(newWindow);
nsServiceManager::ReleaseService(kAppShellServiceCID, appShell);
// After Install, we need to update the queue.
#endif
nsISoftwareUpdate *softwareUpdate;
nsresult rv = nsComponentManager::CreateInstance( kSoftwareUpdateCID,
nsnull,
kISoftwareUpdateIID,
(void**) &softwareUpdate);
rv = nsComponentManager::CreateInstance( kSoftwareUpdateCID,
nsnull,
kISoftwareUpdateIID,
(void**) &softwareUpdate);
if (NS_FAILED(rv))
{

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

@ -44,7 +44,7 @@ nsSoftwareUpdateListener::nsSoftwareUpdateListener(nsInstallInfo *nextInstall)
NS_INIT_REFCNT();
mInstallInfo = nextInstall;
mOutFileDesc = PR_Open(nsAutoCString(nextInstall->GetLocalFile()), PR_CREATE_FILE | PR_RDWR, 0644);
mOutFileDesc = PR_Open(nsAutoCString(nextInstall->GetLocalFile()), PR_CREATE_FILE | PR_RDWR, 0744);
if(mOutFileDesc == NULL)
{