From 809be023aca0fedb1e5ce6ece339287d6ade7348 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Thu, 27 May 2021 23:32:56 -0700
Subject: [PATCH] Add bbs.export_filelist() method

This is the last thing needed to complete the new temp/archive menu module implemented in JavaScript for v3.19.

File list generation can easily be done in JS (see filelist.js for example), but since we have this function already in C++ (i.e. for including filelists in QWK packets) - might as well make it available for use in JS.
---
 src/sbbs3/js_bbs.cpp | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index 898413afa5..3f94b952e3 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -3458,6 +3458,38 @@ js_getfilespec(JSContext *cx, uintN argc, jsval *arglist)
 	return(JS_TRUE);
 }
 
+static JSBool
+js_export_filelist(JSContext *cx, uintN argc, jsval *arglist)
+{
+	jsval *argv=JS_ARGV(cx, arglist);
+	uint32		mode=0;
+	char*		fname=NULL;
+    JSString*	js_str;
+	sbbs_t*		sbbs;
+	jsrefcount	rc;
+
+	if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
+		return JS_FALSE;
+
+	uintN argn = 0;
+	js_str = JS_ValueToString(cx, argv[argn]);
+	JSSTRING_TO_MSTRING(cx, js_str, fname, NULL);
+	HANDLE_PENDING(cx, fname);
+	argn++;
+	if(JSVAL_IS_NUMBER(argv[argn])) {
+		if(!JS_ValueToECMAUint32(cx, argv[argn], &mode)) {
+			free(fname);
+			return JS_FALSE;
+		}
+		argn++;
+	}
+	rc=JS_SUSPENDREQUEST(cx);
+	JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(sbbs->create_filelist(fname, mode)));
+	free(fname);
+	JS_RESUMEREQUEST(cx, rc);
+	return JS_TRUE;
+}
+
 static JSBool
 js_listfiles(JSContext *cx, uintN argc, jsval *arglist)
 {
@@ -4449,6 +4481,10 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 		"specified by number or internal code")
 	,310
 	},
+	{"export_filelist",	js_export_filelist,	2,	JSTYPE_NUMBER,	JSDOCSTR("filename [,mode=<tt>FL_NONE</tt>]")
+	,JSDOCSTR("export list of files to a text file, optionally specifying a file list mode (e.g. <tt>FL_ULTIME</tt>), returning the number of files listed")
+	,319
+	},
 	{"list_files",		js_listfiles,		1,	JSTYPE_NUMBER,	JSDOCSTR("[directory=<i>current</i>] [,filespec=<tt>\"*.*\"</tt> or search_string] [,mode=<tt>FL_NONE</tt>]")
 	,JSDOCSTR("list files in the specified file directory, "
 		"optionally specifying a file specification (wildcards) or a description search string, "
-- 
GitLab