subsurface/qt-models/messagehandlermodel.cpp
Dirk Hohndel f9f4a9c232 debug output: ensure our debug output is captured on Android
I would have bet money that Android used to send stderr to the logcat
log, but apparently it doesn't (anymore?). So in order to be able to
have a chance to debug weird cloud storage issues on Android, let's do
some wholesale replacement of fprintf(stderr,...) with our own version
of the INFO macro that we long ago borrowed from libdivecomputer (and
rename it to ensure we don't have a conflict there).

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-04-18 09:00:21 -07:00

84 lines
2 KiB
C++

// SPDX-License-Identifier: GPL-2.0
#include "messagehandlermodel.h"
#include "core/qthelper.h"
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
extern void writeToAppLogFile(QString logText);
#endif
void logMessageHandler(QtMsgType type, const QMessageLogContext&, const QString &msg)
{
MessageHandlerModel::self()->addLog(type, msg);
}
MessageHandlerModel * MessageHandlerModel::self()
{
static MessageHandlerModel *self = new MessageHandlerModel();
return self;
}
MessageHandlerModel::MessageHandlerModel(QObject*)
{
// no more than one message handler.
qInstallMessageHandler(logMessageHandler);
}
int MessageHandlerModel::rowCount(const QModelIndex&) const
{
return m_data.size();
}
#include <iostream>
void MessageHandlerModel::addLog(QtMsgType type, const QString& message)
{
if (!m_data.isEmpty()) {
struct MessageData *lm = &m_data.last();
QString lastMessage = lm->message.mid(lm->message.indexOf(':'));
QString newMessage = message.mid(message.indexOf(':'));
if (lastMessage == newMessage)
return;
}
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_data.append({message, type});
endInsertRows();
SSRF_INFO("%s", qPrintable(message));
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
writeToAppLogFile(message);
#endif
}
const QString MessageHandlerModel::logAsString()
{
QString copyString;
// Loop through m_data and build big string to be put on the clipboard
for(const MessageData &data: m_data)
copyString += data.message + "\n";
return copyString;
}
QVariant MessageHandlerModel::data(const QModelIndex& idx, int role) const
{
switch(role) {
case Message:
case Qt::DisplayRole:
return m_data.at(idx.row()).message;
}
return QVariant(QString("Role: %1").arg(role));
};
QHash<int, QByteArray> MessageHandlerModel::roleNames() const {
static QHash<int, QByteArray> roles = {
{Message, "message"},
{Severity, "severity"}
};
return roles;
};
void MessageHandlerModel::reset()
{
beginRemoveRows(QModelIndex(), 0, m_data.size()-1);
m_data.clear();
endRemoveRows();
}