From aec49a7bb061028c3580cef0c5dcacb757085e27 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sun, 16 Oct 2005 12:50:44 +0000 Subject: [PATCH] Added support for multiple simultaneous downloads. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1493 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/http/httpclient.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/engine/http/httpclient.c b/engine/http/httpclient.c index 83d48eecd..41bd6fb04 100644 --- a/engine/http/httpclient.c +++ b/engine/http/httpclient.c @@ -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();