File indexing completed on 2024-05-05 05:28:46
0001 // SPDX-FileCopyrightText: 2020 Jonah Brüchert <jbb@kaidan.im> 0002 // 0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0004 0005 #include <KAboutData> 0006 #include <KDBusService> 0007 #include <KLocalizedContext> 0008 #include <KLocalizedString> 0009 #include <KWindowSystem> 0010 0011 #include <QApplication> 0012 #include <QCommandLineParser> 0013 #include <QQmlApplicationEngine> 0014 #include <QQuickStyle> 0015 #include <QQuickWindow> 0016 #include <QUrl> 0017 #include <QtQml> 0018 0019 // Models 0020 #include "chatlistmodel.h" 0021 #include "messagemodel.h" 0022 0023 #include "about.h" 0024 #include "avatarimageprovider.h" 0025 #include "channelhandler.h" 0026 #include "global.h" 0027 #include "settingsmanager.h" 0028 #include "utils.h" 0029 #include "version.h" 0030 #include <contactphonenumbermapper.h> 0031 0032 #include <coroutine> 0033 #include <phonenumberlist.h> 0034 0035 constexpr auto APPLICATION_ID = "org.kde.spacebar"; 0036 0037 Q_DECL_EXPORT int main(int argc, char *argv[]) 0038 { 0039 QCommandLineParser parser; 0040 QApplication app(argc, argv); 0041 0042 if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE") && QQuickStyle::name().isEmpty()) { 0043 QQuickStyle::setStyle(QStringLiteral("org.kde.desktop")); 0044 } 0045 0046 QCoreApplication::setOrganizationName(SL("KDE")); 0047 QCoreApplication::setOrganizationDomain(SL("kde.org")); 0048 QCoreApplication::setApplicationName(SL("spacebar")); 0049 QCoreApplication::setApplicationVersion(QStringLiteral(SPACEBAR_VERSION_STRING)); 0050 QGuiApplication::setApplicationDisplayName(SL("Spacebar")); 0051 0052 KLocalizedString::setApplicationDomain("spacebar"); 0053 0054 KAboutData about(SL("spacebar"), 0055 SL("Spacebar"), 0056 QStringLiteral(SPACEBAR_VERSION_STRING), 0057 i18n("SMS/MMS messaging client"), 0058 KAboutLicense::GPL, 0059 i18n("© 2020-2021 KDE Community")); 0060 about.addAuthor(i18n("Bhushan Shah"), QString(), QStringLiteral("bhush94@gmail.com")); 0061 about.addAuthor(i18n("Jonah Brüchert"), QString(), QStringLiteral("jbb@kaidan.im")); 0062 about.addAuthor(i18n("Martin Klapetek"), QString(), QStringLiteral("mklapetek@kde.org")); 0063 about.addAuthor(i18n("Michael Lang"), QString(), QStringLiteral("criticaltemp@protonmail.com")); 0064 about.addAuthor(i18n("Nicolas Fella"), QString(), QStringLiteral("nicolas.fella@gmx.de")); 0065 about.addAuthor(i18n("Smitty van Bodegom"), QString(), QStringLiteral("me@smitop.com")); 0066 KAboutData::setApplicationData(about); 0067 QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.spacebar"))); 0068 0069 parser.addVersionOption(); 0070 parser.addHelpOption(); 0071 parser.setApplicationDescription(i18n("Spacebar SMS/MMS client")); 0072 parser.addPositionalArgument(QStringLiteral("number"), i18n("Open a chat with the given phone number")); 0073 parser.process(app); 0074 0075 KDBusService service(KDBusService::Unique); 0076 0077 QQmlApplicationEngine engine; 0078 0079 // Use using the instance getter 0080 new Utils(&engine); 0081 0082 ChannelHandler handler; 0083 ChatListModel chatListModel(handler); 0084 0085 // Register types 0086 qmlRegisterSingletonInstance("org.kde.spacebar", 1, 0, "AboutType", &AboutType::instance()); 0087 qmlRegisterSingletonInstance<ChatListModel>(APPLICATION_ID, 1, 0, "ChatListModel", &chatListModel); 0088 qmlRegisterUncreatableType<MessageModel>(APPLICATION_ID, 1, 0, "MessageModel", SL("Created by ChatListModel whenever a new chat was opened")); 0089 qRegisterMetaType<KPeople::PersonData *>("PersonData*"); 0090 qmlRegisterAnonymousType<QAbstractItemModel>(APPLICATION_ID, 1); 0091 qmlRegisterSingletonInstance<Utils>(APPLICATION_ID, 1, 0, "Utils", Utils::instance()); 0092 qmlRegisterSingletonInstance("org.kde.spacebar", 1, 0, "SettingsManager", SettingsManager::self()); 0093 qRegisterMetaType<PhoneNumber>(); 0094 qRegisterMetaType<PhoneNumberList>(); 0095 engine.rootContext()->setContextObject(new KLocalizedContext(&engine)); 0096 engine.addImageProvider(SL("avatar"), new AvatarImageProvider()); 0097 engine.load(QUrl(SL("qrc:///main.qml"))); 0098 0099 if (engine.rootObjects().isEmpty()) { 0100 return -1; 0101 } 0102 0103 auto handleArgs = [&parser, &chatListModel] { 0104 if (!parser.positionalArguments().isEmpty()) { 0105 QString numberArg = parser.positionalArguments().constFirst(); 0106 if (numberArg.startsWith(QStringLiteral("sms:"))) { 0107 numberArg = numberArg.mid(4); 0108 } 0109 if (Utils::instance()->isPhoneNumber(numberArg)) { 0110 chatListModel.startChat(PhoneNumberList(numberArg)); 0111 } else { 0112 qWarning() << "invalid phone number on command line, ignoring"; 0113 } 0114 } 0115 }; 0116 0117 QObject::connect(&service, &KDBusService::activateRequested, &service, [&parser, &handleArgs, &engine](const QStringList &args) { 0118 parser.parse(args); 0119 handleArgs(); 0120 0121 // Move window to the front 0122 auto *window = qobject_cast<QWindow *>(engine.rootObjects().constFirst()); 0123 if (window) { 0124 window->hide(); // Hack - remove once works correctly without 0125 KWindowSystem::updateStartupId(window); 0126 KWindowSystem::activateWindow(window); 0127 window->show(); // Hack - remove once works correctly without 0128 } 0129 }); 0130 0131 handleArgs(); 0132 0133 return app.exec(); 0134 }