Newer
Older
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(argc>1 && JSVAL_IS_NUMBER(argv[1])) {
if(!JS_ValueToInt32(cx,argv[1],&channel))
return JS_FALSE;
}
rc=JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_private_message(JSContext *cx, uintN argc, jsval *arglist)
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_private_chat(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
JSBool local=false;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(argc)
JS_ValueToBoolean(cx,argv[0],&local);
rc=JS_SUSPENDREQUEST(cx);
sbbs->privchat(local ? true:false); // <- eliminates stupid msvc6 "performance warning"
JS_RESUMEREQUEST(cx, rc);
js_get_node_message(JSContext *cx, uintN argc, jsval *arglist)
jsval* argv=JS_ARGV(cx, arglist);
JSBool clearline = false;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(argc > 0 && JSVAL_IS_BOOLEAN(argv[0]))
clearline = JSVAL_TO_BOOLEAN(argv[0]);
rc=JS_SUSPENDREQUEST(cx);
sbbs->getnmsg(clearline ? true : false);
JS_RESUMEREQUEST(cx, rc);
js_put_node_message(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
char* msg = NULL;
char str[256];
char tmp[512];
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
/* Get the destination node number */
if(argn < argc && JSVAL_IS_NUMBER(argv[argn])) {
if(!JS_ValueToInt32(cx,argv[argn], &nodenum))
argn++;
} else {
rc=JS_SUSPENDREQUEST(cx);
nodenum = sbbs->getnodetopage(/* all: */TRUE, /* telegram: */FALSE);
JS_RESUMEREQUEST(cx, rc);
if(nodenum == 0)
return JS_TRUE;
int usernumber = 0;
node_t node;
if(nodenum >= 1) { /* !all */
sbbs->getnodedat(nodenum, &node, false);
usernumber = node.useron;
if((node.misc&NODE_POFF) && sbbs->useron.level < SYSOP_LEVEL) {
sbbs->bprintf(sbbs->text[CantPageNode]
, node.misc&NODE_ANON ? sbbs->text[UNKNOWN_USER] : username(&sbbs->cfg,node.useron,tmp));
return JS_TRUE;
}
}
/* Get the node message text */
if(argn < argc) {
if((js_msg = JS_ValueToString(cx, argv[argn])) == NULL)
return JS_FALSE;
argn++;
JSSTRING_TO_MSTRING(cx, js_msg, msg, NULL);
} else {
if(nodenum >= 1)
sbbs->bprintf(sbbs->text[SendingMessageToUser]
,node.misc&NODE_ANON ? sbbs->text[UNKNOWN_USER]
: username(&sbbs->cfg,node.useron, tmp)
,node.misc&NODE_ANON ? 0 : node.useron);
sbbs->bputs(sbbs->text[NodeMsgPrompt]);
rc=JS_SUSPENDREQUEST(cx);
char line[128];
int result = sbbs->getstr(line,69,K_LINE);
JS_RESUMEREQUEST(cx, rc);
if(result < 1)
return JS_TRUE;
sprintf(str, sbbs->text[nodenum >= 1 ? NodeMsgFmt : AllNodeMsgFmt]
,sbbs->cfg.node_num
,sbbs->thisnode.misc&NODE_ANON
? sbbs->text[UNKNOWN_USER] : sbbs->useron.alias, line);
msg = strdup(str);
}
if(msg == NULL)
return JS_FALSE;
/* Send the message(s) */
BOOL success = TRUE;
rc=JS_SUSPENDREQUEST(cx);
if(nodenum < 0 ) { /* ALL */
for(int i=1; i<=sbbs->cfg.sys_nodes && success; i++) {
if(i==sbbs->cfg.node_num)
continue;
sbbs->getnodedat(i, &node, false);
if((node.status==NODE_INUSE
|| (sbbs->useron.level >= SYSOP_LEVEL && node.status==NODE_QUIET))
&& (sbbs->useron.level >= SYSOP_LEVEL || !(node.misc&NODE_POFF)))
if(putnmsg(&sbbs->cfg, i, msg) != 0)
success = FALSE;
}
if(success) {
sbbs->logline("C", "sent message to all nodes");
sbbs->logline(nulstr, msg);
success = putnmsg(&sbbs->cfg, nodenum, msg) == 0;
if(success && !(node.misc&NODE_ANON))
sbbs->bprintf(sbbs->text[MsgSentToUser],"Message"
,username(&sbbs->cfg,usernumber,tmp), usernumber);
SAFEPRINTF3(str, "%s message to %s on node %d:"
,success ? "sent" : "FAILED to send", username(&sbbs->cfg, usernumber, tmp), nodenum);
sbbs->logline("C",str);
sbbs->logline(nulstr, msg);
}
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(success));
JS_RESUMEREQUEST(cx, rc);
js_get_telegram(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
int32 usernumber;
JSBool clearline = false;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(argc && JSVAL_IS_NUMBER(argv[0])) {
if(!JS_ValueToInt32(cx,argv[0],&usernumber))
return JS_FALSE;
}
if(argc > 1 && JSVAL_IS_BOOLEAN(argv[1]))
clearline = JSVAL_TO_BOOLEAN(argv[1]);
rc=JS_SUSPENDREQUEST(cx);
sbbs->getsmsg(usernumber, clearline ? true : false);
JS_RESUMEREQUEST(cx, rc);
js_put_telegram(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
uintN argn = 0;
int32 usernumber = 0;
JSString* js_msg = NULL;
char* msg = NULL;
char str[256];
char tmp[512];
char logbuf[512] = "";
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
/* Get the destination user number */
if(argn < argc && JSVAL_IS_NUMBER(argv[argn])) {
if(!JS_ValueToInt32(cx,argv[argn], &usernumber))
argn++;
} else {
rc=JS_SUSPENDREQUEST(cx);
usernumber = sbbs->getnodetopage(/* all: */FALSE, /* telegram: */TRUE);
JS_RESUMEREQUEST(cx, rc);
}
/* Validate the destination user number */
if(usernumber < 1)
return JS_TRUE;
if(usernumber == 1 && sbbs->useron.rest&FLAG('S')) { /* ! val fback */
sbbs->bprintf(sbbs->text[R_Feedback], sbbs->cfg.sys_op);
return JS_TRUE;
}
if(usernumber > 1 && sbbs->useron.rest&FLAG('E')) {
sbbs->bputs(sbbs->text[R_Email]);
return JS_TRUE;
/* Get the telegram message text */
if(argn < argc) {
if((js_msg = JS_ValueToString(cx, argv[argn])) == NULL)
return JS_FALSE;
argn++;
JSSTRING_TO_MSTRING(cx, js_msg, msg, NULL);
} else {
char buf[512];
rc=JS_SUSPENDREQUEST(cx);
sbbs->bprintf(sbbs->text[SendingTelegramToUser]
,username(&sbbs->cfg,usernumber,tmp),usernumber);
SAFEPRINTF2(buf,sbbs->text[TelegramFmt]
,sbbs->thisnode.misc&NODE_ANON ? sbbs->text[UNKNOWN_USER] : sbbs->useron.alias
,sbbs->timestr(time(NULL)));
int i=0;
while(sbbs->online && i<5) {
char line[256];
sbbs->bputs("\1n: \1h");
if(!sbbs->getstr(line, 70, i < 4 ? (K_WRAP|K_MSG) : (K_MSG)))
break;
sprintf(str,"%4s%s\r\n",nulstr,line);
SAFECAT(buf, str);
if(i && line[0])
SAFECAT(logbuf, " ");
SAFECAT(logbuf, line);
i++;
}
JS_RESUMEREQUEST(cx, rc);
if(!i)
return JS_TRUE;
if(sbbs->sys_status&SS_ABORT) {
sbbs->bputs(crlf);
return JS_TRUE;
}
msg = strdup(buf);
}
rc=JS_SUSPENDREQUEST(cx);
bool success = putsmsg(&sbbs->cfg,usernumber,msg)==0;
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(success));
SAFEPRINTF3(str,"%s telegram to %s #%u"
,success ? "sent" : "FAILED to send", username(&sbbs->cfg,usernumber,tmp), usernumber);
sbbs->logline("C",str);
if(logbuf[0])
sbbs->logline(nulstr,logbuf);
if(success)
sbbs->bprintf(sbbs->text[MsgSentToUser], "Telegram", username(&sbbs->cfg,usernumber,tmp), usernumber);
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_cmdstr(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
char* p = NULL;
const char *def="";
char* fpath=(char *)def;
char* fspec=(char *)def;
JSString* js_str;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(!js_argc(cx, argc, 1))
return(JS_FALSE);
js_str = JS_ValueToString(cx, argv[0]);
if (!js_str)
return(JS_FALSE);
if(p == NULL)
return JS_FALSE;
for(uintN i=1;i<argc;i++) {
if(JSVAL_IS_STRING(argv[i])) {
js_str = JS_ValueToString(cx, argv[i]);
if(fpath==def) {
JSSTRING_TO_MSTRING(cx, js_str, fpath, NULL);
if(fpath==NULL) {
if(fspec != def)
free(fspec);
free(p);
}
}
else if(fspec==def) {
JSSTRING_TO_MSTRING(cx, js_str, fspec, NULL);
if(fspec==NULL) {
if(fpath != def)
free(fpath);
free(p);
}
}
}
rc=JS_SUSPENDREQUEST(cx);
char* cmd = sbbs->cmdstr(p, fpath, fspec, NULL);
free(p);
if(fpath != def)
free(fpath);
if(fspec != def)
free(fspec);
JS_RESUMEREQUEST(cx, rc);
if((js_str=JS_NewStringCopyZ(cx, cmd))==NULL)
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
static JSBool
js_getfilespec(JSContext *cx, uintN argc, jsval *arglist)
{
char* p;
char tmp[128];
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
p=sbbs->getfilespec(tmp);
JS_RESUMEREQUEST(cx, rc);
if(p==NULL)
JS_SET_RVAL(cx, arglist,JSVAL_NULL);
else {
JSString* js_str = JS_NewStringCopyZ(cx, p);
if(js_str==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
static JSBool
js_listfiles(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
uint32 mode=0;
char* afspec=NULL;
char buf[MAX_PATH+1];
uint dirnum;
JSString* js_str;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
dirnum=get_dirnum(cx,sbbs,argv[0], argc == 0);
if(dirnum>=sbbs->cfg.total_dirs) {
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
return(JS_TRUE);
}
for(uintN i=1;i<argc;i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
if(!JS_ValueToECMAUint32(cx,argv[i],&mode)) {
if(fspec != def)
FREE_AND_NULL(fspec);
else if(JSVAL_IS_STRING(argv[i])) {
js_str = JS_ValueToString(cx, argv[i]);
if(fspec != def)
FREE_AND_NULL(fspec);
JSSTRING_TO_MSTRING(cx, js_str, afspec, NULL);
if(afspec==NULL)
fspec=afspec;
}
}
rc=JS_SUSPENDREQUEST(cx);
if(!(mode&(FL_FINDDESC|FL_EXFIND)))
fspec=padfname(fspec,buf);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(sbbs->listfiles(dirnum,fspec,0 /* tofile */,mode)));
if(afspec)
free(afspec);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_listfileinfo(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
uint32 mode=FI_INFO;
const char *def=ALLFILES;
char* fspec=(char *)def;
char buf[MAX_PATH+1];
uint dirnum;
JSString* js_str;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
dirnum=get_dirnum(cx,sbbs,argv[0], argc == 0);
if(dirnum>=sbbs->cfg.total_dirs) {
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
return(JS_TRUE);
}
for(uintN i=1;i<argc;i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
if(!JS_ValueToECMAUint32(cx,argv[i],&mode))
return JS_FALSE;
}
else if(JSVAL_IS_STRING(argv[i])) {
js_str = JS_ValueToString(cx, argv[i]);
if(fspec != def && fspec != NULL)
free(fspec);
JSSTRING_TO_MSTRING(cx, js_str, fspec, NULL);
if(fspec==NULL)
return JS_FALSE;
}
}
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(sbbs->listfileinfo(dirnum,padfname(fspec,buf),mode)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_post_msg(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
uint32 mode=0;
uint subnum;
uintN n;
JSObject* hdrobj;
sbbs_t* sbbs;
smb_t* resmb = NULL;
smbmsg_t* remsg = NULL;
smbmsg_t msg;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
subnum=get_subnum(cx,sbbs,argv,argc,0);
if(subnum>=sbbs->cfg.total_subs) // invalid sub-board
return(JS_TRUE);
ZERO_VAR(msg);
for(n=1; n<argc; n++) {
if(JSVAL_IS_NUMBER(argv[n])) {
if(!JS_ValueToECMAUint32(cx,argv[n],&mode))
return JS_FALSE;
}
else if(JSVAL_IS_OBJECT(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &resmb, &remsg, /* post: */NULL)) {
if(!js_ParseMsgHeaderObject(cx, hdrobj, &msg))
return JS_FALSE;
remsg = &msg;
}
}
}
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->postmsg(subnum, mode, resmb, remsg)));
smb_freemsgmem(&msg);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_show_msg(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
uint32 p_mode = 0;
uintN n;
JSObject* hdrobj;
sbbs_t* sbbs;
smb_t* smb = NULL;
smbmsg_t* msg = NULL;
post_t* post = NULL;
jsrefcount rc;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
for(n=0; n<argc; n++) {
if(JSVAL_IS_NUMBER(argv[n])) {
if(!JS_ValueToECMAUint32(cx, argv[n], &p_mode))
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
return JS_FALSE;
}
else if(JSVAL_IS_OBJECT(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &smb, &msg, &post)) {
return JS_FALSE;
}
}
}
if(smb == NULL || msg == NULL)
return JS_TRUE;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->show_msg(smb, msg, p_mode, post)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_show_msg_header(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
uintN n;
JSObject* hdrobj;
sbbs_t* sbbs;
smb_t* smb = NULL;
smbmsg_t* msg = NULL;
char* subject = NULL;
char* from = NULL;
char* to = NULL;
jsrefcount rc;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
for(n=0; n<argc; n++) {
if(JSVAL_IS_OBJECT(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &smb, &msg, NULL)) {
return JS_FALSE;
}
} else if(JSVAL_IS_STRING(argv[n])) {
JSString* str = JS_ValueToString(cx, argv[n]);
if(subject == NULL) {
JSSTRING_TO_MSTRING(cx, str, subject, NULL);
} else if(from == NULL) {
JSSTRING_TO_MSTRING(cx, str, from, NULL);
} else if(to == NULL) {
JSSTRING_TO_MSTRING(cx, str, to, NULL);
}
}
}
if(smb == NULL || msg == NULL)
return JS_TRUE;
rc=JS_SUSPENDREQUEST(cx);
sbbs->show_msghdr(smb, msg, subject, from, to);
FREE_AND_NULL(subject);
FREE_AND_NULL(from);
FREE_AND_NULL(to);
static JSBool
js_download_msg_attachments(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
uintN n;
JSObject* hdrobj;
sbbs_t* sbbs;
smb_t* smb = NULL;
smbmsg_t* msg = NULL;
bool del = true;
jsrefcount rc;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
for(n=0; n<argc; n++) {
if(JSVAL_IS_OBJECT(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &smb, &msg, NULL)) {
return JS_FALSE;
}
} else if(JSVAL_IS_BOOLEAN(argv[n])) {
del = JSVAL_TO_BOOLEAN(argv[n]) ? true : false;
}
}
if(smb == NULL || msg == NULL)
return JS_TRUE;
rc=JS_SUSPENDREQUEST(cx);
sbbs->download_msg_attachments(smb, msg, del);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_msgscan_cfg(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
uint32 mode=SUB_CFG_NSCAN;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(argc && JSVAL_IS_NUMBER(argv[0])) {
if(!JS_ValueToECMAUint32(cx,argv[0],&mode))
return JS_FALSE;
}
rc=JS_SUSPENDREQUEST(cx);
sbbs->new_scan_cfg(mode);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_msgscan_ptrs(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
sbbs->new_scan_ptr_cfg();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_msgscan_reinit(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
for(uint i=0;i<sbbs->cfg.total_subs;i++) {
sbbs->subscan[i].ptr=sbbs->subscan[i].sav_ptr;
sbbs->subscan[i].last=sbbs->subscan[i].sav_last;
}
sbbs->bputs(sbbs->text[MsgPtrsInitialized]);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_scansubs(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
uint32 mode=SCAN_NEW;
BOOL all=FALSE;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
for(uintN i=0;i<argc;i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
if(!JS_ValueToECMAUint32(cx,argv[i],&mode))
return JS_FALSE;
}
else if(JSVAL_IS_BOOLEAN(argv[i]))
all=JSVAL_TO_BOOLEAN(argv[i]);
}
rc=JS_SUSPENDREQUEST(cx);
if(all)
sbbs->scanallsubs(mode);
else
sbbs->scansubs(mode);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_scandirs(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
uint32 mode=0;
BOOL all=FALSE;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
for(uintN i=0;i<argc;i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
if(!JS_ValueToECMAUint32(cx,argv[i],&mode))
return JS_FALSE;
}
else if(JSVAL_IS_BOOLEAN(argv[i]))
all=JSVAL_TO_BOOLEAN(argv[i]);
}
rc=JS_SUSPENDREQUEST(cx);
if(all)
sbbs->scanalldirs(mode);
else
sbbs->scandirs(mode);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_scanposts(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
const char *def="";
char* find=(char *)def;
uint32 mode=0;
uint subnum;
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
subnum=get_subnum(cx,sbbs,argv,argc,0);
if(subnum>=sbbs->cfg.total_subs) { // invalid sub-board
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
return(JS_TRUE);
}
for(uintN i=1;i<argc;i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
if(!JS_ValueToECMAUint32(cx,argv[i],&mode)) {
if(find != def)
free(find);
}
else if(JSVAL_IS_STRING(argv[i]) && find==def) {
JSVALUE_TO_MSTRING(cx, argv[i], find, NULL);
if(find==NULL)
return JS_FALSE;
}
}
if(*find)
mode|=SCAN_FIND;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->scanposts(subnum,mode,find)==0));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_listmsgs(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
const char *def="";
char* find=(char *)def;
uint32 mode=0;
uint32 start=0;
uint subnum;
sbbs_t* sbbs;
uintN argn=0;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
subnum=get_subnum(cx,sbbs,argv,argc,argn++);
if(subnum>=sbbs->cfg.total_subs) // invalid sub-board
return(JS_TRUE);
if(argc > argn && JSVAL_IS_NUMBER(argv[argn])) {
if(!JS_ValueToECMAUint32(cx,argv[argn++],&mode))
return JS_FALSE;
}
if(argc > argn && JSVAL_IS_NUMBER(argv[argn])) {
if(!JS_ValueToECMAUint32(cx,argv[argn++],&start))
return JS_FALSE;
}
if(argc > argn && JSVAL_IS_STRING(argv[argn])) {
JSVALUE_TO_MSTRING(cx, argv[argn], find, NULL);
argn++;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(sbbs->listsub(subnum,mode,start,find)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_getnstime(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
time_t t=time(NULL);
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
if(argc && JSVAL_IS_NUMBER(argv[0])) {
uint32 i;
if(!JS_ValueToECMAUint32(cx,argv[0],&i))
t = i;
rc=JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist,DOUBLE_TO_JSVAL((double)t));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_select_shell(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->select_shell()));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_select_editor(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->select_editor()));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_get_time_left(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)