File indexing completed on 2024-04-28 04:50:48

0001 /*
0002  * main.cpp
0003  *
0004  * Copyright (C) 2007-2011 Christoph Pfister <christophpfister@gmail.com>
0005  *
0006  * This program is free software; you can redistribute it and/or modify
0007  * it under the terms of the GNU General Public License as published by
0008  * the Free Software Foundation; either version 2 of the License, or
0009  * (at your option) any later version.
0010  *
0011  * This program is distributed in the hope that it will be useful,
0012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014  * GNU General Public License for more details.
0015  *
0016  * You should have received a copy of the GNU General Public License along
0017  * with this program; if not, write to the Free Software Foundation, Inc.,
0018  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
0019  */
0020 
0021 #include "log.h"
0022 
0023 #include <KAboutData>
0024 #include <KDBusService>
0025 #include <KStartupInfo>
0026 #include <KWindowSystem>
0027 #include <QApplication>
0028 #include <QCommandLineParser>
0029 #include <QDateTime>
0030 #include <QDir>
0031 #include <QPointer>
0032 #include <QStandardPaths>
0033 #include <QString>
0034 
0035 #include <kwindowsystem_version.h>
0036 
0037 #include <iostream>
0038 
0039 #include <config-kaffeine.h>
0040 
0041 extern "C" {
0042   #include <unistd.h>
0043   #include <string.h>
0044 }
0045 
0046 #include "configurationdialog.h"
0047 #include "mainwindow.h"
0048 #include "sqlhelper.h"
0049 
0050 void verboseMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
0051 {
0052     static const QString typeStr[] = {
0053         "[Debug   ] ",
0054         "[Warning ] ",
0055         "[Critical] ",
0056         "[Fatal   ] ",
0057         "[Info    ] "};
0058     static const QString color[] {
0059         "\x1b[0;32m",   // Debug
0060         "\x1b[0;33m",   // Warning
0061         "\x1b[0;31m",   // Critical
0062         "\x1b[1;31m",   // Fatal
0063         "\x1b[0;37m"};  // Info
0064     QString contextString, file = context.file;
0065     QByteArray localMsg = msg.toLocal8Bit();
0066     QString log;
0067 
0068     file.remove(QRegExp(".*/kaffeine/"));
0069 
0070     if (context.line && QLoggingCategory::defaultCategory()->isEnabled(QtDebugMsg))
0071         contextString = QStringLiteral("%1#%2: %3: ")
0072                         .arg(file)
0073                         .arg(context.line)
0074                         .arg(context.function);
0075 
0076     QString timeStr(QDateTime::currentDateTime().toString("dd-MM-yy HH:mm:ss.zzz "));
0077 
0078     log.append(timeStr);
0079     if (type <= 4)
0080         log.append(typeStr[type]);
0081 
0082     if (isatty(STDERR_FILENO) && (type <= 4)) {
0083         if (context.category && strcmp(context.category, "default"))
0084             log.append(QStringLiteral("\x1b[1;37m%1:\x1b[0;37m ") .arg(context.category));
0085         std::cerr << color[type].toLocal8Bit().constData();
0086     } else {
0087         if (context.category && strcmp(context.category, "default"))
0088             log.append(QStringLiteral("%1: ") .arg(context.category));
0089     }
0090     std::cerr << log.toLocal8Bit().constData();
0091 
0092     if (!contextString.isEmpty()) {
0093         if (isatty(STDERR_FILENO))
0094             std::cerr << "\x1b[0;33m";
0095         std::cerr << contextString.toLocal8Bit().constData();
0096     }
0097 
0098     if (isatty(STDERR_FILENO))
0099         std::cerr << "\x1b[0m";
0100 
0101     std::cerr << localMsg.constData() << "\n";
0102 
0103     if (type == QtFatalMsg)
0104         abort();
0105 
0106     log.append(localMsg.constData());
0107     log.append("\n");
0108 
0109     Log newLog;
0110     newLog.storeLog(log);
0111 }
0112 
0113 class KaffeineApplication : public QApplication
0114 {
0115 public:
0116     KaffeineApplication(int &argc, char **argv);
0117     ~KaffeineApplication();
0118     void startWindow();
0119 
0120     QCommandLineParser parser;
0121     KAboutData aboutData;
0122 
0123 public slots:
0124     void activateRequested(const QStringList &arguments,
0125                    const QString &workingDirectory);
0126 
0127 private:
0128     QPointer<MainWindow> mainWindow;
0129 };
0130 
0131 KaffeineApplication::KaffeineApplication(int &argc, char **argv) : QApplication(argc, argv),
0132     aboutData(
0133         // Program name
0134         QStringLiteral("kaffeine"),
0135         i18n("Kaffeine"),
0136         // Version
0137         QStringLiteral(KAFFEINE_VERSION),
0138         // Short description
0139         i18n("A media player by KDE with digital TV support."),
0140         // License
0141         KAboutLicense::GPL_V2,
0142         // Copyright statement
0143         i18n("(C) 2007-2019 The Kaffeine Authors."),
0144         // Optional additional text
0145         "",
0146         // Home page
0147         QStringLiteral("https://kde.org/applications/multimedia/org.kde.kaffeine")
0148     )
0149 {
0150     QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
0151 
0152     QDir dir(path);
0153     if (!dir.exists())
0154         dir.mkpath(path);
0155 
0156     if (!SqlHelper::createInstance()) {
0157         return;
0158     }
0159 
0160     aboutData.addAuthor("Mauro Carvalho Chehab",
0161         i18n("Maintainer"),
0162         QStringLiteral("mchehab+samsung@kernel.org"));
0163     aboutData.addAuthor("Christoph Pfister", "",
0164         QStringLiteral("christophpfister@gmail.com"));
0165     aboutData.addAuthor("Lasse Lindqvist",
0166         i18n("Previous maintainer (for versions 1.x)"),
0167         QStringLiteral("lasse.k.lindqvist@gmail.com"));
0168     aboutData.addAuthor("Christophe Thommeret");
0169     aboutData.addAuthor(QString::fromUtf8("Jürgen Kofler"));
0170     aboutData.setTranslator(i18nc("NAME OF TRANSLATORS", "Your names"),
0171                 i18nc("EMAIL OF TRANSLATORS", "Your emails"));
0172 
0173     KAboutData::setApplicationData(aboutData);
0174 
0175     mainWindow = new MainWindow(&aboutData, &parser);
0176 }
0177 
0178 void KaffeineApplication::activateRequested(const QStringList &arguments,
0179                         const QString &workingDirectory)
0180 {
0181     parser.parse(arguments);
0182 
0183 #if KWINDOWSYSTEM_VERSION > QT_VERSION_CHECK(5, 91, 0)
0184     KWindowSystem::updateStartupId(mainWindow->windowHandle());
0185     KWindowSystem::activateWindow(mainWindow->windowHandle());
0186 #else
0187 #if KWINDOWSYSTEM_VERSION  >= QT_VERSION_CHECK(5, 62, 0)
0188     KStartupInfo::setNewStartupId(mainWindow->window()->windowHandle(), KStartupInfo::startupId());
0189 #else
0190     KStartupInfo::setNewStartupId(mainWindow, KStartupInfo::startupId());
0191 #endif
0192     KWindowSystem::forceActiveWindow(mainWindow->winId());
0193 #endif
0194     mainWindow->parseArgs(workingDirectory);
0195 }
0196 
0197 void KaffeineApplication::startWindow()
0198 {
0199     mainWindow->run();
0200 }
0201 
0202 KaffeineApplication::~KaffeineApplication()
0203 {
0204     // unlike qt, kde sets Qt::WA_DeleteOnClose and needs it to work properly
0205     delete mainWindow; // QPointer; needed if kaffeine is closed via QCoreApplication::quit()
0206 }
0207 
0208 int main(int argc, char *argv[])
0209 {
0210     qInstallMessageHandler(verboseMessageHandler);
0211 
0212     KLocalizedString::setApplicationDomain("kaffeine");
0213 
0214     KaffeineApplication app(argc, argv);
0215 
0216     KAboutData *aboutData = &app.aboutData;
0217 
0218     app.setApplicationName("kaffeine");
0219     app.setOrganizationDomain("kde.org");
0220     app.setWindowIcon(QIcon::fromTheme(QLatin1String("kaffeine"), QIcon(":kaffeine")));
0221     app.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
0222 
0223     app.parser.addVersionOption();
0224     app.parser.addHelpOption();
0225     aboutData->setupCommandLine(&app.parser);
0226 
0227     app.parser.process(app);
0228 
0229     aboutData->processCommandLine(&app.parser);
0230 
0231     const KDBusService service(KDBusService::Unique);
0232 
0233     QObject::connect(&service, &KDBusService::activateRequested,
0234              &app, &KaffeineApplication::activateRequested);
0235 
0236     app.startWindow();
0237 
0238     return app.exec();
0239 }