From ef11784f062b0f3c5f4b2de44c89cfe0ef22d0c4 Mon Sep 17 00:00:00 2001 From: Rob Swindell <rob@synchro.net> Date: Thu, 13 May 2021 21:15:16 -0700 Subject: [PATCH] Allow of edit of file info from extended file info prompt Added text.dat string FileInfoEditPrompt. Does not allow rename of file from this prompt - perhaps it should? Resolves issue #263. --- src/sbbs3/file.cpp | 89 +++++++++++++++++++++++++++++++++++++++ src/sbbs3/listfile.cpp | 76 +-------------------------------- src/sbbs3/sbbs.h | 2 + src/sbbs3/text.h | 2 +- src/sbbs3/text_defaults.c | 11 +++-- src/sbbs3/viewfile.cpp | 16 ++++--- 6 files changed, 112 insertions(+), 84 deletions(-) diff --git a/src/sbbs3/file.cpp b/src/sbbs3/file.cpp index e6b36dc38d..58341ce2cc 100644 --- a/src/sbbs3/file.cpp +++ b/src/sbbs3/file.cpp @@ -273,3 +273,92 @@ bool sbbs_t::movefile(smb_t* smb, file_t* f, int newdir) return true; } + +bool sbbs_t::editfilename(file_t* f) +{ + char str[MAX_FILENAME_LEN + 1]; + char tmp[MAX_PATH + 1]; + char path[MAX_PATH + 1]; + char dirpath[MAX_PATH + 1]; + + bputs(text[EditFilename]); + SAFECOPY(str, f->name); + if(!getstr(str, sizeof(str) - 1, K_EDIT|K_AUTODEL)) + return false; + if(strcmp(str,f->name) != 0) { /* rename */ + if(stricmp(str,f->name) + && findfile(&cfg, f->dir, path, NULL)) + bprintf(text[FileAlreadyThere],path); + else { + SAFEPRINTF2(path,"%s%s",dirpath,f->name); + SAFEPRINTF2(tmp,"%s%s",dirpath,str); + if(fexistcase(path) && rename(path,tmp)) + bprintf(text[CouldntRenameFile],path,tmp); + else { + bprintf(text[FileRenamed],path,tmp); + smb_new_hfield_str(f, SMB_FILENAME, str); + updatefile(&cfg, f); + } + } + } + return true; +} + +bool sbbs_t::editfileinfo(file_t* f) +{ + char str[MAX_PATH + 1]; + + // Description + bputs(text[EditDescription]); + char fdesc[LEN_FDESC + 1]; + SAFECOPY(fdesc, f->desc); + getstr(fdesc, sizeof(fdesc)-1, K_LINE|K_EDIT|K_AUTODEL|K_TRIM); + if(sys_status&SS_ABORT) + return false; + if(strcmp(fdesc, f->desc)) + smb_new_hfield_str(f, SMB_FILEDESC, fdesc); + + // Tags + if((cfg.dir[f->dir]->misc & DIR_FILETAGS) || dir_op(f->dir)) { + char tags[64] = ""; + bputs(text[TagFilePrompt]); + if(f->tags != NULL) + SAFECOPY(tags, f->tags); + getstr(tags, sizeof(tags)-1, K_LINE|K_EDIT|K_AUTODEL|K_TRIM); + if(sys_status&SS_ABORT) + return false; + if((f->tags == NULL && *tags != '\0') || (f->tags != NULL && strcmp(tags, f->tags))) + smb_new_hfield_str(f, SMB_TAGS, tags); + } + // Extended Description + if(f->extdesc != NULL && *f->extdesc) { + if(!noyes(text[DeleteExtDescriptionQ])) { + // TODO + } + } + if(dir_op(f->dir)) { + char uploader[LEN_ALIAS + 1]; + SAFECOPY(uploader, f->from); + bputs(text[EditUploader]); + if(!getstr(uploader, sizeof(uploader), K_EDIT|K_AUTODEL)) + return false; + smb_new_hfield_str(f, SMB_FILEUPLOADER, uploader); + ultoa(f->cost,str,10); + bputs(text[EditCreditValue]); + getstr(str,10,K_NUMBER|K_EDIT|K_AUTODEL); + if(sys_status&SS_ABORT) + return false; + f->cost = atol(str); + smb_new_hfield(f, SMB_COST, sizeof(f->cost), &f->cost); + ultoa(f->hdr.times_downloaded,str,10); + bputs(text[EditTimesDownloaded]); + getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL); + if(sys_status&SS_ABORT) + return false; + f->hdr.times_downloaded=atoi(str); + if(sys_status&SS_ABORT) + return false; + inputnstime32((time32_t*)&f->hdr.when_imported.time); + } + return updatefile(&cfg, f); +} diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp index 0a4e05d8e3..2e65c4ac05 100644 --- a/src/sbbs3/listfile.cpp +++ b/src/sbbs3/listfile.cpp @@ -834,82 +834,10 @@ int sbbs_t::listfileinfo(uint dirnum, const char *filespec, long mode) continue; case 'E': /* edit file information */ if(dir_op(dirnum)) { - bputs(text[EditFilename]); - SAFECOPY(str, f->name); - if(!getstr(str, MAX_FILENAME_LEN, K_EDIT|K_AUTODEL)) + if(!editfilename(f)) break; - if(strcmp(str,f->name) != 0) { /* rename */ - if(stricmp(str,f->name) - && findfile(&cfg, f->dir, path, NULL)) - bprintf(text[FileAlreadyThere],path); - else { - SAFEPRINTF2(path,"%s%s",dirpath,f->name); - SAFEPRINTF2(tmp,"%s%s",dirpath,str); - if(fexistcase(path) && rename(path,tmp)) - bprintf(text[CouldntRenameFile],path,tmp); - else { - bprintf(text[FileRenamed],path,tmp); - smb_new_hfield_str(f, SMB_FILENAME, str); - updatefile(&cfg, f); - } - } - } - } - // Description - bputs(text[EditDescription]); - char fdesc[LEN_FDESC + 1]; - SAFECOPY(fdesc, f->desc); - getstr(fdesc, sizeof(fdesc)-1, K_LINE|K_EDIT|K_AUTODEL|K_TRIM); - if(sys_status&SS_ABORT) - break; - if(strcmp(fdesc, f->desc)) - smb_new_hfield_str(f, SMB_FILEDESC, fdesc); - - // Tags - if((cfg.dir[dirnum]->misc & DIR_FILETAGS) || dir_op(dirnum)) { - char tags[64] = ""; - bputs(text[TagFilePrompt]); - if(f->tags != NULL) - SAFECOPY(tags, f->tags); - getstr(tags, sizeof(tags)-1, K_LINE|K_EDIT|K_AUTODEL|K_TRIM); - if(sys_status&SS_ABORT) - break; - if((f->tags == NULL && *tags != '\0') || (f->tags != NULL && strcmp(tags, f->tags))) - smb_new_hfield_str(f, SMB_TAGS, tags); } - // Extended Description - if(f->extdesc != NULL && *f->extdesc) { - if(!noyes(text[DeleteExtDescriptionQ])) { - // TODO - } - } - if(!dir_op(dirnum)) { - updatefile(&cfg, f); - break; - } - char uploader[LEN_ALIAS + 1]; - SAFECOPY(uploader, f->from); - bputs(text[EditUploader]); - if(!getstr(uploader, sizeof(uploader), K_EDIT|K_AUTODEL)) - break; - smb_new_hfield_str(f, SMB_FILEUPLOADER, uploader); - ultoa(f->cost,str,10); - bputs(text[EditCreditValue]); - getstr(str,10,K_NUMBER|K_EDIT|K_AUTODEL); - if(sys_status&SS_ABORT) - break; - f->cost = atol(str); - smb_new_hfield(f, SMB_COST, sizeof(f->cost), &f->cost); - ultoa(f->hdr.times_downloaded,str,10); - bputs(text[EditTimesDownloaded]); - getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL); - if(sys_status&SS_ABORT) - break; - f->hdr.times_downloaded=atoi(str); - if(sys_status&SS_ABORT) - break; - inputnstime32((time32_t*)&f->hdr.when_imported.time); - updatefile(&cfg, f); + editfileinfo(f); break; case 'F': /* delete file only */ SAFEPRINTF2(str,"%s%s",dirpath,f->name); diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index 54cbdf1432..ec2aa6a066 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1046,6 +1046,8 @@ public: bool addtobatdl(file_t*); bool clearbatdl(void); bool clearbatul(void); + bool editfilename(file_t*); + bool editfileinfo(file_t*); long delfiles(const char *inpath, const char *spec, size_t keep = 0); /* listfile.cpp */ diff --git a/src/sbbs3/text.h b/src/sbbs3/text.h index 10e74ba542..3b185ea665 100644 --- a/src/sbbs3/text.h +++ b/src/sbbs3/text.h @@ -241,7 +241,7 @@ enum { ,ProtocolBatchOrQuit ,BatchUlQueueIsFull ,FileAddedToUlQueue - ,UserToUserXferNodeMsg + ,FileInfoEditPrompt ,FileInfoPrompt ,QuitOrNext ,RExemptRemoveFilePrompt diff --git a/src/sbbs3/text_defaults.c b/src/sbbs3/text_defaults.c index c3275bca47..f52304c503 100644 --- a/src/sbbs3/text_defaults.c +++ b/src/sbbs3/text_defaults.c @@ -376,14 +376,17 @@ const char * const text_defaults[TOTAL_TEXT]={ ,"\x0d\x0a\x01\x6e\x01\x6d\x01\x68\x25\x73\x20\x01\x6e\x01\x6d\x61\x64\x64\x65\x64\x20\x74\x6f\x20\x62\x61\x74\x63\x68\x20\x75\x70" "\x6c\x6f\x61\x64\x20\x71\x75\x65\x75\x65\x01\x63\x20\x2d\x20\x46\x69\x6c\x65\x73\x3a\x20\x01\x68\x25\x75\x20\x01\x6e\x01\x63\x28" "\x01\x68\x25\x75\x01\x6e\x01\x63\x20\x4d\x61\x78\x29\x0d\x0a" // 230 FileAddedToUlQueue - ,"\x55\x6e\x75\x73\x65\x64\x20\x32\x33\x31" // 231 UserToUserXferNodeMsg + ,"\x01\x6e\x01\x3f\x01\x67\x01\x68\x25\x73\x01\x79\x3a\x20\x01\x77\x7e\x42\x01\x79\x61\x74\x63\x68\x20\x64\x6f\x77\x6e\x6c\x6f\x61" + "\x64\x2c\x20\x01\x77\x7e\x45\x01\x79\x64\x69\x74\x20\x69\x6e\x66\x6f\x2c\x20\x01\x77\x7e\x56\x01\x79\x69\x65\x77\x20\x66\x69\x6c" + "\x65\x2c\x20\x01\x77\x7e\x51\x01\x79\x75\x69\x74\x2c\x20\x01\x77\x7e\x50\x01\x79\x72\x65\x76\x20\x6f\x72\x20\x5b\x7e\x4e\x65\x78" + "\x74\x5d\x3a\x20\x01\x77" // 231 FileInfoEditPrompt ,"\x01\x6e\x01\x3f\x01\x67\x01\x68\x25\x73\x01\x79\x3a\x20\x01\x77\x7e\x42\x01\x79\x61\x74\x63\x68\x20\x64\x6f\x77\x6e\x6c\x6f\x61" "\x64\x2c\x20\x01\x77\x7e\x45\x01\x79\x78\x74\x65\x6e\x64\x65\x64\x20\x69\x6e\x66\x6f\x2c\x20\x01\x77\x7e\x56\x01\x79\x69\x65\x77" "\x20\x66\x69\x6c\x65\x2c\x20\x01\x77\x7e\x51\x01\x79\x75\x69\x74\x2c\x20\x01\x77\x7e\x50\x01\x79\x72\x65\x76\x20\x6f\x72\x20\x5b" "\x7e\x4e\x65\x78\x74\x5d\x3a\x20\x01\x77" // 232 FileInfoPrompt ,"\x0d\x0a\x7e\x51\x75\x69\x74\x20\x6f\x72\x20\x5b\x7e\x4e\x65\x78\x74\x5d\x3a\x20" // 233 QuitOrNext ,"\x7e\x52\x65\x6d\x6f\x76\x65\x2c\x20\x7e\x4d\x6f\x76\x65\x2c\x20\x7e\x45\x64\x69\x74\x2c\x20\x7e\x56\x69\x65\x77\x2c\x20\x7e\x51" - "\x75\x69\x74\x2c\x20\x6f\x72\x20\x5b\x7e\x4e\x65\x78\x74\x5d\x3a\x20" // 234 RExemptRemoveFilePrompt + "\x75\x69\x74\x2c\x20\x7e\x50\x72\x65\x76\x20\x6f\x72\x20\x5b\x7e\x4e\x65\x78\x74\x5d\x3a\x20" // 234 RExemptRemoveFilePrompt ,"\x01\x6e\x28\x25\x64\x29\x20\x25\x73\x0d\x0a" // 235 MoveToLibLstFmt ,"\x01\x5f\x0d\x0a\x01\x79\x01\x68\x4c\x69\x62\x72\x61\x72\x79\x20\x5b\x25\x64\x5d\x3a\x20\x01\x6e" // 236 MoveToLibPrompt ,"\x01\x6e\x28\x25\x64\x29\x20\x25\x73\x0d\x0a" // 237 MoveToDirLstFmt @@ -393,8 +396,8 @@ const char * const text_defaults[TOTAL_TEXT]={ ,"\x7e\x52\x65\x6d\x6f\x76\x65\x2c\x20\x7e\x43\x72\x65\x64\x69\x74\x73\x20\x6f\x6e\x6c\x79\x2c\x20\x7e\x46\x69\x6c\x65\x20\x6f\x6e" "\x6c\x79\x2c\x20\x7e\x4d\x6f\x76\x65\x2c\x20\x7e\x45\x64\x69\x74\x2c\x20\x7e\x56\x69\x65\x77\x2c\x20\x7e\x51\x75\x69\x74\x2c\x20" "\x7e\x50\x72\x65\x76\x20\x6f\x72\x20\x5b\x7e\x4e\x65\x78\x74\x5d\x3a\x20" // 241 SysopRemoveFilePrompt - ,"\x7e\x52\x65\x6d\x6f\x76\x65\x2c\x20\x7e\x45\x64\x69\x74\x2c\x20\x7e\x56\x69\x65\x77\x2c\x20\x7e\x51\x75\x69\x74\x2c\x20\x6f\x72" - "\x20\x5b\x7e\x4e\x65\x78\x74\x5d\x3a\x20" // 242 UserRemoveFilePrompt + ,"\x7e\x52\x65\x6d\x6f\x76\x65\x2c\x20\x7e\x45\x64\x69\x74\x2c\x20\x7e\x56\x69\x65\x77\x2c\x20\x7e\x51\x75\x69\x74\x2c\x20\x7e\x50" + "\x72\x65\x76\x20\x6f\x72\x20\x5b\x7e\x4e\x65\x78\x74\x5d\x3a\x20" // 242 UserRemoveFilePrompt ,"\x0d\x0a\x01\x6e\x01\x72\x01\x68\x46\x69\x6c\x65\x20\x64\x6f\x65\x73\x20\x6e\x6f\x74\x20\x65\x78\x69\x73\x74\x3a\x20\x01\x63\x25" "\x73\x01\x6e\x0d\x0a" // 243 FileDoesNotExist ,"\x07\x0d\x0a\x01\x72\x01\x68\x01\x69\x43\x6f\x75\x6c\x64\x6e\x27\x74\x20\x72\x65\x6d\x6f\x76\x65\x20\x27\x25\x73\x27\x2e\x01\x6e" diff --git a/src/sbbs3/viewfile.cpp b/src/sbbs3/viewfile.cpp index b76ef3ff4d..925b368612 100644 --- a/src/sbbs3/viewfile.cpp +++ b/src/sbbs3/viewfile.cpp @@ -35,14 +35,17 @@ int sbbs_t::viewfile(file_t* f, bool ext) format_filename(f->name, fname, sizeof(fname)-1, /* pad: */FALSE); curdirnum=f->dir; /* for ARS */ + bool can_edit = dir_op(f->dir) || useron.exempt&FLAG('R') || stricmp(f->from, useron.alias) == 0; while(online) { sys_status &= ~SS_ABORT; - if(ext) + SAFEPRINTF(str, text[FileInfoPrompt], fname); + if(ext) { showfileinfo(f); - else + if(can_edit) + SAFEPRINTF(str, text[FileInfoEditPrompt], fname); + } else viewfilecontents(f); ASYNC; - SAFEPRINTF(str, text[FileInfoPrompt], fname); mnemonics(str); ch=(char)getkeys("BEVQPN\b-\r",0); if(ch=='Q' || sys_status&SS_ABORT) @@ -53,10 +56,13 @@ int sbbs_t::viewfile(file_t* f, bool ext) CRLF; return(-1); case 'E': - ext=1; + if(ext && can_edit) + editfileinfo(f); + else + ext = true; continue; case 'V': - ext=0; + ext = false; continue; case 'P': case '\b': -- GitLab