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
This commit is contained in:
Bill Somerville
2016-12-11 21:19:31 +00:00
parent 9af1379576
commit 440559f0c3
7 changed files with 67 additions and 43 deletions
+24 -23
View File
@@ -37,6 +37,7 @@ Directory::Directory (Configuration const * configuration
: QTreeWidget {parent}
, configuration_ {configuration}
, network_manager_ {network_manager}
, http_only_ {false}
, root_dir_ {configuration_->save_directory ()}
, contents_ {this
, network_manager_
@@ -79,12 +80,12 @@ bool Directory::url_root (QUrl root)
{
root.setPath (root.path () + '/');
}
if (root.isValid ())
bool valid = root.isValid ();
if (valid)
{
url_root_ = root;
refresh ();
}
return root.isValid ();
return valid;
}
void Directory::error (QString const& title, QString const& message)
@@ -92,7 +93,7 @@ void Directory::error (QString const& title, QString const& message)
MessageBox::warning_message (this, title, message);
}
bool Directory::refresh ()
bool Directory::refresh (bool http_only)
{
abort ();
clear ();
@@ -100,6 +101,7 @@ bool Directory::refresh ()
root_dir_ = configuration_->save_directory ();
QDir contents_dir {root_dir_.absoluteFilePath (samples_dir_name)};
contents_.local_file_path (contents_dir.absoluteFilePath (contents_file_name));
contents_.http_only (http_only_ = http_only);
QUrl url {url_root_.resolved (QDir {root_dir_.relativeFilePath (samples_dir_name)}.filePath (contents_file_name))};
if (url.isValid ())
{
@@ -175,7 +177,7 @@ void Directory::parse_entries (QJsonArray const& entries, QDir const& dir, QTree
{
auto node = new FileNode {parent, network_manager_
, QDir {root_dir_.filePath (dir.path ())}.absoluteFilePath (name)
, url};
, url, http_only_};
FileNode::sync_blocker b {node};
node->setIcon (0, file_icon_);
node->setCheckState (0, node->local () ? Qt::Checked : Qt::Unchecked);
@@ -255,28 +257,27 @@ namespace
// maximum bytes to expect
//
int recurse_children (QTreeWidgetItem const * item, int * counted
, qint64 * bytes, qint64 * max)
, qint64 * bytes, qint64 * max)
{
int items {0};
for (int index {0}; index < item->childCount (); ++index)
{
auto const * child = item->child (index);
qDebug () << "Item name:" << child->text (0);
if (child->type () == FileNode::Type) // only count files
{
++items;
if (auto size = child->data (1, Qt::UserRole).toLongLong ())
{
*max += size;
++*counted;
}
*bytes += child->data (1, Qt::DisplayRole).toLongLong ();
}
else
{
// recurse into sub-directory subtrees
items += recurse_children (child, counted, bytes, max);
}
auto const * child = item->child (index);
if (child->type () == FileNode::Type) // only count files
{
++items;
if (auto size = child->data (1, Qt::UserRole).toLongLong ())
{
*max += size;
++*counted;
}
*bytes += child->data (1, Qt::DisplayRole).toLongLong ();
}
else
{
// recurse into sub-directory subtrees
items += recurse_children (child, counted, bytes, max);
}
}
return items;
}