File indexing completed on 2024-04-14 05:36:51

0001 /***************************************************************************
0002  *   Copyright (C) 2005 by David Saxton                                    *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #ifndef EXTERNALLANGUAGE_H
0012 #define EXTERNALLANGUAGE_H
0013 
0014 #include "language.h"
0015 
0016 #include <QProcess>
0017 
0018 class KProcess;
0019 
0020 /**
0021 Base class for Language support that relies on an external program; so this
0022 class provides functionality for dealing with external processes.
0023 
0024 @author Daniel Clarke
0025 @author David Saxton
0026 */
0027 class ExternalLanguage : public Language
0028 {
0029     Q_OBJECT
0030 public:
0031     ExternalLanguage(ProcessChain *processChain, const QString &name);
0032     ~ExternalLanguage() override;
0033 
0034 protected slots:
0035     void processStdout();
0036     void processStderr();
0037     void processExited(int, QProcess::ExitStatus);
0038 
0039 protected:
0040     /**
0041      * Call this to start the language process. ExternalLanguage will ensure
0042      * that communication et all is properly set up.
0043      * @return true on success, false on error
0044      */
0045     bool start();
0046     /**
0047      * @returns whether the string outputted to stdout is an error or not
0048      */
0049     virtual bool isError(const QString &message) const = 0;
0050     /**
0051      * @returns whether the string outputted to stderr is fatal (stopped compilation)
0052      */
0053     virtual bool isStderrOutputFatal(const QString &message) const
0054     {
0055         Q_UNUSED(message);
0056         return true;
0057     }
0058     /**
0059      * @returns whether the string outputted to stdout is a warning or not
0060      */
0061     virtual bool isWarning(const QString &message) const = 0;
0062     /**
0063      * Called when the process outputs a (non warning/error) message
0064      */
0065     virtual void outputtedMessage(const QString & /*message*/) {};
0066     /**
0067      * Called when the process outputs a warning
0068      */
0069     virtual void outputtedWarning(const QString & /*message*/) {};
0070     /**
0071      * Called when the process outputs an error
0072      */
0073     virtual void outputtedError(const QString & /*message*/) {};
0074     /**
0075      * Called when the process exits (called before any signals are emitted,
0076      * etc). If you reinherit this function, you should return whether
0077      * everything is OK.
0078      */
0079     virtual bool processExited(bool successfully)
0080     {
0081         return successfully;
0082     }
0083     /**
0084      * Call this function if your process could not be started - the process
0085      * will be deleted, and a failure signal emitted.
0086      */
0087     void processInitFailed();
0088     /**
0089      * Disconnects and deletes the language's process.
0090      */
0091     void deleteLanguageProcess();
0092     /**
0093      * Creates process and makes connections, ready for the derived class to
0094      * add arguments and start the process.
0095      */
0096     void resetLanguageProcess();
0097     /**
0098      * Prints out the command used for running the process, with any arguments
0099      * that contain spaces put into quotation marks.
0100      */
0101     void displayProcessCommand();
0102 
0103     KProcess *m_languageProcess;
0104 };
0105 
0106 #endif