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 }