Deflate::Deflate(const char * out, const char * in) { std::ofstream f_out(out, std::ios::binary | std::ios::app | std::ios::out); //file to write std::ifstream f_in; std::string input = "", result = "", line; f_in.open(in); if (f_in.is_open()) { while (std::getline(f_in, line)) input.append(line); f_in.close(); } else std::cout << "Unable to open file"; auto tmp = LZ77::getInstance(input).getResult(input); auto vec_bit = HuffmanCode::getInstance(tmp).CompressHuff(); for (auto it : vec_bit) binaryWrite(f_out, it); }
/* FIXME dont run every time, only if dlqueue is full!!! */ int curlFetch(struct url *ptr, int dlnum) { CURLM *cm; CURLMsg *msg; long L=100; unsigned int C=0; int M, Q, U = -1; fd_set R, W, E; struct timeval T; CURLMcode ret; qboolean got404=false; if (!cls.downloadServer) return 0; curl_global_init(CURL_GLOBAL_ALL); cm = curl_multi_init(); curl_easy_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX); for (C = 0; C < dlnum; ++C) init(cm, C); while (U) { ret = curl_multi_perform(cm, &U); if (U) { FD_ZERO(&R); FD_ZERO(&W); FD_ZERO(&E); if (ret != CURLM_OK) { Com_Printf ("curl_multi_perform error, Aborting HTTP downloads.\n"); return 1; } if (curl_multi_fdset(cm, &R, &W, &E, &M)) { Com_Printf("E: curl_multi_fdset\n"); return 1; } if (L == -1) L = 100; if (M == -1) { /* obviously we need to sleep a short while so we DO NOT RUN OUT OF FDs! */ #ifdef WIN32 Sleep(L); #else sleep(L / 1000); #endif } else { T.tv_sec = L/1000; T.tv_usec = (L%1000)*1000; //T.tv_sec = 5; //T.tv_usec = 0; if (0 > select(M+1, &R, &W, &E, &T)) { Com_Printf("E: select(%i,,,,%li): %i: %s\n", M+1, L, errno, strerror(errno)); return 1; } } } while ((msg = curl_multi_info_read(cm, &Q))) { // allow user to use console CL_SendCommand (); if (msg->msg == CURLMSG_DONE) { long responseCode; extern struct MemoryStruct *memPtr; char *url; double recvsize; double totaltime; char *localfile; char *fullurl; int remainingFiles; static int finishcnt; CURL *e = msg->easy_handle; curl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE, &responseCode); curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url); curl_easy_getinfo(msg->easy_handle, CURLINFO_SIZE_DOWNLOAD, &recvsize); curl_easy_getinfo(msg->easy_handle, CURLINFO_TOTAL_TIME, &totaltime); curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &localfile); curl_easy_getinfo(msg->easy_handle, CURLINFO_EFFECTIVE_URL, &fullurl); remainingFiles=0; if (responseCode == 404) { //Com_Printf("[HTTP] %s [404 Not Found] [x remaining files]\n", //localfile, recvsize/1000,recvsize/(1000*totaltime),remainingFiles); // dont show 404 error in some cases, prettier console... #if HTTP404ERROR Com_Printf("[HTTP] %s [404 Not Found]\n", localfile, recvsize/1000,recvsize/(1000*totaltime),remainingFiles); got404=true; cls.downloadnow=false; // dont download over http again... #endif } else if (responseCode == 200) { /* Com_Printf("[HTTP] %s [%.f kB, %.0f kB/sec] [x remaining files]\n", localfile, recvsize/1000,recvsize/(1000*totaltime),remainingFiles); */ Com_Printf("[HTTP] %s [%.f kB, %.0f kB/sec]\n", localfile, recvsize/1000,recvsize/(1000*totaltime),remainingFiles); binaryWrite(localfile, memPtr->memory, memPtr->size); } finishcnt++; if (memPtr && memPtr->memory) free(memPtr->memory); curl_multi_remove_handle(cm, e); curl_easy_cleanup(e); } else { Com_Printf("E: CURLMsg (%d)\n", msg->msg); return 1; } if (C < dlnum) { init(cm, C++); U++; } } } curl_multi_cleanup(cm); curl_global_cleanup(); return got404 ? 1:0; }