File indexing completed on 2024-04-14 15:17:42
0001 /******************************************************************************************** 0002 begin : sam jui 13 09:50:06 CEST 2002 0003 copyright : (C) 2002 - 2003 by Pascal Brachet 0004 2003 - 2005 by Jeroen Wijnhout (Jeroen.Wijnhout@kdemail.net) 0005 2011 - 2018 by Michel Ludwig (michel.ludwig@kdemail.net) 0006 ********************************************************************************************/ 0007 0008 /*************************************************************************** 0009 * * 0010 * This program is free software; you can redistribute it and/or modify * 0011 * it under the terms of the GNU General Public License as published by * 0012 * the Free Software Foundation; either version 2 of the License, or * 0013 * (at your option) any later version. * 0014 * * 0015 ***************************************************************************/ 0016 0017 #include <QApplication> 0018 #include <QCommandLineParser> 0019 #include <QCommandLineOption> 0020 #include <QDBusConnectionInterface> 0021 #include <QDBusInterface> 0022 #include <QDir> 0023 #include <QFile> 0024 #include <QFileInfo> 0025 #include <QTextCodec> 0026 #include <QUrl> 0027 0028 #include <KAboutData> 0029 #include <KCrash> 0030 #include <KDBusService> 0031 #include <KEncodingProber> 0032 #include <KLocalizedString> 0033 #include <KMessageBox> 0034 #include <KStartupInfo> 0035 0036 #include "kile.h" 0037 #include "kileversion.h" 0038 #include "kiledebug.h" 0039 #include "kileviewmanager.h" 0040 0041 Q_LOGGING_CATEGORY(LOG_KILE_MAIN, "org.kde.kile.main", QtWarningMsg) 0042 Q_LOGGING_CATEGORY(LOG_KILE_PARSER, "org.kde.kile.parser", QtWarningMsg) 0043 Q_LOGGING_CATEGORY(LOG_KILE_CODECOMPLETION, "org.kde.kile.codecompletion", QtWarningMsg) 0044 0045 bool isProject(const QUrl url) 0046 { 0047 return url.fileName().endsWith(QLatin1String(".kilepr")); 0048 } 0049 0050 QString readDataFromStdin() 0051 { 0052 KILE_DEBUG_MAIN; 0053 0054 QByteArray fileData; 0055 QFile qstdin; 0056 QTextCodec *codec = Q_NULLPTR; 0057 0058 qstdin.open( stdin, QIODevice::ReadOnly ); 0059 fileData = qstdin.readAll(); 0060 qstdin.close(); 0061 0062 QTemporaryDir *tempDir = new QTemporaryDir(QDir::tempPath() + QLatin1Char('/') + "kile-stdin"); 0063 QString tempFileName = QFileInfo(tempDir->path(), i18n("StandardInput.tex")).absoluteFilePath(); 0064 KILE_DEBUG_MAIN << "tempFile is " << tempFileName; 0065 0066 QFile tempFile(tempFileName); 0067 if(!tempFile.open(QIODevice::WriteOnly)) { 0068 return QString(); 0069 } 0070 0071 QTextStream stream(&tempFile); 0072 0073 KEncodingProber prober(KEncodingProber::Universal); 0074 KEncodingProber::ProberState state = prober.feed(fileData); 0075 KILE_DEBUG_MAIN << "KEncodingProber::state " << state; 0076 KILE_DEBUG_MAIN << "KEncodingProber::prober.confidence() " << prober.confidence(); 0077 KILE_DEBUG_MAIN << "KEncodingProber::encoding " << prober.encoding(); 0078 0079 codec = QTextCodec::codecForName(prober.encoding()); 0080 if(codec) { 0081 stream.setCodec(codec); 0082 } 0083 0084 stream << fileData; 0085 tempFile.close(); 0086 0087 return tempFileName; 0088 } 0089 0090 inline void initQtResources() { 0091 Q_INIT_RESOURCE(kile); 0092 } 0093 0094 int main(int argc, char **argv) 0095 { 0096 // enable high dpi support 0097 QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true); 0098 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); 0099 0100 QApplication app(argc, argv); 0101 0102 initQtResources(); 0103 0104 app.setApplicationName(QStringLiteral("kile")); 0105 KLocalizedString::setApplicationDomain("kile"); 0106 0107 KAboutData aboutData("kile", i18n("Kile"), kileFullVersion.toLatin1(), 0108 i18n("KDE Integrated LaTeX Environment"), 0109 KAboutLicense::GPL, 0110 i18nc("the parameter is the last copyright year", "by the Kile Team (2003 - %1)", KILE_LAST_COPYRIGHT_YEAR), 0111 QString(), 0112 QStringLiteral("https://kile.sourceforge.io")); 0113 aboutData.addAuthor(i18n("Michel Ludwig"), i18n("Project Management/Developer"), "michel.ludwig@kdemail.net"); 0114 aboutData.addAuthor(i18n("Holger Danielsson"), i18n("Developer"), "holger.danielsson@versanet.de"); 0115 aboutData.addAuthor(i18n("Thomas Braun"), i18n("Former Developer"), "thomas.braun@virtuell-zuhause.de"); 0116 aboutData.addAuthor(i18n("Jeroen Wijnhout"), i18n("Former Maintainer/Developer"),"Jeroen.Wijnhout@kdemail.net"); 0117 aboutData.addAuthor(i18n("Brachet Pascal")); 0118 0119 aboutData.addCredit(i18n("Andrius Štikonas"), i18n("Migration from Subversion to Git"), "andrius@stikonas.eu"); 0120 aboutData.addCredit(i18n("Simon Martin"), i18n("KConfig XT, Various Improvements and Bug-Fixing")); 0121 aboutData.addCredit(i18n("Roland Schulz"), i18n("KatePart Integration")); 0122 aboutData.addCredit(i18n("Thorsten Lück"), i18n("Log Parsing")); 0123 aboutData.addCredit(i18n("Jan-Marek Glogowski"), i18n("Find-in-Files Dialog")); 0124 aboutData.addCredit(i18n("Jonathan Pechta"), i18n("Documentation")); 0125 aboutData.addCredit(i18n("Federico Zenith"), i18n("Documentation")); 0126 0127 aboutData.setOrganizationDomain(QByteArray("kde.org")); 0128 aboutData.setDesktopFileName(QStringLiteral("org.kde.kile")); 0129 0130 aboutData.setProductName(QByteArray("kile")); 0131 0132 KAboutData::setApplicationData(aboutData); 0133 0134 KCrash::initialize(); 0135 0136 app.setApplicationDisplayName(aboutData.displayName()); 0137 app.setOrganizationDomain(aboutData.organizationDomain()); 0138 app.setApplicationVersion(aboutData.version()); 0139 0140 QCommandLineParser parser; 0141 aboutData.setupCommandLine(&parser); 0142 0143 parser.addOption(QCommandLineOption(QStringList() << QLatin1String("line"), i18n("Jump to line"), QLatin1String("line"))); 0144 parser.addOption(QCommandLineOption(QStringList() << QLatin1String("new"), i18n("Start a new Kile mainwindow"))); 0145 //TODO KF5 VERIFY THAT '-' STILL WORKS 0146 parser.addPositionalArgument("urls", i18n("Files to open / specify '-' to read from standard input"), QLatin1String("[urls...]")); 0147 0148 parser.process(app); 0149 aboutData.processCommandLine(&parser); 0150 0151 bool running = false; 0152 0153 { 0154 const KDBusService dbusService(KDBusService::Multiple | KDBusService::NoExitOnFailure); 0155 0156 QDBusConnectionInterface *interface = QDBusConnection::sessionBus().interface(); 0157 0158 if(interface) { 0159 running = interface->isServiceRegistered("net.sourceforge.kile"); 0160 } 0161 else { 0162 KILE_WARNING_MAIN << "no DBUS interface found!"; 0163 } 0164 } 0165 0166 if(!running || parser.isSet("new")) { 0167 bool restore = (parser.positionalArguments().count() == 0); 0168 0169 Kile *kile = new Kile(restore); 0170 0171 // the constructor of the Kile class will return immediatey if Okular cannot be instantiated correctly 0172 if(!kile->viewManager()->viewerPart()) { 0173 delete kile; 0174 0175 KILE_DEBUG_MAIN << "couldn't find a recent version of the Okular library"; 0176 0177 KMessageBox::error(Q_NULLPTR, i18n("Kile cannot start as a recent version the Okular library could not be found.\n\n" 0178 "Please install the Okular library before running Kile."), 0179 i18n("Okular library not found")); 0180 return EXIT_FAILURE; 0181 } 0182 0183 for(const QString& argument : parser.positionalArguments()) { 0184 if(argument == "-") { 0185 kile->openDocument(readDataFromStdin()); 0186 } 0187 else { 0188 const QUrl url = QUrl::fromUserInput(argument, QDir::currentPath(), QUrl::AssumeLocalFile); 0189 0190 if(isProject(url)) { 0191 kile->openProject(url); 0192 } 0193 else { 0194 kile->openDocument(url); 0195 } 0196 } 0197 } 0198 0199 if(parser.isSet("line")) { 0200 QString line = parser.value("line"); 0201 kile->setLine(line); 0202 } 0203 0204 return app.exec(); 0205 } 0206 else { 0207 QDBusInterface *interface = new QDBusInterface("net.sourceforge.kile","/main","net.sourceforge.kile.main"); 0208 0209 for(const QString& argument : parser.positionalArguments()) { 0210 if(argument == "-") { 0211 interface->call("openDocument", readDataFromStdin()); 0212 } 0213 else { 0214 const QUrl url = QUrl::fromUserInput(argument, QDir::currentPath(), QUrl::AssumeLocalFile); 0215 0216 if(isProject(url)) { 0217 interface->call("openProject", url.url()); 0218 } 0219 else { 0220 interface->call("openDocument", url.url()); 0221 } 0222 } 0223 } 0224 0225 if(parser.isSet("line")) { 0226 QString line = parser.value("line"); 0227 interface->call("setLine", line); 0228 } 0229 0230 KStartupInfo::appStarted(); 0231 interface->call("setActive"); 0232 delete interface; 0233 } 0234 0235 return EXIT_SUCCESS; 0236 }