Paginate PutFileNeeded

This commit is contained in:
fickleheart 2019-04-17 23:29:27 -05:00
parent 430831423c
commit 6c5ac8e942
4 changed files with 33 additions and 11 deletions

View file

@ -1433,7 +1433,7 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime)
netbuffer->u.serverinfo.actnum = 0; //mapheaderinfo[gamemap-1]->actnum netbuffer->u.serverinfo.actnum = 0; //mapheaderinfo[gamemap-1]->actnum
p = PutFileNeeded(); p = PutFileNeeded(0);
HSendPacket(node, false, 0, p - ((UINT8 *)&netbuffer->u)); HSendPacket(node, false, 0, p - ((UINT8 *)&netbuffer->u));
} }
@ -2022,10 +2022,6 @@ static boolean CL_ServerConnectionSearchTicker(boolean viams, tic_t *asksent)
} }
cl_mode = CL_ASKDOWNLOADFILES; cl_mode = CL_ASKDOWNLOADFILES;
// no problem if can't send packet, we will retry later
//if (CL_SendRequestFile())
// cl_mode = CL_DOWNLOADFILES;
} }
} }
else else

View file

@ -376,6 +376,8 @@ typedef struct
#define MAXSERVERNAME 32 #define MAXSERVERNAME 32
#define MAXFILENEEDED 915 #define MAXFILENEEDED 915
#define MAXFILENEEDEDPAGES MAX_WADFILES
#define FILENEEDED_MORE 0x80
// This packet is too large // This packet is too large
typedef struct typedef struct
{ {

View file

@ -101,25 +101,49 @@ char downloaddir[512] = "DOWNLOAD";
INT32 lastfilenum = -1; INT32 lastfilenum = -1;
#endif #endif
UINT16 fileneededpages = 0;
static size_t fileneededpagestart[MAXFILENEEDEDPAGES];
/** Fills a serverinfo packet with information about wad files loaded. /** Fills a serverinfo packet with information about wad files loaded.
* *
* \todo Give this function a better name since it is in global scope. * \todo Give this function a better name since it is in global scope.
* Used to have size limiting built in - now handed via W_LoadWadFile in w_wad.c * Used to have size limiting built in - now handed via W_LoadWadFile in w_wad.c
* *
*/ */
UINT8 *PutFileNeeded(void) UINT8 *PutFileNeeded(UINT16 page)
{ {
size_t i, count = 0; size_t i;
UINT8 count = 0;
UINT8 *p = netbuffer->u.serverinfo.fileneeded; UINT8 *p = netbuffer->u.serverinfo.fileneeded;
char wadfilename[MAX_WADPATH] = ""; char wadfilename[MAX_WADPATH] = "";
UINT8 filestatus; UINT8 filestatus;
for (i = 0; i < numwadfiles; i++) if (page > fileneededpages)
I_Error("Fileneeded page %d accessed before a prior page", page);
else if (page == 0)
{
fileneededpages = 0;
memset(fileneededpagestart, 0, sizeof(fileneededpagestart)); // ??? I guess.
fileneededpagestart[0] = mainwads;
}
for (i = fileneededpagestart[page]; i < (fileneededpagestart[page+1] ?: numwadfiles); i++)
{ {
// If it has only music/sound lumps, don't put it in the list // If it has only music/sound lumps, don't put it in the list
if (!wadfiles[i]->important) if (!wadfiles[i]->important)
continue; continue;
nameonly(strcpy(wadfilename, wadfiles[i]->filename));
if (p + 1 + 4 + strlen(wadfilename) + 16 > netbuffer->u.serverinfo.fileneeded + MAXFILENEEDED)
{
// Too many files for this page, so mark the next page to start here and finish up.
fileneededpagestart[page+1] = i;
fileneededpages = page+1;
count |= FILENEEDED_MORE;
break;
}
filestatus = 1; // Importance - not really used any more, holds 1 by default for backwards compat with MS filestatus = 1; // Importance - not really used any more, holds 1 by default for backwards compat with MS
// Store in the upper four bits // Store in the upper four bits
@ -134,11 +158,10 @@ UINT8 *PutFileNeeded(void)
count++; count++;
WRITEUINT32(p, wadfiles[i]->filesize); WRITEUINT32(p, wadfiles[i]->filesize);
nameonly(strcpy(wadfilename, wadfiles[i]->filename));
WRITESTRINGN(p, wadfilename, MAX_WADPATH); WRITESTRINGN(p, wadfilename, MAX_WADPATH);
WRITEMEM(p, wadfiles[i]->md5sum, 16); WRITEMEM(p, wadfiles[i]->md5sum, 16);
} }
netbuffer->u.serverinfo.fileneedednum = (UINT8)count; netbuffer->u.serverinfo.fileneedednum = count;
return p; return p;
} }

View file

@ -53,7 +53,8 @@ extern char downloaddir[512];
extern INT32 lastfilenum; extern INT32 lastfilenum;
#endif #endif
UINT8 *PutFileNeeded(void); extern UINT16 fileneededpages;
UINT8 *PutFileNeeded(UINT16 page);
void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr); void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr);
void CL_PrepareDownloadSaveGame(const char *tmpsave); void CL_PrepareDownloadSaveGame(const char *tmpsave);