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