Newer
Older
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->guru_page()));
JS_RESUMEREQUEST(cx, rc);
js_multinode_chat(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
int32 channel=1;
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]) && !JSVAL_IS_NULL(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)) {
JS_ReportError(cx, "msg hdr object cannot be parsed");
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))
else if(JSVAL_IS_OBJECT(argv[n]) && !JSVAL_IS_NULL(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &smb, &msg, &post)) {
JS_ReportError(cx, "msg hdr object lacks privates");
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
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);
if(JSVAL_IS_OBJECT(argv[n]) && !JSVAL_IS_NULL(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL) {
JS_ReportError(cx, "invalid object argument");
}
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &smb, &msg, NULL)) {
JS_ReportError(cx, "msg hdr object lacks privates");
} 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]) && !JSVAL_IS_NULL(argv[n])) {
if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &smb, &msg, NULL)) {
JS_ReportError(cx, "msg hdr object lacks privates");
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);
}
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
static JSBool
js_change_msg_attr(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
JSObject* hdrobj;
sbbs_t* sbbs;
smbmsg_t* msg = NULL;
jsrefcount rc;
if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(argc < 1 || !JSVAL_IS_OBJECT(argv[0]) || JSVAL_IS_NULL(argv[0]))
return JS_TRUE;
if((hdrobj=JSVAL_TO_OBJECT(argv[0]))==NULL)
return JS_FALSE;
if(!js_GetMsgHeaderObjectPrivates(cx, hdrobj, NULL, &msg, NULL)) {
JS_ReportError(cx, "msg hdr object lacks privates");
return JS_FALSE;
}
if(msg == NULL)
return JS_TRUE;
rc=JS_SUSPENDREQUEST(cx);
int32 attr = sbbs->chmsgattr(*msg);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(attr));
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=SCAN_INDEX;
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))