Newer
Older
/* Synchronet JavaScript "MsgBase" Object */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 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 *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#include "js_request.h"
#include "userdat.h"
#include <stdbool.h>
#ifdef JAVASCRIPT
typedef struct
{
smb_t smb;
int smb_result;
BOOL debug;
} private_t;
typedef struct
{
private_t *p;
BOOL expand_fields;
smbmsg_t msg;
} privatemsg_t;
/* Destructor */
static void js_finalize_msgbase(JSContext *cx, JSObject *obj)
{
private_t* p;
if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
return;
if(SMB_IS_OPEN(&(p->smb)))
smb_close(&(p->smb));
free(p);
JS_SetPrivate(cx, obj, NULL);
}
/* Methods */
extern JSClass js_msgbase_class;
static JSBool
js_open(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
private_t* p;
scfg_t* scfg;
scfg = JS_GetRuntimePrivate(JS_GetRuntime(cx));
if(scfg == NULL) {
JS_ReportError(cx, "JS_GetRuntimePrivate returned NULL");
return JS_FALSE;
}
if((p=(private_t*)js_GetClassPrivate(cx, obj, &js_msgbase_class))==NULL) {
}
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if(p->smb.subnum==INVALID_SUB
&& strchr(p->smb.file,'/')==NULL
&& strchr(p->smb.file,'\\')==NULL) {
JS_ReportError(cx,"Unrecognized msgbase code: %s",p->smb.file);
}
rc=JS_SUSPENDREQUEST(cx);
if((p->smb_result = smb_open_sub(scfg, &(p->smb), p->smb.subnum)) != SMB_SUCCESS) {
JS_RESUMEREQUEST(cx, rc);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
}
js_close(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
if((p=(private_t*)js_GetClassPrivate(cx, obj, &js_msgbase_class))==NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc=JS_SUSPENDREQUEST(cx);
smb_close(&(p->smb));
JS_RESUMEREQUEST(cx, rc);
static BOOL parse_recipient_object(JSContext* cx, private_t* p, JSObject* hdr, smbmsg_t* msg)
char* cp=NULL;
size_t cp_sz=0;
char to[256];
ushort nettype=NET_UNKNOWN;
ushort agent;
int32 i32;
jsval val;
scfg_t* scfg;
int smb_result = SMB_SUCCESS;
scfg = JS_GetRuntimePrivate(JS_GetRuntime(cx));
if(JS_GetProperty(cx, hdr, "to", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"to\" string in recipient object");
return(FALSE);
} else {
if((p != NULL) && (p->smb.status.attr&SMB_EMAIL)) { /* e-mail */
JS_ReportError(cx, "\"to\" property not included in email recipient object");
return(FALSE); /* "to" property required */
}
if((smb_result = smb_hfield_str(msg, RECIPIENT, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENT field to message header", smb_result);
goto err;
if((p != NULL) && !(p->smb.status.attr&SMB_EMAIL)) {
SAFECOPY(to,cp);
strlwr(to);
msg->idx.to=crc16(to,0);
}
if(JS_GetProperty(cx, hdr, "to_list", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"to_list\" string in recipient object");
return(FALSE);
}
if((smb_result = smb_hfield_str(msg, RECIPIENTLIST, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTLIST field to message header", smb_result);
goto err;
}
}
if(JS_GetProperty(cx, hdr, "cc_list", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"cc_list\" string in recipient object");
return(FALSE);
}
if((smb_result = smb_hfield_str(msg, SMB_CARBONCOPY, cp))!=SMB_SUCCESS) {
free(cp);
JS_ReportError(cx, "Error %d adding SMB_CARBONCOPY field to message header", smb_result);
goto err;
}
}
if(JS_GetProperty(cx, hdr, "to_ext", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"to_ext\" string in recipient object");
if((smb_result = smb_hfield_str(msg, RECIPIENTEXT, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTEXT field to message header", smb_result);
goto err;
if((p != NULL) && (p->smb.status.attr&SMB_EMAIL))
if(JS_GetProperty(cx, hdr, "to_org", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"to_org\" string in recipient object");
if((smb_result = smb_hfield_str(msg, RECIPIENTORG, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTORG field to message header", smb_result);
goto err;
if(JS_GetProperty(cx, hdr, "to_net_type", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32)) {
free(cp);
return(FALSE);
if(JS_GetProperty(cx, hdr, "to_net_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"to_net_addr\" string in recipient object");
if((smb_result = smb_hfield_netaddr(msg, RECIPIENTNETADDR, cp, &nettype))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTADDR field to message header", smb_result);
goto err;

rswindell
committed
if(nettype!=NET_UNKNOWN) {
if((p != NULL) && (p->smb.status.attr&SMB_EMAIL)) {
if(nettype==NET_QWK && msg->idx.to==0) {
char fulladdr[128];
msg->idx.to = qwk_route(scfg, msg->to_net.addr, fulladdr, sizeof(fulladdr)-1);
if(fulladdr[0]==0) {
JS_ReportError(cx, "Unroutable QWKnet \"to_net_addr\" (%s) in recipient object"
,msg->to_net.addr);
return(FALSE);
}
if((smb_result = smb_hfield_str(msg, RECIPIENTNETADDR, fulladdr))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTADDR field to message header"
,smb_result);
goto err;
}
if(msg->idx.to != 0) {
char ext[32];
sprintf(ext,"%u",msg->idx.to);
if((smb_result = smb_hfield_str(msg, RECIPIENTEXT, ext))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTEXT field to message header"
,smb_result);
goto err;
}
}
} else
msg->idx.to=0;
}
if((smb_result = smb_hfield_bin(msg, RECIPIENTNETTYPE, nettype))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTNETTYPE field to message header", smb_result);
goto err;
if(JS_GetProperty(cx, hdr, "to_agent", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
return FALSE;
if((smb_result = smb_hfield_bin(msg, RECIPIENTAGENT, agent))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RECIPIENTAGENT field to message header", smb_result);
goto err;
return(TRUE);
err:
if(smb_result != SMB_SUCCESS && p != NULL)
p->smb_result = smb_result;
return(FALSE);
}
static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbmsg_t* msg
,BOOL recipient)
{
char* cp=NULL;
size_t cp_sz=0;
char from[256];
ushort nettype=NET_UNKNOWN;
ushort type;
ushort agent;
int32 i32;
JSObject* array;
JSObject* field;
jsuint i,len;
int smb_result = SMB_SUCCESS;
if(hdr==NULL) {
JS_ReportError(cx, "NULL header object");
if(recipient && !parse_recipient_object(cx,p,hdr,msg))
if(msg->hdr.type != SMB_MSG_TYPE_BALLOT) {
/* Required Header Fields */
if(JS_GetProperty(cx, hdr, "subject", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"subject\" string in header object");
goto err;
}
} else
cp=strdup("");
if((smb_result = smb_hfield_str(msg, SUBJECT, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SUBJECT field to message header", smb_result);
msg->idx.subj=smb_subject_crc(cp);
if(JS_GetProperty(cx, hdr, "from", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from\" string in header object");
}
} else {
JS_ReportError(cx, "\"from\" property required in header");
goto err; /* "from" property required */
if((smb_result = smb_hfield_str(msg, SENDER, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDER field to message header", smb_result);
if((p != NULL) && !(p->smb.status.attr&SMB_EMAIL) && msg->hdr.type != SMB_MSG_TYPE_BALLOT) {
SAFECOPY(from,cp);
strlwr(from);
msg->idx.from=crc16(from,0);
}
if(JS_GetProperty(cx, hdr, "from_ext", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_ext\" string in header object");
if((smb_result = smb_hfield_str(msg, SENDEREXT, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDEREXT field to message header", smb_result);
if((p != NULL) && (p->smb.status.attr&SMB_EMAIL))
if(JS_GetProperty(cx, hdr, "from_org", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_org\" string in header object");
if((smb_result = smb_hfield_str(msg, SENDERORG, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERORG field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "from_net_type", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32)) {
goto err;
}
nettype=(ushort)i32;
if(JS_GetProperty(cx, hdr, "from_net_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_net_addr\" string in header object");
if((smb_result = smb_hfield_netaddr(msg, SENDERNETADDR, cp, &nettype))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERNETADDR field to message header", smb_result);

rswindell
committed
if(nettype!=NET_UNKNOWN) {
if((p != NULL) && (p->smb.status.attr&SMB_EMAIL))
msg->idx.from=0;
if((smb_result = smb_hfield_bin(msg, SENDERNETTYPE, nettype))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERNETTYPE field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "from_agent", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
agent=(ushort)i32;
if((smb_result = smb_hfield_bin(msg, SENDERAGENT, agent))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERAGENT field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "from_ip_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_ip_addr\" string in header object");
if((smb_result = smb_hfield_str(msg, SENDERIPADDR, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERIPADDR field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "from_host_name", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_host_name\" string in header object");
if((smb_result = smb_hfield_str(msg, SENDERHOSTNAME, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERHOSTNAME field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "from_protocol", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_protocol\" string in header object");
if((smb_result = smb_hfield_str(msg, SENDERPROTOCOL, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERPROTOCOL field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "from_port", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"from_port\" string in header object");
if((smb_result = smb_hfield_str(msg, SENDERPORT, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERPORT field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "sender_userid", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"sender_userid\" string in header object");
}
if((smb_result = smb_hfield_str(msg, SENDERUSERID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERUSERID field to message header", smb_result);
}
}
if(JS_GetProperty(cx, hdr, "sender_server", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"sender_server\" string in header object");
}
if((smb_result = smb_hfield_str(msg, SENDERSERVER, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERSERVER field to message header", smb_result);
}
}
if(JS_GetProperty(cx, hdr, "sender_time", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"sender_time\" string in header object");
}
if((smb_result = smb_hfield_str(msg, SENDERTIME, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SENDERTIME field to message header", smb_result);
}
}
if(JS_GetProperty(cx, hdr, "replyto", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"replyto\" string in header object");
if((smb_result = smb_hfield_str(msg, REPLYTO, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTO field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "replyto_ext", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"replyto_ext\" string in header object");
if((smb_result = smb_hfield_str(msg, REPLYTOEXT, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTOEXT field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "replyto_org", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"replyto_org\" string in header object");
if((smb_result = smb_hfield_str(msg, REPLYTOORG, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTOORG field to message header", smb_result);
nettype=NET_UNKNOWN;
if(JS_GetProperty(cx, hdr, "replyto_net_type", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
nettype=(ushort)i32;
if(JS_GetProperty(cx, hdr, "replyto_net_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"replyto_net_addr\" string in header object");
if((smb_result = smb_hfield_netaddr(msg, REPLYTONETADDR, cp, &nettype))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTONETADDR field to message header", smb_result);
}

rswindell
committed
if(nettype!=NET_UNKNOWN) {
if((smb_result = smb_hfield_bin(msg, REPLYTONETTYPE, nettype))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTONETTYPE field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "replyto_agent", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
agent=(ushort)i32;
if((smb_result = smb_hfield_bin(msg, REPLYTOAGENT, agent))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTOAGENT field to message header", smb_result);
/* RFC822 headers */
if(JS_GetProperty(cx, hdr, "replyto_list", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"replyto_list\" string in header object");
goto err;
}
if((smb_result = smb_hfield_str(msg, REPLYTOLIST, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding REPLYTOLIST field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "id", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"id\" string in header object");
if((smb_result = smb_hfield_str(msg, RFC822MSGID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RFC822MSGID field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "reply_id", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"reply_id\" string in header object");
if((smb_result = smb_hfield_str(msg, RFC822REPLYID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding RFC822REPLYID field to message header", smb_result);
}
/* SMTP headers */
if(JS_GetProperty(cx, hdr, "reverse_path", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"reverse_path\" string in header object");
if((smb_result = smb_hfield_str(msg, SMTPREVERSEPATH, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SMTPREVERSEPATH field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "forward_path", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"forward_path\" string in header object");
if((smb_result = smb_hfield_str(msg, SMTPFORWARDPATH, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding SMTPFORWARDPATH field to message header", smb_result);
}
/* USENET headers */
if(JS_GetProperty(cx, hdr, "path", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"path\" string in header object");
if((smb_result = smb_hfield_str(msg, USENETPATH, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding USENETPATH field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "newsgroups", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"newsgroups\" string in header object");
if((smb_result = smb_hfield_str(msg, USENETNEWSGROUPS, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding USENETNEWSGROUPS field to message header", smb_result);
}
/* FTN headers */
if(JS_GetProperty(cx, hdr, "ftn_msgid", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_msgid\" string in header object");
if((smb_result = smb_hfield_str(msg, FIDOMSGID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOMSGID field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "ftn_reply", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_reply\" string in header object");
if((smb_result = smb_hfield_str(msg, FIDOREPLYID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOREPLYID field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "ftn_area", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_area\" string in header object");
if((smb_result = smb_hfield_str(msg, FIDOAREA, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOAREA field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "ftn_flags", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_flags\" string in header object");
if((smb_result = smb_hfield_str(msg, FIDOFLAGS, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOFLAGS field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "ftn_pid", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_pid\" string in header object");
if((smb_result = smb_hfield_str(msg, FIDOPID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOPID field to message header", smb_result);
if(JS_GetProperty(cx, hdr, "ftn_tid", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_tid\" string in header object");
if((smb_result = smb_hfield_str(msg, FIDOTID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOTID field to message header", smb_result);
}
if(JS_GetProperty(cx, hdr, "ftn_charset", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_charset\" string in header object");
goto err;
}
if((smb_result = smb_hfield_str(msg, FIDOCHARSET, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOCHARSET field to message header", smb_result);
goto err;
}
}
if(JS_GetProperty(cx, hdr, "ftn_bbsid", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"ftn_bbsid\" string in header object");
goto err;
}
if((smb_result = smb_hfield_str(msg, FIDOBBSID, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding FIDOBBSID field to message header", smb_result);
goto err;
}
}
if(JS_GetProperty(cx, hdr, "date", &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"date\" string in header object");
msg->hdr.when_written=rfc822date(cp);
}
const char* prop_name = "summary";
uint16_t hfield_type = SMB_SUMMARY;
if(JS_GetProperty(cx, hdr, prop_name, &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"%s\" string in header object", prop_name);
goto err;
}
if((smb_result = smb_hfield_str(msg, hfield_type, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding %s field to message header", smb_result, smb_hfieldtype(hfield_type));
goto err;
}
}
prop_name = "tags";
hfield_type = SMB_TAGS;
if(JS_GetProperty(cx, hdr, prop_name, &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"%s\" string in header object", prop_name);
goto err;
}
if((smb_result = smb_hfield_str(msg, hfield_type, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding %s field to message header", smb_result, smb_hfieldtype(hfield_type));
goto err;
}
}
prop_name = "editor";
hfield_type = SMB_EDITOR;
if(JS_GetProperty(cx, hdr, prop_name, &val) && !JSVAL_NULL_OR_VOID(val)) {
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid \"%s\" string in header object", prop_name);
goto err;
}
if((smb_result = smb_hfield_str(msg, hfield_type, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding %s field to message header", smb_result, smb_hfieldtype(hfield_type));
goto err;
}
}
prop_name = "columns";
hfield_type = SMB_COLUMNS;
if(JS_GetProperty(cx, hdr, prop_name, &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToECMAUint32(cx, val, &u32)) {
JS_ReportError(cx, "Invalid \"%s\" number in header object", prop_name);
goto err;
}
uint8_t u8 = u32;
if((smb_result = smb_hfield_bin(msg, hfield_type, u8))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding %s field to message header", smb_result, smb_hfieldtype(hfield_type));
goto err;
}
}
if(JS_GetProperty(cx, hdr, "attr", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.attr=(ushort)i32;
msg->idx.attr=msg->hdr.attr;
}
if(JS_GetProperty(cx, hdr, "votes", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
goto err;
msg->hdr.votes=(ushort)i32;
if(msg->hdr.type == SMB_MSG_TYPE_BALLOT)
msg->idx.votes=msg->hdr.votes;
if(JS_GetProperty(cx, hdr, "auxattr", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToECMAUint32(cx,val,&u32))
if(JS_GetProperty(cx, hdr, "netattr", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.netattr=i32;
}
if(JS_GetProperty(cx, hdr, "when_written_time", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.when_written.time=i32;
}
if(JS_GetProperty(cx, hdr, "when_written_zone", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.when_written.zone=(short)i32;
}
if(JS_GetProperty(cx, hdr, "when_imported_time", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.when_imported.time=i32;
}
if(JS_GetProperty(cx, hdr, "when_imported_zone", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.when_imported.zone=(short)i32;
}
if(JS_GetProperty(cx, hdr, "thread_id", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.thread_id=i32;
}
if((JS_GetProperty(cx, hdr, "thread_orig", &val) && (!JSVAL_NULL_OR_VOID(val)))
|| (JS_GetProperty(cx, hdr, "thread_back", &val) && !JSVAL_NULL_OR_VOID(val))) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.thread_back=i32;
if(JS_GetProperty(cx, hdr, "thread_next", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.thread_next=i32;
}
if(JS_GetProperty(cx, hdr, "thread_first", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.thread_first=i32;
}
if(JS_GetProperty(cx, hdr, "delivery_attempts", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
goto err;
msg->hdr.delivery_attempts=i32;
}
if(JS_GetProperty(cx, hdr, "priority", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
goto err;
msg->hdr.priority=i32;
}
if(JS_GetProperty(cx, hdr, "field_list", &val) && JSVAL_IS_OBJECT(val)) {
array=JSVAL_TO_OBJECT(val);
len=0;
if(!JS_GetArrayLength(cx, array, &len)) {
JS_ReportError(cx, "Invalid \"field_list\" array in header object");
for(i=0;i<len;i++) {
if(!JS_GetElement(cx, array, i, &val))
continue;
if(!JSVAL_IS_OBJECT(val))
continue;
field=JSVAL_TO_OBJECT(val);
if(!JS_GetProperty(cx, field, "type", &val))
continue;
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
else {
if(!JS_ValueToInt32(cx,val,&i32))
type=(ushort)i32;
}
if(!JS_GetProperty(cx, field, "data", &val))
continue;
JSVALUE_TO_RASTRING(cx, val, cp, &cp_sz, NULL);
HANDLE_PENDING(cx, cp);
if(cp==NULL) {
JS_ReportError(cx, "Invalid data string in \"field_list\" array");
if((smb_result = smb_hfield_str(msg, type, cp))!=SMB_SUCCESS) {
JS_ReportError(cx, "Error %d adding field (type %02Xh) to message header", smb_result, type);
}
}
if(msg->hdr.number==0 && JS_GetProperty(cx, hdr, "number", &val) && !JSVAL_NULL_OR_VOID(val)) {
if(!JS_ValueToInt32(cx,val,&i32))
msg->hdr.number=i32;
}
return(TRUE);
if(smb_result != SMB_SUCCESS && p != NULL)
p->smb_result = smb_result;
if(cp)
free(cp);
return(FALSE);
}
/* obj *may* have been previously returned from get_msg_header() */
BOOL js_ParseMsgHeaderObject(JSContext* cx, JSObject* obj, smbmsg_t* msg)
privatemsg_t* p;
p=(privatemsg_t*)JS_GetPrivate(cx,obj);
if(!parse_header_object(cx, p == NULL ? NULL : p->p, obj, msg, /* recipient */ TRUE)) {
smb_freemsgmem(msg);
return(FALSE);
}
/* obj must've been previously returned from get_msg_header() */
BOOL js_GetMsgHeaderObjectPrivates(JSContext* cx, JSObject* obj, smb_t** smb, smbmsg_t** msg, post_t** post)
{
privatemsg_t* p;
if((p=(privatemsg_t*)JS_GetPrivate(cx,obj))==NULL)
return FALSE;
if(smb != NULL) {
if(p->p == NULL)
return FALSE;
*smb = &(p->p->smb);
}
if(msg != NULL)
*msg = &p->msg;
return TRUE;
}
static BOOL msg_offset_by_id(private_t* p, char* id, int32_t* offset)
{
smbmsg_t msg;
if((p->smb_result = smb_getmsgidx_by_msgid(&(p->smb),&msg,id))!=SMB_SUCCESS)
return(FALSE);
*offset = msg.idx_offset;
return(TRUE);
}
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
static bool set_msg_idx_properties(JSContext* cx, JSObject* obj, idxrec_t* idx, int32_t offset)
{
jsval val;
val = UINT_TO_JSVAL(idx->number);
if(!JS_DefineProperty(cx, obj, "number" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
if(idx->attr&MSG_VOTE && !(idx->attr&MSG_POLL)) {
val=UINT_TO_JSVAL(idx->votes);
if(!JS_DefineProperty(cx, obj, "votes" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
val=UINT_TO_JSVAL(idx->remsg);
if(!JS_DefineProperty(cx, obj, "remsg" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
} else { /* normal message */
val=UINT_TO_JSVAL(idx->to);
if(!JS_DefineProperty(cx, obj, "to" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
val=UINT_TO_JSVAL(idx->from);
if(!JS_DefineProperty(cx, obj, "from" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
val=UINT_TO_JSVAL(idx->subj);
if(!JS_DefineProperty(cx, obj, "subject" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
}
val=UINT_TO_JSVAL(idx->attr);
if(!JS_DefineProperty(cx, obj, "attr" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
// confusingly, this is the msg.offset, not the idx.offset value
val=INT_TO_JSVAL(offset);
if(!JS_DefineProperty(cx, obj, "offset" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
val=UINT_TO_JSVAL(idx->time);
if(!JS_DefineProperty(cx, obj, "time" ,val
,NULL,NULL,JSPROP_ENUMERATE))
return false;
return true;
}
static JSBool
js_get_msg_index(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
uintN n;
smbmsg_t msg;
JSObject* idxobj;
JSBool by_offset=JS_FALSE;
JSBool include_votes=JS_FALSE;
private_t* p;
JSObject* proto;
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
if((p=(private_t*)js_GetClassPrivate(cx, obj, &js_msgbase_class))==NULL) {
}
if(!SMB_IS_OPEN(&(p->smb)))
memset(&msg,0,sizeof(msg));
if(n < argc && JSVAL_IS_BOOLEAN(argv[n]))
by_offset = JSVAL_TO_BOOLEAN(argv[n++]);
for(;n<argc;n++) {
if(JSVAL_IS_BOOLEAN(argv[n]))
include_votes = JSVAL_TO_BOOLEAN(argv[n]);
else if(JSVAL_IS_NUMBER(argv[n])) {
if(by_offset) { /* Get by offset */
if(!JS_ValueToInt32(cx, argv[n], (int32*)&msg.idx_offset))
return JS_FALSE;
}
else { /* Get by number */
if(!JS_ValueToInt32(cx, argv[n], (int32*)&msg.hdr.number))
return JS_FALSE;
}
}
}
rc=JS_SUSPENDREQUEST(cx);
p->smb_result = smb_getmsgidx(&(p->smb), &msg);
JS_RESUMEREQUEST(cx, rc);
if(p->smb_result != SMB_SUCCESS)
return JS_TRUE;
if(!include_votes && (msg.idx.attr&MSG_VOTE))
return JS_TRUE;
if(JS_GetProperty(cx, JS_GetGlobalObject(cx), "MsgBase", &val) && !JSVAL_NULL_OR_VOID(val)) {
JS_ValueToObject(cx,val,&proto);
if(JS_GetProperty(cx, proto, "IndexPrototype", &val) && !JSVAL_NULL_OR_VOID(val))
JS_ValueToObject(cx,val,&proto);
else
proto=NULL;
}
else
proto=NULL;
if((idxobj=JS_NewObject(cx,NULL,proto,obj))==NULL)
set_msg_idx_properties(cx, idxobj, &msg.idx, msg.idx_offset);
JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(idxobj));
return JS_TRUE;
}
static JSBool
js_get_index(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject* obj=JS_THIS_OBJECT(cx, arglist);
jsrefcount rc;
private_t* priv;
uint32_t off;
JSObject* array;
idxrec_t* idx;
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
if((priv=(private_t*)js_GetClassPrivate(cx, obj, &js_msgbase_class))==NULL) {
return JS_FALSE;
if(!SMB_IS_OPEN(&(priv->smb)))
return JS_TRUE;
off_t index_length = filelength(fileno(priv->smb.sid_fp));
if(index_length < sizeof(*idx))
return JS_TRUE;
rc=JS_SUSPENDREQUEST(cx);
if(smb_getstatus(&(priv->smb)) != SMB_SUCCESS) {
JS_RESUMEREQUEST(cx, rc);
return JS_TRUE;
}
if((array = JS_NewArrayObject(cx, 0, NULL)) == NULL) {
JS_RESUMEREQUEST(cx, rc);
JS_ReportError(cx, "JS_NewArrayObject failure");
return JS_FALSE;
}
JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(array));
uint32_t total_msgs = (uint32_t)(index_length / sizeof(*idx));
if(total_msgs > priv->smb.status.total_msgs)
total_msgs = priv->smb.status.total_msgs;
if(total_msgs < 1) {
JS_RESUMEREQUEST(cx, rc);
return JS_TRUE;
if((idx = calloc(total_msgs, sizeof(*idx))) == NULL) {
JS_RESUMEREQUEST(cx, rc);
JS_ReportError(cx, "malloc error on line %d in %s of %s", WHERE);
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
return JS_FALSE;
}
if((priv->smb_result = smb_locksmbhdr(&(priv->smb))) != SMB_SUCCESS) {
JS_RESUMEREQUEST(cx, rc);
free(idx);
return JS_TRUE;
}
rewind(priv->smb.sid_fp);
size_t fread_result = fread(idx, sizeof(*idx), total_msgs, priv->smb.sid_fp);
smb_unlocksmbhdr(&(priv->smb));
JS_RESUMEREQUEST(cx, rc);
if(fread_result != total_msgs) {
JS_ReportError(cx, "index read failed (%lu instead of %lu)", fread_result, total_msgs);
free(idx);
return JS_FALSE;
}
for(off=0; off < total_msgs; off++) {
JSObject* idxobj;
if((idxobj = JS_NewObject(cx, NULL, NULL, array)) == NULL) {
JS_ReportError(cx, "object allocation failure, line %d", __LINE__);
free(idx);
return JS_FALSE;
}
set_msg_idx_properties(cx, idxobj, &idx[off], off);
JS_DefineElement(cx, array, off, OBJECT_TO_JSVAL(idxobj), NULL, NULL, JSPROP_ENUMERATE);
}
free(idx);
}
#define LAZY_BOOLEAN(PropName, PropValue, flags) \
if(name==NULL || strcmp(name, (PropName))==0) { \
if(name) free(name); \
JS_DefineProperty(cx, obj, (PropName), v, NULL,NULL,flags); \
if(name) return JS_TRUE; \
}
#define LAZY_INTEGER(PropName, PropValue, flags) \
if(name==NULL || strcmp(name, (PropName))==0) { \
if(name) free(name); \
v=INT_TO_JSVAL((PropValue)); \
JS_DefineProperty(cx, obj, (PropName), v, NULL,NULL,flags); \
if(name) return JS_TRUE; \
}
#define LAZY_UINTEGER(PropName, PropValue, flags) \
if(name) free(name); \
v=UINT_TO_JSVAL((PropValue)); \
JS_DefineProperty(cx, obj, (PropName), v, NULL,NULL,flags); \
if(name) return JS_TRUE; \
#define LAZY_UINTEGER_EXPAND(PropName, PropValue, flags) \
if(name) free(name); \
v=UINT_TO_JSVAL((PropValue)); \
JS_DefineProperty(cx, obj, (PropName), v, NULL,NULL,flags); \
if(name) return JS_TRUE; \
else if(name) return JS_TRUE; \
#define LAZY_UINTEGER_COND(PropName, Condition, PropValue, flags) \
if(name) free(name); \
v=UINT_TO_JSVAL((uint32_t)(PropValue)); \
JS_DefineProperty(cx, obj, (PropName), v, NULL,NULL,flags); \
if(name) return JS_TRUE; \
else if(name) return JS_TRUE; \
#define LAZY_STRING(PropName, PropValue, flags) \
if(name) free(name); \
if((js_str=JS_NewStringCopyZ(cx, (PropValue)))!=NULL) { \
JS_DefineProperty(cx, obj, PropName, STRING_TO_JSVAL(js_str), NULL, NULL, flags); \
if(name) return JS_TRUE; \
else if(name) return JS_TRUE; \
#define LAZY_STRING_TRUNCSP(PropName, PropValue, flags) \
if(name) free(name); \
if((js_str=JS_NewStringCopyZ(cx, truncsp(PropValue)))!=NULL) { \
Loading
Loading full blame...