void CL_cURL_PerformDownload(void) { CURLMcode res; CURLMsg *msg; int c; int i = 0; res = qcurl_multi_perform(clc.downloadCURLM, &c); while(res == CURLM_CALL_MULTI_PERFORM && i < 100) { res = qcurl_multi_perform(clc.downloadCURLM, &c); i++; } if(res == CURLM_CALL_MULTI_PERFORM) return; msg = qcurl_multi_info_read(clc.downloadCURLM, &c); if(msg == NULL) { return; } FS_FCloseFile(clc.download); if(msg->msg == CURLMSG_DONE && msg->data.result == CURLE_OK) { FS_SV_Rename(clc.downloadTempName, clc.downloadName); } else { long code; qcurl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE, &code); Com_Error(ERR_DROP, "Download Error: %s Code: %d", qcurl_easy_strerror(msg->data.result), code); } *clc.downloadTempName = *clc.downloadName = 0; Cvar_Set( "cl_downloadName", "" ); CL_cURL_Cleanup(); FS_Restart(clc.checksumFeed); CL_Reconnect_f(); }
/* ================== CL_ParseServerData ================== */ qboolean CL_ParseServerData (sizebuf_t *msg) { char *str; int i; Com_DPrintf ("Serverdata packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); cls.state = ca_connected; // parse protocol version number i = MSG_ReadLong (msg); cls.serverProtocol = i; cl.servercount = MSG_ReadLong (msg); cl.attractloop = MSG_ReadByte (msg); if (cl.attractloop) { //cls.serverProtocol = PROTOCOL_VERSION_DEFAULT; } else if (i != PROTOCOL_VERSION_DEFAULT && i != PROTOCOL_VERSION_R1Q2) { Com_Error (ERR_DROP, "Server is using unknown protocol %d.", i); } // game directory str = MSG_ReadString (msg); Q_strncpyz (cl.gamedir, str, sizeof(cl.gamedir)); str = cl.gamedir; // set gamedir if (!Com_ServerState()) { Cvar_SetLatched("game", str); if( FS_NeedRestart() ) { CL_RestartFilesystem(true); } } // parse player entity number cl.playernum = MSG_ReadShort (msg); // get the full level name str = MSG_ReadString (msg); cl.pmp.strafeHack = false; cl.pmp.speedMultiplier = 1; cl.pmp.airaccelerate = 0; cls.protocolVersion = 0; if (cls.serverProtocol == PROTOCOL_VERSION_R1Q2) { i = MSG_ReadByte(msg); if( i ) { Com_Printf("'Enhanced' R1Q2 servers are not supported, falling back to protocol 34.\n" ); CL_Disconnect(); cls.serverProtocol = PROTOCOL_VERSION_DEFAULT; CL_Reconnect_f (); return false; } i = MSG_ReadShort(msg); if (i < PROTOCOL_VERSION_R1Q2_MINIMUM || i > PROTOCOL_VERSION_R1Q2_CURRENT) { if (cl.attractloop) { if ( i < PROTOCOL_VERSION_R1Q2_MINIMUM ) Com_Printf("This demo was recorded with an earlier version of the R1Q2 protocol. It may not play back properly.\n"); else Com_Printf("This demo was recorded with a later version of the R1Q2 protocol. It may not play back properly.\n"); } else { if( i < PROTOCOL_VERSION_R1Q2_MINIMUM ) { Com_Printf("Server uses OLDER minor R1Q2 protocol version than minimum supported (%i < %i), falling back to protocol 34.\n", i, PROTOCOL_VERSION_R1Q2_MINIMUM); CL_Disconnect(); cls.serverProtocol = PROTOCOL_VERSION_DEFAULT; CL_Reconnect_f (); return false; } Com_Printf("Server uses NEWER minor R1Q2 protocol version (%i > %i), some features will be unavailable.\n", i, PROTOCOL_VERSION_R1Q2_CURRENT); } } if (i >= 1903) { MSG_ReadByte(msg); cl.pmp.strafeHack = MSG_ReadByte(msg); } cl.pmp.speedMultiplier = 2; cls.protocolVersion = i; } if (cl.playernum == -1) { // playing a cinematic or showing a pic, not a level SCR_PlayCinematic (str); } else { // seperate the printfs so the server message can have a color Com_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Com_Printf ("%c%s\n", 2, str); // need to prep refresh at next oportunity cl.refresh_prepped = false; if((unsigned)cl.playernum >= MAX_CLIENTS) { cl.playernum = ( MAX_CLIENTS - 1 ); } } return true; }