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