File indexing completed on 2024-05-19 05:13:16

0001 /*
0002     This file is part of Akonadi.
0003 
0004     SPDX-FileCopyrightText: 2012 Volker Krause <vkrause@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "instanceselector.h"
0010 #include "ui_instanceselector.h"
0011 
0012 #include "akonadiconsole_debug.h"
0013 #include <KLocalizedString>
0014 #include <QIcon>
0015 #include <akonadi/private/dbus_p.h>
0016 #include <akonadi/private/instance_p.h>
0017 
0018 #include <QApplication>
0019 #include <QDBusConnection>
0020 #include <QDBusConnectionInterface>
0021 #include <QDialogButtonBox>
0022 #include <QPushButton>
0023 #include <QStandardItemModel>
0024 #include <QVBoxLayout>
0025 
0026 InstanceSelector::InstanceSelector(const QString &remoteHost, QWidget *parent, Qt::WindowFlags flags)
0027     : QDialog(parent, flags)
0028     , ui(new Ui::InstanceSelector)
0029     , m_remoteHost(remoteHost)
0030 {
0031     auto mainWidget = new QWidget(this);
0032     auto mainLayout = new QVBoxLayout(this);
0033     mainLayout->addWidget(mainWidget);
0034     ui->setupUi(mainWidget);
0035 
0036     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Close, this);
0037     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0038     okButton->setDefault(true);
0039     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0040     connect(buttonBox, &QDialogButtonBox::accepted, this, &InstanceSelector::slotAccept);
0041     connect(buttonBox, &QDialogButtonBox::rejected, this, &InstanceSelector::slotReject);
0042     mainLayout->addWidget(buttonBox);
0043     okButton->setIcon(QIcon::fromTheme(QStringLiteral("network-connect")));
0044     okButton->setText(i18n("Connect"));
0045 
0046     const QStringList insts = instances();
0047     qCDebug(AKONADICONSOLE_LOG) << "Found running Akonadi instances:" << insts;
0048     if (insts.size() <= 1) {
0049         m_instance = QString::fromUtf8(qgetenv("AKONADI_INSTANCE"));
0050         if (insts.size() == 1 && m_instance.isEmpty()) {
0051             m_instance = insts.first();
0052         }
0053         slotAccept();
0054     } else {
0055         auto model = new QStandardItemModel(this);
0056         for (const QString &inst : insts) {
0057             auto item = new QStandardItem;
0058             item->setText(inst.isEmpty() ? QStringLiteral("<global>") : inst);
0059             item->setData(inst, Qt::UserRole);
0060             model->appendRow(item);
0061         }
0062         connect(ui->listView, &QAbstractItemView::doubleClicked, this, &InstanceSelector::slotAccept);
0063         ui->listView->setModel(model);
0064         show();
0065     }
0066 }
0067 
0068 InstanceSelector::~InstanceSelector()
0069 {
0070     delete mWindow;
0071 }
0072 
0073 void InstanceSelector::slotAccept()
0074 {
0075     if (ui->listView->model()) { // there was something to select
0076         const QModelIndexList selection = ui->listView->selectionModel()->selectedRows();
0077         if (selection.size() != 1) {
0078             return;
0079         }
0080         m_instance = selection.first().data(Qt::UserRole).toString();
0081     }
0082     QDialog::accept();
0083 
0084     qputenv("AKONADI_INSTANCE", m_instance.toUtf8());
0085     Akonadi::Instance::setIdentifier(m_instance);
0086     auto mWindow = new MainWindow;
0087     if (!m_remoteHost.isEmpty()) {
0088         mWindow->setWindowTitle(i18nc("@title:window", "Remote Akonadi Console (%1)", m_remoteHost));
0089     } else if (!m_instance.isEmpty()) {
0090         mWindow->setWindowTitle(i18nc("@title:window", "Akonadi Console (Instance: %1)", m_instance));
0091     }
0092     mWindow->show();
0093 }
0094 
0095 void InstanceSelector::slotReject()
0096 {
0097     QDialog::reject();
0098     QApplication::quit();
0099 }
0100 
0101 QStringList InstanceSelector::instances()
0102 {
0103     const QString currentInstance = Akonadi::Instance::identifier();
0104     Akonadi::Instance::setIdentifier(QString());
0105     const QString lockService = Akonadi::DBus::serviceName(Akonadi::DBus::ControlLock);
0106     Akonadi::Instance::setIdentifier(currentInstance);
0107 
0108     const QStringList allServices = QDBusConnection::sessionBus().interface()->registeredServiceNames();
0109     QStringList insts;
0110     for (const QString &service : allServices) {
0111         if (!service.startsWith(lockService)) {
0112             continue;
0113         }
0114         insts.push_back(service.mid(lockService.length() + 1));
0115     }
0116     return insts;
0117 }
0118 
0119 #include "moc_instanceselector.cpp"