/** ****************************************************************************** * * @file consoleprocess.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. * @brief * @see The GNU Public License (GPL) Version 3 * @defgroup * @{ * *****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CONSOLEPROCESS_H #define CONSOLEPROCESS_H #include "abstractprocess.h" #include #include #include #include #include #ifdef Q_OS_WIN #include QT_BEGIN_NAMESPACE class QWinEventNotifier; QT_END_NAMESPACE #endif QT_BEGIN_NAMESPACE class QSettings; class QTemporaryFile; QT_END_NAMESPACE namespace Utils { class QTCREATOR_UTILS_EXPORT ConsoleProcess : public QObject, public AbstractProcess { Q_OBJECT public: enum Mode { Run, Debug, Suspend }; ConsoleProcess(QObject *parent = 0); ~ConsoleProcess(); bool start(const QString &program, const QStringList &args); void stop(); void setMode(Mode m) { m_mode = m; } Mode mode() const { return m_mode; } bool isRunning() const; // This reflects the state of the console+stub qint64 applicationPID() const { return m_appPid; } int exitCode() const { return m_appCode; } // This will be the signal number if exitStatus == CrashExit QProcess::ExitStatus exitStatus() const { return m_appStatus; } #ifdef Q_OS_UNIX void setSettings(QSettings *settings) { m_settings = settings; } static QString defaultTerminalEmulator(); static QString terminalEmulator(const QSettings *settings); static void setTerminalEmulator(QSettings *settings, const QString &term); #endif signals: void processError(const QString &error); // These reflect the state of the actual client process void processStarted(); void processStopped(); // These reflect the state of the console+stub void wrapperStarted(); void wrapperStopped(); private slots: void stubConnectionAvailable(); void readStubOutput(); void stubExited(); #ifdef Q_OS_WIN void inferiorExited(); #endif private: static QString modeOption(Mode m); static QString msgCommChannelFailed(const QString &error); static QString msgPromptToClose(); static QString msgCannotCreateTempFile(const QString &why); static QString msgCannotCreateTempDir(const QString & dir, const QString &why); static QString msgUnexpectedOutput(); static QString msgCannotChangeToWorkDir(const QString & dir, const QString &why); static QString msgCannotExecute(const QString & p, const QString &why); QString stubServerListen(); void stubServerShutdown(); #ifdef Q_OS_WIN void cleanupStub(); void cleanupInferior(); #endif Mode m_mode; qint64 m_appPid; int m_appCode; QString m_executable; QProcess::ExitStatus m_appStatus; QLocalServer m_stubServer; QLocalSocket *m_stubSocket; QTemporaryFile *m_tempFile; #ifdef Q_OS_WIN PROCESS_INFORMATION *m_pid; HANDLE m_hInferior; QWinEventNotifier *inferiorFinishedNotifier; QWinEventNotifier *processFinishedNotifier; #else QProcess m_process; QByteArray m_stubServerDir; QSettings *m_settings; #endif }; } //namespace Utils #endif