WSJT-X/SampleDownloader/FileNode.hpp
Bill Somerville 8b1ef4d8be Fix various sample downloader issues especially server redirect handling
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
2016-12-11 21:19:31 +00:00

68 lines
2.0 KiB
C++

#ifndef FILE_NODE_HPP__
#define FILE_NODE_HPP__
#include <QTreeWidgetItem>
#include "RemoteFile.hpp"
class QNetworkAccessManager;
class QString;
class QUrl;
//
// A holder for a RemoteFile object linked to a QTreeWidget row.
//
// It renders the file name in first column and holds download
// progress data in the second column. The progress information is a
// 64 bit integer number of bytes in the DisplayRole and a total bytes
// expected in the UserRole. The first column also renders a check box
// that downloads the file when checked and removes the downloaded
// file when unchecked. The URL and local absolute file path are
// stored in the UserData and UserData+1 roles of the first column.
//
class FileNode final
: public QTreeWidgetItem
, protected RemoteFile::ListenerInterface
{
public:
explicit FileNode (QTreeWidgetItem * parent
, QNetworkAccessManager * network_manager
, QString const& local_path
, QUrl const& url
, bool http_only);
bool local () const {return remote_file_.local ();}
bool sync (bool local);
void abort ();
static int constexpr Type {UserType + 1};
//
// Clients may use this RAII class to block nested calls to sync
// which may be troublesome, e.g. when UI updates cause recursion.
//
struct sync_blocker
{
sync_blocker (FileNode * node) : node_ {node} {node_->block_sync_ = true;}
sync_blocker (sync_blocker const&) = delete;
sync_blocker& operator = (sync_blocker const&) = delete;
~sync_blocker () {node_->block_sync_ = false;}
private:
FileNode * node_;
};
protected:
void error (QString const& title, QString const& message) override;
bool redirect_request (QUrl const&) override {return true;} // allow
void download_progress (qint64 bytes_received, qint64 total_bytes) override;
void download_finished (bool success) override;
private:
RemoteFile remote_file_; // active download
bool block_sync_;
friend struct sync_blocker;
};
#endif