Skip to content
Snippets Groups Projects
Commit 8b36382c authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Dynamically recalculate the user's download rate (in CPS)

Upon successful download of a file, recalculate and store the user's download CPS (characters/bytes per second), mainly for subsequent transfer time estimates.
parent 2ed9a146
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
......@@ -33,7 +33,6 @@ void sbbs_t::batchmenu()
BOOL sort = -1;
uint i,n,xfrprot,xfrdir;
int64_t totalcdt,totalsize;
time_t start,end;
str_list_t ini;
str_list_t filenames;
......@@ -217,11 +216,10 @@ void sbbs_t::batchmenu()
SYNC;
if(online==ON_REMOTE) {
delfiles(cfg.temp_dir,ALLFILES);
start=time(NULL);
protocol(cfg.prot[xfrprot],XFER_BATCH_UPLOAD,str,nulstr,true);
end=time(NULL);
time_t elapsed = 0;
protocol(cfg.prot[xfrprot],XFER_BATCH_UPLOAD,str,nulstr, /* cd: */true, /* autohang: */true, &elapsed);
if(xfrdir != INVALID_DIR && !(cfg.dir[xfrdir]->misc&DIR_ULTIME))
starttime+=end-start;
starttime+=elapsed;
}
batch_upload();
delfiles(cfg.temp_dir,ALLFILES);
......@@ -245,7 +243,6 @@ BOOL sbbs_t::start_batch_download()
char list[1024] = "";
int error;
uint i,xfrprot;
time_t start,end;
if(useron.rest&FLAG('D')) { /* Download restriction */
bputs(text[R_Download]);
......@@ -421,13 +418,14 @@ BOOL sbbs_t::start_batch_download()
SAFEPRINTF(str,"%sBATCHDN.LST",cfg.node_dir);
putnode_downloading(totalsize);
start=time(NULL);
error=protocol(cfg.prot[xfrprot],XFER_BATCH_DOWNLOAD,str,list,false);
end=time(NULL);
time_t elapsed = 0;
error=protocol(cfg.prot[xfrprot],XFER_BATCH_DOWNLOAD,str,list,false,&elapsed);
if(cfg.prot[xfrprot]->misc&PROT_DSZLOG || !error)
batch_download(xfrprot);
if(batdn_total())
notdownloaded((ulong)totalsize,start,end);
notdownloaded(totalsize, elapsed);
else
downloadedbytes(totalsize, elapsed);
autohangup();
return TRUE;
......
......@@ -51,22 +51,34 @@ void sbbs_t::downloadedfile(file_t* f)
user_event(EVENT_DOWNLOAD);
}
/****************************************************************************/
/* This function is called when a file is successfully downloaded. */
/****************************************************************************/
void sbbs_t::downloadedbytes(off_t size, time_t elapsed)
{
if(elapsed <= 1)
cur_cps = (uint)size;
else
cur_cps = (uint)(size / elapsed);
putuserdec32(useron.number, USER_DLCPS, cur_cps);
}
/****************************************************************************/
/* This function is called when a file is unsuccessfully downloaded. */
/* It logs the transfer time and checks for possible leech protocol use. */
/****************************************************************************/
void sbbs_t::notdownloaded(off_t size, time_t start, time_t end)
void sbbs_t::notdownloaded(off_t size, time_t elapsed)
{
char str[256],tmp2[256];
char tmp[512];
SAFEPRINTF2(str,"Estimated Time: %s Transfer Time: %s"
,sectostr(cur_cps ? (uint)(size/cur_cps) : 0,tmp)
,sectostr((uint)(end-start),tmp2));
,sectostr((uint)(elapsed),tmp2));
logline(nulstr,str);
if(cfg.leech_pct && cur_cps /* leech detection */
&& end-start>=cfg.leech_sec
&& end-start>=(double)(size/cur_cps)*(double)cfg.leech_pct/100.0) {
&& elapsed>=cfg.leech_sec
&& elapsed>=(double)(size/cur_cps)*(double)cfg.leech_pct/100.0) {
lprintf(LOG_ERR, "Node %d Possible use of leech protocol (leech=%u downloads=%u)"
,cfg.node_num, useron.leech+1,useron.dls);
useron.leech = (uchar)adjustuserval(&cfg, useron.number, USER_LEECH, 1);
......@@ -93,7 +105,7 @@ const char* sbbs_t::protcmdline(prot_t* prot, enum XFER_TYPE type)
/* Handles start and stop routines for transfer protocols */
/****************************************************************************/
int sbbs_t::protocol(prot_t* prot, enum XFER_TYPE type
,const char *fpath, const char *fspec, bool cd, bool autohangup)
,const char *fpath, const char *fspec, bool cd, bool autohangup, time_t* elapsed)
{
char protlog[256],*p;
char* cmdline;
......@@ -136,7 +148,9 @@ int sbbs_t::protocol(prot_t* prot, enum XFER_TYPE type
request_telnet_opt(TELNET_DO,TELNET_BINARY_TX);
request_telnet_opt(TELNET_WILL,TELNET_BINARY_TX);
time_t start = time(NULL);
i=external(cmdline,ex_mode,p);
time_t end = time(NULL);
/* Got back to Text/NVT mode */
request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
request_telnet_opt(TELNET_WONT,TELNET_BINARY_TX);
......@@ -156,6 +170,11 @@ int sbbs_t::protocol(prot_t* prot, enum XFER_TYPE type
CRLF;
if(autohang) sys_status|=SS_PAUSEOFF; /* Pause off after download */
if(elapsed != nullptr) {
*elapsed = end - start;
if(*elapsed < 0)
*elapsed = 0;
}
return(i);
}
......@@ -384,7 +403,8 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc, bool autohang)
break;
if(i >= cfg.total_prots)
return false;
error = protocol(cfg.prot[i], XFER_DOWNLOAD, fname, fname, false, autohang);
time_t elapsed = 0;
error = protocol(cfg.prot[i], XFER_DOWNLOAD, fname, fname, false, autohang, &elapsed);
if(cfg.prot[i]->misc&PROT_DSZLOG)
result = checkdszlog(fname);
else
......@@ -396,8 +416,9 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc, bool autohang)
logon_dls++;
useron.dls = (ushort)adjustuserval(&cfg, useron.number, USER_DLS, 1);
useron.dlb = (uint32_t)adjustuserval(&cfg, useron.number, USER_DLB, length);
downloadedbytes(length, elapsed);
char bytes[32];
ultoac((ulong)length, bytes);
u64toac(length, bytes);
bprintf(text[FileNBytesSent], getfname(fname), bytes);
char str[128];
SAFEPRINTF3(str, "downloaded %s: %s (%s bytes)"
......
......@@ -439,7 +439,8 @@ void sbbs_t::download_msg_attachments(smb_t* smb, smbmsg_t* msg, bool del)
&& chk_ar(cfg.prot[i]->ar,&useron,&client))
break;
if(i<cfg.total_prots) {
int error = protocol(cfg.prot[i], XFER_DOWNLOAD, fpath, nulstr, false);
time_t elapsed = 0;
int error = protocol(cfg.prot[i], XFER_DOWNLOAD, fpath, nulstr, /* cid: */false, /* autohang: */true, &elapsed);
if(checkprotresult(cfg.prot[i],error,fpath)) {
if(del)
(void)remove(fpath);
......@@ -449,6 +450,7 @@ void sbbs_t::download_msg_attachments(smb_t* smb, smbmsg_t* msg, bool del)
,USER_DLS,1);
useron.dlb=adjustuserval(&cfg, useron.number
,USER_DLB, length);
downloadedbytes(length, elapsed);
bprintf(text[FileNBytesSent]
,getfname(fpath),u64toac(length,tmp));
SAFEPRINTF(str
......
......@@ -740,7 +740,6 @@ int sbbs_t::listfileinfo(const uint dirnum, const char *filespec, const int mode
int found=0;
uint i,j;
size_t m;
time_t start,end;
file_t* f;
action = NODE_LFIL;
......@@ -1053,15 +1052,15 @@ int sbbs_t::listfileinfo(const uint dirnum, const char *filespec, const int mode
}
}
putnode_downloading(getfilesize(&cfg, f));
start=time(NULL);
error=protocol(cfg.prot[i],XFER_DOWNLOAD,path,nulstr,false);
end=time(NULL);
time_t elapsed = 0;
error=protocol(cfg.prot[i],XFER_DOWNLOAD,path,nulstr,/* cd: */false, /* autohangup: */true, &elapsed);
if(cfg.dir[f->dir]->misc&DIR_TFREE)
starttime+=end-start;
if(checkprotresult(cfg.prot[i],error, f))
starttime+=elapsed;
if(checkprotresult(cfg.prot[i],error, f)) {
downloadedfile(f);
else
notdownloaded(f->size, start, end);
downloadedbytes(f->size, elapsed);
} else
notdownloaded(f->size, elapsed);
delfiles(cfg.temp_dir,ALLFILES);
autohangup();
}
......
......@@ -1049,8 +1049,9 @@ public:
/* download.cpp */
void downloadedfile(file_t* f);
void notdownloaded(off_t size, time_t start, time_t end);
int protocol(prot_t* prot, enum XFER_TYPE, const char *fpath, const char *fspec, bool cd, bool autohangup=true);
void notdownloaded(off_t size, time_t elapsed);
void downloadedbytes(off_t size, time_t elapsed);
int protocol(prot_t* prot, enum XFER_TYPE, const char *fpath, const char *fspec, bool cd, bool autohangup=true, time_t* elapsed=NULL);
const char* protcmdline(prot_t* prot, enum XFER_TYPE type);
void seqwait(uint devnum);
void autohangup(void);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment