get the basics of http download working. need error checking.

This commit is contained in:
Bill Currie 2007-03-24 13:57:07 +00:00 committed by Jeff Teunissen
parent d7b84e3ca3
commit a4f9363566
2 changed files with 49 additions and 33 deletions

View file

@ -1081,9 +1081,12 @@ CL_Download_f (void)
return;
}
dsprintf (cls.downloadname, "%s/%s", qfs_gamedir->dir.def, Cmd_Argv (1));
dstring_copystr (cls.downloadname, Cmd_Argv (1));
dstring_copystr (cls.downloadtempname, Cmd_Argv (1));
QFS_StripExtension (cls.downloadname->str, cls.downloadtempname->str);
dstring_appendstr (cls.downloadtempname, ".tmp");
dstring_copystr (cls.downloadtempname, cls.downloadname->str);
cls.download = QFS_WOpen (cls.downloadname->str, 0);
if (cls.download) {
cls.downloadtype = dl_single;

View file

@ -241,6 +241,7 @@ CL_CheckOrDownloadFile (const char *filename)
return true;
dstring_copystr (cls.downloadname, filename);
dstring_copystr (cls.downloadtempname, filename);
Con_Printf ("Downloading %s...\n", cls.downloadname->str);
// download to a temp name, and only rename to the real name when done,
@ -439,13 +440,15 @@ CL_FinishDownload (void)
cls.downloadname->str + 6);
}
if (QFS_Rename (oldn->str, newn->str))
Con_Printf ("failed to rename, %s.\n", strerror (errno));
Con_Printf ("failed to rename %s to %s, %s.\n", oldn->str,
newn->str, strerror (errno));
dstring_delete (oldn);
dstring_delete (newn);
}
cls.download = NULL;
dstring_clearstr (cls.downloadname);
dstring_clearstr (cls.downloadtempname);
dstring_clearstr (cls.downloadurl);
cls.downloadpercent = 0;
@ -453,6 +456,42 @@ CL_FinishDownload (void)
CL_RequestNextDownload ();
}
static int
CL_OpenDownload (void)
{
dstring_t *name = dstring_newstr ();
const char *fname, *path;
if (strncmp (cls.downloadtempname->str, "skins/", 6) == 0) {
path = qfs_gamedir->dir.skins;
fname = cls.downloadtempname->str + 6;
} else if (strncmp (cls.downloadtempname->str, "progs/", 6) == 0) {
path = qfs_gamedir->dir.progs;
fname = cls.downloadtempname->str + 6;
} else if (strncmp (cls.downloadtempname->str, "sound/", 6) == 0) {
path = qfs_gamedir->dir.sound;
fname = cls.downloadtempname->str + 6;
} else if (strncmp (cls.downloadtempname->str, "maps/", 5) == 0) {
path = qfs_gamedir->dir.maps;
fname = cls.downloadtempname->str + 5;
} else {
path = qfs_gamedir->dir.def;
fname = cls.downloadtempname->str;
}
dsprintf (name, "%s/%s", path, fname);
cls.download = QFS_WOpen (name->str, 0);
if (!cls.download) {
dstring_clearstr (cls.downloadname);
dstring_clearstr (cls.downloadurl);
Con_Printf ("Failed to open %s\n", name->str);
CL_RequestNextDownload ();
return 0;
}
dstring_delete (name);
return 1;
}
/*
CL_ParseDownload
@ -466,7 +505,7 @@ CL_ParseDownload (void)
// read the data
size = MSG_ReadShort (net_message);
percent = MSG_ReadByte (net_message);
Con_Printf ("%d %d\n", size, percent);
if (cls.demoplayback) {
if (size > 0)
net_message->readcount += size;
@ -539,41 +578,15 @@ CL_ParseDownload (void)
Con_Printf ("server sent http redirect but we don't know how to handle"
"it :(\n");
#endif
CL_OpenDownload ();
return;
}
// open the file if not opened yet
if (!cls.download) {
dstring_t *name = dstring_newstr ();
const char *fname, *path;
if (strncmp (cls.downloadtempname->str, "skins/", 6) == 0) {
path = qfs_gamedir->dir.skins;
fname = cls.downloadtempname->str + 6;
} else if (strncmp (cls.downloadtempname->str, "progs/", 6) == 0) {
path = qfs_gamedir->dir.progs;
fname = cls.downloadtempname->str + 6;
} else if (strncmp (cls.downloadtempname->str, "sound/", 6) == 0) {
path = qfs_gamedir->dir.sound;
fname = cls.downloadtempname->str + 6;
} else if (strncmp (cls.downloadtempname->str, "maps/", 5) == 0) {
path = qfs_gamedir->dir.maps;
fname = cls.downloadtempname->str + 5;
} else {
path = qfs_gamedir->dir.def;
fname = cls.downloadtempname->str;
}
dsprintf (name, "%s/%s", path, fname);
cls.download = QFS_WOpen (name->str, 0);
if (!cls.download) {
dstring_clearstr (cls.downloadname);
dstring_clearstr (cls.downloadurl);
net_message->readcount += size;
Con_Printf ("Failed to open %s\n", name->str);
CL_RequestNextDownload ();
if (!CL_OpenDownload ()) {
return;
net_message->readcount += size;
}
dstring_delete (name);
}
Qwrite (cls.download, net_message->message->data + net_message->readcount,