]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - libcurl.c
added vid_grabkeyboard cvar which defaults to 0, this means that the glx client no...
[xonotic/darkplaces.git] / libcurl.c
index 42c407ff4d4a3ff8d74817588e8877f09a6e6850..4061f5516732e1e430ef9943b25c3a16cfea5e23 100644 (file)
--- 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","0", "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()
+{
+       return numdownloads_added;
+}
+
+void Curl_Register_predownload()
 {
-       downloadinfo *di;
-       for(di = downloads; di; di = di->next)
-               if(di->forthismap)
-                       return true;
-       return false;
+       Curl_CommandWhenDone("cl_begindownloads");
+       Curl_CommandWhenError("cl_begindownloads");
 }
-*/
 
 /*
 ====================
@@ -446,8 +457,6 @@ static void Curl_EndDownload(downloadinfo *di, CurlStatus status, CURLcode error
                        ++numdownloads_fail;
        }
        Z_Free(di);
-
-       Curl_CheckCommandWhenDone();
 }
 
 /*
@@ -709,12 +718,16 @@ blocking.
 */
 void Curl_Run()
 {
+       noclear = FALSE;
+
        if(!cl_curl_enabled.integer)
                return;
 
        if(!curl_dll)
                return;
 
+       Curl_CheckCommandWhenDone();
+
        if(!downloads)
                return;
 
@@ -970,7 +983,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 +1030,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(cls.signon >= 3)
+                                       {
+                                               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;
                }
@@ -1104,10 +1126,12 @@ Curl_downloadinfo_t *Curl_GetDownloadInfo(int *nDownloads, const char **addition
                // 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