96 lines
3.2 KiB
C++
96 lines
3.2 KiB
C++
#include "./httpdownloadwithinforequst.h"
|
|
#include "./permissionstatus.h"
|
|
|
|
namespace Network {
|
|
|
|
/*!
|
|
* \class HttpDownloadWithInfoRequst
|
|
* \brief The HttpDownloadWithInfoRequst class a base class for HTTP downloads which need to perform
|
|
* additional requests before the actual download.
|
|
*
|
|
* A YoutubeDownload needs to retrieve the download URL for example. These requests are handled by
|
|
* the HttpDownloadWithInfoRequst class during initialization.
|
|
*/
|
|
|
|
/*!
|
|
* \brief Constructs a new YoutubeDownload for the specified \a url.
|
|
*/
|
|
HttpDownloadWithInfoRequst::HttpDownloadWithInfoRequst(const QUrl &url, QObject *parent)
|
|
: HttpDownload(url, parent)
|
|
{
|
|
}
|
|
|
|
HttpDownloadWithInfoRequst::~HttpDownloadWithInfoRequst()
|
|
{
|
|
}
|
|
|
|
void HttpDownloadWithInfoRequst::doInit()
|
|
{
|
|
setTitleFromFilename(initialUrl().host());
|
|
bool success;
|
|
QString reasonForFail;
|
|
// get the info request
|
|
m_infoDownload.reset(infoRequestDownload(success, reasonForFail));
|
|
if (success) {
|
|
// the request could be constructed successfully
|
|
if (!m_infoDownload) {
|
|
// no request needed (at this time), just call evalVideoInformation()
|
|
evalVideoInformation(nullptr, nullptr);
|
|
} else {
|
|
// setup and initiate the request
|
|
m_infoDownload->setParent(parent());
|
|
m_infoDownload->setDefaultUserAgentUsed(isDefaultUserAgentUsed());
|
|
m_infoDownload->setCustomUserAgent(userAgent());
|
|
m_infoDownload->setProxy(proxy());
|
|
connect(m_infoDownload.get(), &Download::statusChanged, this, &HttpDownloadWithInfoRequst::infoRequestChangedStatus);
|
|
m_infoDownload->init();
|
|
}
|
|
} else {
|
|
reportInitiated(false, reasonForFail);
|
|
}
|
|
}
|
|
|
|
void HttpDownloadWithInfoRequst::abortDownload()
|
|
{
|
|
if (m_infoDownload) {
|
|
m_infoDownload->stop();
|
|
}
|
|
HttpDownload::abortDownload();
|
|
}
|
|
|
|
/*!
|
|
* \brief Handles the status of the info request.
|
|
*/
|
|
void HttpDownloadWithInfoRequst::infoRequestChangedStatus(Download *download)
|
|
{
|
|
switch (download->status()) {
|
|
case DownloadStatus::Failed:
|
|
reportInitiated(false, tr("Couldn't retieve the video information. %1").arg(statusInfo()));
|
|
break;
|
|
case DownloadStatus::Ready:
|
|
if (m_infoDownload->isValidOptionChosen()) {
|
|
m_infoDownload->setRedirectPermission(m_infoDownload->chosenOption(), PermissionStatus::AlwaysAllowed);
|
|
m_infoBuffer.reset(new QBuffer());
|
|
if (m_infoBuffer->open(QIODevice::ReadWrite)) {
|
|
download->start(m_infoBuffer.get());
|
|
} else {
|
|
reportInitiated(false, tr("Couldn't initialize buffer to store initialization data."));
|
|
}
|
|
} else {
|
|
reportInitiated(false, tr("The initialization request has no options."));
|
|
}
|
|
break;
|
|
case DownloadStatus::Finished:
|
|
if (!m_infoBuffer) {
|
|
reportInitiated(false, tr("The initialization data buffer hasn't been initialized."));
|
|
} else {
|
|
m_infoBuffer->seek(0);
|
|
evalVideoInformation(download, m_infoBuffer.get());
|
|
m_infoDownload.reset();
|
|
}
|
|
break;
|
|
default:;
|
|
}
|
|
}
|
|
} // namespace Network
|