From fee9cf3f660cc572cb1d8e1399efec020932dd64 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Thu, 12 Jun 2003 09:08:14 +0000 Subject: [PATCH] Created is_download_free() function which checks all the various criteria that can make a download free for a particular user from a particular file area, with support for per-directory exemption ARS (finally). --- src/sbbs3/bat_xfer.cpp | 18 ++++++++++-------- src/sbbs3/download.cpp | 2 +- src/sbbs3/ftpsrvr.c | 12 ++---------- src/sbbs3/listfile.cpp | 2 +- src/sbbs3/pack_qwk.cpp | 4 ++-- src/sbbs3/userdat.c | 23 +++++++++++++++++++++++ src/sbbs3/userdat.h | 1 + 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp index e12bc33543..bd52b1a394 100644 --- a/src/sbbs3/bat_xfer.cpp +++ b/src/sbbs3/bat_xfer.cpp @@ -101,9 +101,9 @@ void sbbs_t::batchmenu() break; } for(i=0,totalcdt=0;i<batdn_total;i++) + if(!is_download_free(&cfg,batdn_dir[i],&useron)) totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); break; @@ -353,9 +353,9 @@ BOOL sbbs_t::start_batch_download() return(FALSE); } for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { + if(is_download_free(&cfg,batdn_dir[i],&useron)) + totalcdt+=batdn_cdt[i]; + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); return(FALSE); @@ -788,10 +788,12 @@ bool sbbs_t::addtobatdl(file_t* f) return(false); } for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; + if(!is_download_free(&cfg,batdn_dir[i],&useron)) + totalcdt+=batdn_cdt[i]; if(cfg.dir[f->dir]->misc&DIR_FREE) f->cdt=0L; - totalcdt+=f->cdt; - if(!(useron.exempt&FLAG('D')) && totalcdt>useron.cdt+useron.freecdt) { + if(!is_download_free(&cfg,f->dir,&useron)) + totalcdt+=f->cdt; + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[CantAddToQueue],f->name); bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp)); return(false); diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp index a7443ddb48..4b86d52297 100644 --- a/src/sbbs3/download.cpp +++ b/src/sbbs3/download.cpp @@ -67,7 +67,7 @@ void sbbs_t::downloadfile(file_t* f) /****************************/ useron.dls=(ushort)adjustuserrec(&cfg,useron.number,U_DLS,5,1); useron.dlb=adjustuserrec(&cfg,useron.number,U_DLB,10,length); - if(!(cfg.dir[f->dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D'))) + if(!is_download_free(&cfg,f->dir,&useron)) subtract_cdt(&cfg,&useron,f->cdt); /**************************/ /* Update Uploader's Info */ diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 5483d737f0..d377bda74e 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -1335,7 +1335,6 @@ static void send_thread(void* arg) ulong dur; ulong cps; ulong length; - BOOL exempt; BOOL error=FALSE; FILE* fp; file_t f; @@ -1553,13 +1552,7 @@ static void send_thread(void* arg) if(xfer.credits) { xfer.user->dls=(ushort)adjustuserrec(&scfg, xfer.user->number,U_DLS,5,1); xfer.user->dlb=adjustuserrec(&scfg, xfer.user->number,U_DLB,10,total); - exempt=FALSE; - if(xfer.user->exempt&FLAG('D')) - exempt=TRUE; - if(scfg.dir[xfer.dir]->ex_ar[0]!=0 - && chk_ar(&scfg, scfg.dir[xfer.dir]->ex_ar, xfer.user)) - exempt=TRUE; - if(xfer.dir>=0 && !(scfg.dir[xfer.dir]->misc&DIR_FREE) && !exempt) + if(xfer.dir>=0 && !is_download_free(&scfg,xfer.dir,xfer.user)) subtract_cdt(&scfg, xfer.user, xfer.credits); } if(!xfer.tmpfile && !xfer.delfile) @@ -3900,8 +3893,7 @@ static void ctrl_thread(void* arg) /* Verify credits */ if(!getsize && !getdate && !delecmd - && !(scfg.dir[dir]->misc&DIR_FREE) - && !(user.exempt&FLAG('D'))) { + && !is_download_free(&scfg,dir,&user)) { if(filedat) getfiledat(&scfg,&f); else diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp index 8f0f941c0d..630899d7f1 100644 --- a/src/sbbs3/listfile.cpp +++ b/src/sbbs3/listfile.cpp @@ -1207,7 +1207,7 @@ int sbbs_t::listfileinfo(uint dirnum, char *filespec, long mode) found=-1; break; } continue; } - if(!(cfg.dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D')) + if(!is_download_free(&cfg,f.dir,&useron) && f.cdt>(useron.cdt+useron.freecdt)) { SYNC; bprintf(text[YouOnlyHaveNCredits] diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp index 4759065af7..fc7fd21ab5 100644 --- a/src/sbbs3/pack_qwk.cpp +++ b/src/sbbs3/pack_qwk.cpp @@ -541,9 +541,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) if(batdn_total) { for(i=0,totalcdt=0;i<batdn_total;i++) + if(!is_download_free(&cfg,batdn_dir[i],&useron)) totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); } diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index dcd9e85cf2..37153e7b36 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -2200,3 +2200,26 @@ int DLLCALL user_rec_len(int offset) return(-1); } + +BOOL DLLCALL is_download_free(scfg_t* cfg, uint dirnum, user_t* user) +{ + if(!VALID_CFG(cfg)) + return(FALSE); + + if(dirnum>=cfg->total_dirs) + return(FALSE); + + if(cfg->dir[dirnum]->misc&DIR_FREE) + return(TRUE); + + if(user==NULL) + return(FALSE); + + if(user->exempt&FLAG('D')) + return(TRUE); + + if(cfg->dir[dirnum]->ex_ar[0]==0) + return(FALSE); + + return(chk_ar(cfg,cfg->dir[dirnum]->ex_ar,user)); +} \ No newline at end of file diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h index d831a6fdfc..e081ea8e41 100644 --- a/src/sbbs3/userdat.h +++ b/src/sbbs3/userdat.h @@ -106,6 +106,7 @@ DLLEXPORT BOOL DLLCALL logoutuserdat(scfg_t*, user_t*, time_t now, time_t logont DLLEXPORT void DLLCALL resetdailyuserdat(scfg_t*, user_t*); DLLEXPORT void DLLCALL subtract_cdt(scfg_t*, user_t*, long amt); DLLEXPORT int DLLCALL user_rec_len(int offset); +DLLEXPORT BOOL DLLCALL is_download_free(scfg_t* cfg, uint dirnum, user_t* user); #ifdef __cplusplus } -- GitLab