зеркало из https://github.com/mozilla/gecko-dev.git
294 строки
8.7 KiB
C
294 строки
8.7 KiB
C
/* -*- 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 "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.
|
|
*/
|
|
/*
|
|
* lm_trggr.c
|
|
*
|
|
* Reflects AutoInstall trigger methods
|
|
* into the global JavaScript config object.
|
|
*
|
|
* See Trigger.java for related functions.
|
|
*/
|
|
|
|
#include "lm.h"
|
|
#include "prefapi.h"
|
|
#include "VerReg.h"
|
|
#ifdef MOZ_SMARTUPDATE
|
|
#include "softupdt.h"
|
|
#endif
|
|
#include "gui.h" /* XP_AppPlatform */
|
|
|
|
JSBool PR_CALLBACK asd_Version(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
JSBool PR_CALLBACK asd_get_version(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
JSBool PR_CALLBACK asd_start_update(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
JSBool PR_CALLBACK asd_conditional_update(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
JSBool PR_CALLBACK asd_alert(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
JSBool PR_CALLBACK asd_platform(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
|
|
PRIVATE JSFunctionSpec autoinstall_methods[] = {
|
|
{ "getVersion", asd_get_version, 2 },
|
|
{ "startUpdate", asd_start_update, 2 },
|
|
{ "conditionalUpdate", asd_conditional_update, 4 },
|
|
{ "startUpdateComponent", asd_conditional_update, 4 }, /* old name */
|
|
{ NULL, NULL, 0 }
|
|
};
|
|
|
|
PRIVATE JSFunctionSpec globalconfig_methods[] = {
|
|
{ "alert", asd_alert, 1 },
|
|
{ "getPlatform", asd_platform, 0 },
|
|
{ NULL, NULL, 0 }
|
|
};
|
|
|
|
PRIVATE JSClass autoinstall_class = {
|
|
"AutoInstall", 0,
|
|
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
|
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
|
|
};
|
|
|
|
PRIVATE JSClass version_class = {
|
|
"VersionInfo", 0,
|
|
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
|
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
|
|
};
|
|
|
|
JSBool lm_DefineTriggers()
|
|
{
|
|
JSContext *globalContext = NULL;
|
|
JSObject *globalObject = NULL;
|
|
JSObject *autoInstallObject, *versionObject;
|
|
JSBool ans;
|
|
|
|
/* get global mocha context and object */
|
|
PREF_GetConfigContext(&globalContext);
|
|
PREF_GetGlobalConfigObject(&globalObject);
|
|
|
|
if (globalContext == NULL || globalObject == NULL) {
|
|
return JS_FALSE;
|
|
}
|
|
|
|
JS_BeginRequest(globalContext);
|
|
/* define AutoInstall object in global object */
|
|
autoInstallObject = JS_DefineObject(globalContext, globalObject,
|
|
"AutoInstall",
|
|
&autoinstall_class,
|
|
NULL,
|
|
JSPROP_ENUMERATE|JSPROP_READONLY);
|
|
|
|
if (!autoInstallObject) {
|
|
JS_EndRequest(globalContext);
|
|
return JS_FALSE;
|
|
}
|
|
|
|
|
|
/* define Version class in AutoInstall */
|
|
versionObject = JS_InitClass(globalContext, autoInstallObject, NULL,
|
|
&version_class, asd_Version, 0, NULL, NULL, NULL, NULL);
|
|
|
|
if (!versionObject) {
|
|
JS_EndRequest(globalContext);
|
|
return JS_FALSE;
|
|
}
|
|
|
|
/* define some global config utility functions */
|
|
JS_DefineFunctions(globalContext, globalObject, globalconfig_methods);
|
|
|
|
ans = JS_DefineFunctions(globalContext, autoInstallObject,
|
|
autoinstall_methods);
|
|
JS_EndRequest(globalContext);
|
|
return ans;
|
|
}
|
|
|
|
/* Convert VERSION type to Version JS object */
|
|
static void asd_versToObj(JSContext *cx, VERSION* vers, JSObject* versObj)
|
|
{
|
|
jsval val = INT_TO_JSVAL(vers->major);
|
|
JS_SetProperty(cx, versObj, "major", &val);
|
|
val = INT_TO_JSVAL(vers->minor);
|
|
JS_SetProperty(cx, versObj, "minor", &val);
|
|
val = INT_TO_JSVAL(vers->release);
|
|
JS_SetProperty(cx, versObj, "release", &val);
|
|
val = INT_TO_JSVAL(vers->build);
|
|
JS_SetProperty(cx, versObj, "build", &val);
|
|
}
|
|
|
|
/* Convert Version JS object to VERSION type */
|
|
static void asd_objToVers(JSContext *cx, JSObject* versObj, VERSION* vers)
|
|
{
|
|
jsval val;
|
|
JS_GetProperty(cx, versObj, "major", &val);
|
|
vers->major = JSVAL_TO_INT(val);
|
|
JS_GetProperty(cx, versObj, "minor", &val);
|
|
vers->minor = JSVAL_TO_INT(val);
|
|
JS_GetProperty(cx, versObj, "release", &val);
|
|
vers->release = JSVAL_TO_INT(val);
|
|
JS_GetProperty(cx, versObj, "build", &val);
|
|
vers->build = JSVAL_TO_INT(val);
|
|
}
|
|
|
|
/*
|
|
* ?? -- move this to VR?
|
|
* Returns 0 if versions are equal; < 0 if vers2 is newer; > 0 if vers1 is newer
|
|
*/
|
|
static int asd_compareVersion(VERSION* vers1, VERSION* vers2)
|
|
{
|
|
int diff;
|
|
if (vers1 == NULL)
|
|
diff = -4;
|
|
else if (vers2 == NULL)
|
|
diff = 4;
|
|
else if (vers1->major == vers2->major) {
|
|
if (vers1->minor == vers2->minor) {
|
|
if (vers1->release == vers2->release) {
|
|
if (vers1->build == vers2->build)
|
|
diff = 0;
|
|
else diff = (vers1->build > vers2->build) ? 1 : -1;
|
|
}
|
|
else diff = (vers1->release > vers2->release) ? 2 : -2;
|
|
}
|
|
else diff = (vers1->minor > vers2->minor) ? 3 : -3;
|
|
}
|
|
else diff = (vers1->major > vers2->major) ? 4 : -4;
|
|
return diff;
|
|
}
|
|
|
|
/* Version constructor
|
|
(accepts up to four int params to initialize fields) */
|
|
JSBool PR_CALLBACK asd_Version
|
|
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
VERSION vers;
|
|
vers.major = (argc >= 1 && JSVAL_IS_INT(argv[0])) ? JSVAL_TO_INT(argv[0]) : 0;
|
|
vers.minor = (argc >= 2 && JSVAL_IS_INT(argv[1])) ? JSVAL_TO_INT(argv[1]) : 0;
|
|
vers.release = (argc >= 3 && JSVAL_IS_INT(argv[2])) ? JSVAL_TO_INT(argv[2]) : 0;
|
|
vers.build = (argc >= 4 && JSVAL_IS_INT(argv[3])) ? JSVAL_TO_INT(argv[3]) : 0;
|
|
|
|
asd_versToObj(cx, &vers, obj);
|
|
return JS_TRUE;
|
|
}
|
|
|
|
/* arguments:
|
|
0. component name
|
|
1. version no. to fill in
|
|
return:
|
|
error status */
|
|
JSBool PR_CALLBACK asd_get_version
|
|
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
REGERR status = 0;
|
|
if (argc >= 2 && JSVAL_IS_STRING(argv[0])
|
|
&& JSVAL_IS_OBJECT(argv[1]))
|
|
{
|
|
VERSION vers;
|
|
char* component_path = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
|
|
status = VR_GetVersion(component_path, &vers);
|
|
|
|
if (status == REGERR_OK) {
|
|
JSObject* versObj = JSVAL_TO_OBJECT(argv[1]);
|
|
asd_versToObj(cx, &vers, versObj);
|
|
}
|
|
}
|
|
*rval = INT_TO_JSVAL(status);
|
|
return JS_TRUE;
|
|
}
|
|
|
|
/* arguments:
|
|
0. url
|
|
1. flags
|
|
return:
|
|
true if no errors */
|
|
JSBool PR_CALLBACK asd_start_update
|
|
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
|
|
|
|
#ifdef MOZ_SMARTUPDATE
|
|
if (argc >= 2 && JSVAL_IS_STRING(argv[0]) &&
|
|
JSVAL_IS_INT(argv[1])) {
|
|
char* url = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
|
|
MWContext* cx = FE_GetInitContext();
|
|
XP_Bool result = SU_StartSoftwareUpdate( cx, url,
|
|
NULL, NULL, NULL, JSVAL_TO_INT(argv[1]) );
|
|
*rval = BOOLEAN_TO_JSVAL(result);
|
|
return JS_TRUE;
|
|
}
|
|
#endif
|
|
return JS_TRUE;
|
|
}
|
|
|
|
/* arguments:
|
|
0. url
|
|
1. component name
|
|
2. version no. to compare
|
|
3. flags
|
|
return:
|
|
true if update triggered and no errors */
|
|
JSBool PR_CALLBACK asd_conditional_update
|
|
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
REGERR status = 0;
|
|
|
|
*rval = BOOLEAN_TO_JSVAL(JS_FALSE); /*INT_TO_JSVAL(status);*/
|
|
|
|
#ifdef MOZ_SMARTUPDATE
|
|
if (argc >= 4 && JSVAL_IS_STRING(argv[0]) &&
|
|
JSVAL_IS_STRING(argv[1]) &&
|
|
JSVAL_IS_OBJECT(argv[2]) &&
|
|
JSVAL_IS_INT(argv[3]))
|
|
{
|
|
VERSION curr_vers;
|
|
char* component_path = JS_GetStringBytes(JSVAL_TO_STRING(argv[1]));
|
|
status = VR_GetVersion(component_path, &curr_vers);
|
|
|
|
if (status == REGERR_OK) {
|
|
JSObject* versObj = JSVAL_TO_OBJECT(argv[2]);
|
|
VERSION req_vers;
|
|
asd_objToVers(cx, versObj, &req_vers);
|
|
if ( asd_compareVersion(&req_vers, &curr_vers) > 0 ) {
|
|
char* url = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
|
|
MWContext* cx = FE_GetInitContext();
|
|
XP_Bool result = SU_StartSoftwareUpdate( cx, url,
|
|
NULL, NULL, NULL, JSVAL_TO_INT(argv[3]) );
|
|
*rval = BOOLEAN_TO_JSVAL(result);
|
|
return JS_TRUE;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
return JS_TRUE;
|
|
}
|
|
|
|
JSBool PR_CALLBACK asd_alert
|
|
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
if (argc >= 1 && JSVAL_IS_STRING(argv[0])) {
|
|
char* msg = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
|
|
MWContext* ctx = FE_GetInitContext();
|
|
|
|
if (ctx)
|
|
FE_Alert(ctx, msg);
|
|
}
|
|
return JS_TRUE;
|
|
}
|
|
|
|
JSBool PR_CALLBACK asd_platform
|
|
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
*rval = STRING_TO_JSVAL( JS_NewStringCopyZ(cx, XP_AppPlatform) );
|
|
return JS_TRUE;
|
|
}
|
|
|