#include #include "DownloadClient.h" DownloadClient::DownloadClient(): isDownloading(false), current(NULL), currentId(-1) { } DownloadClient::DownloadClient(QString addr): SslClient(addr), isDownloading(false), current(NULL), currentId(-1) { DownloadClient(); } void DownloadClient::Download(const string &filename) { pair file(filename, 0); vector > fileList; fileList.push_back(file); Download(fileList); } void DownloadClient::Download(const pair &file) { vector > fileList; fileList.push_back(file); Download(fileList); } void DownloadClient::Download(const vector > &fileList) { if (server.isEmpty()) { Logger::Error("Server address isn't set! Aborting.\n"); return; } if (isDownloading) { Logger::Error("Previous downloading process wasn't finished! Aborting.\n"); return; } connect(this, SIGNAL(ReplyRecieved(SslClient::RequestType&, QByteArray&)), this, SLOT(FileDataRecieved(SslClient::RequestType&, QByteArray&))); isDownloading = true; files = fileList; DoDownload(); } void DownloadClient::DoDownload() { currentId++; if (currentId < (int)files.size()) { pair file = files[currentId]; QString filename = QString::fromLocal8Bit(file.first.c_str()); string md5 = file.second; current = new QFile(filename); current->open(QIODevice::WriteOnly | QIODevice::Unbuffered); Logger::Info("Downloading file (%d of %u): %s\n", currentId + 1, files.size(), file.first.c_str()); SendFileRequest(file.first); } else { Logger::Info("All files have been downloaded.\n"); isDownloading = false; emit downloadFinished(); } } void DownloadClient::FileDataRecieved(SslClient::RequestType &type, QByteArray &data) { Logger::Trace("Recieved file data: %u bytes\n", data.size()); if (type != RegularFile) { Logger::Error("Invalid reply recieved: %x\n", type); return; } if ((current == NULL) || (! current->isOpen())) { Logger::Error("File isn't open or in invalid state.\n"); return; } pair file = files[currentId]; string filename = file.first; if (data.size() != 0) { current->write(data); current->waitForBytesWritten(-1); } else { Logger::Trace("Last (empty) packet recieved\n"); current->close(); delete current; current = NULL; /** * @todo md5 hash check */ // proceed to the next file DoDownload(); } }