Skip to content
Snippets Groups Projects
Commit 059a0ceb authored by rswindell's avatar rswindell
Browse files

Renamed to js_*

parent 89a4fb52
No related branches found
No related tags found
No related merge requests found
/* conobj.cpp */
/* Synchronet JavaScript "Console" Object */
/* $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
/*****************************/
/* Console Object Properites */
/*****************************/
enum {
CON_PROP_ONLINE
,CON_PROP_STATUS
,CON_PROP_LNCNTR
,CON_PROP_TOS
,CON_PROP_ROWS
,CON_PROP_AUTOTERM
,CON_PROP_TIMEOUT /* User inactivity timeout reference */
,CON_PROP_TIMELEFT_WARN /* low timeleft warning flag */
};
static JSBool js_console_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
ulong val;
jsint tiny;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
tiny = JSVAL_TO_INT(id);
switch(tiny) {
case CON_PROP_ONLINE:
val=sbbs->online;
break;
case CON_PROP_STATUS:
val=sbbs->console;
break;
case CON_PROP_LNCNTR:
val=sbbs->lncntr;
break;
case CON_PROP_TOS:
val=sbbs->tos;
break;
case CON_PROP_ROWS:
val=sbbs->rows;
break;
case CON_PROP_AUTOTERM:
val=sbbs->autoterm;
break;
case CON_PROP_TIMEOUT:
val=sbbs->timeout;
break;
case CON_PROP_TIMELEFT_WARN:
val=sbbs->timeleft_warn;
break;
default:
return(JS_TRUE);
}
*vp = INT_TO_JSVAL(val);
return(JS_TRUE);
}
static JSBool js_console_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
long val;
jsint tiny;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
tiny = JSVAL_TO_INT(id);
JS_ValueToInt32(cx, *vp, &val);
switch(tiny) {
case CON_PROP_ONLINE:
sbbs->online=val;
break;
case CON_PROP_STATUS:
sbbs->console=val;
break;
case CON_PROP_LNCNTR:
sbbs->lncntr=val;
break;
case CON_PROP_TOS:
sbbs->tos=val;
break;
case CON_PROP_ROWS:
sbbs->rows=val;
break;
case CON_PROP_AUTOTERM:
sbbs->autoterm=val;
break;
case CON_PROP_TIMEOUT:
sbbs->timeout=val;
break;
case CON_PROP_TIMELEFT_WARN:
sbbs->timeleft_warn=val;
break;
default:
return(JS_TRUE);
}
return(JS_TRUE);
}
#define CON_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
static struct JSPropertySpec js_console_properties[] = {
/* name ,tinyid ,flags ,getter,setter */
{ "online" ,CON_PROP_ONLINE ,CON_PROP_FLAGS ,NULL,NULL},
{ "status" ,CON_PROP_STATUS ,CON_PROP_FLAGS ,NULL,NULL},
{ "line_counter" ,CON_PROP_LNCNTR ,CON_PROP_FLAGS ,NULL,NULL},
{ "top_of_screen" ,CON_PROP_TOS ,CON_PROP_FLAGS ,NULL,NULL},
{ "rows" ,CON_PROP_ROWS ,CON_PROP_FLAGS ,NULL,NULL},
{ "autoterm" ,CON_PROP_AUTOTERM ,CON_PROP_FLAGS ,NULL,NULL},
{ "timeout" ,CON_PROP_TIMEOUT ,CON_PROP_FLAGS ,NULL,NULL},
{ "timeleft_warning" ,CON_PROP_TIMELEFT_WARN ,CON_PROP_FLAGS ,NULL,NULL},
{0}
};
/**************************/
/* Console Object Methods */
/**************************/
static JSBool
js_inkey(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char key[2];
long mode=0;
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc && JSVAL_IS_INT(argv[0]))
mode=JSVAL_TO_INT(argv[0]);
key[0]=sbbs->inkey(mode);
key[1]=0;
js_str = JS_NewStringCopyZ(cx, key);
*rval = STRING_TO_JSVAL(js_str);
return(JS_TRUE);
}
static JSBool
js_getkey(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char key[2];
long mode=0;
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc && JSVAL_IS_INT(argv[0]))
mode=JSVAL_TO_INT(argv[0]);
key[0]=sbbs->getkey(mode);
key[1]=0;
js_str = JS_NewStringCopyZ(cx, key);
*rval = STRING_TO_JSVAL(js_str);
return(JS_TRUE);
}
static JSBool
js_getstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char *p;
long mode=0;
uintN i;
size_t maxlen=0;
sbbs_t* sbbs;
JSString* js_str=NULL;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
for(i=0;i<argc;i++) {
if(JSVAL_IS_INT(argv[i])) {
if(!maxlen)
maxlen=JSVAL_TO_INT(argv[i]);
else
mode=JSVAL_TO_INT(argv[i]);
continue;
}
if(JSVAL_IS_STRING(argv[i])) {
js_str = JS_ValueToString(cx, argv[i]);
if (!js_str)
return(JS_FALSE);
}
}
if(!maxlen) maxlen=128;
if((p=(char *)calloc(1,maxlen+1))==NULL)
return(JS_FALSE);
if(js_str!=NULL)
sprintf(p,"%.*s",maxlen,JS_GetStringBytes(js_str));
sbbs->getstr(p,maxlen,mode);
js_str = JS_NewStringCopyZ(cx, p);
free(p);
*rval = STRING_TO_JSVAL(js_str);
return(JS_TRUE);
}
static JSBool
js_getnum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
ulong maxnum=~0;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc && JSVAL_IS_INT(argv[0]))
maxnum=JSVAL_TO_INT(argv[0]);
*rval = INT_TO_JSVAL(sbbs->getnum(maxnum));
return(JS_TRUE);
}
static JSBool
js_getkeys(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char key[2];
uintN i;
long val;
ulong maxnum=~0;
sbbs_t* sbbs;
JSString* js_str=NULL;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
for(i=0;i<argc;i++) {
if(JSVAL_IS_INT(argv[i])) {
maxnum=JSVAL_TO_INT(argv[i]);
continue;
}
if(JSVAL_IS_STRING(argv[i])) {
js_str = JS_ValueToString(cx, argv[i]);
}
}
if (!js_str)
return(JS_FALSE);
val=sbbs->getkeys(JS_GetStringBytes(js_str),maxnum);
if(val==-1) { // abort
*rval = INT_TO_JSVAL(0);
} else if(val<0) { // number
val&=~0x80000000;
*rval = INT_TO_JSVAL(val);
} else { // key
key[0]=(uchar)val;
key[1]=0;
js_str = JS_NewStringCopyZ(cx, key);
*rval = STRING_TO_JSVAL(js_str);
}
return(JS_TRUE);
}
static JSBool
js_gettemplate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char str[128];
long mode=0;
uintN i;
sbbs_t* sbbs;
JSString* js_str=NULL;
JSString* js_fmt=NULL;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
for(i=0;i<argc;i++) {
if(JSVAL_IS_STRING(argv[i])) {
if(js_fmt==NULL)
js_fmt = JS_ValueToString(cx, argv[i]);
else
js_str = JS_ValueToString(cx, argv[i]);
} else if (JSVAL_IS_INT(argv[i]))
mode=JSVAL_TO_INT(argv[i]);
}
if(js_fmt==NULL)
return(JS_FALSE);
if(js_str==NULL)
str[0]=0;
else
sprintf(str, "%.*s", sizeof(str)-1, JS_GetStringBytes(js_str));
sbbs->gettmplt(str,JS_GetStringBytes(js_fmt),mode);
js_str = JS_NewStringCopyZ(cx, str);
*rval = STRING_TO_JSVAL(js_str);
return(JS_TRUE);
}
static JSBool
js_ungetstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
p=JS_GetStringBytes(js_str);
while(p && *p)
sbbs->ungetkey(*(p++));
return(JS_TRUE);
}
static JSBool
js_yesno(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
*rval = BOOLEAN_TO_JSVAL(sbbs->yesno(JS_GetStringBytes(js_str)));
return(JS_TRUE);
}
static JSBool
js_noyes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
*rval = BOOLEAN_TO_JSVAL(sbbs->noyes(JS_GetStringBytes(js_str)));
return(JS_TRUE);
}
static JSBool
js_mnemonics(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return(JS_FALSE);
sbbs->mnemonics(JS_GetStringBytes(js_str));
return(JS_TRUE);
}
static JSBool
js_clear(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->CLS;
return(JS_TRUE);
}
static JSBool
js_clearline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->clearline();
return(JS_TRUE);
}
static JSBool
js_crlf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->outchar(CR);
sbbs->outchar(LF);
return(JS_TRUE);
}
static JSBool
js_attr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->attr(JSVAL_TO_INT(argv[0]));
return(JS_TRUE);
}
static JSBool
js_pause(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->pause();
return(JS_TRUE);
}
static JSBool
js_print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSString* str;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
sbbs->bputs(JS_GetStringBytes(str));
return(JS_TRUE);
}
static JSBool
js_write(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSString* str;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
sbbs->rputs(JS_GetStringBytes(str));
return(JS_TRUE);
}
static JSBool
js_putmsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
long mode=0;
JSString* str;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
if(argc>1 && JSVAL_IS_INT(argv[1]))
mode=JSVAL_TO_INT(argv[1]);
sbbs->putmsg(JS_GetStringBytes(str),mode);
return(JS_TRUE);
}
static JSBool
js_printfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
long mode=0;
JSString* str;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
if(argc>1 && JSVAL_IS_INT(argv[1]))
mode=JSVAL_TO_INT(argv[1]);
sbbs->printfile(JS_GetStringBytes(str),mode);
return(JS_TRUE);
}
static JSBool
js_printtail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int lines=0;
long mode=0;
uintN i;
sbbs_t* sbbs;
JSString* js_str=NULL;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
for(i=0;i<argc;i++) {
if(JSVAL_IS_INT(argv[i])) {
if(!lines)
lines=JSVAL_TO_INT(argv[i]);
else
mode=JSVAL_TO_INT(argv[i]);
} else if(JSVAL_IS_STRING(argv[i]))
js_str = JS_ValueToString(cx, argv[i]);
}
if(js_str==NULL)
return(JS_FALSE);
if(!lines)
lines=5;
sbbs->printtail(JS_GetStringBytes(js_str),lines,mode);
return(JS_TRUE);
}
static JSBool
js_menu(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSString* str;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
sbbs->menu(JS_GetStringBytes(str));
return(JS_TRUE);
}
static JSBool
js_uselect(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
uintN i;
int num=0;
char* title;
char* item;
char* ar_str;
uchar* ar;
sbbs_t* sbbs;
JSString* js_str;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(!argc) {
*rval = INT_TO_JSVAL(sbbs->uselect(0,0,NULL,NULL,NULL));
return(JS_TRUE);
}
for(i=0;i<argc;i++) {
if(!JSVAL_IS_STRING(argv[i])) {
num = JSVAL_TO_INT(argv[i]);
continue;
}
if((js_str=JS_ValueToString(cx, argv[i]))==NULL)
return(JS_FALSE);
if(title==NULL)
title=JS_GetStringBytes(js_str);
else if(item==NULL)
item=JS_GetStringBytes(js_str);
else {
ar_str=JS_GetStringBytes(js_str);
ar=arstr(NULL,ar_str,&sbbs->cfg);
}
}
*rval = INT_TO_JSVAL(sbbs->uselect(1, num, title, item, ar));
return(JS_TRUE);
}
static JSBool
js_center(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSString* str;
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
sbbs->center(JS_GetStringBytes(str));
return(JS_TRUE);
}
static JSBool
js_saveline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->slatr[sbbs->slcnt]=sbbs->latr;
sprintf(sbbs->slbuf[sbbs->slcnt<SAVE_LINES ? sbbs->slcnt++ : sbbs->slcnt]
,"%.*s",sbbs->lbuflen,sbbs->lbuf);
sbbs->lbuflen=0;
return(JS_TRUE);
}
static JSBool
js_restoreline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->lbuflen=0;
sbbs->attr(sbbs->slatr[--sbbs->slcnt]);
sbbs->rputs(sbbs->slbuf[sbbs->slcnt]);
sbbs->curatr=LIGHTGRAY;
return(JS_TRUE);
}
static JSBool
js_ansi_save(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->ANSI_SAVE();
return(JS_TRUE);
}
static JSBool
js_ansi_restore(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->ANSI_RESTORE();
return(JS_TRUE);
}
static JSBool
js_ansi_gotoxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if(argc<2)
return(JS_FALSE);
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->GOTOXY(JSVAL_TO_INT(argv[0]),JSVAL_TO_INT(argv[1]));
return(JS_TRUE);
}
static JSBool
js_ansi_up(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc)
sbbs->rprintf("\x1b[%dA",JSVAL_TO_INT(argv[0]));
else
sbbs->rputs("\x1b[A");
return(JS_TRUE);
}
static JSBool
js_ansi_down(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc)
sbbs->rprintf("\x1b[%dB",JSVAL_TO_INT(argv[0]));
else
sbbs->rputs("\x1b[B");
return(JS_TRUE);
}
static JSBool
js_ansi_right(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc)
sbbs->rprintf("\x1b[%dC",JSVAL_TO_INT(argv[0]));
else
sbbs->rputs("\x1b[C");
return(JS_TRUE);
}
static JSBool
js_ansi_left(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
if(argc)
sbbs->rprintf("\x1b[%dD",JSVAL_TO_INT(argv[0]));
else
sbbs->rputs("\x1b[D");
return(JS_TRUE);
}
static JSBool
js_ansi_getlines(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
sbbs_t* sbbs;
if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
return(JS_FALSE);
sbbs->ansi_getlines();
return(JS_TRUE);
}
static JSFunctionSpec js_console_functions[] = {
{"inkey", js_inkey, 0}, // get key - no wait
{"getkey", js_getkey, 0}, // get key - with wait
{"getstr", js_getstr, 0}, // get string
{"getnum", js_getnum, 0}, // get number
{"getkeys", js_getkeys, 1}, // get one of a list of keys
{"gettemplate", js_gettemplate, 1}, // get a string based on template
{"ungetstr", js_ungetstr, 1}, // put a string in the keyboard buffer
{"yesno", js_yesno, 1}, // Y/n question
{"noyes", js_noyes, 1}, // N/y question
{"mnemonics", js_mnemonics, 1}, // mnemonics input
{"clear", js_clear, 0}, // clear screen
{"clearline", js_clearline, 0}, // clear current line
{"crlf", js_crlf, 0}, // output cr/lf
{"attr", js_attr, 1}, // set current text attribute
{"pause", js_pause, 0}, // pause
{"print", js_print, 1}, // display a string (supports ^A and @-codes)
{"write", js_write, 1}, // display a raw string
{"putmsg", js_putmsg, 1}, // display message text (^A, @-codes, etc) with mode
{"center", js_center, 1}, // display a string centered on the screen
{"printfile", js_printfile, 1}, // print a file, optional mode
{"printtail", js_printtail, 2}, // print last x lines of file, optional mode
{"menu", js_menu, 1}, // print menu (auto-extension)
{"uselect", js_uselect, 0}, // user selection menu
{"saveline", js_saveline, 0}, // save last output line
{"restoreline", js_restoreline, 0}, // restore last output line
{"ansi_pushxy", js_ansi_save, 0},
{"ansi_popxy", js_ansi_restore, 0},
{"ansi_gotoxy", js_ansi_gotoxy, 2},
{"ansi_up", js_ansi_up, 0},
{"ansi_down", js_ansi_down, 0},
{"ansi_right", js_ansi_right, 0},
{"ansi_left", js_ansi_left, 0},
{"ansi_getlines", js_ansi_getlines, 0},
{0}
};
static JSClass js_console_class = {
"Console" /* name */
,0 /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_console_get /* getProperty */
,js_console_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
JSObject* js_CreateConsoleObject(JSContext* cx, JSObject* parent)
{
JSObject* obj;
obj = JS_DefineObject(cx, parent, "console", &js_console_class, NULL, 0);
if(obj==NULL)
return(NULL);
if(!JS_DefineProperties(cx, obj, js_console_properties))
return(NULL);
if (!JS_DefineFunctions(cx, obj, js_console_functions))
return(NULL);
return(obj);
}
#endif /* JAVSCRIPT */
\ No newline at end of file
/* fileobj.c */
/* Synchronet JavaScript "File Area" Object */
/* $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 JSClass js_file_area_class = {
"FileArea" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,JS_PropertyStub /* getProperty */
,JS_PropertyStub /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
JSObject* DLLCALL js_CreateFileAreaObject(scfg_t* cfg, JSContext* cx, JSObject* parent, user_t* user
,char* html_index_file)
{
char vpath[MAX_PATH+1];
JSObject* areaobj;
JSObject* libobj;
JSObject* dirobj;
JSObject* lib_list;
JSObject* dir_list;
jsval val;
jsint index;
uint l,d;
areaobj = JS_DefineObject(cx, parent, "file_area", &js_file_area_class, NULL, 0);
if(areaobj==NULL)
return(NULL);
/* lib_list[] */
if((lib_list=JS_NewArrayObject(cx, 0, NULL))==NULL)
return(NULL);
val=OBJECT_TO_JSVAL(lib_list);
if(!JS_SetProperty(cx, areaobj, "lib_list", &val))
return(NULL);
for(l=0;l<cfg->total_libs;l++) {
if(!chk_ar(cfg,cfg->lib[l]->ar,user))
continue;
if((libobj=JS_NewObject(cx, &js_file_area_class, NULL, NULL))==NULL)
return(NULL);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->lib[l]->sname));
if(!JS_SetProperty(cx, libobj, "name", &val))
return(NULL);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->lib[l]->lname));
if(!JS_SetProperty(cx, libobj, "description", &val))
return(NULL);
sprintf(vpath,"/%s/%s",cfg->lib[l]->sname,html_index_file);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, vpath));
if(!JS_SetProperty(cx, libobj, "link", &val))
return(NULL);
/* dir_list[] */
if((dir_list=JS_NewArrayObject(cx, 0, NULL))==NULL)
return(NULL);
val=OBJECT_TO_JSVAL(dir_list);
if(!JS_SetProperty(cx, libobj, "dir_list", &val))
return(NULL);
for(d=0;d<cfg->total_dirs;d++) {
if(cfg->dir[d]->lib!=l)
continue;
if(!chk_ar(cfg,cfg->dir[d]->ar,user))
continue;
if((dirobj=JS_NewObject(cx, &js_file_area_class, NULL, NULL))==NULL)
return(NULL);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->dir[d]->code));
if(!JS_SetProperty(cx, dirobj, "code", &val))
return(NULL);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->dir[d]->sname));
if(!JS_SetProperty(cx, dirobj, "name", &val))
return(NULL);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->dir[d]->lname));
if(!JS_SetProperty(cx, dirobj, "description", &val))
return(NULL);
sprintf(vpath,"/%s/%s/%s"
,cfg->lib[l]->sname
,cfg->dir[d]->code
,html_index_file);
val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, vpath));
if(!JS_SetProperty(cx, dirobj, "link", &val))
return(NULL);
if(!JS_GetArrayLength(cx, dir_list, &index))
return(NULL);
val=OBJECT_TO_JSVAL(dirobj);
JS_SetElement(cx, dir_list, index, &val);
}
if(!JS_GetArrayLength(cx, lib_list, &index))
return(NULL);
val=OBJECT_TO_JSVAL(libobj);
JS_SetElement(cx, lib_list, index, &val);
}
return(areaobj);
}
#endif /* JAVSCRIPT */
\ No newline at end of file
/* globobj.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++) {
str = JS_ValueToString(cx, argv[i]);
if (!str)
return JS_FALSE;
argv[i] = STRING_TO_JSVAL(str);
filename = JS_GetStringBytes(str);
errno = 0;
if(!strchr(filename,BACKSLASH))
sprintf(path,"%s%s",cfg->exec_dir,filename);
else
strcpy(path,filename);
script = JS_CompileFile(cx, obj, path);
if (!script)
ok = JS_FALSE;
else {
ok = JS_ExecuteScript(cx, obj, script, &result);
JS_DestroyScript(cx, script);
}
if (!ok)
return JS_FALSE;
}
return JS_TRUE;
}
static JSBool
js_format(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char tmp[1024];
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]))
arglist[i-1]=(char *)JSVAL_TO_INT(argv[i]);
else
arglist[i-1]=NULL;
}
vsprintf(tmp,JS_GetStringBytes(fmt),(char*)arglist);
str = JS_NewStringCopyZ(cx, tmp);
*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);
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);
return(JS_TRUE);
}
static JSBool
js_exit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
return(JS_FALSE);
}
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 */
{"beep", js_beep, 0}, /* local beep (freq, dur) */
{0}
};
JSObject* DLLCALL js_CreateGlobalObject(scfg_t* cfg, JSContext* cx)
{
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 */
\ No newline at end of file
/* sysobj.c */
/* Synchronet JavaScript "system" Object */
/* $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
/* System Object Properites */
enum {
SYS_PROP_NAME
,SYS_PROP_OP
,SYS_PROP_ID
,SYS_PROP_MISC
,SYS_PROP_PSNAME
,SYS_PROP_PSNUM
,SYS_PROP_INETADDR
,SYS_PROP_LOCATION
,SYS_PROP_TIMEZONE
,SYS_PROP_NODES
,SYS_PROP_LASTNODE
,SYS_PROP_PWDAYS
,SYS_PROP_DELDAYS
,SYS_PROP_LASTUSERON
,SYS_PROP_FREEDISKSPACE
};
static JSBool js_system_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
jsint tiny;
scfg_t* cfg;
if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
return JS_FALSE;
tiny = JSVAL_TO_INT(id);
switch(tiny) {
case SYS_PROP_NAME:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->sys_name));
break;
case SYS_PROP_OP:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->sys_op));
break;
case SYS_PROP_ID:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->sys_id));
break;
case SYS_PROP_MISC:
*vp = INT_TO_JSVAL(cfg->sys_misc);
break;
case SYS_PROP_PSNAME:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->sys_psname));
break;
case SYS_PROP_PSNUM:
*vp = INT_TO_JSVAL(cfg->sys_psnum);
break;
case SYS_PROP_INETADDR:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->sys_inetaddr));
break;
case SYS_PROP_LOCATION:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, cfg->sys_location));
break;
case SYS_PROP_TIMEZONE:
*vp = INT_TO_JSVAL(cfg->sys_timezone);
break;
case SYS_PROP_NODES:
*vp = INT_TO_JSVAL(cfg->sys_nodes);
break;
case SYS_PROP_LASTNODE:
*vp = INT_TO_JSVAL(cfg->sys_lastnode);
break;
case SYS_PROP_PWDAYS:
*vp = INT_TO_JSVAL(cfg->sys_pwdays);
break;
case SYS_PROP_DELDAYS:
*vp = INT_TO_JSVAL(cfg->sys_deldays);
break;
case SYS_PROP_LASTUSERON:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, lastuseron));
break;
case SYS_PROP_FREEDISKSPACE:
*vp = INT_TO_JSVAL(getfreediskspace(cfg->temp_dir));
break;
}
return(TRUE);
}
static JSBool js_system_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
jsint tiny;
scfg_t* cfg;
if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
return JS_FALSE;
tiny = JSVAL_TO_INT(id);
switch(tiny) {
case SYS_PROP_MISC:
JS_ValueToInt32(cx, *vp, &cfg->sys_misc);
break;
}
return(TRUE);
}
#define SYSOBJ_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
static struct JSPropertySpec js_system_properties[] = {
/* name, tinyid, flags, getter, setter */
{ "name", SYS_PROP_NAME, SYSOBJ_FLAGS, NULL, NULL },
{ "operator", SYS_PROP_OP, SYSOBJ_FLAGS, NULL, NULL },
{ "qwk_id", SYS_PROP_ID, SYSOBJ_FLAGS, NULL, NULL },
{ "settings", SYS_PROP_MISC, JSPROP_ENUMERATE, NULL, NULL },
{ "psname", SYS_PROP_PSNAME, SYSOBJ_FLAGS, NULL, NULL },
{ "psnum", SYS_PROP_PSNUM, SYSOBJ_FLAGS, NULL, NULL },
{ "inetaddr", SYS_PROP_INETADDR, SYSOBJ_FLAGS, NULL, NULL },
{ "location", SYS_PROP_LOCATION, SYSOBJ_FLAGS, NULL, NULL },
{ "timezone", SYS_PROP_TIMEZONE, SYSOBJ_FLAGS, NULL, NULL },
{ "nodes", SYS_PROP_NODES, SYSOBJ_FLAGS, NULL, NULL },
{ "lastnode", SYS_PROP_LASTNODE, SYSOBJ_FLAGS, NULL, NULL },
{ "pwdays", SYS_PROP_PWDAYS, SYSOBJ_FLAGS, NULL, NULL },
{ "deldays", SYS_PROP_DELDAYS, SYSOBJ_FLAGS, NULL, NULL },
{ "freediskspace", SYS_PROP_FREEDISKSPACE, SYSOBJ_FLAGS, NULL, NULL },
{0}
};
static JSClass js_system_class = {
"System" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_system_get /* getProperty */
,js_system_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
/* System Stats Propertiess */
enum {
SYSSTAT_PROP_LOGONS
,SYSSTAT_PROP_LTODAY
,SYSSTAT_PROP_TIMEON
,SYSSTAT_PROP_TTODAY
,SYSSTAT_PROP_ULS
,SYSSTAT_PROP_ULB
,SYSSTAT_PROP_DLS
,SYSSTAT_PROP_DLB
,SYSSTAT_PROP_PTODAY
,SYSSTAT_PROP_ETODAY
,SYSSTAT_PROP_FTODAY
,SYSSTAT_PROP_NUSERS
,SYSSTAT_PROP_TOTALUSERS
,SYSSTAT_PROP_TOTALFILES
,SYSSTAT_PROP_TOTALMSGS
,SYSSTAT_PROP_TOTALMAIL
,SYSSTAT_PROP_FEEDBACK
};
static JSBool js_sysstats_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
jsint tiny;
scfg_t* cfg;
stats_t stats;
uint i;
ulong l;
if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
return JS_FALSE;
tiny = JSVAL_TO_INT(id);
if(!getstats(cfg, 0, &stats))
return(FALSE);
switch(tiny) {
case SYSSTAT_PROP_LOGONS:
*vp = INT_TO_JSVAL(stats.logons);
break;
case SYSSTAT_PROP_LTODAY:
*vp = INT_TO_JSVAL(stats.ltoday);
break;
case SYSSTAT_PROP_TIMEON:
*vp = INT_TO_JSVAL(stats.timeon);
break;
case SYSSTAT_PROP_TTODAY:
*vp = INT_TO_JSVAL(stats.ttoday);
break;
case SYSSTAT_PROP_ULS:
*vp = INT_TO_JSVAL(stats.uls);
break;
case SYSSTAT_PROP_ULB:
*vp = INT_TO_JSVAL(stats.ulb);
break;
case SYSSTAT_PROP_DLS:
*vp = INT_TO_JSVAL(stats.dls);
break;
case SYSSTAT_PROP_DLB:
*vp = INT_TO_JSVAL(stats.dlb);
break;
case SYSSTAT_PROP_PTODAY:
*vp = INT_TO_JSVAL(stats.ptoday);
break;
case SYSSTAT_PROP_ETODAY:
*vp = INT_TO_JSVAL(stats.etoday);
break;
case SYSSTAT_PROP_FTODAY:
*vp = INT_TO_JSVAL(stats.ftoday);
break;
case SYSSTAT_PROP_NUSERS:
*vp = INT_TO_JSVAL(stats.nusers);
break;
case SYSSTAT_PROP_TOTALUSERS:
*vp = INT_TO_JSVAL(lastuser(cfg));
break;
case SYSSTAT_PROP_TOTALMSGS:
l=0;
for(i=0;i<cfg->total_subs;i++)
l+=getposts(cfg,i);
*vp = INT_TO_JSVAL(l);
break;
case SYSSTAT_PROP_TOTALFILES:
l=0;
for(i=0;i<cfg->total_dirs;i++)
l+=getfiles(cfg,i);
*vp = INT_TO_JSVAL(l);
break;
case SYSSTAT_PROP_TOTALMAIL:
*vp = INT_TO_JSVAL(getmail(cfg, 0,0));
break;
case SYSSTAT_PROP_FEEDBACK:
*vp = INT_TO_JSVAL(getmail(cfg, 1,0));
break;
}
return(TRUE);
}
#define SYSSTAT_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
static struct JSPropertySpec js_sysstats_properties[] = {
/* name, tinyid, flags, getter, setter */
{ "total_logons", SYSSTAT_PROP_LOGONS, SYSSTAT_FLAGS, NULL, NULL },
{ "logons_today", SYSSTAT_PROP_LTODAY, SYSSTAT_FLAGS, NULL, NULL },
{ "total_timeon", SYSSTAT_PROP_TIMEON, SYSSTAT_FLAGS, NULL, NULL },
{ "timeon_today", SYSSTAT_PROP_TTODAY, SYSSTAT_FLAGS, NULL, NULL },
{ "total_files", SYSSTAT_PROP_TOTALFILES, SYSSTAT_FLAGS, NULL, NULL },
{ "files_uploaded_today", SYSSTAT_PROP_ULS, SYSSTAT_FLAGS, NULL, NULL },
{ "bytes_uploaded_today", SYSSTAT_PROP_ULB, SYSSTAT_FLAGS, NULL, NULL },
{ "files_downloaded_today", SYSSTAT_PROP_DLS, SYSSTAT_FLAGS, NULL, NULL },
{ "bytes_downloaded_today", SYSSTAT_PROP_DLB, SYSSTAT_FLAGS, NULL, NULL },
{ "total_messages", SYSSTAT_PROP_TOTALMSGS, SYSSTAT_FLAGS, NULL, NULL },
{ "messages_posted_today", SYSSTAT_PROP_PTODAY, SYSSTAT_FLAGS, NULL, NULL },
{ "total_email", SYSSTAT_PROP_TOTALMAIL, SYSSTAT_FLAGS, NULL, NULL },
{ "email_sent_today", SYSSTAT_PROP_ETODAY, SYSSTAT_FLAGS, NULL, NULL },
{ "total_feedback", SYSSTAT_PROP_FEEDBACK, SYSSTAT_FLAGS, NULL, NULL },
{ "feedback_sent_today", SYSSTAT_PROP_FTODAY, SYSSTAT_FLAGS, NULL, NULL },
{ "total_users", SYSSTAT_PROP_TOTALUSERS, SYSSTAT_FLAGS, NULL, NULL },
{ "new_users_today", SYSSTAT_PROP_NUSERS, SYSSTAT_FLAGS, NULL, NULL },
{0}
};
static JSClass js_sysstats_class = {
"Stats" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_sysstats_get /* getProperty */
,JS_PropertyStub /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
extern const char* beta_version;
JSObject* DLLCALL js_CreateSystemObject(scfg_t* cfg, JSContext* cx, JSObject* parent)
{
char str[256];
jsval val;
JSObject* sysobj;
JSObject* statsobj;
sysobj = JS_DefineObject(cx, parent, "system", &js_system_class, NULL, 0);
if(sysobj==NULL)
return(NULL);
if(!JS_SetPrivate(cx, sysobj, cfg)) /* Store a pointer to scfg_t */
return(NULL);
/****************************/
/* static string properties */
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, VERSION));
if(!JS_SetProperty(cx, sysobj, "version", &val))
return(NULL);
sprintf(str,"%c",REVISION);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, str));
if(!JS_SetProperty(cx, sysobj, "revision", &val))
return(NULL);
sprintf(str,"%s%c%s",VERSION,REVISION,beta_version);
truncsp(str);
#if defined(_DEBUG)
strcat(str," Debug");
#endif
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, str));
if(!JS_SetProperty(cx, sysobj, "full_version", &val))
return(NULL);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, VERSION_NOTICE));
if(!JS_SetProperty(cx, sysobj, "version_notice", &val))
return(NULL);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, PLATFORM_DESC));
if(!JS_SetProperty(cx, sysobj, "platform", &val))
return(NULL);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, socklib_version(str)));
if(!JS_SetProperty(cx, sysobj, "socket_lib", &val))
return(NULL);
sprintf(str,"SMBLIB %s",smb_lib_ver());
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, str));
if(!JS_SetProperty(cx, sysobj, "msgbase_lib", &val))
return(NULL);
COMPILER_DESC(str);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, str));
if(!JS_SetProperty(cx, sysobj, "compiled_with", &val))
return(NULL);
sprintf(str,"%s %.5s",__DATE__,__TIME__);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, str));
if(!JS_SetProperty(cx, sysobj, "compiled_when", &val))
return(NULL);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, COPYRIGHT_NOTICE));
if(!JS_SetProperty(cx, sysobj, "copyright", &val))
return(NULL);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx
,(char *)JS_GetImplementationVersion()));
if(!JS_SetProperty(cx, sysobj, "js_version", &val))
return(NULL);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,os_version(str)));
if(!JS_SetProperty(cx, sysobj, "os_version", &val))
return(NULL);
/***********************/
if(!JS_DefineProperties(cx, sysobj, js_system_properties))
return(NULL);
statsobj = JS_DefineObject(cx, sysobj, "stats", &js_sysstats_class, NULL, 0);
if(statsobj==NULL)
return(NULL);
JS_SetPrivate(cx, statsobj, cfg); /* Store a pointer to scfg_t */
if(!JS_DefineProperties(cx, statsobj, js_sysstats_properties))
return(NULL);
return(sysobj);
}
#endif /* JAVSCRIPT */
\ No newline at end of file
/* userobj.c */
/* Synchronet JavaScript "User" Object */
/* $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
/* User Object Properites */
enum {
USER_PROP_ALIAS
,USER_PROP_NAME
,USER_PROP_HANDLE
,USER_PROP_NOTE
,USER_PROP_COMP
,USER_PROP_COMMENT
,USER_PROP_NETMAIL
,USER_PROP_ADDRESS
,USER_PROP_LOCATION
,USER_PROP_ZIPCODE
,USER_PROP_PASS
,USER_PROP_PHONE
,USER_PROP_BIRTH
,USER_PROP_MODEM
,USER_PROP_LASTON
,USER_PROP_FIRSTON
,USER_PROP_EXPIRE
,USER_PROP_PWMOD
,USER_PROP_LOGONS
,USER_PROP_LTODAY
,USER_PROP_TIMEON
,USER_PROP_TEXTRA
,USER_PROP_TTODAY
,USER_PROP_TLAST
,USER_PROP_POSTS
,USER_PROP_EMAILS
,USER_PROP_FBACKS
,USER_PROP_ETODAY
,USER_PROP_PTODAY
,USER_PROP_ULB
,USER_PROP_ULS
,USER_PROP_DLB
,USER_PROP_DLS
,USER_PROP_CDT
,USER_PROP_MIN
,USER_PROP_LEVEL
,USER_PROP_FLAGS1
,USER_PROP_FLAGS2
,USER_PROP_FLAGS3
,USER_PROP_FLAGS4
,USER_PROP_EXEMPT
,USER_PROP_REST
,USER_PROP_ROWS
,USER_PROP_SEX
,USER_PROP_MISC
,USER_PROP_LEECH
,USER_PROP_CURSUB
,USER_PROP_CURDIR
,USER_PROP_FREECDT
,USER_PROP_XEDIT
,USER_PROP_SHELL
,USER_PROP_QWK
,USER_PROP_TMPEXT
,USER_PROP_CHAT
,USER_PROP_NS_TIME
,USER_PROP_PROT
};
static JSBool js_user_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
jsint tiny;
user_t* user;
if((user=(user_t*)JS_GetPrivate(cx,obj))==NULL)
return JS_FALSE;
tiny = JSVAL_TO_INT(id);
switch(tiny) {
case USER_PROP_MISC:
JS_ValueToInt32(cx, *vp, &user->misc);
break;
}
return(TRUE);
}
static JSBool js_user_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
char* p=NULL;
char tmp[128];
ulong val;
jsint tiny;
user_t* user;
if((user=(user_t*)JS_GetPrivate(cx,obj))==NULL)
return JS_FALSE;
tiny = JSVAL_TO_INT(id);
switch(tiny) {
case USER_PROP_ALIAS:
p=user->alias;
break;
case USER_PROP_NAME:
p=user->name;
break;
case USER_PROP_HANDLE:
p=user->handle;
break;
case USER_PROP_NOTE:
p=user->note;
break;
case USER_PROP_COMP:
p=user->comp;
break;
case USER_PROP_COMMENT:
p=user->comment;
break;
case USER_PROP_NETMAIL:
p=user->netmail;
break;
case USER_PROP_ADDRESS:
p=user->address;
break;
case USER_PROP_LOCATION:
p=user->location;
break;
case USER_PROP_ZIPCODE:
p=user->zipcode;
break;
case USER_PROP_PASS:
p=user->pass;
break;
case USER_PROP_PHONE:
p=user->phone;
break;
case USER_PROP_BIRTH:
p=user->birth;
break;
case USER_PROP_MODEM:
p=user->modem;
break;
case USER_PROP_LASTON:
val=user->laston;
break;
case USER_PROP_FIRSTON:
val=user->firston;
break;
case USER_PROP_EXPIRE:
val=user->expire;
break;
case USER_PROP_PWMOD:
val=user->pwmod;
break;
case USER_PROP_LOGONS:
val=user->logons;
break;
case USER_PROP_LTODAY:
val=user->ltoday;
break;
case USER_PROP_TIMEON:
val=user->timeon;
break;
case USER_PROP_TEXTRA:
val=user->textra;
break;
case USER_PROP_TTODAY:
val=user->ttoday;
break;
case USER_PROP_TLAST:
val=user->tlast;
break;
case USER_PROP_POSTS:
val=user->posts;
break;
case USER_PROP_EMAILS:
val=user->emails;
break;
case USER_PROP_FBACKS:
val=user->fbacks;
break;
case USER_PROP_ETODAY:
val=user->etoday;
break;
case USER_PROP_PTODAY:
val=user->ptoday;
break;
case USER_PROP_ULB:
val=user->ulb;
break;
case USER_PROP_ULS:
val=user->uls;
break;
case USER_PROP_DLB:
val=user->dlb;
break;
case USER_PROP_DLS:
val=user->dls;
break;
case USER_PROP_CDT:
val=user->cdt;
break;
case USER_PROP_MIN:
val=user->min;
break;
case USER_PROP_LEVEL:
val=user->level;
break;
case USER_PROP_FLAGS1:
val=user->flags1;
break;
case USER_PROP_FLAGS2:
val=user->flags2;
break;
case USER_PROP_FLAGS3:
val=user->flags3;
break;
case USER_PROP_FLAGS4:
val=user->flags4;
break;
case USER_PROP_EXEMPT:
val=user->exempt;
break;
case USER_PROP_REST:
val=user->rest;
break;
case USER_PROP_ROWS:
val=user->rows;
break;
case USER_PROP_SEX:
sprintf(tmp,"%c",user->sex);
p=tmp;
break;
case USER_PROP_MISC:
val=user->misc;
break;
case USER_PROP_LEECH:
val=user->leech;
break;
case USER_PROP_CURSUB:
p=user->cursub;
break;
case USER_PROP_CURDIR:
p=user->curdir;
break;
case USER_PROP_FREECDT:
val=user->freecdt;
break;
case USER_PROP_XEDIT:
val=user->xedit;
break;
case USER_PROP_SHELL:
val=user->shell;
break;
case USER_PROP_QWK:
val=user->qwk;
break;
case USER_PROP_TMPEXT:
p=user->tmpext;
break;
case USER_PROP_CHAT:
val=user->laston;
break;
case USER_PROP_NS_TIME:
val=user->laston;
break;
case USER_PROP_PROT:
sprintf(tmp,"%c",user->prot);
p=tmp;
break;
default:
return(TRUE);
}
if(p!=NULL)
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, p));
else
*vp = INT_TO_JSVAL(val);
return(TRUE);
}
#define USEROBJ_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
static struct JSPropertySpec js_user_properties[] = {
/* name ,tinyid ,flags, getter, setter */
{ "alias" ,USER_PROP_ALIAS ,USEROBJ_FLAGS, NULL,NULL},
{ "name" ,USER_PROP_NAME ,USEROBJ_FLAGS, NULL,NULL},
{ "handle" ,USER_PROP_HANDLE ,USEROBJ_FLAGS, NULL,NULL},
{ "note" ,USER_PROP_NOTE ,USEROBJ_FLAGS, NULL,NULL},
{ "ip_address" ,USER_PROP_NOTE ,USEROBJ_FLAGS, NULL,NULL},
{ "computer" ,USER_PROP_COMP ,USEROBJ_FLAGS, NULL,NULL},
{ "host_name" ,USER_PROP_COMP ,USEROBJ_FLAGS, NULL,NULL},
{ "comment" ,USER_PROP_COMMENT ,USEROBJ_FLAGS, NULL,NULL},
{ "netmail" ,USER_PROP_NETMAIL ,USEROBJ_FLAGS, NULL,NULL},
{ "email" ,USER_PROP_NETMAIL ,USEROBJ_FLAGS, NULL,NULL},
{ "address" ,USER_PROP_ADDRESS ,USEROBJ_FLAGS, NULL,NULL},
{ "location" ,USER_PROP_LOCATION ,USEROBJ_FLAGS, NULL,NULL},
{ "zipcode" ,USER_PROP_ZIPCODE ,USEROBJ_FLAGS, NULL,NULL},
{ "phone" ,USER_PROP_PHONE ,USEROBJ_FLAGS, NULL,NULL},
{ "birthdate" ,USER_PROP_BIRTH ,USEROBJ_FLAGS, NULL,NULL},
{ "modem" ,USER_PROP_MODEM ,USEROBJ_FLAGS, NULL,NULL},
{ "connection" ,USER_PROP_MODEM ,USEROBJ_FLAGS, NULL,NULL},
{ "screen_rows" ,USER_PROP_ROWS ,USEROBJ_FLAGS, NULL,NULL},
{ "gender" ,USER_PROP_SEX ,USEROBJ_FLAGS, NULL,NULL},
{ "cursub" ,USER_PROP_CURSUB ,USEROBJ_FLAGS, NULL,NULL},
{ "curdir" ,USER_PROP_CURDIR ,USEROBJ_FLAGS, NULL,NULL},
{ "editor" ,USER_PROP_XEDIT ,USEROBJ_FLAGS, NULL,NULL},
{ "command_shell" ,USER_PROP_SHELL ,USEROBJ_FLAGS, NULL,NULL},
{ "settings" ,USER_PROP_MISC ,USEROBJ_FLAGS, NULL,NULL},
{ "qwk_settings" ,USER_PROP_QWK ,USEROBJ_FLAGS, NULL,NULL},
{ "chat_settings" ,USER_PROP_CHAT ,USEROBJ_FLAGS, NULL,NULL},
{ "temp_file_ext" ,USER_PROP_TMPEXT ,USEROBJ_FLAGS, NULL,NULL},
{ "newscan_date" ,USER_PROP_NS_TIME ,USEROBJ_FLAGS, NULL,NULL},
{ "download_protocol" ,USER_PROP_PROT ,USEROBJ_FLAGS, NULL,NULL},
{0}
};
/* user.stats: These should be READ ONLY by nature */
static struct JSPropertySpec js_user_stats_properties[] = {
/* name ,tinyid ,flags, getter, setter */
{ "laston_date" ,USER_PROP_LASTON ,USEROBJ_FLAGS, NULL,NULL},
{ "firston_date" ,USER_PROP_FIRSTON ,USEROBJ_FLAGS, NULL,NULL},
{ "total_logons" ,USER_PROP_LOGONS ,USEROBJ_FLAGS, NULL,NULL},
{ "logons_today" ,USER_PROP_LTODAY ,USEROBJ_FLAGS, NULL,NULL},
{ "total_timeon" ,USER_PROP_TIMEON ,USEROBJ_FLAGS, NULL,NULL},
{ "timeon_today" ,USER_PROP_TTODAY ,USEROBJ_FLAGS, NULL,NULL},
{ "timeon_last_logon" ,USER_PROP_TLAST ,USEROBJ_FLAGS, NULL,NULL},
{ "total_posts" ,USER_PROP_POSTS ,USEROBJ_FLAGS, NULL,NULL},
{ "total_emails" ,USER_PROP_EMAILS ,USEROBJ_FLAGS, NULL,NULL},
{ "total_feedbacks" ,USER_PROP_FBACKS ,USEROBJ_FLAGS, NULL,NULL},
{ "email_today" ,USER_PROP_ETODAY ,USEROBJ_FLAGS, NULL,NULL},
{ "posts_today" ,USER_PROP_PTODAY ,USEROBJ_FLAGS, NULL,NULL},
{ "bytes_uploaded" ,USER_PROP_ULB ,USEROBJ_FLAGS, NULL,NULL},
{ "files_uploaded" ,USER_PROP_ULS ,USEROBJ_FLAGS, NULL,NULL},
{ "bytes_downloaded" ,USER_PROP_DLB ,USEROBJ_FLAGS, NULL,NULL},
{ "files_downloaded" ,USER_PROP_DLS ,USEROBJ_FLAGS, NULL,NULL},
{ "leech_attempts" ,USER_PROP_LEECH ,USEROBJ_FLAGS, NULL,NULL},
{0}
};
/* user.security */
static struct JSPropertySpec js_user_security_properties[] = {
/* name ,tinyid ,flags, getter, setter */
{ "password" ,USER_PROP_PASS ,USEROBJ_FLAGS, NULL,NULL},
{ "password_date" ,USER_PROP_PWMOD ,USEROBJ_FLAGS, NULL,NULL},
{ "level" ,USER_PROP_LEVEL ,USEROBJ_FLAGS, NULL,NULL},
{ "flags1" ,USER_PROP_FLAGS1 ,USEROBJ_FLAGS, NULL,NULL},
{ "flags2" ,USER_PROP_FLAGS2 ,USEROBJ_FLAGS, NULL,NULL},
{ "flags3" ,USER_PROP_FLAGS3 ,USEROBJ_FLAGS, NULL,NULL},
{ "flags4" ,USER_PROP_FLAGS4 ,USEROBJ_FLAGS, NULL,NULL},
{ "exemptions" ,USER_PROP_EXEMPT ,USEROBJ_FLAGS, NULL,NULL},
{ "restrictions" ,USER_PROP_REST ,USEROBJ_FLAGS, NULL,NULL},
{ "credits" ,USER_PROP_CDT ,USEROBJ_FLAGS, NULL,NULL},
{ "free_credits" ,USER_PROP_FREECDT ,USEROBJ_FLAGS, NULL,NULL},
{ "minutes" ,USER_PROP_MIN ,USEROBJ_FLAGS, NULL,NULL},
{ "extra_time" ,USER_PROP_TEXTRA ,USEROBJ_FLAGS, NULL,NULL},
{ "expiration_date" ,USER_PROP_EXPIRE ,USEROBJ_FLAGS, NULL,NULL},
{0}
};
static JSClass js_user_class = {
"User" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
static JSClass js_user_stats_class = {
"UserStats" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
static JSClass js_user_security_class = {
"UserSecurity" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
JSObject* DLLCALL js_CreateUserObject(scfg_t* cfg, JSContext* cx, JSObject* parent, char* name, user_t* user)
{
JSObject* userobj;
JSObject* statsobj;
JSObject* securityobj;
userobj = JS_DefineObject(cx, parent, name, &js_user_class, NULL, 0);
if(userobj==NULL)
return(NULL);
JS_SetPrivate(cx, userobj, user); /* Store a pointer to user_t */
JS_DefineProperties(cx, userobj, js_user_properties);
/* user.stats */
statsobj = JS_DefineObject(cx, userobj, "stats"
,&js_user_stats_class, NULL, 0);
if(statsobj==NULL)
return(NULL);
JS_SetPrivate(cx, statsobj, user); /* Store a pointer to user_t */
JS_DefineProperties(cx, statsobj, js_user_stats_properties);
/* user.security */
securityobj = JS_DefineObject(cx, userobj, "security"
,&js_user_security_class, NULL, 0);
if(securityobj==NULL)
return(NULL);
JS_SetPrivate(cx, securityobj, user); /* Store a pointer to user_t */
JS_DefineProperties(cx, securityobj, js_user_security_properties);
return(userobj);
}
#endif /* JAVSCRIPT */
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment