downloader.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "downloader.h"
  2. #include <QEventLoop>
  3. #include <QApplication>
  4. #include <QDebug>
  5. Downloader::Downloader(QObject *parent) :QObject(parent), busy(false)
  6. {
  7. connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)), this, SLOT(onDownloadFinished(QNetworkReply*)));
  8. }
  9. Downloader::~Downloader() {
  10. }
  11. QUrl Downloader::getUrl()
  12. {
  13. return url;
  14. }
  15. void Downloader::setUrl(const QUrl &_url)
  16. {
  17. url = _url;
  18. }
  19. void Downloader::waitForDownloaded()
  20. {
  21. QEventLoop loop;
  22. connect(this, &Downloader::downloadFinished, &loop, &QEventLoop::quit);
  23. loop.exec();
  24. }
  25. void Downloader::start()
  26. {
  27. if (busy) {
  28. qDebug() << "Cannot download " << url << ", downloader is busy!";
  29. return;
  30. }
  31. qDebug() << "Starting download " << url;
  32. busy = true;
  33. QNetworkRequest request(url);
  34. m_CurrentReply = m_WebCtrl.get(request);
  35. m_CurrentReply->setReadBufferSize(download_speed_limit);
  36. connect(m_CurrentReply, &QNetworkReply::readyRead, this, &Downloader::onReadyRead);
  37. connect(m_CurrentReply, &QNetworkReply::downloadProgress, this, &Downloader::progressChanged);
  38. }
  39. void Downloader::updateDownloadSpeedLimit(int bytes_per_sec)
  40. {
  41. download_speed_limit = bytes_per_sec;
  42. if (m_CurrentReply)
  43. m_CurrentReply->setReadBufferSize(bytes_per_sec);
  44. }
  45. void Downloader::stop()
  46. {
  47. m_CurrentReply->abort();
  48. busy = false;
  49. }
  50. void Downloader::onDownloadFinished(QNetworkReply*) {
  51. if (m_CurrentReply)
  52. m_CurrentReply->deleteLater();
  53. busy = false;
  54. emit downloadFinished();
  55. }
  56. void Downloader::onReadyRead()
  57. {
  58. QByteArray readdata = m_CurrentReply->readAll();
  59. if (targetFile && targetFile->isWritable())
  60. targetFile->write(readdata);
  61. if (targetBytearray)
  62. targetBytearray->append(readdata);
  63. }