//===-- TTYState.h ----------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Created by Greg Clayton on 3/26/07.
//
//===----------------------------------------------------------------------===//

#ifndef __TTYState_h__
#define __TTYState_h__

#include <stdint.h>
#include <termios.h>

class TTYState {
public:
  TTYState();
  ~TTYState();

  bool GetTTYState(int fd, bool saveProcessGroup);
  bool SetTTYState() const;

  bool IsValid() const {
    return FileDescriptorValid() && TFlagsValid() && TTYStateValid();
  }
  bool FileDescriptorValid() const { return m_fd >= 0; }
  bool TFlagsValid() const { return m_tflags != -1; }
  bool TTYStateValid() const { return m_ttystateErr == 0; }
  bool ProcessGroupValid() const { return m_processGroup != -1; }

protected:
  int m_fd; // File descriptor
  int m_tflags;
  int m_ttystateErr;
  struct termios m_ttystate;
  pid_t m_processGroup;
};

class TTYStateSwitcher {
public:
  TTYStateSwitcher();
  ~TTYStateSwitcher();

  bool GetState(uint32_t idx, int fd, bool saveProcessGroup);
  bool SetState(uint32_t idx) const;
  uint32_t NumStates() const { return sizeof(m_ttystates) / sizeof(TTYState); }
  bool ValidStateIndex(uint32_t idx) const { return idx < NumStates(); }

protected:
  mutable uint32_t m_currentState;
  TTYState m_ttystates[2];
};

#endif