/* */ #include "ConsoleDownloadEngine.h" #include "Util.h" #include #include volatile sig_atomic_t haltRequested = 0; ConsoleDownloadEngine::ConsoleDownloadEngine() {} ConsoleDownloadEngine::~ConsoleDownloadEngine() {} void ConsoleDownloadEngine::sendStatistics(long long int currentSize, long long int totalSize) { /* printf("\r "); printf("\r"); printf("%s/%s Bytes %d%% %s %.2f KB/s %d connections", Util::llitos(currentSize, true).c_str(), Util::llitos(totalSize, true).c_str(), (totalSize == 0 ? 0 : (int)((currentSize*100)/totalSize)), avgSpeed == 0 ? "-" : Util::secfmt(eta).c_str(), speed/1024.0, commands.size()); fflush(stdout); */ cout << "\r "; cout << "\r"; if(_requestGroupMan->countRequestGroup() > 0) { RequestGroupHandle firstRequestGroup = _requestGroupMan->getRequestGroup(0); int32_t dlSpeed = firstRequestGroup->calculateDownloadSpeed(); int32_t eta = 0; if(firstRequestGroup->getTotalLength() > 0 && dlSpeed > 0) { eta = (firstRequestGroup->getTotalLength()-firstRequestGroup->getDownloadLength())/dlSpeed; } cout << "[" << "#" << firstRequestGroup->getGID() << " " << "SIZE:" << Util::abbrevSize(firstRequestGroup->getDownloadLength()) << "B" << "/" << Util::abbrevSize(firstRequestGroup->getTotalLength()) << "B"; if(firstRequestGroup->getTotalLength() > 0) { cout << "(" << 100*firstRequestGroup->getDownloadLength()/firstRequestGroup->getTotalLength() << "%)"; } cout << " " << "CN:" << firstRequestGroup->numConnection; cout << " " << "SPD:" << fixed << setprecision(2) << dlSpeed/1024.0 << "KiB/s"; if(eta > 0) { cout << " " << "ETA:" << Util::secfmt(eta); } cout << "]"; if(_requestGroupMan->countRequestGroup() > 1) { cout << "(" << _requestGroupMan->countRequestGroup()-1 << "more...)"; } } if(_requestGroupMan->countRequestGroup() > 1) { cout << " " << "[TOTAL SPD:" << fixed << setprecision(2) << speed/1024.0 << "KiB/s" << "]"; } { FileAllocationEntryHandle entry = _fileAllocationMan->getCurrentFileAllocationEntry(); if(!entry.isNull()) { cout << " " << "[FileAlloc:" << "#" << entry->getRequestGroup()->getGID() << " " << Util::abbrevSize(entry->getCurrentLength()) << "B" << "/" << Util::abbrevSize(entry->getTotalLength()) << "B" << "(" << 100*entry->getCurrentLength()/entry->getTotalLength() << "%)"; cout << "]"; if(_fileAllocationMan->countFileAllocationEntryInQueue() > 0) { cout << "(" << _fileAllocationMan->countFileAllocationEntryInQueue() << "waiting...)"; } } } { CheckIntegrityEntryHandle entry = _checkIntegrityMan->getFirstCheckIntegrityEntry(); if(!entry.isNull()) { cout << " " << "[Checksum:" << "#" << entry->getRequestGroup()->getGID() << " " << Util::abbrevSize(entry->getCurrentLength()) << "B" << "/" << Util::abbrevSize(entry->getTotalLength()) << "B" << "(" << 100*entry->getCurrentLength()/entry->getTotalLength() << "%)"; cout << "]"; if(_checkIntegrityMan->countCheckIntegrityEntry() > 1) { cout << "(" << _checkIntegrityMan->countCheckIntegrityEntry()-1 << "more...)"; } } } cout << flush; } void ConsoleDownloadEngine::initStatistics() { cp.reset(); startup.reset(); speed = 0; psize = 0; avgSpeed = 0; eta = 0; startupLength = 0; isStartupLengthSet = false; } void ConsoleDownloadEngine::calculateStatistics() { long long int dlSize = _requestGroupMan->getDownloadLength(); if(!isStartupLengthSet && dlSize > 0) { startupLength = dlSize; psize = dlSize; isStartupLengthSet = true; } int elapsed = cp.difference(); if(elapsed >= 1) { int nspeed = (int)((dlSize-psize)/elapsed); if(nspeed < 0) { nspeed = 0; } speed = (nspeed+speed)/2; cp.reset(); psize = dlSize; int elapsedFromStartup = startup.difference(); if(elapsedFromStartup > 0) { avgSpeed = (int)((dlSize-startupLength)/elapsedFromStartup); } int64_t totalLength = _requestGroupMan->getTotalLength(); if(avgSpeed < 0) { avgSpeed = 0; } else if(avgSpeed != 0 && totalLength > 0) { eta = (totalLength-dlSize)/avgSpeed; } sendStatistics(dlSize, totalLength); } } void ConsoleDownloadEngine::onEndOfRun() { _requestGroupMan->closeFile(); // if(segmentMan->finished()) { // segmentMan->remove(); // } else { // segmentMan->save(); // } } void ConsoleDownloadEngine::afterEachIteration() { if(haltRequested) { printf(_("\nstopping application...\n")); fflush(stdout); _requestGroupMan->save(); _requestGroupMan->closeFile(); printf(_("done\n")); exit(EXIT_SUCCESS); } } void ConsoleDownloadEngine::fillCommand() { addCommand(_requestGroupMan->getInitialCommands(this)); }