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 }