mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-10 22:51:57 +00:00
Added support for multiple simultaneous downloads.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1493 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
aeff202074
commit
aec49a7bb0
1 changed files with 28 additions and 9 deletions
|
@ -67,7 +67,7 @@ It doesn't use persistant connections.
|
|||
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
typedef struct http_con_s {
|
||||
int sock;
|
||||
|
||||
enum {HC_REQUESTING,HC_GETTINGHEADER, HC_GETTING} state;
|
||||
|
@ -88,6 +88,7 @@ typedef struct {
|
|||
IWEBFILE *file;
|
||||
|
||||
void (*NotifyFunction)(char *localfile, qboolean sucess); //called when failed or succeeded, and only if it got a connection in the first place.
|
||||
struct http_con_s *next;
|
||||
} http_con_t;
|
||||
|
||||
static http_con_t *httpcl;
|
||||
|
@ -216,7 +217,11 @@ static qboolean HTTP_CL_Run(http_con_t *con)
|
|||
if (!*Location)
|
||||
Con_Printf("Server redirected to null location\n");
|
||||
else
|
||||
HTTP_CL_Get(Location, con->filename, con->NotifyFunction);
|
||||
{
|
||||
if (HTTP_CL_Get(Location, con->filename, con->NotifyFunction))
|
||||
con->NotifyFunction = NULL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -363,7 +368,8 @@ static qboolean HTTP_CL_Run(http_con_t *con)
|
|||
void HTTP_CL_Think(void)
|
||||
{
|
||||
http_con_t *con = httpcl;
|
||||
if (con)
|
||||
http_con_t *prev = NULL;
|
||||
while (con)
|
||||
{
|
||||
if (!HTTP_CL_Run(con))
|
||||
{
|
||||
|
@ -373,15 +379,18 @@ void HTTP_CL_Think(void)
|
|||
if (cls.downloadmethod == DL_HTTP)
|
||||
cls.downloadmethod = DL_NONE;
|
||||
closesocket(con->sock);
|
||||
|
||||
if (prev)
|
||||
prev->next = con->next;
|
||||
else
|
||||
httpcl = con->next;
|
||||
|
||||
if (con->buffer)
|
||||
IWebFree(con->buffer);
|
||||
IWebFree(con);
|
||||
if (con == httpcl)
|
||||
{
|
||||
httpcl = NULL;
|
||||
return;
|
||||
}
|
||||
con = NULL;
|
||||
|
||||
//I don't fancy fixing this up.
|
||||
return;
|
||||
}
|
||||
else if (!cls.downloadmethod)
|
||||
{
|
||||
|
@ -406,9 +415,16 @@ void HTTP_CL_Think(void)
|
|||
cls.downloadpercent = con->totalreceived*100.0f/con->contentlength;
|
||||
}
|
||||
}
|
||||
|
||||
prev = con;
|
||||
con = con->next;
|
||||
}
|
||||
}
|
||||
|
||||
//returns true if we start downloading it
|
||||
//returns false if we couldn't connect
|
||||
//note that this return value is actually pretty useless
|
||||
//the NotifyFunction will only ever be called after this has returned true, and won't always suceed.
|
||||
qboolean HTTP_CL_Get(char *url, char *localfile, void (*NotifyFunction)(char *localfile, qboolean sucess))
|
||||
{
|
||||
unsigned long _true = true;
|
||||
|
@ -509,12 +525,15 @@ qboolean HTTP_CL_Get(char *url, char *localfile, void (*NotifyFunction)(char *lo
|
|||
con->bufferused = strlen(con->buffer);
|
||||
con->contentlength = -1;
|
||||
con->NotifyFunction = NotifyFunction;
|
||||
if (!NotifyFunction)
|
||||
Con_Printf("No NotifyFunction\n");
|
||||
strcpy(con->filename, localfile);
|
||||
|
||||
slash = strchr(con->filename, '?');
|
||||
if (slash)
|
||||
*slash = '_';
|
||||
|
||||
con->next = httpcl;
|
||||
httpcl = con;
|
||||
|
||||
HTTP_CL_Think();
|
||||
|
|
Loading…
Reference in a new issue