From 2dfde4da2ef8414e08f110e314f8ed25bd4fa0a1 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Thu, 27 Jan 2022 01:15:11 -0800
Subject: [PATCH] Allow files to be removed from batch queues by number

This fixes issue #328.

The user actually *can* remove files from the batch queues in v3.19b, but you have to type the filenames which is not obvious from the prompt which implies you need to type the file index position (e.g. '1' for the first file in the queue). In all Synchronet versions prior, you could only remove by number (and not by name).

The fix is to allow either the number or the name of the file to be entered at the RemoveWhich prompt and the file is removed from the queue successfully.

Thanks Ragnarok!
---
 src/sbbs3/bat_xfer.cpp |  6 ++++--
 src/sbbs3/filedat.c    | 19 +++++++++++++++++++
 src/sbbs3/filedat.h    |  1 +
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp
index 1f7072ffd5..76c7799aad 100644
--- a/src/sbbs3/bat_xfer.cpp
+++ b/src/sbbs3/bat_xfer.cpp
@@ -148,12 +148,14 @@ void sbbs_t::batchmenu()
 				if((n = batup_total()) > 0) {
 					bprintf(text[RemoveWhichFromUlQueue], n);
 					if(getstr(str, MAX_FILENAME_LEN, K_NONE) > 0)
-						batch_file_remove(&cfg, useron.number, XFER_BATCH_UPLOAD, str);
+						if(!batch_file_remove(&cfg, useron.number, XFER_BATCH_UPLOAD, str) && (n = atoi(str)) > 0)
+							batch_file_remove_n(&cfg, useron.number, XFER_BATCH_UPLOAD, n - 1);
 				}
 				if((n = batdn_total()) > 0) {
 					bprintf(text[RemoveWhichFromDlQueue], n);
 					if(getstr(str, MAX_FILENAME_LEN, K_NONE) > 0)
-						batch_file_remove(&cfg, useron.number, XFER_BATCH_DOWNLOAD, str);
+						if(!batch_file_remove(&cfg, useron.number, XFER_BATCH_DOWNLOAD, str) && (n = atoi(str)) > 0)
+							batch_file_remove_n(&cfg, useron.number, XFER_BATCH_DOWNLOAD, n - 1);
 				}
 				break;
 		   case 'U':
diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c
index e69c2de26f..8088d734fd 100644
--- a/src/sbbs3/filedat.c
+++ b/src/sbbs3/filedat.c
@@ -411,6 +411,25 @@ bool batch_file_remove(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, const
 	return result;
 }
 
+// 'n' is zero-based index of file to remove
+bool batch_file_remove_n(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, uint n)
+{
+	FILE* fp = batch_list_open(cfg, usernumber, type, /* create: */false);
+	if(fp == NULL)
+		return false;
+	str_list_t ini = iniReadFile(fp);
+	str_list_t files = iniGetSectionList(ini, NULL);
+	bool result = false;
+	if(n < strListCount(files))
+		result = iniRemoveSection(&ini, files[n]);
+	iniWriteFile(fp, ini);
+	iniCloseFile(fp);
+	iniFreeStringList(ini);
+	iniFreeStringList(files);
+	return result;
+}
+
+
 bool batch_file_exists(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, const char* filename)
 {
 	FILE* fp = batch_list_open(cfg, usernumber, type, /* create: */false);
diff --git a/src/sbbs3/filedat.h b/src/sbbs3/filedat.h
index f44c9122fc..057df739ba 100644
--- a/src/sbbs3/filedat.h
+++ b/src/sbbs3/filedat.h
@@ -87,6 +87,7 @@ DLLEXPORT bool			batch_list_clear(scfg_t*, uint usernumber, enum XFER_TYPE);
 DLLEXPORT bool			batch_file_add(scfg_t*, uint usernumber, enum XFER_TYPE, file_t*);
 DLLEXPORT bool			batch_file_exists(scfg_t*, uint usernumber, enum XFER_TYPE, const char* filename);
 DLLEXPORT bool			batch_file_remove(scfg_t*, uint usernumber, enum XFER_TYPE, const char* filename);
+DLLEXPORT bool			batch_file_remove_n(scfg_t*, uint usernumber, enum XFER_TYPE, uint n);
 DLLEXPORT size_t		batch_file_count(scfg_t*, uint usernumber, enum XFER_TYPE);
 DLLEXPORT bool			batch_file_get(scfg_t*, str_list_t, const char* filename, file_t*);
 DLLEXPORT int			batch_file_dir(scfg_t*, str_list_t, const char* filename);
-- 
GitLab