File indexing completed on 2024-05-12 05:12:45

0001 /*
0002     This file is part of Akonadi.
0003 
0004     SPDX-FileCopyrightText: 2006 Tobias Koenig <tokoe@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "debugwidget.h"
0010 
0011 #include "connectionpage.h"
0012 #include "tracernotificationinterface.h"
0013 
0014 #include <Akonadi/ControlGui>
0015 
0016 #include <Akonadi/ServerManager>
0017 #include <KLocalizedString>
0018 #include <KTextEdit>
0019 
0020 #include <QCheckBox>
0021 #include <QFileDialog>
0022 #include <QPushButton>
0023 #include <QSplitter>
0024 #include <QVBoxLayout>
0025 
0026 using org::freedesktop::Akonadi::DebugInterface;
0027 
0028 DebugWidget::DebugWidget(QWidget *parent)
0029     : QWidget(parent)
0030 {
0031     auto layout = new QVBoxLayout(this);
0032     layout->setContentsMargins({});
0033 
0034     QString service = QStringLiteral("org.freedesktop.Akonadi");
0035     if (Akonadi::ServerManager::hasInstanceIdentifier()) {
0036         service += QLatin1Char('.') + Akonadi::ServerManager::instanceIdentifier();
0037     }
0038     mDebugInterface = new DebugInterface(service, QStringLiteral("/debug"), QDBusConnection::sessionBus(), this);
0039     auto cb = new QCheckBox(i18n("Enable debugger"), this);
0040     cb->setChecked(mDebugInterface->isValid() && mDebugInterface->tracer().value() == QLatin1StringView("dbus"));
0041     connect(cb, &QCheckBox::toggled, this, &DebugWidget::enableDebugger);
0042     layout->addWidget(cb);
0043 
0044     auto splitter = new QSplitter(Qt::Vertical, this);
0045     splitter->setObjectName(QLatin1StringView("debugSplitter"));
0046     layout->addWidget(splitter);
0047 
0048     mConnectionPage = new ConnectionPage(i18n("All"), splitter);
0049     mConnectionPage->showAllConnections(true);
0050 
0051     mGeneralView = new KTextEdit(splitter);
0052     mGeneralView->setReadOnly(true);
0053 
0054     auto iface = new org::freedesktop::Akonadi::TracerNotification(QString(), QStringLiteral("/tracing/notifications"), QDBusConnection::sessionBus(), this);
0055 
0056     connect(iface, &org::freedesktop::Akonadi::TracerNotification::signalEmitted, this, &DebugWidget::signalEmitted);
0057     connect(iface, &org::freedesktop::Akonadi::TracerNotification::warningEmitted, this, &DebugWidget::warningEmitted);
0058     connect(iface, &org::freedesktop::Akonadi::TracerNotification::errorEmitted, this, &DebugWidget::errorEmitted);
0059 
0060     auto buttonLayout = new QHBoxLayout;
0061     layout->addLayout(buttonLayout);
0062 
0063     auto clearGeneralButton = new QPushButton(i18n("Clear Information View"), this);
0064     auto clearFilteredButton = new QPushButton(i18n("Clear Filtered Messages"), this);
0065     auto clearAllButton = new QPushButton(i18n("Clear All Messages"), this);
0066     auto saveRichtextButton = new QPushButton(i18n("Save Filtered Messages ..."), this);
0067     auto saveRichtextEverythingButton = new QPushButton(i18n("Save All Messages ..."), this);
0068 
0069     buttonLayout->addWidget(clearFilteredButton);
0070     buttonLayout->addWidget(clearAllButton);
0071     buttonLayout->addWidget(clearGeneralButton);
0072     buttonLayout->addWidget(saveRichtextButton);
0073     buttonLayout->addWidget(saveRichtextEverythingButton);
0074 
0075     connect(clearFilteredButton, &QPushButton::clicked, mConnectionPage, &ConnectionPage::clearFiltered);
0076     connect(clearAllButton, &QPushButton::clicked, mConnectionPage, &ConnectionPage::clear);
0077     connect(clearGeneralButton, &QPushButton::clicked, mGeneralView, &KTextEdit::clear);
0078     connect(saveRichtextButton, &QPushButton::clicked, this, &DebugWidget::saveRichText);
0079     connect(saveRichtextEverythingButton, &QPushButton::clicked, this, &DebugWidget::saveEverythingRichText);
0080 
0081     Akonadi::ControlGui::widgetNeedsAkonadi(this);
0082 }
0083 
0084 void DebugWidget::signalEmitted(const QString &signalName, const QString &msg)
0085 {
0086     mGeneralView->append(QStringLiteral("<font color=\"green\">%1 ( %2 )</font>").arg(signalName, msg));
0087 }
0088 
0089 void DebugWidget::warningEmitted(const QString &componentName, const QString &msg)
0090 {
0091     mGeneralView->append(QStringLiteral("<font color=\"blue\">%1: %2</font>").arg(componentName, msg));
0092 }
0093 
0094 void DebugWidget::errorEmitted(const QString &componentName, const QString &msg)
0095 {
0096     mGeneralView->append(QStringLiteral("<font color=\"red\">%1: %2</font>").arg(componentName, msg));
0097 }
0098 
0099 void DebugWidget::enableDebugger(bool enable)
0100 {
0101     mDebugInterface->setTracer(enable ? QStringLiteral("dbus") : QStringLiteral("null"));
0102 }
0103 
0104 void DebugWidget::saveRichText()
0105 {
0106     const QString fileName = QFileDialog::getSaveFileName(this);
0107     if (fileName.isEmpty()) {
0108         return;
0109     }
0110 
0111     QFile file(fileName);
0112     if (!file.open(QIODevice::WriteOnly)) {
0113         return;
0114     }
0115 
0116     file.write(mConnectionPage->toHtmlFiltered().toUtf8());
0117     file.close();
0118 }
0119 
0120 void DebugWidget::saveEverythingRichText()
0121 {
0122     const QString fileName = QFileDialog::getSaveFileName(this);
0123     if (fileName.isEmpty()) {
0124         return;
0125     }
0126 
0127     QFile file(fileName);
0128     if (!file.open(QIODevice::WriteOnly)) {
0129         return;
0130     }
0131 
0132     file.write(mConnectionPage->toHtml().toUtf8());
0133     file.close();
0134 }
0135 
0136 #include "moc_debugwidget.cpp"