diff options
Diffstat (limited to 'src/libs/3rdparty/libptyqt/unixptyprocess.h')
-rw-r--r-- | src/libs/3rdparty/libptyqt/unixptyprocess.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/libs/3rdparty/libptyqt/unixptyprocess.h b/src/libs/3rdparty/libptyqt/unixptyprocess.h new file mode 100644 index 0000000000..e4df0d2f74 --- /dev/null +++ b/src/libs/3rdparty/libptyqt/unixptyprocess.h @@ -0,0 +1,66 @@ +#ifndef UNIXPTYPROCESS_H +#define UNIXPTYPROCESS_H + +#include "iptyprocess.h" +#include <QProcess> +#include <QSocketNotifier> + +// support for build with MUSL on Alpine Linux +#ifndef _PATH_UTMPX +#include <sys/time.h> +#define _PATH_UTMPX "/var/log/utmp" +#endif + +class ShellProcess : public QProcess +{ + friend class UnixPtyProcess; + Q_OBJECT +public: + ShellProcess() + : QProcess() + , m_handleMaster(-1) + , m_handleSlave(-1) + { + setProcessChannelMode(QProcess::SeparateChannels); + setChildProcessModifier([this]() { configChildProcess(); }); + } + + void emitReadyRead() { emit readyRead(); } + +protected: + void configChildProcess(); + +private: + int m_handleMaster, m_handleSlave; + QString m_handleSlaveName; +}; + +class UnixPtyProcess : public IPtyProcess +{ +public: + UnixPtyProcess(); + virtual ~UnixPtyProcess(); + + virtual bool startProcess(const QString &executable, + const QStringList &arguments, + const QString &workingDir, + QStringList environment, + qint16 cols, + qint16 rows); + virtual bool resize(qint16 cols, qint16 rows); + virtual bool kill(); + virtual PtyType type(); + virtual QString dumpDebugInfo(); + virtual QIODevice *notifier(); + virtual QByteArray readAll(); + virtual qint64 write(const QByteArray &byteArray); + virtual bool isAvailable(); + void moveToThread(QThread *targetThread); + +private: + ShellProcess m_shellProcess; + QSocketNotifier *m_readMasterNotify; + QByteArray m_shellReadBuffer; +}; + +#endif // UNIXPTYPROCESS_H |