X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=libcurl.c;h=301a81b7dc1248e921627f50cb20427405a42b01;hb=17a6dfb7c9b37209272a4ea7e07b7dbccd5d0aa8;hp=1aa40f6382c08e30d1da1bf6fb40ecf2d975ce0a;hpb=001af047073ed9ff2ee8f07586283c0da9c594c7;p=xonotic%2Fdarkplaces.git diff --git a/libcurl.c b/libcurl.c index 1aa40f63..301a81b7 100644 --- a/libcurl.c +++ b/libcurl.c @@ -2,11 +2,11 @@ #include "fs.h" #include "libcurl.h" -static cvar_t cl_curl_maxdownloads = {1, "cl_curl_maxdownloads","1", "maximum number of concurrent HTTP/FTP downloads"}; -static cvar_t cl_curl_maxspeed = {1, "cl_curl_maxspeed","100", "maximum download speed (KiB/s)"}; -static cvar_t sv_curl_defaulturl = {1, "sv_curl_defaulturl","", "default autodownload source URL"}; -static cvar_t sv_curl_serverpackages = {1, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"}; -static cvar_t cl_curl_enabled = {1, "cl_curl_enabled","0", "whether client's download support is enabled"}; +static cvar_t cl_curl_maxdownloads = {CVAR_SAVE, "cl_curl_maxdownloads","1", "maximum number of concurrent HTTP/FTP downloads"}; +static cvar_t cl_curl_maxspeed = {CVAR_SAVE, "cl_curl_maxspeed","100", "maximum download speed (KiB/s)"}; +static cvar_t sv_curl_defaulturl = {CVAR_SAVE, "sv_curl_defaulturl","", "default autodownload source URL"}; +static cvar_t sv_curl_serverpackages = {CVAR_SAVE, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"}; +static cvar_t cl_curl_enabled = {CVAR_SAVE, "cl_curl_enabled","1", "whether client's download support is enabled"}; /* ================================================================= @@ -185,6 +185,8 @@ downloadinfo; static downloadinfo *downloads = NULL; static int numdownloads = 0; +static qboolean noclear = FALSE; + static int numdownloads_fail = 0; static int numdownloads_success = 0; static int numdownloads_added = 0; @@ -236,6 +238,8 @@ Clears the "will disconnect on failure" flags. void Curl_Clear_forthismap() { downloadinfo *di; + if(noclear) + return; for(di = downloads; di; di = di->next) di->forthismap = false; Curl_CommandWhenError(NULL); @@ -245,16 +249,23 @@ void Curl_Clear_forthismap() numdownloads_added = 0; } -/* obsolete: numdownloads_added contains the same -static qboolean Curl_Have_forthismap() +/* +==================== +Curl_Have_forthismap + +Returns true if a download needed for the current game is running. +==================== +*/ +qboolean Curl_Have_forthismap() { - downloadinfo *di; - for(di = downloads; di; di = di->next) - if(di->forthismap) - return true; - return false; + return numdownloads_added; +} + +void Curl_Register_predownload() +{ + Curl_CommandWhenDone("cl_begindownloads"); + Curl_CommandWhenError("cl_begindownloads"); } -*/ /* ==================== @@ -270,19 +281,19 @@ static void Curl_CheckCommandWhenDone() return; if(numdownloads_added && (numdownloads_success == numdownloads_added) && *command_when_done) { - Con_DPrintf("Map downloads occurred, executing %s\n", command_when_done); + Con_DPrintf("cURL downloads occurred, executing %s\n", command_when_done); Cbuf_AddText("\n"); Cbuf_AddText(command_when_done); Cbuf_AddText("\n"); - Curl_Clear_forthismap(NULL); + Curl_Clear_forthismap(); } else if(numdownloads_added && numdownloads_fail && *command_when_error) { - Con_DPrintf("Map downloads FAILED, executing %s\n", command_when_error); + Con_DPrintf("cURL downloads FAILED, executing %s\n", command_when_error); Cbuf_AddText("\n"); Cbuf_AddText(command_when_error); Cbuf_AddText("\n"); - Curl_Clear_forthismap(NULL); + Curl_Clear_forthismap(); } } @@ -300,12 +311,16 @@ static qboolean CURL_OpenLibrary (void) #if defined(WIN64) "libcurl64.dll", #elif defined(WIN32) + "libcurl-4.dll", "libcurl-3.dll", #elif defined(MACOSX) + "libcurl.4.dylib", // Mac OS X Notyetreleased "libcurl.3.dylib", // Mac OS X Tiger "libcurl.2.dylib", // Mac OS X Panther #else + "libcurl.so.4", "libcurl.so.3", + "libcurl.so", // FreeBSD #endif NULL }; @@ -446,8 +461,6 @@ static void Curl_EndDownload(downloadinfo *di, CurlStatus status, CURLcode error ++numdownloads_fail; } Z_Free(di); - - Curl_CheckCommandWhenDone(); } /* @@ -633,7 +646,7 @@ void Curl_Begin(const char *URL, const char *name, qboolean ispak, qboolean fort return; } } - + if(ispak && FS_FileExists(fn)) { qboolean already_loaded; @@ -709,12 +722,16 @@ blocking. */ void Curl_Run() { + noclear = FALSE; + if(!cl_curl_enabled.integer) return; if(!curl_dll) return; + Curl_CheckCommandWhenDone(); + if(!downloads) return; @@ -724,7 +741,7 @@ void Curl_Run() { int remaining; CURLMcode mc; - + do { mc = qcurl_multi_perform(curlm, &remaining); @@ -760,7 +777,7 @@ void Curl_Run() break; } } - + Curl_EndDownload(di, failed, result); } } @@ -970,7 +987,10 @@ void Curl_Curl_f(void) else { downloadinfo *di = Curl_Find(url); - Curl_EndDownload(di, CURL_DOWNLOAD_ABORTED, CURLE_OK); + if(di) + Curl_EndDownload(di, CURL_DOWNLOAD_ABORTED, CURLE_OK); + else + Con_Print("download not found\n"); } return; } @@ -1014,12 +1034,18 @@ void Curl_Curl_f(void) char donecommand[256]; if(cls.netcon) { - dpsnprintf(donecommand, sizeof(donecommand), "connect %s", cls.netcon->address); - Curl_CommandWhenDone(donecommand); + if(cl.loadbegun) // curling won't inhibit loading the map any more when at this stage, so bail out and force a reconnect + { + dpsnprintf(donecommand, sizeof(donecommand), "connect %s", cls.netcon->address); + Curl_CommandWhenDone(donecommand); + noclear = TRUE; + CL_Disconnect(); + noclear = FALSE; + Curl_CheckCommandWhenDone(); + } + else + Curl_Register_predownload(); } - CL_Disconnect(); - - Curl_CheckCommandWhenDone(); } return; } @@ -1098,16 +1124,18 @@ Curl_downloadinfo_t *Curl_GetDownloadInfo(int *nDownloads, const char **addition } ++i; } - + if(additional_info) { // TODO: can I clear command_when_done as soon as the first download fails? if(*command_when_done && !numdownloads_fail && numdownloads_added) { - if(strncmp(command_when_done, "connect ", 8)) - dpsnprintf(addinfo, sizeof(addinfo), "(will do '%s' when done)", command_when_done); - else + if(!strncmp(command_when_done, "connect ", 8)) dpsnprintf(addinfo, sizeof(addinfo), "(will join %s when done)", command_when_done + 8); + else if(!strcmp(command_when_done, "cl_begindownloads")) + dpsnprintf(addinfo, sizeof(addinfo), "(will enter the game when done)"); + else + dpsnprintf(addinfo, sizeof(addinfo), "(will do '%s' when done)", command_when_done); *additional_info = addinfo; } else @@ -1154,7 +1182,7 @@ static const char *Curl_FindPackURL(const char *filename) char *p = buf; char *pattern = NULL, *patternend = NULL, *url = NULL, *urlend = NULL; qboolean eof = false; - + pattern = p; while(!eof) { @@ -1248,7 +1276,7 @@ void Curl_ClearRequirements() } p = sv_curl_serverpackages.string; Con_DPrintf("Require all of: %s\n", p); - while(COM_ParseTokenConsole(&p)) + while(COM_ParseToken_Simple(&p, false)) { Con_DPrintf("Require: %s\n", com_token); Curl_RequireFile(com_token);