diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c index 11f88b64ffddd9131c7464c601c0eb8bb84ce850..edffb2e5b37a703fce4a09c4898a914d6d2a198f 100644 --- a/src/sbbs3/js_msgbase.c +++ b/src/sbbs3/js_msgbase.c @@ -561,6 +561,7 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval * jsint items; jsval v; JSBool by_offset=JS_FALSE; + JSBool expand_fields=JS_TRUE; private_t* p; *rval = JSVAL_NULL; @@ -575,10 +576,19 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval * memset(&msg,0,sizeof(msg)); + /* Parse boolean arguments first */ for(n=0;n<argc;n++) { - if(JSVAL_IS_BOOLEAN(argv[n])) + if(!JSVAL_IS_BOOLEAN(argv[n])) + continue; + if(n) + expand_fields=JSVAL_TO_BOOLEAN(argv[n]); + else by_offset=JSVAL_TO_BOOLEAN(argv[n]); - else if(JSVAL_IS_NUMBER(argv[n])) { + } + + /* Now parse message offset/id and get message */ + for(n=0;n<argc;n++) { + if(JSVAL_IS_NUMBER(argv[n])) { if(by_offset) /* Get by offset */ JS_ValueToInt32(cx,argv[n],(int32*)&msg.offset); else /* Get by number */ @@ -671,31 +681,38 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval * ,STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE); - JS_DefineProperty(cx, hdrobj, "to_agent",INT_TO_JSVAL(msg.to_agent) - ,NULL,NULL,JSPROP_ENUMERATE); - JS_DefineProperty(cx, hdrobj, "from_agent",INT_TO_JSVAL(msg.from_agent) - ,NULL,NULL,JSPROP_ENUMERATE); - JS_DefineProperty(cx, hdrobj, "replyto_agent",INT_TO_JSVAL(msg.replyto_agent) - ,NULL,NULL,JSPROP_ENUMERATE); + if(expand_fields || msg.to_agent) + JS_DefineProperty(cx, hdrobj, "to_agent",INT_TO_JSVAL(msg.to_agent) + ,NULL,NULL,JSPROP_ENUMERATE); + if(expand_fields || msg.from_agent) + JS_DefineProperty(cx, hdrobj, "from_agent",INT_TO_JSVAL(msg.from_agent) + ,NULL,NULL,JSPROP_ENUMERATE); + if(expand_fields || msg.replyto_agent) + JS_DefineProperty(cx, hdrobj, "replyto_agent",INT_TO_JSVAL(msg.replyto_agent) + ,NULL,NULL,JSPROP_ENUMERATE); - JS_DefineProperty(cx, hdrobj, "to_net_type",INT_TO_JSVAL(msg.to_net.type) - ,NULL,NULL,JSPROP_ENUMERATE); + if(expand_fields || msg.to_net.type) + JS_DefineProperty(cx, hdrobj, "to_net_type",INT_TO_JSVAL(msg.to_net.type) + ,NULL,NULL,JSPROP_ENUMERATE); if(msg.to_net.type && (js_str=JS_NewStringCopyZ(cx,net_addr(&msg.to_net)))!=NULL) JS_DefineProperty(cx, hdrobj, "to_net_addr" ,STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE); - JS_DefineProperty(cx, hdrobj, "from_net_type",INT_TO_JSVAL(msg.from_net.type) - ,NULL,NULL,JSPROP_ENUMERATE); + if(expand_fields || msg.from_net.type) + JS_DefineProperty(cx, hdrobj, "from_net_type",INT_TO_JSVAL(msg.from_net.type) + ,NULL,NULL,JSPROP_ENUMERATE); if(msg.from_net.type && (js_str=JS_NewStringCopyZ(cx,net_addr(&msg.from_net)))!=NULL) JS_DefineProperty(cx, hdrobj, "from_net_addr" ,STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE); - JS_DefineProperty(cx, hdrobj, "replyto_net_type",INT_TO_JSVAL(msg.replyto_net.type) - ,NULL,NULL,JSPROP_ENUMERATE); + + if(expand_fields || msg.replyto_net.type) + JS_DefineProperty(cx, hdrobj, "replyto_net_type",INT_TO_JSVAL(msg.replyto_net.type) + ,NULL,NULL,JSPROP_ENUMERATE); if(msg.replyto_net.type && (js_str=JS_NewStringCopyZ(cx,net_addr(&msg.replyto_net)))!=NULL) JS_DefineProperty(cx, hdrobj, "replyto_net_addr" @@ -724,17 +741,24 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval * JS_DefineProperty(cx, hdrobj, "from_port" ,INT_TO_JSVAL(*port) ,NULL,NULL,JSPROP_ENUMERATE); - - JS_DefineProperty(cx, hdrobj, "forwarded",INT_TO_JSVAL(msg.forwarded) - ,NULL,NULL,JSPROP_ENUMERATE); - JS_NewNumberValue(cx,msg.expiration,&v); - JS_DefineProperty(cx, hdrobj, "expiration",v,NULL,NULL,JSPROP_ENUMERATE); - JS_NewNumberValue(cx,msg.priority,&v); - JS_DefineProperty(cx, hdrobj, "priority",v,NULL,NULL,JSPROP_ENUMERATE); - JS_NewNumberValue(cx,msg.cost,&v); - JS_DefineProperty(cx, hdrobj, "cost",v,NULL,NULL,JSPROP_ENUMERATE); - + + if(expand_fields || msg.forwarded) + JS_DefineProperty(cx, hdrobj, "forwarded",INT_TO_JSVAL(msg.forwarded) + ,NULL,NULL,JSPROP_ENUMERATE); + if(expand_fields || msg.expiration) { + JS_NewNumberValue(cx,msg.expiration,&v); + JS_DefineProperty(cx, hdrobj, "expiration",v,NULL,NULL,JSPROP_ENUMERATE); + } + if(expand_fields || msg.priority) { + JS_NewNumberValue(cx,msg.priority,&v); + JS_DefineProperty(cx, hdrobj, "priority",v,NULL,NULL,JSPROP_ENUMERATE); + } + if(expand_fields || msg.cost) { + JS_NewNumberValue(cx,msg.cost,&v); + JS_DefineProperty(cx, hdrobj, "cost",v,NULL,NULL,JSPROP_ENUMERATE); + } + /* Fixed length portion of msg header */ JS_DefineProperty(cx, hdrobj, "type", INT_TO_JSVAL(msg.hdr.type) ,NULL,NULL,JSPROP_ENUMERATE); JS_DefineProperty(cx, hdrobj, "version", INT_TO_JSVAL(msg.hdr.version) @@ -783,7 +807,7 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval * val=msg.reply_id; else { reply_id[0]=0; - if(msg.hdr.thread_orig) { + if(expand_fields && msg.hdr.thread_orig) { memset(&orig_msg,0,sizeof(orig_msg)); orig_msg.hdr.number=msg.hdr.thread_orig; if(smb_getmsgidx(&(p->smb), &orig_msg)) @@ -799,13 +823,15 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval * ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE); /* Message-ID */ - SAFECOPY(msg_id,get_msgid(scfg,p->smb.subnum,&msg)); - val=msg_id; - if((js_str=JS_NewStringCopyZ(cx,truncsp(val)))==NULL) - return(JS_FALSE); - JS_DefineProperty(cx, hdrobj, "id" - ,STRING_TO_JSVAL(js_str) - ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE); + if(expand_fields || msg.id!=NULL) { + SAFECOPY(msg_id,get_msgid(scfg,p->smb.subnum,&msg)); + val=msg_id; + if((js_str=JS_NewStringCopyZ(cx,truncsp(val)))==NULL) + return(JS_FALSE); + JS_DefineProperty(cx, hdrobj, "id" + ,STRING_TO_JSVAL(js_str) + ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE); + } /* USENET Fields */ if(msg.path!=NULL @@ -1541,8 +1567,10 @@ static jsSyncMethodSpec js_msgbase_functions[] = { ,JSDOCSTR("close message base (if open)") ,310 }, - {"get_msg_header", js_get_msg_header, 2, JSTYPE_OBJECT, JSDOCSTR("[boolean by_offset,] number_or_id") - ,JSDOCSTR("returns a specific message header, <i>null</i> on failure") + {"get_msg_header", js_get_msg_header, 2, JSTYPE_OBJECT, JSDOCSTR("[boolean by_offset,] number_or_id [,boolean expand_fields]") + ,JSDOCSTR("returns a specific message header, <i>null</i> on failure. " + "Pass <i>false</i> for the <i>expand_fields</i> argument (default: <i>true</i>) " + "if you will be re-writing the header later with <i>put_msg_header()</i>") ,310 }, {"put_msg_header", js_put_msg_header, 2, JSTYPE_BOOLEAN, JSDOCSTR("[boolean by_offset,] number, object header")