/* * @brief */ void WriteAASFile(void) { char path[MAX_QPATH]; file_t *f; StripExtension(bsp_name, path); g_strlcat(path, ".aas", sizeof(path)); if (!(f = Fs_OpenWrite(path))) { Com_Error(ERR_FATAL, "Couldn't open %s for writing\n", path); } Com_Print("Writing %d AAS nodes..\n", d_aas.num_nodes); SwapAASFile(); d_bsp_header_t header; memset(&header, 0, sizeof(header)); header.ident = LittleLong(AAS_IDENT); header.version = LittleLong(AAS_VERSION); Fs_Write(f, &header, 1, sizeof(header)); d_bsp_lump_t *lump = &header.lumps[AAS_LUMP_NODES]; WriteLump(f, lump, d_aas.nodes, sizeof(d_aas_node_t) * d_aas.num_nodes); // rewrite the header with the populated lumps Fs_Seek(f, 0); Fs_Write(f, &header, 1, sizeof(header)); Fs_Close(f); }
/* * @brief Returns true if the file exists, otherwise it attempts to start a download * from the server. */ _Bool Cl_CheckOrDownloadFile(const char *filename) { char cmd[MAX_STRING_CHARS]; if (cls.state == CL_DISCONNECTED) { Com_Print("Not connected\n"); return true; } if (IS_INVALID_DOWNLOAD(filename)) { Com_Warn("Refusing to download \"%s\"\n", filename); return true; } Com_Debug("Checking for %s\n", filename); if (Fs_Exists(filename)) { // it exists, no need to download return true; } Com_Debug("Attempting to download %s\n", filename); strncpy(cls.download.name, filename, sizeof(cls.download.name)); // udp downloads to a temp name, and only renames when done StripExtension(cls.download.name, cls.download.tempname); g_strlcat(cls.download.tempname, ".tmp", sizeof(cls.download.tempname)); // attempt an http download if available if (cls.download_url[0] && Cl_HttpDownload()) return false; // check to see if we already have a tmp for this file, if so, try to resume // open the file if not opened yet if (Fs_Exists(cls.download.tempname)) { // a temp file exists, resume download int64_t len = Fs_Load(cls.download.tempname, NULL); if ((cls.download.file = Fs_OpenAppend(cls.download.tempname))) { if (Fs_Seek(cls.download.file, len - 1)) { // give the server the offset to start the download Com_Debug("Resuming %s...\n", cls.download.name); g_snprintf(cmd, sizeof(cmd), "download %s %u", cls.download.name, (uint32_t) len); Net_WriteByte(&cls.net_chan.message, CL_CMD_STRING); Net_WriteString(&cls.net_chan.message, cmd); return false; } } } // or start if from the beginning Com_Debug("Downloading %s...\n", cls.download.name); g_snprintf(cmd, sizeof(cmd), "download %s", cls.download.name); Net_WriteByte(&cls.net_chan.message, CL_CMD_STRING); Net_WriteString(&cls.net_chan.message, cmd); return false; }