js_global.c 10.76 KiB
/* js_global.c */
/* Synchronet JavaScript "global" object properties/methods for all servers */
/* $Id$ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2001 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#ifdef JAVASCRIPT
static JSBool
js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char path[MAX_PATH+1];
uintN i;
JSString* str;
const char* filename;
JSScript* script;
JSBool ok;
jsval result;
scfg_t* cfg;
if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
return(JS_FALSE);
for (i=0;i<argc;i++) {
if((str=JS_ValueToString(cx, argv[i]))==NULL)
return(JS_FALSE);
if((filename=JS_GetStringBytes(str))==NULL)
return(JS_FALSE);
errno = 0;
if(!strchr(filename,BACKSLASH))
sprintf(path,"%s%s",cfg->exec_dir,filename);
else
strcpy(path,filename);
if((script=JS_CompileFile(cx, obj, path))==NULL)
return(JS_FALSE);
ok = JS_ExecuteScript(cx, obj, script, &result);
JS_DestroyScript(cx, script);
if (!ok)
return(JS_FALSE);
}
*rval=JSVAL_VOID;
return(JS_TRUE);
}
static JSBool
js_format(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
uintN i;
JSString * fmt;
JSString * str;
va_list arglist[64];
fmt = JS_ValueToString(cx, argv[0]);
if (!fmt)
return(JS_FALSE);
for (i = 1; i < argc && i<sizeof(arglist)/sizeof(arglist[0]); i++) {
if(JSVAL_IS_STRING(argv[i])) {
str = JS_ValueToString(cx, argv[i]);
if (!str)
return(JS_FALSE);
arglist[i-1]=JS_GetStringBytes(str);
} else if(JSVAL_IS_INT(argv[i]) || JSVAL_IS_BOOLEAN(argv[i]))
arglist[i-1]=(char *)JSVAL_TO_INT(argv[i]);
else
arglist[i-1]=NULL;
}
if((p=JS_vsmprintf(JS_GetStringBytes(fmt),(char*)arglist))==NULL)
return(JS_FALSE);
str = JS_NewStringCopyZ(cx, p);
JS_smprintf_free(p);
*rval = STRING_TO_JSVAL(str);
return(JS_TRUE);
}
static JSBool
js_mswait(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int val=1;
if(argc)
val=JSVAL_TO_INT(argv[0]);
mswait(val);
*rval = JSVAL_VOID;
return(JS_TRUE);
}
static JSBool
js_random(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
*rval = INT_TO_JSVAL(sbbs_random(JSVAL_TO_INT(argv[0])));
return(JS_TRUE);
}
static JSBool
js_time(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
*rval = INT_TO_JSVAL(time(NULL));
return(JS_TRUE);
}
static JSBool
js_beep(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int freq=500;
int dur=500;
if(argc)
freq=JSVAL_TO_INT(argv[0]);
if(argc>1)
dur=JSVAL_TO_INT(argv[1]);
sbbs_beep(freq,dur);
*rval = JSVAL_VOID;
return(JS_TRUE);
}
static JSBool
js_exit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
*rval = JSVAL_VOID;
return(JS_FALSE);
}
static JSBool
js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* str;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
if((str=JS_GetStringBytes(js_str))==NULL)
return(JS_FALSE);
*rval = INT_TO_JSVAL(crc16(str));
return(JS_TRUE);
}
static JSBool
js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* str;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
if((str=JS_GetStringBytes(js_str))==NULL)
return(JS_FALSE);
*rval = INT_TO_JSVAL(crc32(str,strlen(str)));
return(JS_TRUE);
}
static JSBool
js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
ulong sum=0;
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
if((p=JS_GetStringBytes(js_str))==NULL)
return(JS_FALSE);
while(*p) sum+=*(p++);
*rval = INT_TO_JSVAL(sum);
return(JS_TRUE);
}
static JSBool
js_ascii(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
char str[2];
JSString* js_str;
if(JSVAL_IS_STRING(argv[0])) { /* string to ascii-int */
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
if((p=JS_GetStringBytes(js_str))==NULL)
return(JS_FALSE);
*rval=INT_TO_JSVAL(*p);
return(JS_TRUE);
}
/* ascii-int to str */
str[0]=(uchar)JSVAL_TO_INT(argv[0]);
str[1]=0;
js_str = JS_NewStringCopyZ(cx, str);
*rval = STRING_TO_JSVAL(js_str);
return(JS_TRUE);
}
static JSBool
js_strip_ctrl(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
ulong sum=0;
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
if((p=JS_GetStringBytes(js_str))==NULL)
return(JS_FALSE);
strip_ctrl(p);
js_str = JS_NewStringCopyZ(cx, p);
*rval = STRING_TO_JSVAL(js_str);
return(JS_TRUE);
}
static JSBool
js_fexist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return(JS_TRUE);
}
*rval = BOOLEAN_TO_JSVAL(fexist(p));
return(JS_TRUE);
}
static JSBool
js_isdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return(JS_TRUE);
}
*rval = BOOLEAN_TO_JSVAL(isdir(p));
return(JS_TRUE);
}
static JSBool
js_fattr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
*rval = INT_TO_JSVAL(-1);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = INT_TO_JSVAL(-1);
return(JS_TRUE);
}
*rval = INT_TO_JSVAL(getfattr(p));
return(JS_TRUE);
}
static JSBool
js_fdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
*rval = INT_TO_JSVAL(-1);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = INT_TO_JSVAL(-1);
return(JS_TRUE);
}
*rval = INT_TO_JSVAL(fdate(p));
return(JS_TRUE);
}
static JSBool
js_flength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
*rval = INT_TO_JSVAL(-1);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = INT_TO_JSVAL(-1);
return(JS_TRUE);
}
*rval = INT_TO_JSVAL(flength(p));
return(JS_TRUE);
}
static JSBool
js_sound(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
if(!argc) { /* Stop playing sound */
#ifdef _WIN32
PlaySound(NULL,NULL,0);
#endif
*rval = BOOLEAN_TO_JSVAL(JS_TRUE);
return(JS_TRUE);
}
if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return(JS_TRUE);
}
#ifdef _WIN32
*rval = BOOLEAN_TO_JSVAL(PlaySound(p, NULL, SND_ASYNC|SND_FILENAME));
#else
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
#endif
return(JS_TRUE);
}
static JSClass js_global_class ={
"Global",
JSCLASS_HAS_PRIVATE, /* needed for scfg_t ptr */
JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,
JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub
};
static JSFunctionSpec js_global_functions[] = {
{"exit", js_exit, 0}, /* stop execution */
{"load", js_load, 1}, /* Load and execute a javascript file */
{"format", js_format, 1}, /* return a formatted string (ala printf) */
{"mswait", js_mswait, 0}, /* millisecond wait/sleep routine */
{"sleep", js_mswait, 0}, /* millisecond wait/sleep routine */
{"random", js_random, 1}, /* return random int between 0 and n */
{"time", js_time, 0}, /* return time in Unix format */
{"beep", js_beep, 0}, /* local beep (freq, dur) */
{"sound", js_sound, 0}, /* play sound file */
{"crc16", js_crc16, 1}, /* calculate 16-bit CRC of string */
{"crc32", js_crc32, 1}, /* calculate 32-bit CRC of string */
{"chksum", js_chksum, 1}, /* calculate 32-bit chksum of string */
{"ascii", js_ascii, 1}, /* convert str to ascii-val or vice-versa */
{"strip_ctrl", js_strip_ctrl, 1}, /* strip ctrl chars from string */
{"file_exists", js_fexist, 1}, /* verify file existence */
{"file_isdir", js_isdir, 1}, /* check if directory */
{"file_attrib", js_fattr, 1}, /* get file mode/attributes */
{"file_date", js_fdate, 1}, /* get file last modified date/time */
{"file_size", js_flength, 1}, /* get file length (in bytes) */
{0}
};
JSObject* DLLCALL js_CreateGlobalObject(JSContext* cx, scfg_t* cfg)
{
JSObject* glob;
if((glob = JS_NewObject(cx, &js_global_class, NULL, NULL)) ==NULL)
return(NULL);
if (!JS_InitStandardClasses(cx, glob))
return(NULL);
if (!JS_DefineFunctions(cx, glob, js_global_functions))
return(NULL);
if(!JS_SetPrivate(cx, glob, cfg)) /* Store a pointer to scfg_t */
return(NULL);
return(glob);
}
#endif /* JAVSCRIPT */