js8call/JS8_Deprecated/DisplayManual.cpp
Chris-AC9KH 356bdc0f50 Code cleanup - move loose source and header files in source tree to group folders
Rename all header files with .h extension
Fix function declaration in HamlibTransceiver.h that overrode member function but was not marked override
Remove unused variable in Modulator.cpp
Remove unused files from source tree
Remove duplicate LazyFillComboBox files
Reformat codebase to LLVM C++ standard
2026-01-02 16:46:38 -06:00

159 lines
4.4 KiB
C++

#include "DisplayManual.h"
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QString>
#include <QDir>
#include <QFileInfo>
#include <QDesktopServices>
#include <QLocale>
#include "JS8_Main/revision_utils.h"
#include "JS8_Include/pimpl_impl.h"
namespace
{
class token
: public QObject
{
Q_OBJECT
public:
token (QUrl const& url, QString const& lang, QString const& name_we, QObject * parent = nullptr)
: QObject {parent}
, url_ {url}
, lang_ {lang}
, name_we_ {name_we}
{
}
QUrl url_;
QString lang_;
QString name_we_;
};
}
class DisplayManual::impl final
: public QObject
{
Q_OBJECT
public:
impl (QNetworkAccessManager * qnam)
: qnam_ {qnam}
{
connect (qnam_, &QNetworkAccessManager::finished, this, &DisplayManual::impl::reply_finished);
}
void display (QUrl const& url, QString const& name_we)
{
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
if (QNetworkAccessManager::Accessible != qnam_->networkAccessible ()) {
// try and recover network access for QNAM
qnam_->setNetworkAccessible (QNetworkAccessManager::Accessible);
}
#endif
// try and find a localized manual
auto lang = QLocale::system ().name ();
// try for language and country first
auto file = name_we + '_' + lang + '-' + version () + ".html";
auto target = url.resolved (file);
QNetworkRequest request {target};
request.setRawHeader ("User-Agent", "WSJT-X Manual Checker");
request.setOriginatingObject (new token {url, lang, name_we, this});
auto * reply = qnam_->head (request);
outstanding_requests_ << reply;
}
void reply_finished (QNetworkReply * reply)
{
if (outstanding_requests_.contains (reply))
{
QUrl target;
if (reply->error ())
{
if (auto * tok = qobject_cast<token *> (reply->request ().originatingObject ()))
{
auto pos = tok->lang_.lastIndexOf ('_');
QString file;
if (pos >= 0)
{
tok->lang_.truncate (pos);
file = tok->name_we_ + '_' + tok->lang_ + '-' + version () + ".html";
target = tok->url_.resolved (file);
QNetworkRequest request {target};
request.setRawHeader ("User-Agent", "WSJT-X Manual Checker");
request.setOriginatingObject (tok);
auto * reply = qnam_->head (request);
outstanding_requests_ << reply;
}
else
{
// give up looking and request the default
file = tok->name_we_ + '-' + version () + ".html";
target = tok->url_.resolved (file);
QDesktopServices::openUrl (target);
delete tok;
}
}
}
else
{
// found it
if (auto * tok = qobject_cast<token *> (reply->request ().originatingObject ()))
{
delete tok;
}
QDesktopServices::openUrl (reply->request ().url ());
}
outstanding_requests_.removeOne (reply);
reply->deleteLater ();
}
}
QNetworkAccessManager * qnam_;
QList<QNetworkReply *> outstanding_requests_;
};
#include "DisplayManual.moc"
DisplayManual::DisplayManual (QNetworkAccessManager * qnam, QObject * parent)
: QObject {parent}
, m_ {qnam}
{
}
DisplayManual::~DisplayManual ()
{
}
void DisplayManual::display_html_url (QUrl const& url, QString const& name_we)
{
m_->display (url, name_we);
}
void DisplayManual::display_html_file (QDir const& dir, QString const& name_we)
{
// try and find a localized manual
auto lang = QLocale::system ().name ();
// try for language and country first
auto file = dir.absoluteFilePath (name_we + '_' + lang + '-' + version () + ".html");
if (!QFileInfo::exists (file))
{
// try for language
lang.truncate (lang.lastIndexOf ('_'));
file = dir.absoluteFilePath (name_we + '_' + lang + '-' + version () + ".html");
if (!QFileInfo::exists (file))
{
// use default
file = dir.absoluteFilePath (name_we + '-' + version () + ".html");
}
}
// may fail but browser 404 error is a good as anything
QDesktopServices::openUrl (QUrl {"file:///" + file});
}