Sync from quickmods
This commit is contained in:
		@@ -53,16 +53,42 @@ void ByteArrayDownload::downloadError(QNetworkReply::NetworkError error)
 | 
			
		||||
	QLOG_ERROR() << "Error getting URL:" << m_url.toString().toLocal8Bit()
 | 
			
		||||
				 << "Network error: " << error;
 | 
			
		||||
	m_status = Job_Failed;
 | 
			
		||||
	m_errorString = m_reply->errorString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ByteArrayDownload::downloadFinished()
 | 
			
		||||
{
 | 
			
		||||
	if (m_followRedirects)
 | 
			
		||||
	{
 | 
			
		||||
		QVariant redirect = m_reply->header(QNetworkRequest::LocationHeader);
 | 
			
		||||
		QString redirectURL;
 | 
			
		||||
		if(redirect.isValid())
 | 
			
		||||
		{
 | 
			
		||||
			redirectURL = redirect.toString();
 | 
			
		||||
		}
 | 
			
		||||
		// FIXME: This is a hack for https://bugreports.qt-project.org/browse/QTBUG-41061
 | 
			
		||||
		else if(m_reply->hasRawHeader("Location"))
 | 
			
		||||
		{
 | 
			
		||||
			auto data = m_reply->rawHeader("Location");
 | 
			
		||||
			if(data.size() > 2 && data[0] == '/' && data[1] == '/')
 | 
			
		||||
				redirectURL = m_reply->url().scheme() + ":" + data;
 | 
			
		||||
		}
 | 
			
		||||
		if (!redirectURL.isEmpty())
 | 
			
		||||
		{
 | 
			
		||||
			m_url = QUrl(redirect.toString());
 | 
			
		||||
			QLOG_INFO() << "Following redirect to " << m_url.toString();
 | 
			
		||||
			start();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if the download succeeded
 | 
			
		||||
	if (m_status != Job_Failed)
 | 
			
		||||
	{
 | 
			
		||||
		// nothing went wrong...
 | 
			
		||||
		m_status = Job_Finished;
 | 
			
		||||
		m_data = m_reply->readAll();
 | 
			
		||||
		m_content_type = m_reply->header(QNetworkRequest::ContentTypeHeader).toString();
 | 
			
		||||
		m_reply.reset();
 | 
			
		||||
		emit succeeded(m_index_within_job);
 | 
			
		||||
		return;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,10 @@ public:
 | 
			
		||||
	/// if not saving to file, downloaded data is placed here
 | 
			
		||||
	QByteArray m_data;
 | 
			
		||||
 | 
			
		||||
	QString m_errorString;
 | 
			
		||||
 | 
			
		||||
	bool m_followRedirects = false;
 | 
			
		||||
 | 
			
		||||
public
 | 
			
		||||
slots:
 | 
			
		||||
	virtual void start();
 | 
			
		||||
 
 | 
			
		||||
@@ -101,6 +101,30 @@ void CacheDownload::downloadError(QNetworkReply::NetworkError error)
 | 
			
		||||
}
 | 
			
		||||
void CacheDownload::downloadFinished()
 | 
			
		||||
{
 | 
			
		||||
	if (m_followRedirects)
 | 
			
		||||
	{
 | 
			
		||||
		QVariant redirect = m_reply->header(QNetworkRequest::LocationHeader);
 | 
			
		||||
		QString redirectURL;
 | 
			
		||||
		if(redirect.isValid())
 | 
			
		||||
		{
 | 
			
		||||
			redirectURL = redirect.toString();
 | 
			
		||||
		}
 | 
			
		||||
		// FIXME: This is a hack for https://bugreports.qt-project.org/browse/QTBUG-41061
 | 
			
		||||
		else if(m_reply->hasRawHeader("Location"))
 | 
			
		||||
		{
 | 
			
		||||
			auto data = m_reply->rawHeader("Location");
 | 
			
		||||
			if(data.size() > 2 && data[0] == '/' && data[1] == '/')
 | 
			
		||||
				redirectURL = m_reply->url().scheme() + ":" + data;
 | 
			
		||||
		}
 | 
			
		||||
		if (!redirectURL.isEmpty())
 | 
			
		||||
		{
 | 
			
		||||
			m_url = QUrl(redirect.toString());
 | 
			
		||||
			QLOG_INFO() << "Following redirect to " << m_url.toString();
 | 
			
		||||
			start();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if the download succeeded
 | 
			
		||||
	if (m_status == Job_Failed)
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,8 @@ private:
 | 
			
		||||
	bool wroteAnyData = false;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	bool m_followRedirects = false;
 | 
			
		||||
 | 
			
		||||
	explicit CacheDownload(QUrl url, MetaEntryPtr entry);
 | 
			
		||||
	static CacheDownloadPtr make(QUrl url, MetaEntryPtr entry)
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
@@ -55,6 +55,9 @@ public:
 | 
			
		||||
	/// the network reply
 | 
			
		||||
	std::shared_ptr<QNetworkReply> m_reply;
 | 
			
		||||
 | 
			
		||||
	/// the content of the content-type header
 | 
			
		||||
	QString m_content_type;
 | 
			
		||||
 | 
			
		||||
	/// source URL
 | 
			
		||||
	QUrl m_url;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ class NetJob : public ProgressProvider
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	explicit NetJob(QString job_name) : ProgressProvider(), m_job_name(job_name) {};
 | 
			
		||||
	virtual ~NetJob() {};
 | 
			
		||||
	explicit NetJob(QString job_name) : ProgressProvider(), m_job_name(job_name) {}
 | 
			
		||||
	virtual ~NetJob() {}
 | 
			
		||||
	template <typename T> bool addNetAction(T action)
 | 
			
		||||
	{
 | 
			
		||||
		NetActionPtr base = std::static_pointer_cast<NetAction>(action);
 | 
			
		||||
@@ -62,7 +62,10 @@ public:
 | 
			
		||||
	{
 | 
			
		||||
		return downloads[index];
 | 
			
		||||
	}
 | 
			
		||||
	;
 | 
			
		||||
	const NetActionPtr at(const int index)
 | 
			
		||||
	{
 | 
			
		||||
		return downloads.at(index);
 | 
			
		||||
	}
 | 
			
		||||
	NetActionPtr first()
 | 
			
		||||
	{
 | 
			
		||||
		if (downloads.size())
 | 
			
		||||
@@ -73,21 +76,10 @@ public:
 | 
			
		||||
	{
 | 
			
		||||
		return downloads.size();
 | 
			
		||||
	}
 | 
			
		||||
	virtual void getProgress(qint64 ¤t, qint64 &total)
 | 
			
		||||
	{
 | 
			
		||||
		current = current_progress;
 | 
			
		||||
		total = total_progress;
 | 
			
		||||
	}
 | 
			
		||||
	;
 | 
			
		||||
	virtual QString getStatus() const
 | 
			
		||||
	{
 | 
			
		||||
		return m_job_name;
 | 
			
		||||
	}
 | 
			
		||||
	virtual bool isRunning() const
 | 
			
		||||
	{
 | 
			
		||||
		return m_running;
 | 
			
		||||
	}
 | 
			
		||||
	;
 | 
			
		||||
	QStringList getFailedFiles();
 | 
			
		||||
signals:
 | 
			
		||||
	void started();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user