mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-10 07:12:07 +00:00
Den Download-Kram aus cl_parse.c nach cl_download.c
This commit is contained in:
parent
974aeeea41
commit
d7900e6333
2 changed files with 194 additions and 186 deletions
|
@ -379,3 +379,189 @@ void CL_RequestNextDownload (void)
|
|||
MSG_WriteString (&cls.netchan.message, va("begin %i\n", precache_spawncount) );
|
||||
}
|
||||
|
||||
void CL_DownloadFileName(char *dest, int destlen, char *fn) {
|
||||
if (strncmp(fn, "players", 7) == 0)
|
||||
Com_sprintf (dest, destlen, "%s/%s", BASEDIRNAME, fn);
|
||||
|
||||
else
|
||||
Com_sprintf (dest, destlen, "%s/%s", FS_Gamedir(), fn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if the file exists, otherwise it attempts
|
||||
* to start a download from the server.
|
||||
*/
|
||||
qboolean CL_CheckOrDownloadFile (char *filename) {
|
||||
FILE *fp;
|
||||
char name[MAX_OSPATH];
|
||||
char *ptr;
|
||||
|
||||
if (strstr (filename, "..")) {
|
||||
Com_Printf ("Refusing to download a path with ..\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
/* fix backslashes - this is mostly für UNIX comaptiblity */
|
||||
while ((ptr=strchr(filename,'\\'))) {
|
||||
*ptr = '/';
|
||||
}
|
||||
|
||||
if (FS_LoadFile (filename, NULL) != -1) {
|
||||
/* it exists, no need to download */
|
||||
return true;
|
||||
}
|
||||
|
||||
strcpy (cls.downloadname, filename);
|
||||
|
||||
/* download to a temp name, and only rename
|
||||
to the real name when done, so if interrupted
|
||||
a runt file wont be left */
|
||||
COM_StripExtension (cls.downloadname, cls.downloadtempname);
|
||||
strcat (cls.downloadtempname, ".tmp");
|
||||
|
||||
/* check to see if we already have a tmp for this file, if so, try to resume
|
||||
and open the file if not opened yet */
|
||||
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
|
||||
|
||||
fp = fopen (name, "r+b");
|
||||
|
||||
if (fp) {
|
||||
/* it exists */
|
||||
int len;
|
||||
fseek(fp, 0, SEEK_END);
|
||||
len = ftell(fp);
|
||||
|
||||
cls.download = fp;
|
||||
|
||||
/* give the server an offset to start the download */
|
||||
Com_Printf ("Resuming %s\n", cls.downloadname);
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message,
|
||||
va("download %s %i", cls.downloadname, len));
|
||||
|
||||
} else {
|
||||
Com_Printf ("Downloading %s\n", cls.downloadname);
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message,
|
||||
va("download %s", cls.downloadname));
|
||||
}
|
||||
|
||||
cls.downloadnumber++;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Request a download from the server
|
||||
*/
|
||||
void CL_Download_f (void) {
|
||||
char filename[MAX_OSPATH];
|
||||
|
||||
if (Cmd_Argc() != 2) {
|
||||
Com_Printf("Usage: download <filename>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Com_sprintf(filename, sizeof(filename), "%s", Cmd_Argv(1));
|
||||
|
||||
if (strstr (filename, "..")) {
|
||||
Com_Printf ("Refusing to download a path with ..\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (FS_LoadFile (filename, NULL) != -1) {
|
||||
/* it exists, no need to download */
|
||||
Com_Printf("File already exists.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
strcpy (cls.downloadname, filename);
|
||||
Com_Printf ("Downloading %s\n", cls.downloadname);
|
||||
|
||||
/* download to a temp name, and only rename
|
||||
to the real name when done, so if interrupted
|
||||
a runt file wont be left */
|
||||
COM_StripExtension (cls.downloadname, cls.downloadtempname);
|
||||
strcat (cls.downloadtempname, ".tmp");
|
||||
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message,
|
||||
va("download %s", cls.downloadname));
|
||||
|
||||
cls.downloadnumber++;
|
||||
}
|
||||
|
||||
/*
|
||||
* A download message has been received from the server
|
||||
*/
|
||||
void CL_ParseDownload (void) {
|
||||
int size, percent;
|
||||
char name[MAX_OSPATH];
|
||||
int r;
|
||||
|
||||
/* read the data */
|
||||
size = MSG_ReadShort (&net_message);
|
||||
percent = MSG_ReadByte (&net_message);
|
||||
|
||||
if (size == -1) {
|
||||
Com_Printf ("Server does not have this file.\n");
|
||||
|
||||
if (cls.download) {
|
||||
/* if here, we tried to resume a
|
||||
file but the server said no */
|
||||
fclose (cls.download);
|
||||
cls.download = NULL;
|
||||
}
|
||||
|
||||
CL_RequestNextDownload ();
|
||||
return;
|
||||
}
|
||||
|
||||
/* open the file if not opened yet */
|
||||
if (!cls.download) {
|
||||
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
|
||||
|
||||
FS_CreatePath (name);
|
||||
|
||||
cls.download = fopen (name, "wb");
|
||||
|
||||
if (!cls.download) {
|
||||
net_message.readcount += size;
|
||||
Com_Printf ("Failed to open %s\n", cls.downloadtempname);
|
||||
CL_RequestNextDownload ();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fwrite (net_message.data + net_message.readcount, 1, size, cls.download);
|
||||
net_message.readcount += size;
|
||||
|
||||
if (percent != 100) {
|
||||
/* request next block */
|
||||
cls.downloadpercent = percent;
|
||||
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
SZ_Print (&cls.netchan.message, "nextdl");
|
||||
|
||||
} else {
|
||||
char oldn[MAX_OSPATH];
|
||||
char newn[MAX_OSPATH];
|
||||
|
||||
fclose (cls.download);
|
||||
|
||||
/* rename the temp file to it's final name */
|
||||
CL_DownloadFileName(oldn, sizeof(oldn), cls.downloadtempname);
|
||||
CL_DownloadFileName(newn, sizeof(newn), cls.downloadname);
|
||||
r = rename (oldn, newn);
|
||||
|
||||
if (r)
|
||||
Com_Printf ("failed to rename.\n");
|
||||
|
||||
cls.download = NULL;
|
||||
cls.downloadpercent = 0;
|
||||
|
||||
/* get another file if needed */
|
||||
CL_RequestNextDownload ();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,10 +16,18 @@
|
|||
* this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* =======================================================================
|
||||
*
|
||||
* This file implements the entity and network protocol parsing
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
#include "header/client.h"
|
||||
|
||||
void CL_DownloadFileName(char *dest, int destlen, char *fn);
|
||||
void CL_ParseDownload (void);
|
||||
|
||||
int bitcounts[32]; /* just for protocol profiling */
|
||||
|
||||
char *svc_strings[256] = {
|
||||
|
@ -48,118 +56,6 @@ char *svc_strings[256] = {
|
|||
"svc_frame"
|
||||
};
|
||||
|
||||
void CL_DownloadFileName(char *dest, int destlen, char *fn) {
|
||||
if (strncmp(fn, "players", 7) == 0)
|
||||
Com_sprintf (dest, destlen, "%s/%s", BASEDIRNAME, fn);
|
||||
|
||||
else
|
||||
Com_sprintf (dest, destlen, "%s/%s", FS_Gamedir(), fn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if the file exists, otherwise it attempts
|
||||
* to start a download from the server.
|
||||
*/
|
||||
qboolean CL_CheckOrDownloadFile (char *filename) {
|
||||
FILE *fp;
|
||||
char name[MAX_OSPATH];
|
||||
char *ptr;
|
||||
|
||||
if (strstr (filename, "..")) {
|
||||
Com_Printf ("Refusing to download a path with ..\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
/* fix backslashes - this is mostly für UNIX comaptiblity */
|
||||
while ((ptr=strchr(filename,'\\'))) {
|
||||
*ptr = '/';
|
||||
}
|
||||
|
||||
if (FS_LoadFile (filename, NULL) != -1) {
|
||||
/* it exists, no need to download */
|
||||
return true;
|
||||
}
|
||||
|
||||
strcpy (cls.downloadname, filename);
|
||||
|
||||
/* download to a temp name, and only rename
|
||||
to the real name when done, so if interrupted
|
||||
a runt file wont be left */
|
||||
COM_StripExtension (cls.downloadname, cls.downloadtempname);
|
||||
strcat (cls.downloadtempname, ".tmp");
|
||||
|
||||
/* check to see if we already have a tmp for this file, if so, try to resume
|
||||
and open the file if not opened yet */
|
||||
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
|
||||
|
||||
fp = fopen (name, "r+b");
|
||||
|
||||
if (fp) {
|
||||
/* it exists */
|
||||
int len;
|
||||
fseek(fp, 0, SEEK_END);
|
||||
len = ftell(fp);
|
||||
|
||||
cls.download = fp;
|
||||
|
||||
/* give the server an offset to start the download */
|
||||
Com_Printf ("Resuming %s\n", cls.downloadname);
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message,
|
||||
va("download %s %i", cls.downloadname, len));
|
||||
|
||||
} else {
|
||||
Com_Printf ("Downloading %s\n", cls.downloadname);
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message,
|
||||
va("download %s", cls.downloadname));
|
||||
}
|
||||
|
||||
cls.downloadnumber++;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Request a download from the server
|
||||
*/
|
||||
void CL_Download_f (void) {
|
||||
char filename[MAX_OSPATH];
|
||||
|
||||
if (Cmd_Argc() != 2) {
|
||||
Com_Printf("Usage: download <filename>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Com_sprintf(filename, sizeof(filename), "%s", Cmd_Argv(1));
|
||||
|
||||
if (strstr (filename, "..")) {
|
||||
Com_Printf ("Refusing to download a path with ..\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (FS_LoadFile (filename, NULL) != -1) {
|
||||
/* it exists, no need to download */
|
||||
Com_Printf("File already exists.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
strcpy (cls.downloadname, filename);
|
||||
Com_Printf ("Downloading %s\n", cls.downloadname);
|
||||
|
||||
/* download to a temp name, and only rename
|
||||
to the real name when done, so if interrupted
|
||||
a runt file wont be left */
|
||||
COM_StripExtension (cls.downloadname, cls.downloadtempname);
|
||||
strcat (cls.downloadtempname, ".tmp");
|
||||
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message,
|
||||
va("download %s", cls.downloadname));
|
||||
|
||||
cls.downloadnumber++;
|
||||
}
|
||||
|
||||
void CL_RegisterSounds (void) {
|
||||
int i;
|
||||
|
||||
|
@ -177,80 +73,6 @@ void CL_RegisterSounds (void) {
|
|||
S_EndRegistration ();
|
||||
}
|
||||
|
||||
/*
|
||||
* A download message has been received from the server
|
||||
*/
|
||||
void CL_ParseDownload (void) {
|
||||
int size, percent;
|
||||
char name[MAX_OSPATH];
|
||||
int r;
|
||||
|
||||
/* read the data */
|
||||
size = MSG_ReadShort (&net_message);
|
||||
percent = MSG_ReadByte (&net_message);
|
||||
|
||||
if (size == -1) {
|
||||
Com_Printf ("Server does not have this file.\n");
|
||||
|
||||
if (cls.download) {
|
||||
/* if here, we tried to resume a
|
||||
file but the server said no */
|
||||
fclose (cls.download);
|
||||
cls.download = NULL;
|
||||
}
|
||||
|
||||
CL_RequestNextDownload ();
|
||||
return;
|
||||
}
|
||||
|
||||
/* open the file if not opened yet */
|
||||
if (!cls.download) {
|
||||
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
|
||||
|
||||
FS_CreatePath (name);
|
||||
|
||||
cls.download = fopen (name, "wb");
|
||||
|
||||
if (!cls.download) {
|
||||
net_message.readcount += size;
|
||||
Com_Printf ("Failed to open %s\n", cls.downloadtempname);
|
||||
CL_RequestNextDownload ();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fwrite (net_message.data + net_message.readcount, 1, size, cls.download);
|
||||
net_message.readcount += size;
|
||||
|
||||
if (percent != 100) {
|
||||
/* request next block */
|
||||
cls.downloadpercent = percent;
|
||||
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
SZ_Print (&cls.netchan.message, "nextdl");
|
||||
|
||||
} else {
|
||||
char oldn[MAX_OSPATH];
|
||||
char newn[MAX_OSPATH];
|
||||
|
||||
fclose (cls.download);
|
||||
|
||||
/* rename the temp file to it's final name */
|
||||
CL_DownloadFileName(oldn, sizeof(oldn), cls.downloadtempname);
|
||||
CL_DownloadFileName(newn, sizeof(newn), cls.downloadname);
|
||||
r = rename (oldn, newn);
|
||||
|
||||
if (r)
|
||||
Com_Printf ("failed to rename.\n");
|
||||
|
||||
cls.download = NULL;
|
||||
cls.downloadpercent = 0;
|
||||
|
||||
/* get another file if needed */
|
||||
CL_RequestNextDownload ();
|
||||
}
|
||||
}
|
||||
|
||||
int CL_ParseEntityBits (unsigned *bits) {
|
||||
unsigned b, total;
|
||||
int i;
|
||||
|
|
Loading…
Reference in a new issue