From f8c041f9ba57ab9857b14958585fde5adcde19c8 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 6 Jun 2006 17:15:50 +0000
Subject: [PATCH] Added optional protocol key argument to sendfile() and
 recvfile() for JS equivalent of Baja SEND_FILE_VIA and RECEIVE_FILE_VIA.

---
 src/sbbs3/download.cpp | 25 ++++++++++++++-----------
 src/sbbs3/js_bbs.cpp   | 34 +++++++++++++++++++++++-----------
 src/sbbs3/sbbs.h       |  4 ++--
 src/sbbs3/upload.cpp   | 25 ++++++++++++++-----------
 4 files changed, 53 insertions(+), 35 deletions(-)

diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp
index 54a4901e99..c91cabc66d 100644
--- a/src/sbbs3/download.cpp
+++ b/src/sbbs3/download.cpp
@@ -450,25 +450,28 @@ void sbbs_t::seqwait(uint devnum)
 
 }
 
-bool sbbs_t::sendfile(char* fname)
+bool sbbs_t::sendfile(char* fname, char prot)
 {
 	char	keys[128];
 	char	ch;
 	size_t	i;
 	bool	result=false;
 
-	xfer_prot_menu(XFER_DOWNLOAD);
-	mnemonics(text[ProtocolOrQuit]);
-	strcpy(keys,"Q");
-	for(i=0;i<cfg.total_prots;i++)
-		if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron))
-			sprintf(keys+strlen(keys),"%c",cfg.prot[i]->mnemonic);
-
-	ch=(char)getkeys(keys,0);
+	if(prot)
+		ch=toupper(prot);
+	else {
+		xfer_prot_menu(XFER_DOWNLOAD);
+		mnemonics(text[ProtocolOrQuit]);
+		strcpy(keys,"Q");
+		for(i=0;i<cfg.total_prots;i++)
+			if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron))
+				sprintf(keys+strlen(keys),"%c",cfg.prot[i]->mnemonic);
 
-	if(ch=='Q' || sys_status&SS_ABORT)
-		return(false); 
+		ch=(char)getkeys(keys,0);
 
+		if(ch=='Q' || sys_status&SS_ABORT)
+			return(false); 
+	}
 	for(i=0;i<cfg.total_prots;i++)
 		if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron))
 			break;
diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index c2942eb630..be9669e902 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -827,10 +827,10 @@ static jsSyncPropertySpec js_bbs_properties[] = {
 	{	"file_cmds"			,BBS_PROP_FILE_CMDS		,JSPROP_ENUMERATE	,310},
 	{	"curgrp"			,BBS_PROP_CURGRP		,JSPROP_ENUMERATE	,310},
 	{	"cursub"			,BBS_PROP_CURSUB		,JSPROP_ENUMERATE	,310},
-	{	"cursub_code"		,BBS_PROP_CURSUB_CODE	,JSPROP_ENUMERATE	,31301},
+	{	"cursub_code"		,BBS_PROP_CURSUB_CODE	,JSPROP_ENUMERATE	,314},
 	{	"curlib"			,BBS_PROP_CURLIB		,JSPROP_ENUMERATE	,310},
 	{	"curdir"			,BBS_PROP_CURDIR		,JSPROP_ENUMERATE	,310},
-	{	"curdir_code"		,BBS_PROP_CURDIR_CODE	,JSPROP_ENUMERATE	,31301},
+	{	"curdir_code"		,BBS_PROP_CURDIR_CODE	,JSPROP_ENUMERATE	,314},
 	{	"connection"		,BBS_PROP_CONNECTION	,PROP_READONLY		,310},
 	{	"rlogin_name"		,BBS_PROP_RLOGIN_NAME	,JSPROP_ENUMERATE	,310},
 	{	"client_name"		,BBS_PROP_CLIENT_NAME	,JSPROP_ENUMERATE	,310},
@@ -1582,11 +1582,16 @@ static JSBool
 js_sendfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	sbbs_t*		sbbs;
+	char		prot=0;
+	char*		p;
 
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	*rval = BOOLEAN_TO_JSVAL(sbbs->sendfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
+	if(argc>1 && (p=js_ValueToStringBytes(cx, argv[1], NULL))!=NULL)
+		prot=*p;
+
+	*rval = BOOLEAN_TO_JSVAL(sbbs->sendfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0])),prot));
 
 	return(JS_TRUE);
 }
@@ -1595,11 +1600,16 @@ static JSBool
 js_recvfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	sbbs_t*		sbbs;
+	char		prot=0;
+	char*		p;
 
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	*rval = BOOLEAN_TO_JSVAL(sbbs->recvfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
+	if(argc>1 && (p=js_ValueToStringBytes(cx, argv[1], NULL))!=NULL)
+		prot=*p;
+
+	*rval = BOOLEAN_TO_JSVAL(sbbs->recvfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0])),prot));
 
 	return(JS_TRUE);
 }
@@ -2657,13 +2667,15 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	,JSDOCSTR("add file list to batch download queue")
 	,310
 	},
-	{"send_file",		js_sendfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("send specified filename (complete path) to user via user-prompted protocol")
-	,31301
+	{"send_file",		js_sendfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename [,protocol]")
+	,JSDOCSTR("send specified filename (complete path) to user via user-prompted "
+		"(or optionally specified) protocol")
+	,314
 	},
-	{"receive_file",	js_recvfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("received specified filename (complete path) frome user via user-prompted protocol")
-	,31301
+	{"receive_file",	js_recvfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename [,protocol]")
+	,JSDOCSTR("received specified filename (complete path) frome user via user-prompted "
+		"(or optionally specified) protocol")
+	,314
 	},
 	{"temp_xfer",		js_temp_xfer,		0,	JSTYPE_VOID,	JSDOCSTR("")
 	,JSDOCSTR("enter the temporary file tranfer menu")
@@ -2799,7 +2811,7 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	{"list_msgs",		js_listmsgs,		1,	JSTYPE_NUMBER,	JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>SCAN_READ</tt>] [,message_number=<tt>0</tt>] [,string find]")
 	,JSDOCSTR("list messages in the specified message sub-board (number or internal code), "
 		"optionally search for 'find' string, returns number of messages listed")
-	,31301
+	,314
 	},		
 	/* menuing */
 	{"menu",			js_menu,			1,	JSTYPE_VOID,	JSDOCSTR("base_filename")
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 98dbaf57fc..328a9a2edb 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -609,8 +609,8 @@ public:
 	void	autohangup(void);
 	bool	checkdszlog(file_t*);
 	bool	checkprotresult(prot_t*, int error, file_t*);
-	bool	sendfile(char* fname);
-	bool	recvfile(char* fname);
+	bool	sendfile(char* fname, char prot=0);
+	bool	recvfile(char* fname, char prot=0);
 
 	/* file.cpp */
 	void	fileinfo(file_t* f);
diff --git a/src/sbbs3/upload.cpp b/src/sbbs3/upload.cpp
index 0e240765fd..8071e345af 100644
--- a/src/sbbs3/upload.cpp
+++ b/src/sbbs3/upload.cpp
@@ -599,25 +599,28 @@ bool sbbs_t::bulkupload(uint dirnum)
 	return(false);
 }
 
-bool sbbs_t::recvfile(char *fname)
+bool sbbs_t::recvfile(char *fname, char prot)
 {
 	char	keys[32];
 	char	ch;
 	size_t	i;
 	bool	result=false;
 
-	xfer_prot_menu(XFER_UPLOAD);
-	mnemonics(text[ProtocolOrQuit]);
-	strcpy(keys,"Q");
-	for(i=0;i<cfg.total_prots;i++)
-		if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron))
-			sprintf(keys+strlen(keys),"%c",cfg.prot[i]->mnemonic);
-
-	ch=(char)getkeys(keys,0);
+	if(prot)
+		ch=toupper(prot);
+	else {
+		xfer_prot_menu(XFER_UPLOAD);
+		mnemonics(text[ProtocolOrQuit]);
+		strcpy(keys,"Q");
+		for(i=0;i<cfg.total_prots;i++)
+			if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron))
+				sprintf(keys+strlen(keys),"%c",cfg.prot[i]->mnemonic);
 
-	if(ch=='Q' || sys_status&SS_ABORT)
-		return(false); 
+		ch=(char)getkeys(keys,0);
 
+		if(ch=='Q' || sys_status&SS_ABORT)
+			return(false); 
+	}
 	for(i=0;i<cfg.total_prots;i++)
 		if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron))
 			break;
-- 
GitLab