3#include <QtCore/QJsonDocument>
4#include <QtCore/QJsonObject>
16 _batchTimer.setSingleShot(
true);
17 (void)connect(&_batchTimer, &QChronoTimer::timeout,
this, &LogRemoteSink::_flushBatch);
26LogRemoteSink::~LogRemoteSink()
35void LogRemoteSink::setEnabled(
bool enabled)
37 if (_enabled == enabled) {
48void LogRemoteSink::setHost(
const QString& host)
50 if (_transport.
host() == host) {
57void LogRemoteSink::setPort(quint16 port)
59 if (_transport.
port() == port) {
68 if (_transport.
protocol() == protocol) {
75void LogRemoteSink::setTlsEnabled(
bool enabled)
84void LogRemoteSink::setTlsVerifyPeer(
bool verify)
97void LogRemoteSink::setVehicleId(
const QString&
id)
99 if (_vehicleId ==
id) {
106void LogRemoteSink::setCompressionEnabled(
bool enabled)
108 if (_compressionEnabled == enabled) {
111 _compressionEnabled = enabled;
115void LogRemoteSink::setCompressionLevel(
int level)
117 level = qBound(1, level, 9);
118 if (_compressionLevel == level) {
121 _compressionLevel = level;
129void LogRemoteSink::resetBytesSent()
135bool LogRemoteSink::loadTlsCaCertificates(
const QString& filePath)
139 if (certs.isEmpty()) {
140 _setLastTlsError(
error);
147bool LogRemoteSink::loadTlsClientCertificate(
const QString& certPath,
const QString& keyPath)
150 QSslCertificate cert;
153 _setLastTlsError(
error);
160void LogRemoteSink::setMaxPendingEntries(
int max)
163 if (_maxPendingEntries != max) {
164 _maxPendingEntries = max;
173QByteArray LogRemoteSink::_formatEntry(
const LogEntry& entry)
const
176 if (!_vehicleId.isEmpty()) {
177 obj[QStringLiteral(
"v")] = _vehicleId;
179 return QJsonDocument(obj).toJson(QJsonDocument::Compact);
182QByteArray LogRemoteSink::_maybeCompress(
const QByteArray& data)
const
184 if (!_compressionEnabled) {
194void LogRemoteSink::send(
const LogEntry& entry)
196 if (!_enabled || _transport.
host().isEmpty() || _transport.
port() == 0) {
200 if (_batch.size() >= _maxPendingEntries) {
201 if (++_droppedEntries == 1 || (_droppedEntries % 100) == 0) {
207 _batch.append(_formatEntry(entry));
208 if (_batch.size() >= kBatchSize) {
211 }
else if (!_batchTimer.isActive()) {
216void LogRemoteSink::_flushBatch()
220 if (_batch.isEmpty()) {
225 if (_batch.size() == 1) {
226 payload = _batch.first();
229 for (
const auto& b : std::as_const(_batch)) {
230 totalSize += b.size() + 1;
232 payload.reserve(totalSize);
234 for (
int i = 0; i < _batch.size(); ++i) {
238 payload.append(_batch.at(i));
243 const QByteArray data = _maybeCompress(payload);
244 const quint64 sent = _transport.
send(data);
251 if (!_lastError.isEmpty()) {
257 while (_batch.size() > _maxPendingEntries) {
258 _batch.removeFirst();
268void LogRemoteSink::_setLastError(
const QString&
error)
270 if (_lastError !=
error) {
277void LogRemoteSink::_setLastTlsError(
const QString&
error)
279 if (_lastTlsError !=
error) {
280 _lastTlsError =
error;
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void droppedEntriesChanged()
void errorOccurred(const QString &message)
void compressionLevelChanged()
void lastTlsErrorChanged()
void compressionEnabledChanged()
void tlsVerifyPeerChanged()
void maxPendingEntriesChanged()
void setTlsClientCertificate(const QSslCertificate &cert, const QSslKey &key)
void errorOccurred(const QString &message)
void setTarget(const QString &host, quint16 port)
Protocol protocol() const
void setTlsCaCertificates(const QList< QSslCertificate > &certs)
void setTlsVerifyPeer(bool verify)
quint64 send(const QByteArray &data)
Send pre-formatted payload. Returns bytes sent (0 on failure/pending).
void setTlsEnabled(bool enabled)
bool tlsVerifyPeer() const
void reset()
Reset transports (e.g. after host/port change).
void setProtocol(Protocol protocol)
QByteArray compress(const QByteArray &data, CompressionLevel level)
QList< QSslCertificate > loadCaCertificates(const QString &filePath, QString *errorOut)
bool loadClientCertAndKey(const QString &certPath, const QString &keyPath, QSslCertificate &certOut, QSslKey &keyOut, QString *errorOut)