mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-08-27 08:36:36 -04:00
Thanks to Mike W9MDB for the concept of forcing to HTTP if OpenSSL is not installed or if the user requires it for other reasons. The sample downloader should now be usable with or without OpenSSL libraries being installed, so long as SourceForge continue to serve identical content from both HTTP and HTTPS schemes on their file servers and mirrors. For users with baulked OpenSSL installations, incorrect or incomplete CA certificate stores, either the improved capability to ignore SSL/TLS errors for the duration of a session at their discretion or, as a last resort a new option to force an HTTP URL scheme is provided. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7379 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
85 lines
2.2 KiB
C++
85 lines
2.2 KiB
C++
#ifndef REMOTE_FILE_HPP__
|
|
#define REMOTE_FILE_HPP__
|
|
|
|
#include <QObject>
|
|
#include <QString>
|
|
#include <QUrl>
|
|
#include <QFileInfo>
|
|
#include <QSaveFile>
|
|
#include <QPointer>
|
|
|
|
class QNetworkAccessManager;
|
|
class QNetworkReply;
|
|
|
|
//
|
|
// Synchronize an individual file specified by a URL to the local file
|
|
// system
|
|
//
|
|
class RemoteFile final
|
|
: public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
//
|
|
// Clients of RemoteFile must provide an instance of this
|
|
// interface. It may be used to receive information and requests
|
|
// from the RemoteFile instance as it does its work.
|
|
//
|
|
class ListenerInterface
|
|
{
|
|
protected:
|
|
ListenerInterface () {}
|
|
|
|
public:
|
|
virtual void error (QString const& title, QString const& message) = 0;
|
|
virtual bool redirect_request (QUrl const&) {return false;} // disallow
|
|
virtual void download_progress (qint64 /* bytes_received */, qint64 /* total_bytes */) {}
|
|
virtual void download_finished (bool /* success */) {}
|
|
};
|
|
|
|
explicit RemoteFile (ListenerInterface * listener, QNetworkAccessManager * network_manager
|
|
, QString const& local_file_path, bool http_only = false
|
|
, QObject * parent = nullptr);
|
|
|
|
// true if local file exists or will do very soon
|
|
bool local () const;
|
|
|
|
// download/remove the local file
|
|
bool sync (QUrl const& url, bool local = true, bool force = false);
|
|
|
|
// abort an active download
|
|
void abort ();
|
|
|
|
// change the local location, this will rename if the file exists locally
|
|
void local_file_path (QString const&);
|
|
|
|
QString local_file_path () const {return local_file_.absoluteFilePath ();}
|
|
QUrl url () const {return url_;}
|
|
|
|
// always use an http scheme for remote URLs
|
|
void http_only (bool flag = true) {http_only_ = flag;}
|
|
|
|
private:
|
|
void download (QUrl url);
|
|
void reply_finished ();
|
|
|
|
Q_SLOT void store ();
|
|
|
|
Q_SIGNAL void redirect (QUrl const&, unsigned redirect_count);
|
|
Q_SIGNAL void downloadProgress (qint64 bytes_received, qint64 total_bytes);
|
|
Q_SIGNAL void finished ();
|
|
|
|
ListenerInterface * listener_;
|
|
QNetworkAccessManager * network_manager_;
|
|
QFileInfo local_file_;
|
|
bool http_only_;
|
|
QUrl url_;
|
|
QPointer<QNetworkReply> reply_;
|
|
bool is_valid_;
|
|
unsigned redirect_count_;
|
|
QSaveFile file_;
|
|
};
|
|
|
|
#endif
|