File indexing completed on 2024-05-19 05:21:23

0001 /*
0002   This file is part of KDE Kontact.
0003 
0004   SPDX-FileCopyrightText: 2001 Matthias Hoelzer-Kluepfel <mhk@kde.org>
0005   SPDX-FileCopyrightText: 2002-2003 Daniel Molkentin <molkentin@kde.org>
0006 
0007   SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 // Use the kdepim version
0011 #include "kontact-version.h"
0012 
0013 #include "kontact_debug.h"
0014 #include "mainwindow.h"
0015 #include "prefs.h"
0016 using namespace Kontact;
0017 
0018 #include <KontactInterface/PimUniqueApplication>
0019 #include <KontactInterface/Plugin>
0020 #include <KontactInterface/UniqueAppHandler>
0021 
0022 #include <KAboutData>
0023 #include <KCrash>
0024 #include <KLocalizedString>
0025 #include <KPluginMetaData>
0026 
0027 #include <QCommandLineParser>
0028 #include <QDBusConnection>
0029 #include <QDBusConnectionInterface>
0030 #include <QPointer>
0031 #include <QWindow>
0032 
0033 #include <iostream>
0034 
0035 using namespace std;
0036 
0037 static const char version[] = KONTACT_VERSION;
0038 
0039 class KontactApp : public KontactInterface::PimUniqueApplication
0040 {
0041     Q_OBJECT
0042 public:
0043     KontactApp(int &argc, char **argv[])
0044         : KontactInterface::PimUniqueApplication(argc, argv)
0045         , mMainWindow(nullptr)
0046     {
0047         KLocalizedString::setApplicationDomain(QByteArrayLiteral("kontact"));
0048     }
0049 
0050     ~KontactApp() override = default;
0051 
0052     int activate(const QStringList &arguments, const QString &workingDir) override;
0053 
0054     void setMainWindow(MainWindow *window)
0055     {
0056         mMainWindow = window;
0057         KontactInterface::UniqueAppHandler::setMainWidget(window);
0058     }
0059 
0060     void setSessionRestored(bool restored)
0061     {
0062         mSessionRestored = restored;
0063     }
0064 
0065 private:
0066     QPointer<MainWindow> mMainWindow;
0067     bool mSessionRestored = false;
0068 };
0069 
0070 static void listPlugins()
0071 {
0072     const QList<KPluginMetaData> pluginMetaDatas = KPluginMetaData::findPlugins(QStringLiteral("pim6/kontact"), [](const KPluginMetaData &data) {
0073         return data.rawData().value(QStringLiteral("X-KDE-KontactPluginVersion")).toInt() == KONTACT_PLUGIN_VERSION;
0074     });
0075 
0076     for (const KPluginMetaData &plugin : pluginMetaDatas) {
0077         // skip summary only plugins
0078         if (plugin.rawData().contains(QLatin1StringView("X-KDE-KontactPluginHasPart"))) {
0079             bool var = plugin.rawData().value(QStringLiteral("X-KDE-KontactPluginHasPart")).toBool();
0080 
0081             if (!var) {
0082                 continue;
0083             }
0084         }
0085 
0086         cout << "Plugin name " << qPrintable(plugin.pluginId()) << endl;
0087     }
0088 }
0089 
0090 static void loadCommandLineOptions(QCommandLineParser *parser)
0091 {
0092     parser->addOption(QCommandLineOption(QStringLiteral("module"), i18n("Start with a specific Kontact module"), QStringLiteral("module")));
0093     parser->addOption(QCommandLineOption(QStringLiteral("iconify"), i18n("Start in iconified (minimized) mode")));
0094     parser->addOption(QCommandLineOption(QStringLiteral("list"), i18n("List all possible modules and exit")));
0095 }
0096 
0097 int KontactApp::activate(const QStringList &args, const QString &workingDir)
0098 {
0099     Q_UNUSED(workingDir)
0100 
0101     QCommandLineParser parser;
0102     loadCommandLineOptions(&parser);
0103     parser.process(args);
0104 
0105     QString moduleName;
0106     if (Prefs::self()->forceStartupPlugin()) {
0107         moduleName = Prefs::self()->forcedStartupPlugin();
0108     }
0109     if (parser.isSet(QStringLiteral("module"))) {
0110         moduleName = parser.value(QStringLiteral("module"));
0111     }
0112     if (!mSessionRestored) {
0113         if (!mMainWindow) {
0114             mMainWindow = new MainWindow();
0115             if (!moduleName.isEmpty()) {
0116                 mMainWindow->setInitialActivePluginModule(moduleName);
0117             }
0118             mMainWindow->show();
0119             KontactInterface::UniqueAppHandler::setMainWidget(mMainWindow);
0120             // --iconify is needed in kontact, although kstart can do that too,
0121             // because kstart returns immediately so it's too early to talk D-Bus to the app.
0122             if (parser.isSet(QStringLiteral("iconify"))) {
0123                 mMainWindow->windowHandle()->showMinimized();
0124             }
0125         } else {
0126             if (!moduleName.isEmpty()) {
0127                 mMainWindow->setInitialActivePluginModule(moduleName);
0128             }
0129         }
0130     } else if (!moduleName.isEmpty()) {
0131         mMainWindow->selectPlugin(moduleName);
0132     }
0133 
0134     // Start KOrgac in case it's wasn't started on session start.
0135     QDBusConnection::sessionBus().interface()->startService(QStringLiteral("org.kde.korgac"));
0136 
0137     // Handle startup notification and window activation
0138     // (The first time it will do nothing except note that it was called)
0139     return 0;
0140 }
0141 
0142 int main(int argc, char **argv)
0143 {
0144     QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
0145     KontactApp app(argc, &argv);
0146 
0147     KCrash::initialize();
0148     KAboutData about(QStringLiteral("kontact"),
0149                      i18n("Kontact"),
0150                      QLatin1StringView(version),
0151                      i18n("KDE personal information manager"),
0152                      KAboutLicense::GPL,
0153                      i18n("Copyright © 2001–%1 Kontact authors", QStringLiteral("2024")),
0154                      QString(),
0155                      QStringLiteral("https://userbase.kde.org/Kontact"));
0156 
0157     about.addAuthor(i18n("Allen Winter"), QString(), QStringLiteral("winter@kde.org"));
0158     about.addAuthor(i18n("Rafael Fernández López"), QString(), QStringLiteral("ereslibre@kde.org"));
0159     about.addAuthor(i18n("Daniel Molkentin"), QString(), QStringLiteral("molkentin@kde.org"));
0160     about.addAuthor(i18n("Don Sanders"), QString(), QStringLiteral("sanders@kde.org"));
0161     about.addAuthor(i18n("Cornelius Schumacher"), QString(), QStringLiteral("schumacher@kde.org"));
0162     about.addAuthor(i18n("Tobias K\303\266nig"), QString(), QStringLiteral("tokoe@kde.org"));
0163     about.addAuthor(i18n("David Faure"), QString(), QStringLiteral("faure@kde.org"));
0164     about.addAuthor(i18n("Ingo Kl\303\266cker"), QString(), QStringLiteral("kloecker@kde.org"));
0165     about.addAuthor(i18n("Sven L\303\274ppken"), QString(), QStringLiteral("sven@kde.org"));
0166     about.addAuthor(i18n("Zack Rusin"), QString(), QStringLiteral("zack@kde.org"));
0167     about.addAuthor(i18n("Matthias Hoelzer-Kluepfel"), i18n("Original Author"), QStringLiteral("mhk@kde.org"));
0168     about.addCredit(i18n("Torgny Nyblom"), i18n("Git Migration"), QStringLiteral("nyblom@kde.org"));
0169     app.setAboutData(about);
0170     app.setWindowIcon(QIcon::fromTheme(QStringLiteral("kontact")));
0171     app.setDesktopFileName(QStringLiteral("org.kde.kontact"));
0172 
0173     QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("kontact")));
0174 
0175     QCommandLineParser *cmdArgs = app.cmdArgs();
0176     loadCommandLineOptions(cmdArgs);
0177 
0178     const QStringList args = QApplication::arguments();
0179     cmdArgs->process(args);
0180     about.processCommandLine(cmdArgs);
0181 
0182     if (cmdArgs->isSet(QStringLiteral("list"))) {
0183         listPlugins();
0184         return 0;
0185     }
0186 
0187     if (!KontactApp::start(args)) {
0188         // Already running, brought to the foreground.
0189         qCDebug(KONTACT_LOG) << "Kontact already running, exiting.";
0190         return 0;
0191     }
0192 
0193     if (!app.isSessionRestored()) {
0194         // There can only be one main window
0195         if (KMainWindow::canBeRestored(1)) {
0196             auto mainWindow = new MainWindow();
0197             app.setMainWindow(mainWindow);
0198             app.setSessionRestored(true);
0199             mainWindow->show();
0200             mainWindow->restore(1);
0201         }
0202     }
0203 
0204     const int ret = app.exec();
0205     qDeleteAll(KMainWindow::memberList());
0206 
0207     return ret;
0208 }
0209 
0210 #include "main.moc"