From fdfbc651e897521b07af194fc38d4a76b13b3070 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Thu, 19 Mar 2020 19:41:32 +0000
Subject: [PATCH] Create MsgBase.dump_msg_header() method which will perform a
 low-level header "dump" to an array of strings using the (new)
 smb_msghdr_str_list() SMBLIB function. The message header passed must've been
 previously returned from the get_msg_header() or get_all_msg_headers()
 method.

A similar dump could be constructed from the header properties, as available in
JS, but that would be inconsistent with other msg header dumps and likely lack
header fields or details available from the lowest level dump method provided
in SMBLIB.
---
 src/sbbs3/js_msgbase.c | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index a17cafe4c6..1e95a4cd7b 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -2024,6 +2024,39 @@ js_get_all_msg_headers(JSContext *cx, uintN argc, jsval *arglist)
 	return JS_TRUE;
 }
 
+static JSBool
+js_dump_msg_header(JSContext *cx, uintN argc, jsval *arglist)
+{
+	jsval *argv=JS_ARGV(cx, arglist);
+	JS_SET_RVAL(cx, arglist, JSVAL_NULL);
+
+	if(argc >= 1 && JSVAL_IS_OBJECT(argv[0])) {
+		JSObject* hdr = JSVAL_TO_OBJECT(argv[0]);
+		if(hdr == NULL)		/* no header supplied? */
+			return JS_TRUE;
+		privatemsg_t* mp = (privatemsg_t*)JS_GetPrivate(cx, hdr);
+		if(mp == NULL)
+			return JS_TRUE;
+		str_list_t list = smb_msghdr_str_list(&mp->msg);
+		if(list != NULL) {
+			JSObject* array;
+			if((array = JS_NewArrayObject(cx, 0, NULL)) == NULL) {
+				JS_ReportError(cx, "JS_NewArrayObject failure");
+				return JS_FALSE;
+			}
+			JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(array));
+			for(int i = 0; list[i] != NULL; i++) {
+				JSString* js_str = JS_NewStringCopyZ(cx, list[i]);
+				if(js_str == NULL)
+					break;
+				JS_DefineElement(cx, array, i, STRING_TO_JSVAL(js_str), NULL, NULL, JSPROP_ENUMERATE);
+			}
+			strListFree(&list);
+		}
+	}
+	return JS_TRUE;
+}
+
 static JSBool
 js_put_msg_header(JSContext *cx, uintN argc, jsval *arglist)
 {
@@ -3228,7 +3261,10 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,JSDOCSTR("Returns 0 for no votes, 1 for an up-vote, 2 for a down-vote, or in the case of a poll-response: a bit-field of votes.")
 	,317
 	},
-
+	{"dump_msg_header",		js_dump_msg_header,		1,	JSTYPE_ARRAY,	JSDOCSTR("object header")
+		,JSDOCSTR("dump a message header object to an array of strings for diagnostic uses")
+		,31702
+	},
 	{0}
 };
 
-- 
GitLab