/***************************************************************************
    begin                : Mon Sep 13 1999
    copyright            : (C) 1999 by John Birch
    email                : jbb@kdevelop.org

  This code was originally written by Judin Maxim, from the
	KDEStudio project.

  It was then updated with later code from konsole (KDE).

	It has also been enhanced with an idea from the code in kdbg
	written by Johannes Sixt<Johannes.Sixt@telecom.at>

 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef _STTY_H_
#define _STTY_H_

class QSocketNotifier;
class QProcess;

#include <QObject>
#include <QString>
#include <QScopedPointer>

namespace KDevMI {

class STTY : public QObject
{
    Q_OBJECT

public:
    explicit STTY(bool ext=false, const QString &termAppName=QString());
    ~STTY() override;

    ///Call it if getSlave returns an empty string.
    QString lastError(){return m_lastError;}
    QString getSlave()    { return ttySlave; };
    void readRemaining();

private Q_SLOTS:
    void OutReceived(int);

Q_SIGNALS:
    void OutOutput(const QByteArray&);
    void ErrOutput(const QByteArray&);

private:
    int findTTY();
    bool findExternalTTY(const QString &termApp);

private:
    int fout;
    QSocketNotifier *out = nullptr;
    QString ttySlave;
    QString m_lastError;
    QScopedPointer<QProcess> m_externalTerminal;
    bool external_;

    char pty_master[50];  // "/dev/ptyxx" | "/dev/ptmx"
    char tty_slave[50];   // "/dev/ttyxx" | "/dev/pts/########..."
};

} // end of namespace KDevMI

#endif
