Request Syncthing version

This commit is contained in:
Martchus 2018-07-30 23:00:40 +02:00
parent 3549a4cdef
commit 39dd98354a
2 changed files with 58 additions and 2 deletions

View File

@ -75,6 +75,7 @@ SyncthingConnection::SyncthingConnection(const QString &syncthingUrl, const QByt
, m_connectionsReply(nullptr)
, m_errorsReply(nullptr)
, m_eventsReply(nullptr)
, m_versionReply(nullptr)
, m_unreadNotifications(false)
, m_hasConfig(false)
, m_hasStatus(false)
@ -265,6 +266,7 @@ void SyncthingConnection::continueReconnecting()
m_startTime = DateTime();
m_lastFileName.clear();
m_lastFileDeleted = false;
m_syncthingVersion.clear();
if (m_apiKey.isEmpty() || m_syncthingUrl.isEmpty()) {
emit error(tr("Connection configuration is insufficient."), SyncthingErrorCategory::OverallConnection, QNetworkReply::NoError);
return;
@ -688,7 +690,7 @@ SyncthingDev *SyncthingConnection::addDevInfo(std::vector<SyncthingDev> &devs, c
return nullptr;
}
int row;
if (SyncthingDev *existingDevInfo = findDevInfo(devId, row)) {
if (SyncthingDev *const existingDevInfo = findDevInfo(devId, row)) {
devs.emplace_back(move(*existingDevInfo));
} else {
devs.emplace_back(devId);
@ -708,6 +710,7 @@ void SyncthingConnection::continueConnecting()
requestDirStatistics();
requestDeviceStatistics();
requestErrors();
requestVersion();
for (const SyncthingDir &dir : m_dirs) {
requestDirStatus(dir.id);
if (!m_requestCompletion) {
@ -742,6 +745,9 @@ void SyncthingConnection::abortAllRequests()
if (m_eventsReply) {
m_eventsReply->abort();
}
if (m_versionReply) {
m_versionReply->abort();
}
}
/*!
@ -851,7 +857,13 @@ void SyncthingConnection::requestCompletion(const QString &devId, const QString
void SyncthingConnection::requestDeviceStatistics()
{
QObject::connect(
requestData(QStringLiteral("stats/device"), QUrlQuery()), &QNetworkReply::finished, this, &SyncthingConnection::readDeviceStatistics);
requestData(QStringLiteral("stats/device"), QUrlQuery()), &QNetworkReply::finished, this, &SyncthingConnection::readDeviceStatistics);
}
void SyncthingConnection::requestVersion()
{
QObject::connect(
m_versionReply = requestData(QStringLiteral("system/version"), QUrlQuery()), &QNetworkReply::finished, this, &SyncthingConnection::readVersion);
}
/*!
@ -2248,6 +2260,36 @@ void SyncthingConnection::readCompletion()
}
}
void SyncthingConnection::readVersion()
{
auto *const reply = static_cast<QNetworkReply *>(sender());
reply->deleteLater();
if (reply == m_versionReply) {
m_versionReply = nullptr;
}
switch (reply->error()) {
case QNetworkReply::NoError: {
const QByteArray response(reply->readAll());
QJsonParseError jsonError;
const auto replyDoc(QJsonDocument::fromJson(response, &jsonError));
if (jsonError.error != QJsonParseError::NoError) {
emitError(tr("Unable to parse version: "), jsonError, reply, response);
return;
}
const auto replyObj(replyDoc.object());
m_syncthingVersion = replyObj.value(QLatin1String("longVersion")).toString();
break;
}
case QNetworkReply::OperationCanceledError:
return; // intended, not an error
default:
emitError(tr("Unable to request version: "), SyncthingErrorCategory::OverallConnection, reply);
}
}
/*!
* \brief Sets the connection status. Ensures statusChanged() is emitted.
* \param status Specifies the status; should be either SyncthingStatus::Disconnected, SyncthingStatus::Reconnecting, or

View File

@ -83,6 +83,7 @@ class LIB_SYNCTHING_CONNECTOR_EXPORT SyncthingConnection : public QObject {
Q_PROPERTY(double totalIncomingRate READ totalIncomingRate NOTIFY trafficChanged)
Q_PROPERTY(double totalOutgoingRate READ totalOutgoingRate NOTIFY trafficChanged)
Q_PROPERTY(QString lastSyncedFile READ lastSyncedFile)
Q_PROPERTY(QString syncthingVersion READ syncthingVersion)
Q_PROPERTY(ChronoUtilities::DateTime lastSyncTime READ lastSyncTime)
Q_PROPERTY(QList<QSslError> expectedSslErrors READ expectedSslErrors)
Q_PROPERTY(std::vector<const SyncthingDev *> connectedDevices READ connectedDevices)
@ -133,6 +134,7 @@ public:
ChronoUtilities::DateTime lastSyncTime() const;
ChronoUtilities::DateTime startTime() const;
ChronoUtilities::TimeSpan uptime() const;
const QString &syncthingVersion() const;
QMetaObject::Connection requestQrCode(const QString &text, std::function<void(const QByteArray &)> callback);
QMetaObject::Connection requestLog(std::function<void(const std::vector<SyncthingLogEntry> &)> callback);
const QList<QSslError> &expectedSslErrors() const;
@ -180,6 +182,7 @@ public Q_SLOTS:
void requestDirStatus(const QString &dirId);
void requestCompletion(const QString &devId, const QString &dirId);
void requestDeviceStatistics();
void requestVersion();
void postConfigFromJsonObject(const QJsonObject &rawConfig);
void postConfigFromByteArray(const QByteArray &rawConfig);
@ -252,6 +255,7 @@ private Q_SLOTS:
void readDirRejected(ChronoUtilities::DateTime eventTime, const QString &dirId, const QJsonObject &eventData);
void readDevRejected(ChronoUtilities::DateTime eventTime, const QString &devId, const QJsonObject &eventData);
void readCompletion();
void readVersion();
void continueConnecting();
void continueReconnecting();
@ -298,6 +302,7 @@ private:
QNetworkReply *m_connectionsReply;
QNetworkReply *m_errorsReply;
QNetworkReply *m_eventsReply;
QNetworkReply *m_versionReply;
bool m_unreadNotifications;
bool m_hasConfig;
bool m_hasStatus;
@ -308,6 +313,7 @@ private:
ChronoUtilities::DateTime m_lastErrorTime;
ChronoUtilities::DateTime m_startTime;
QString m_lastFileName;
QString m_syncthingVersion;
bool m_lastFileDeleted;
QList<QSslError> m_expectedSslErrors;
QJsonObject m_rawConfig;
@ -621,6 +627,14 @@ inline ChronoUtilities::TimeSpan SyncthingConnection::uptime() const
return ChronoUtilities::DateTime::gmtNow() - m_startTime;
}
/*!
* \brief Returns the Syncthing version.
*/
inline const QString &SyncthingConnection::syncthingVersion() const
{
return m_syncthingVersion;
}
/*!
* \brief Returns a list of all expected certificate errors. This is meant to allow self-signed certificates.
* \remarks This list is updated via loadSelfSignedCertificate().