Synchronet now requires the libarchive development package (e.g. libarchive-dev on Debian-based Linux distros, libarchive.org for more info) to build successfully.

Commit 464f80c5 authored by rswindell's avatar rswindell
Browse files

New @-codes (for currently viewed file):

- FILE_AREA
- FILE_AREA_DESC
- FILE_LIB
- FILE_LIB_DESC
- FILE_LIB_NUM
- FILE_DIR
- FILE_DIR_DESC
- FILE_DIR_CODE
- FILE_DIR_NUM
- FILE_NAME
- FILE_DESC
- FILE_UPLOADER
- FILE_SIZE
- FILE_CREDITS
- FILE_TIME
- FILE_TIME_ULED
- FILE_TIME_DLED
- FILE_DATE
- FILE_DATE_ULED
- FILE_DAT_DLED
- FILE_TIMES_DLED
Fixed MSG_ATTR @-code (missing SPAM attribute)
New text.dat line: FileHdrDescSeparator, displayed between file detail display
(name, date, uploader, etc.) and extended description, if there is one. This
is used to execute showfileavatar.js.
New JS 'bbs' object properties:
- file_name
- file_description
- file_dir_number
- file_attr
- file_date
- file_credits
- file_uploader
- file_update_date
- file_download_date
- file_download_count
Inspiried by Lon Seidman's now infamous (but likely common) Synchronet sysop
blunder (removing a file rather than downloading it while demonstrating his BBS
on his youtube channel:
- New text.dat line: RemoveFileQ <- using this rather than the vague:
  AreYouSureQ, when prompting to remove a file
- The sysop command to remove files from the batch file flagging prompt has
  been changed from 'D' (delete) to 'R' (remove).
- The 'D' command from the batch file flagging prompt may now be used for
  immediate Download of any flagged file(s).
- When flagging files with '*', treat the same as '*.*'
parent 1f1775eb
......@@ -1038,8 +1038,10 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
uint16_t attr = current_msg->hdr.attr;
uint16_t poll = attr&MSG_POLL_VOTE_MASK;
uint32_t auxattr = current_msg->hdr.auxattr;
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s%s%s%s%s%s%s"
/* Synchronized with show_msgattr(): */
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
,attr&MSG_PRIVATE ? "Private " :nulstr
,attr&MSG_SPAM ? "SPAM " :nulstr
,attr&MSG_READ ? "Read " :nulstr
,attr&MSG_DELETE ? "Deleted " :nulstr
,attr&MSG_KILLREAD ? "Kill " :nulstr
......@@ -1206,6 +1208,73 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
return(str);
}
return(NULL);
/* Currently viewed file */
if(current_file != NULL) {
if(current_file->dir < cfg.total_dirs) {
if(strcmp(sp, "FILE_AREA") == 0) {
safe_snprintf(str, maxlen, "%s %s"
,cfg.lib[cfg.dir[current_file->dir]->lib]->sname
,cfg.dir[current_file->dir]->sname);
return str;
}
if(strcmp(sp, "FILE_AREA_DESC") == 0) {
safe_snprintf(str, maxlen, "%s %s"
,cfg.lib[cfg.dir[current_file->dir]->lib]->lname
,cfg.dir[current_file->dir]->lname);
return str;
}
if(strcmp(sp, "FILE_LIB") == 0)
return cfg.lib[cfg.dir[current_file->dir]->lib]->sname;
if(strcmp(sp, "FILE_LIB_DESC") == 0)
return cfg.lib[cfg.dir[current_file->dir]->lib]->lname;
if(strcmp(sp, "FILE_LIB_NUM") == 0) {
safe_snprintf(str, maxlen, "%u", getusrlib(current_file->dir));
return str;
}
if(strcmp(sp, "FILE_DIR") == 0)
return cfg.dir[current_file->dir]->sname;
if(strcmp(sp, "FILE_DIR_DESC") == 0)
return cfg.dir[current_file->dir]->lname;
if(strcmp(sp, "FILE_DIR_CODE") == 0)
return cfg.dir[current_file->dir]->code;
if(strcmp(sp, "FILE_DIR_NUM") == 0) {
safe_snprintf(str, maxlen, "%u", getusrdir(current_file->dir));
return str;
}
}
if(strcmp(sp, "FILE_NAME") == 0)
return current_file->name;
if(strcmp(sp, "FILE_DESC") == 0)
return current_file->desc;
if(strcmp(sp, "FILE_UPLOADER") == 0)
return current_file->uler;
if(strcmp(sp, "FILE_SIZE") == 0) {
safe_snprintf(str, maxlen, "%lu", current_file->size);
return str;
}
if(strcmp(sp, "FILE_CREDITS") == 0) {
safe_snprintf(str, maxlen, "%lu", current_file->cdt);
return str;
}
if(strcmp(sp, "FILE_TIME") == 0)
return timestr(current_file->date);
if(strcmp(sp, "FILE_TIME_ULED") == 0)
return timestr(current_file->dateuled);
if(strcmp(sp, "FILE_TIME_DLED") == 0)
return timestr(current_file->datedled);
if(strcmp(sp, "FILE_DATE") == 0)
return datestr(current_file->date);
if(strcmp(sp, "FILE_DATE_ULED") == 0)
return datestr(current_file->dateuled);
if(strcmp(sp, "FILE_DATE_DLED") == 0)
return datestr(current_file->datedled);
if(strcmp(sp, "FILE_TIMES_DLED") == 0) {
safe_snprintf(str, maxlen, "%lu", current_file->timesdled);
return str;
}
}
return NULL;
}
......@@ -8,7 +8,7 @@
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
......@@ -750,6 +750,40 @@ uint sbbs_t::getusrsub(uint subnum)
return(usub+1);
}
uint sbbs_t::getusrlib(uint dirnum)
{
uint ulib;
if(dirnum == INVALID_DIR)
return 0;
if(usrlibs <= 0)
return 0;
for(ulib=0; ulib < usrlibs; ulib++)
if(usrlib[ulib] == cfg.dir[dirnum]->lib)
break;
return ulib+1;
}
uint sbbs_t::getusrdir(uint dirnum)
{
uint udir;
uint ulib;
ulib = getusrlib(dirnum);
if(ulib <= 0)
return 0;
ulib--;
for(udir=0; udir < usrdirs[ulib]; udir++)
if(usrdir[ulib][udir] == dirnum)
break;
return udir+1;
}
int sbbs_t::dir_op(uint dirnum)
{
return(SYSOP || (cfg.dir[dirnum]->op_ar!=NULL && cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron,&client)));
......
......@@ -48,6 +48,7 @@ void sbbs_t::fileinfo(file_t* f)
char* real_fname;
uint i,j;
current_file = f;
for(i=0;i<usrlibs;i++)
if(usrlib[i]==cfg.dir[f->dir]->lib)
break;
......@@ -85,10 +86,9 @@ void sbbs_t::fileinfo(file_t* f)
else
bprintf(text[InvalidAlternatePathN],f->altpath);
}
CRLF;
bputs(text[FileHdrDescSeparator]);
if(f->misc&FM_EXTDESC) {
getextdesc(&cfg,f->dir,f->datoffset,ext);
CRLF;
putmsg(ext,P_NOATCODES);
CRLF;
}
......@@ -99,7 +99,7 @@ void sbbs_t::fileinfo(file_t* f)
}
if(f->opencount)
bprintf(text[FileIsOpen],f->opencount,f->opencount>1 ? "s" : nulstr);
current_file = NULL;
}
......
......@@ -142,6 +142,19 @@ enum {
,BBS_PROP_BATCH_UPLOAD_TOTAL
,BBS_PROP_BATCH_DNLOAD_TOTAL
/* READ ONLY */
,BBS_PROP_FILE_NAME
,BBS_PROP_FILE_DESC
,BBS_PROP_FILE_DIR
,BBS_PROP_FILE_ATTR
,BBS_PROP_FILE_DATE
,BBS_PROP_FILE_SIZE
,BBS_PROP_FILE_CREDITS
,BBS_PROP_FILE_ULER
,BBS_PROP_FILE_DATE_ULED
,BBS_PROP_FILE_DATE_DLED
,BBS_PROP_FILE_TIMES_DLED
,BBS_PROP_COMMAND_STR
};
......@@ -241,6 +254,18 @@ enum {
,"message replied-to identifier"
,"message delivery attempt counter"
,"file name"
,"file description"
,"file directory (number)"
,"file attribute flags"
,"file date"
,"file size (in bytes)"
,"file credit value"
,"file uploader (user name)"
,"file upload date"
,"file last-download date"
,"file download count"
,"number of files in batch upload queue"
,"number of files in batch download queue"
......@@ -631,6 +656,74 @@ static JSBool js_bbs_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
p=sbbs->current_msg->reply_id;
break;
/* Currently Displayed File (sbbs.current_file) */
case BBS_PROP_FILE_NAME:
if(sbbs->current_file==NULL)
p=nulstr;
else
p=sbbs->current_file->name;
break;
case BBS_PROP_FILE_DESC:
if(sbbs->current_file==NULL)
p=nulstr;
else
p=sbbs->current_file->desc;
break;
case BBS_PROP_FILE_ULER:
if(sbbs->current_file==NULL)
p=nulstr;
else
p=sbbs->current_file->uler;
break;
case BBS_PROP_FILE_DATE:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->date;
break;
case BBS_PROP_FILE_DATE_ULED:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->dateuled;
break;
case BBS_PROP_FILE_DATE_DLED:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->datedled;
break;
case BBS_PROP_FILE_TIMES_DLED:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->timesdled;
break;
case BBS_PROP_FILE_SIZE:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->size;
break;
case BBS_PROP_FILE_CREDITS:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->cdt;
break;
case BBS_PROP_FILE_DIR:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->dir;
break;
case BBS_PROP_FILE_ATTR:
if(sbbs->current_file==NULL)
p=nulstr;
else
val=sbbs->current_file->misc;
break;
case BBS_PROP_BATCH_UPLOAD_TOTAL:
val=sbbs->batup_total;
break;
......@@ -946,6 +1039,18 @@ static jsSyncPropertySpec js_bbs_properties[] = {
{ "msg_delivery_attempts" ,BBS_PROP_MSG_DELIVERY_ATTEMPTS
,PROP_READONLY ,310},
{ "file_name" ,BBS_PROP_FILE_NAME ,PROP_READONLY ,317},
{ "file_description" ,BBS_PROP_FILE_DESC ,PROP_READONLY ,317},
{ "file_dir_number" ,BBS_PROP_FILE_DIR ,PROP_READONLY ,317},
{ "file_attr" ,BBS_PROP_FILE_ATTR ,PROP_READONLY ,317},
{ "file_date" ,BBS_PROP_FILE_DATE ,PROP_READONLY ,317},
{ "file_size" ,BBS_PROP_FILE_SIZE ,PROP_READONLY ,317},
{ "file_credits" ,BBS_PROP_FILE_CREDITS ,PROP_READONLY ,317},
{ "file_uploader" ,BBS_PROP_FILE_ULER ,PROP_READONLY ,317},
{ "file_upload_date" ,BBS_PROP_FILE_DATE_ULED ,PROP_READONLY ,317},
{ "file_download_date",BBS_PROP_FILE_DATE_DLED ,PROP_READONLY ,317},
{ "file_download_count",BBS_PROP_FILE_TIMES_DLED ,PROP_READONLY ,317},
{ "batch_upload_total",BBS_PROP_BATCH_UPLOAD_TOTAL,PROP_READONLY ,310},
{ "batch_dnload_total",BBS_PROP_BATCH_DNLOAD_TOTAL,PROP_READONLY ,310},
......
......@@ -8,7 +8,7 @@
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2015 Rob Swindell - http://www.synchro.net/copyright.html *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
......@@ -705,7 +705,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
return(0);
if(ch=='P' || ch=='-')
return(3);
if(ch=='B') { /* Flag for batch download */
if(ch=='B' || ch=='D') { /* Flag for batch download */
if(useron.rest&FLAG('D')) {
bputs(text[R_Download]);
return(2);
......@@ -716,7 +716,10 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
f.datoffset=bf[0].datoffset;
f.size=0;
getfiledat(&cfg,&f);
addtobatdl(&f);
if(ch=='D')
downloadfile(&f);
else
addtobatdl(&f);
CRLF;
return(2);
}
......@@ -733,7 +736,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
bprintf(text[BatchDlQueueIsFull],str+c);
break;
}
if(strchr(str+c,'.')) { /* filename or spec given */
if(str[c]=='*' || strchr(str+c,'.')) { /* filename or spec given */
f.dir=dirnum;
p=strchr(str+c,' ');
if(!p) p=strchr(str+c,',');
......@@ -761,8 +764,11 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
f.datoffset=bf[str[c]-'A'].datoffset;
f.size=0;
getfiledat(&cfg,&f);
addtobatdl(&f); }
addtobatdl(&f);
}
}
if(ch=='D')
start_batch_download();
CRLF;
return(2);
}
......@@ -792,7 +798,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
CRLF;
lncntr=0;
for(c=0;c<d;c++) {
if(strchr(str+c,'.')) { /* filename or spec given */
if(str[c]=='*' || strchr(str+c,'.')) { /* filename or spec given */
f.dir=dirnum;
p=strchr(str+c,' ');
if(!p) p=strchr(str+c,',');
......@@ -830,7 +836,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
continue;
}
if((ch=='D' || ch=='M') /* Delete or Move */
if((ch=='R' || ch=='M') /* Delete or Move */
&& !(useron.rest&FLAG('R'))
&& (dir_op(dirnum) || useron.exempt&FLAG('R'))) {
if(total==1) {
......@@ -846,8 +852,8 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
return(-1);
if(d) { /* d is string length */
CRLF;
if(ch=='D') {
if(noyes(text[AreYouSureQ]))
if(ch=='R') {
if(noyes(text[RemoveFileQ]))
return(2);
remcdt=remfile=1;
if(dir_op(dirnum)) {
......@@ -881,7 +887,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
}
lncntr=0;
for(c=0;c<d;c++) {
if(strchr(str+c,'.')) { /* filename or spec given */
if(str[c]=='*' || strchr(str+c,'.')) { /* filename or spec given */
f.dir=dirnum;
p=strchr(str+c,' ');
if(!p) p=strchr(str+c,',');
......@@ -901,7 +907,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
,f.opencount,f.opencount>1 ? "s":nulstr);
continue;
}
if(ch=='D') {
if(ch=='R') {
removefile(&f);
if(remfile) {
sprintf(tmp,"%s%s",cfg.dir[f.dir]->path,fname);
......@@ -931,7 +937,7 @@ int sbbs_t::batchflagprompt(uint dirnum, file_t* bf, uint total
,f.opencount,f.opencount>1 ? "s":nulstr);
continue;
}
if(ch=='D') {
if(ch=='R') {
removefile(&f);
if(remfile) {
sprintf(tmp,"%s%s",cfg.dir[f.dir]->path,fname);
......@@ -1203,7 +1209,7 @@ int sbbs_t::listfileinfo(uint dirnum, char *filespec, long mode)
if(!fexistcase(str))
bprintf(text[FileDoesNotExist],str);
else {
if(!noyes(text[AreYouSureQ])) {
if(!noyes(text[DeleteFileQ])) {
if(remove(str))
bprintf(text[CouldntRemoveFile],str);
else {
......@@ -1216,7 +1222,7 @@ int sbbs_t::listfileinfo(uint dirnum, char *filespec, long mode)
}
break;
case 'R': /* remove file from database */
if(noyes(text[AreYouSureQ]))
if(noyes(text[RemoveFileQ]))
break;
removefile(&f);
sprintf(str,"%s%s",dirpath,fname);
......
......@@ -3167,6 +3167,7 @@ sbbs_t::sbbs_t(ushort node_num, union xp_sockaddr *addr, size_t addr_len, const
nodefile_fp=NULL;
node_ext_fp=NULL;
current_msg=NULL;
current_file=NULL;
mnestr=NULL;
#ifdef JAVASCRIPT
......
......@@ -520,6 +520,7 @@ public:
csi_t main_csi; /* Main Command Shell Image */
smbmsg_t* current_msg; /* For message header @-codes */
file_t* current_file;
/* Global command shell variables */
uint global_str_vars;
......@@ -589,6 +590,8 @@ public:
void getusrdirs(void);
uint getusrsub(uint subnum);
uint getusrgrp(uint subnum);
uint getusrdir(uint dirnum);
uint getusrlib(uint dirnum);
uint userdatdupe(uint usernumber, uint offset, uint datlen, char *dat
,bool del=false, bool next=false);
......@@ -596,8 +599,10 @@ public:
bool gettimeleft_inside;
/* str.cpp */
char* timestr(time_t intime);
char* timestr(time_t);
char* datestr(time_t);
char timestr_output[60];
char datestr_output[60];
char* age_of_posted_item(char* buf, size_t max, time_t);
void userlist(long mode);
size_t gettmplt(char *outstr, const char *tmplt, long mode);
......
......@@ -842,6 +842,11 @@ char* sbbs_t::timestr(time_t intime)
return(::timestr(&cfg,(time32_t)intime,timestr_output));
}
char* sbbs_t::datestr(time_t t)
{
return unixtodstr(&cfg, (time32_t)t, datestr_output);
}
void sbbs_t::sys_info()
{
char tmp[128];
......
......@@ -809,6 +809,8 @@ enum {
,VoteInThisPollNow
,MIMEDecodedPlainText
,MsgHdrBodySeparator
,FileHdrDescSeparator
,RemoveFileQ
,TOTAL_TEXT
};
......
......@@ -376,9 +376,9 @@ const char * const text_defaults[TOTAL_TEXT]={
"\x01\x68\x25\x75\x01\x6e\x01\x63\x20\x4d\x61\x78\x29\x0d\x0a" // 230 FileAddedToUlQueue
,"\x07\x01\x5f\x01\x77\x01\x68\x4e\x6f\x64\x65\x20\x25\x32\x64\x3a\x20\x01\x67\x25\x73\x01\x6e\x01\x67\x20\x73\x65\x6e\x74\x20\x79"
"\x6f\x75\x20\x61\x20\x66\x69\x6c\x65\x2e\x0d\x0a" // 231 UserToUserXferNodeMsg
,"\x01\x6e\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\x20\x6f\x72\x20\x5b\x4e\x65\x78\x74\x5d\x3a\x20\x01\x77" // 232 FileInfoPrompt
,"\x01\x6e\x01\x2f\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\x20\x6f\x72\x20\x5b\x4e\x65\x78\x74\x5d\x3a\x20\x01\x77" // 232 FileInfoPrompt
,"\x0d\x0a\x7e\x51\x75\x69\x74\x20\x6f\x72\x20\x5b\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\x4e\x65\x78\x74\x5d\x3a\x20" // 234 RExemptRemoveFilePrompt
......@@ -484,7 +484,7 @@ const char * const text_defaults[TOTAL_TEXT]={
"\x28\x25\x73\x20\x62\x79\x74\x65\x73\x29\x01\x6e\x0d\x0a" // 302 Compressed
,"\x01\x77\x01\x68\x0d\x0a\x25\x73\x20\x69\x73\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x69\x6e\x20\x74\x68\x65\x20\x71\x75\x65\x75\x65"
"\x2e\x0d\x0a" // 303 FileAlreadyInQueue
,"\x01\x77\x01\x68\x0d\x0a\x46\x69\x6c\x65\x20\x69\x73\x20\x6e\x6f\x74\x20\x6f\x6e\x6c\x69\x6e\x65\x2e\x0d\x0a" // 304 FileIsNotOnline
,"\x01\x77\x01\x68\x01\x2f\x46\x69\x6c\x65\x20\x69\x73\x20\x6e\x6f\x74\x20\x6f\x6e\x6c\x69\x6e\x65\x2e\x0d\x0a" // 304 FileIsNotOnline
,"\x01\x6e\x0d\x0a\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\x64\x6f"
"\x77\x6e\x6c\x6f\x61\x64\x20\x71\x75\x65\x75\x65\x20\x2d\x0d\x0a\x01\x63\x46\x69\x6c\x65\x73\x3a\x20\x01\x68\x25\x75\x01\x6e\x01"
"\x63\x20\x28\x01\x68\x25\x75\x01\x6e\x01\x63\x20\x4d\x61\x78\x29\x20\x20\x43\x72\x65\x64\x69\x74\x73\x3a\x20\x01\x68\x25\x73\x01"
......@@ -521,7 +521,7 @@ const char * const text_defaults[TOTAL_TEXT]={
,"\x0d\x0a\x01\x6e\x01\x67\x41\x6c\x74\x65\x72\x6e\x61\x74\x65\x20\x50\x61\x74\x68\x20\x20\x20\x3a\x01\x68\x20\x25\x73" // 326 FiAlternatePath
,"\x0d\x0a\x01\x72\x01\x68\x01\x69\x49\x6e\x76\x61\x6c\x69\x64\x20\x41\x6c\x74\x65\x72\x6e\x61\x74\x65\x20\x50\x61\x74\x68\x20\x4e"
"\x75\x6d\x62\x65\x72\x3a\x20\x25\x75\x01\x6e" // 327 InvalidAlternatePathN
,"\x01\x5f\x0d\x0a\x01\x77\x01\x68\x46\x69\x6c\x65\x20\x69\x73\x20\x63\x75\x72\x72\x65\x6e\x74\x6c\x79\x20\x6f\x70\x65\x6e\x20\x62"
,"\x01\x5f\x01\x2f\x01\x77\x01\x68\x46\x69\x6c\x65\x20\x69\x73\x20\x63\x75\x72\x72\x65\x6e\x74\x6c\x79\x20\x6f\x70\x65\x6e\x20\x62"
"\x79\x20\x25\x64\x20\x75\x73\x65\x72\x25\x73\x2e\x0d\x0a" // 328 FileIsOpen
,"\x07\x07\x0d\x0a\x01\x68\x01\x72\x48\x01\x62\x61\x01\x67\x70\x01\x79\x70\x01\x63\x79\x20\x01\x6d\x42\x01\x77\x69\x01\x72\x72\x01"
"\x67\x74\x01\x62\x68\x01\x63\x64\x01\x6d\x61\x01\x79\x79\x20\x01\x77\x74\x01\x72\x6f\x20\x01\x67\x79\x01\x62\x6f\x01\x63\x75\x0d"
......@@ -766,7 +766,7 @@ const char * const text_defaults[TOTAL_TEXT]={
"\x20\x24\x29\x3a\x20\x01\x6e" // 471 ModifyCredits
,"\x01\x5f\x01\x79\x01\x68\x41\x64\x6a\x75\x73\x74\x20\x4d\x69\x6e\x75\x74\x65\x73\x20\x28\x2d\x20\x74\x6f\x20\x73\x75\x62\x74\x72"
"\x61\x63\x74\x2c\x20\x48\x20\x3d\x20\x48\x6f\x75\x72\x73\x29\x3a\x20\x01\x6e" // 472 ModifyMinutes
,"\x0d\x0a\x44\x65\x6c\x65\x74\x65\x20\x51\x75\x65\x73\x74\x69\x6f\x6e\x61\x69\x72\x65" // 473 DeleteQuestionaireQ
,"\x0d\x0a\x44\x65\x6c\x65\x74\x65\x20\x51\x75\x65\x73\x74\x69\x6f\x6e\x6e\x61\x69\x72\x65" // 473 DeleteQuestionaireQ
,"\x01\x68\x01\x62\x55\x73\x65\x72\x20\x53\x65\x74\x74\x69\x6e\x67\x73\x20\x66\x6f\x72\x20\x01\x77\x25\x73\x20\x23\x25\x64\x01\x62"
"\x3a\x0d\x0a\x0d\x0a" // 474 UserDefaultsHdr
,"\x01\x6e\x01\x62\x5b\x01\x68\x01\x77\x54\x01\x6e\x01\x62\x5d\x20\x01\x68\x54\x65\x72\x6d\x69\x6e\x61\x6c\x20\x4d\x6f\x64\x65\x20"
......@@ -1100,10 +1100,10 @@ const char * const text_defaults[TOTAL_TEXT]={
,"\x01\x5f\x01\x63\x01\x68\x4c\x69\x73\x74\x69\x6e\x67\x20\x01\x6e\x01\x63\x28\x01\x68\x25\x75\x01\x6e\x01\x63\x29\x20\x25\x73\x20"
"\x28\x01\x68\x25\x75\x01\x6e\x01\x63\x29\x20\x25\x73\x20\x28\x01\x68\x3f\x01\x6e\x01\x63\x3d\x4d\x65\x6e\x75\x29\x20\x28\x01\x68"
"\x25\x75\x01\x6e\x01\x63\x20\x46\x69\x6c\x65\x73\x01\x6e\x01\x63\x29\x3a\x20\x01\x6e" // 660 BatchFlagPrompt
,"\x01\x6e\x01\x3e\x01\x71\x01\x6c\x01\x34\x20\x20\x01\x68\x01\x79\x5b\x01\x77\x42\x01\x79\x5d\x61\x74\x63\x68\x20\x44\x6f\x77\x6e"
"\x6c\x6f\x61\x64\x20\x20\x5b\x01\x77\x56\x01\x79\x5d\x69\x65\x77\x20\x43\x6f\x6e\x74\x65\x6e\x74\x20\x20\x5b\x01\x77\x45\x01\x79"
"\x5d\x78\x74\x65\x6e\x64\x65\x64\x20\x49\x6e\x66\x6f\x20\x20\x5b\x01\x77\x50\x01\x79\x5d\x72\x65\x76\x69\x6f\x75\x73\x20\x46\x69"
"\x6c\x65\x73\x20\x20\x5b\x01\x77\x51\x01\x79\x5d\x75\x69\x74\x20\x20\x01\x6e\x0d\x0a" // 661 FileListBatchCommands
,"\x01\x6e\x01\x3e\x01\x71\x01\x6c\x01\x34\x20\x20\x01\x68\x01\x79\x5b\x01\x77\x44\x01\x79\x5d\x6f\x77\x6e\x6c\x6f\x61\x64\x20\x20"
"\x01\x68\x01\x79\x5b\x01\x77\x42\x01\x79\x5d\x61\x74\x63\x68\x20\x20\x5b\x01\x77\x56\x01\x79\x5d\x69\x65\x77\x20\x43\x6f\x6e\x74"
"\x65\x6e\x74\x20\x20\x5b\x01\x77\x45\x01\x79\x5d\x78\x74\x65\x6e\x64\x65\x64\x20\x49\x6e\x66\x20\x20\x5b\x01\x77\x50\x01\x79\x5d"
"\x72\x65\x76\x69\x6f\x75\x73\x20\x50\x61\x67\x65\x20\x20\x5b\x01\x77\x51\x01\x79\x5d\x75\x69\x74\x20\x20\x01\x6e\x0d\x0a" // 661 FileListBatchCommands
,"\x0d\x0a\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x20\x61\x74\x74\x61\x63\x68\x65\x64\x20\x66\x69\x6c\x65\x3a\x20\x01\x77\x25\x73\x01\x62"
"\x20\x28\x25\x73\x20\x62\x79\x74\x65\x73\x29" // 662 DownloadAttachedFileQ
,"\x0d\x0a\x0d\x0a\x01\x6e\x54\x69\x6d\x65\x20\x6c\x65\x66\x74\x20\x3a\x20\x25\x31\x33\x75\x0d\x0a" // 663 FreeMinLeft
......@@ -1320,5 +1320,7 @@ const char * const text_defaults[TOTAL_TEXT]={
"\x6f\x77\x2e\x0d\x0a" // 796 VoteInThisPollNow
,"\x01\x6e\x01\x6d\x4d\x49\x4d\x45\x2d\x64\x65\x63\x6f\x64\x65\x64\x20\x70\x6c\x61\x69\x6e\x2d\x74\x65\x78\x74\x3a\x01\x6e\x0d\x0a"
"" // 797 MIMEDecodedPlainText
,"\x01\x2f\x0d\x0a" // 798 MsgHdrBodySeparator
,"\x01\x2f\x40\x45\x58\x45\x43\x3a\x53\x48\x4f\x57\x4d\x53\x47\x41\x56\x41\x54\x41\x52\x40\x0d\x0a" // 798 MsgHdrBodySeparator
,"\x01\x2f\x0d\x0a\x40\x45\x58\x45\x43\x3a\x53\x48\x4f\x57\x46\x49\x4c\x45\x41\x56\x41\x54\x41\x52\x40" // 799 FileHdrDescSeparator
,"\x52\x65\x6d\x6f\x76\x65\x20\x66\x69\x6c\x65" // 800 RemoveFileQ
};
......@@ -55,7 +55,6 @@ int sbbs_t::viewfile(file_t* f, int ext)
else
viewfilecontents(f);
ASYNC;
CRLF;
sprintf(str,text[FileInfoPrompt],unpadfname(f->name,tmp));
mnemonics(str);
ch=(char)getkeys("BEVQ\r",0);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment