mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-13 01:55:44 +00:00
231 lines
5.8 KiB
C
231 lines
5.8 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.
|
|
*/
|
|
/*
|
|
* Sofware Update object
|
|
* This object only exists to pass the data from SoftwareUpdate trigger
|
|
* to softupdate Java class. It has a single property, src, that is read-only
|
|
* It is created as a part of the scope for softupdate
|
|
*
|
|
* Aleks Totic 3/5/97
|
|
*
|
|
*/
|
|
|
|
#include "lm.h"
|
|
|
|
/* Private object data */
|
|
typedef struct JSSoftup {
|
|
JSString * src; /* Name of the JAR file */
|
|
JSBool silent;
|
|
JSBool force;
|
|
} JSSoftup;
|
|
|
|
/* Properties */
|
|
enum su_slot {
|
|
SU_SRC = -1,
|
|
SU_SILENT = -2,
|
|
SU_FORCE = -3
|
|
};
|
|
|
|
static JSPropertySpec su_props[] = {
|
|
{ "src", SU_SRC, JSPROP_READONLY },
|
|
{ "silent", SU_SILENT, JSPROP_READONLY },
|
|
{ "force", SU_FORCE, JSPROP_READONLY },
|
|
{0}
|
|
};
|
|
|
|
/* Prototypes */
|
|
JSBool PR_CALLBACK
|
|
su_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
|
|
void PR_CALLBACK
|
|
su_finalize(JSContext *cx, JSObject *obj);
|
|
JSBool PR_CALLBACK
|
|
SoftUpdate(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
|
|
static JSBool
|
|
su_InitSoftUpClass( MochaDecoder * decoder, JSContext *cx );
|
|
char *
|
|
DecodeSoftUpJSArgs(const char * jsArgs, JSBool* force, JSBool* silent );
|
|
|
|
extern JSClass lm_softup_class;
|
|
|
|
/*
|
|
* su_getProperty
|
|
*
|
|
*/
|
|
JSBool PR_CALLBACK
|
|
su_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
{
|
|
JSSoftup *softup;
|
|
jsint slot;
|
|
|
|
if (!JSVAL_IS_INT(id))
|
|
return JS_TRUE;
|
|
|
|
slot = JSVAL_TO_INT(id);
|
|
|
|
softup = JS_GetInstancePrivate(cx, obj, &lm_softup_class, NULL);
|
|
XP_ASSERT( softup );
|
|
if (!softup )
|
|
return JS_TRUE;
|
|
|
|
switch (slot)
|
|
{
|
|
case SU_SRC:
|
|
*vp = STRING_TO_JSVAL(softup->src);
|
|
return JS_TRUE;
|
|
case SU_SILENT:
|
|
*vp = BOOLEAN_TO_JSVAL(softup->silent);
|
|
return JS_TRUE;
|
|
case SU_FORCE:
|
|
*vp = BOOLEAN_TO_JSVAL(softup->force);
|
|
return JS_TRUE;
|
|
default:
|
|
return JS_TRUE;
|
|
}
|
|
return JS_TRUE;
|
|
}
|
|
|
|
/*
|
|
* clean up
|
|
*/
|
|
void PR_CALLBACK
|
|
su_finalize(JSContext *cx, JSObject *obj)
|
|
{
|
|
JSSoftup *softup;
|
|
softup = JS_GetPrivate(cx, obj);
|
|
if (softup)
|
|
{
|
|
JS_UnlockGCThing( cx, softup->src );
|
|
XP_FREE(softup);
|
|
}
|
|
}
|
|
|
|
/* Global, referenced in su_trigger.c to check if the object is the
|
|
correct class */
|
|
|
|
JSClass lm_softup_class = {
|
|
"SoftUpdate", JSCLASS_HAS_PRIVATE,
|
|
JS_PropertyStub, JS_PropertyStub, su_getProperty, JS_PropertyStub,
|
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, su_finalize
|
|
};
|
|
|
|
/*
|
|
* Constructor
|
|
* No one should be able to construct one of these, except as a scope object
|
|
* for softupdate.
|
|
*/
|
|
JSBool PR_CALLBACK
|
|
SoftUpdate(JSContext *cx, JSObject *obj,
|
|
uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
return JS_TRUE;
|
|
}
|
|
|
|
/*
|
|
* Initialize the class
|
|
*/
|
|
static JSObject *prototype = NULL; /* Using this as a class prototype */
|
|
/* and a signal if class has been loaded */
|
|
|
|
static JSBool
|
|
su_InitSoftUpClass(MochaDecoder * decoder, JSContext *cx)
|
|
{
|
|
JSObject *prototype;
|
|
prototype = JS_InitClass( cx, /* JSContext *cx */
|
|
decoder->window_object, /* JSObject *obj */
|
|
NULL, /* decoder->event_receiver_prototype, JSObject *parent_proto */
|
|
&lm_softup_class, /* JSClass *clasp */
|
|
SoftUpdate, /* JSNative constructor */
|
|
0, /* PRUintn nargs */
|
|
su_props, /* JSPropertySpec *ps */
|
|
0, /* JSFunctionSpec *fs */
|
|
0, /* JSPropertySpec *static_ps */
|
|
0); /* JSFunctionSpec *static_fs */
|
|
|
|
if (!prototype)
|
|
return JS_FALSE;
|
|
|
|
/* JS_InitStandardClasses makes the "standard" JS functions available
|
|
if ( !JS_InitStandardClasses(cx, prototype))
|
|
return JS_FALSE;
|
|
*/ return JS_TRUE;
|
|
}
|
|
|
|
/* Decodes the JSArgs */
|
|
/* see softupdt.c, EncodeSoftUpJSArgs for info on encoding */
|
|
/* jsArgs do not have 'autoinstall:' prefix */
|
|
char *
|
|
DecodeSoftUpJSArgs(const char *jsArgs, JSBool *force, JSBool *silent )
|
|
{
|
|
char * fileName;
|
|
int32 length;
|
|
int32 fileNameLength;
|
|
|
|
*force = JS_FALSE;
|
|
*silent = JS_FALSE;
|
|
if (jsArgs == NULL)
|
|
return NULL;
|
|
length = XP_STRLEN(jsArgs);
|
|
fileNameLength = length - 4;
|
|
fileName = XP_ALLOC(fileNameLength +1);
|
|
XP_MEMCPY(fileName, jsArgs, fileNameLength);
|
|
fileName[fileNameLength] = 0;
|
|
*force = (JSBool)(jsArgs[length - 1] == 'T');
|
|
*silent = (JSBool)(jsArgs[length - 3] == 'T');
|
|
return fileName;
|
|
}
|
|
|
|
/*
|
|
* Creates a new object
|
|
* Arguments: jarargs jar: followed by name of the JAR file
|
|
*/
|
|
|
|
JSObject *
|
|
lm_NewSoftupObject( JSContext *cx, MochaDecoder *decoder, const char *jarargs )
|
|
{
|
|
JSObject * obj;
|
|
if (prototype == NULL)
|
|
{
|
|
if ( !su_InitSoftUpClass(decoder, cx ))
|
|
return NULL;
|
|
}
|
|
|
|
obj = JS_NewObject(cx, &lm_softup_class, prototype, decoder->window_object);
|
|
if ( obj )
|
|
{
|
|
JSSoftup * su;
|
|
su = XP_ALLOC (sizeof (JSSoftup));
|
|
if ( su )
|
|
{
|
|
char * fileName;
|
|
JSBool silent;
|
|
JSBool force;
|
|
fileName = DecodeSoftUpJSArgs( jarargs, &force, &silent);
|
|
su->src = JS_NewStringCopyZ(cx, fileName);
|
|
if ( fileName )
|
|
XP_FREE(fileName);
|
|
su->force = force;
|
|
su->silent = silent;
|
|
JS_LockGCThing( cx, su->src );
|
|
JS_SetPrivate( cx, obj, su );
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|