networkdownloader.cpp 1.8 KB

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