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"