Newer
Older
fail = true;
break;
if(!fail) {
rc=JS_SUSPENDREQUEST(cx);
sbbs->telnet_gate(addr,mode|TG_RLOGIN,client_user_name,server_user_name,term_type);
JS_RESUMEREQUEST(cx, rc);
FREE_AND_NULL(addr);
FREE_AND_NULL(client_user_name);
FREE_AND_NULL(server_user_name);
FREE_AND_NULL(term_type);
return(fail ? JS_FALSE : JS_TRUE);
js_pagesysop(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_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->sysop_page()));
JS_RESUMEREQUEST(cx, rc);
js_pageguru(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_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");
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
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);
}
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
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));