Terminal.h revision 81a96aa6242f7b559770f5dc62316253cb8cb0d4
1//===-- Terminal.h ----------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_Terminal_h_
11#define liblldb_Terminal_h_
12#if defined(__cplusplus)
13
14#include "lldb/lldb-private.h"
15
16struct termios;
17
18namespace lldb_private {
19
20class Terminal
21{
22public:
23
24    Terminal (int fd = -1) :
25        m_fd (fd)
26    {
27    }
28
29    ~Terminal ()
30    {
31    }
32
33    bool
34    IsATerminal () const;
35
36    int
37    GetFileDescriptor () const
38    {
39        return m_fd;
40    }
41
42    void
43    SetFileDescriptor (int fd)
44    {
45        m_fd = fd;
46    }
47
48    bool
49    FileDescriptorIsValid () const
50    {
51        return m_fd != -1;
52    }
53
54    void
55    Clear ()
56    {
57        m_fd = -1;
58    }
59
60    bool
61    SetEcho (bool enabled);
62
63    bool
64    SetCanonical (bool enabled);
65
66protected:
67    int m_fd;   // This may or may not be a terminal file descriptor
68};
69
70
71//----------------------------------------------------------------------
72/// @class State Terminal.h "lldb/Host/Terminal.h"
73/// @brief A terminal state saving/restoring class.
74///
75/// This class can be used to remember the terminal state for a file
76/// descriptor and later restore that state as it originally was.
77//----------------------------------------------------------------------
78class TerminalState
79{
80public:
81    //------------------------------------------------------------------
82    /// Default constructor
83    //------------------------------------------------------------------
84    TerminalState();
85
86    //------------------------------------------------------------------
87    /// Destructor
88    //------------------------------------------------------------------
89    ~TerminalState();
90
91    //------------------------------------------------------------------
92    /// Save the TTY state for \a fd.
93    ///
94    /// Save the current state of the TTY for the file descriptor "fd"
95    /// and if "save_process_group" is true, attempt to save the process
96    /// group info for the TTY.
97    ///
98    /// @param[in] fd
99    ///     The file descriptor to save the state of.
100    ///
101    /// @param[in] save_process_group
102    ///     If \b true, save the process group settings, else do not
103    ///     save the process group setttings for a TTY.
104    ///
105    /// @return
106    ///     Returns \b true if \a fd describes a TTY and if the state
107    ///     was able to be saved, \b false otherwise.
108    //------------------------------------------------------------------
109    bool
110    Save (int fd, bool save_process_group);
111
112    //------------------------------------------------------------------
113    /// Restore the TTY state to the cached state.
114    ///
115    /// Restore the state of the TTY using the cached values from a
116    /// previous call to TerminalState::Save(int,bool).
117    ///
118    /// @return
119    ///     Returns \b true if the TTY state was successfully restored,
120    ///     \b false otherwise.
121    //------------------------------------------------------------------
122    bool
123    Restore () const;
124
125    //------------------------------------------------------------------
126    /// Test for valid cached TTY state information.
127    ///
128    /// @return
129    ///     Returns \b true if this object has valid saved TTY state
130    ///     settings that can be used to restore a previous state,
131    ///     \b false otherwise.
132    //------------------------------------------------------------------
133    bool
134    IsValid() const;
135
136    void
137    Clear ();
138
139protected:
140
141    //------------------------------------------------------------------
142    /// Test if tflags is valid.
143    ///
144    /// @return
145    ///     Returns \b true if \a m_tflags is valid and can be restored,
146    ///     \b false otherwise.
147    //------------------------------------------------------------------
148    bool
149    TFlagsIsValid() const;
150
151    //------------------------------------------------------------------
152    /// Test if ttystate is valid.
153    ///
154    /// @return
155    ///     Returns \b true if \a m_ttystate is valid and can be
156    ///     restored, \b false otherwise.
157    //------------------------------------------------------------------
158    bool
159    TTYStateIsValid() const;
160
161    //------------------------------------------------------------------
162    /// Test if the process group information is valid.
163    ///
164    /// @return
165    ///     Returns \b true if \a m_process_group is valid and can be
166    ///     restored, \b false otherwise.
167    //------------------------------------------------------------------
168    bool
169    ProcessGroupIsValid() const;
170
171    //------------------------------------------------------------------
172    // Member variables
173    //------------------------------------------------------------------
174    Terminal        m_tty;          ///< A terminal
175    int             m_tflags;       ///< Cached tflags information.
176    STD_UNIQUE_PTR(struct termios) m_termios_ap; ///< Cached terminal state information.
177    lldb::pid_t     m_process_group;///< Cached process group information.
178
179};
180
181//----------------------------------------------------------------------
182/// @class TerminalStateSwitcher Terminal.h "lldb/Host/Terminal.h"
183/// @brief A TTY state switching class.
184///
185/// This class can be used to remember 2 TTY states for a given file
186/// descriptor and switch between the two states.
187//----------------------------------------------------------------------
188class TerminalStateSwitcher
189{
190public:
191    //------------------------------------------------------------------
192    /// Constructor
193    //------------------------------------------------------------------
194    TerminalStateSwitcher();
195
196    //------------------------------------------------------------------
197    /// Destructor
198    //------------------------------------------------------------------
199    ~TerminalStateSwitcher();
200
201    //------------------------------------------------------------------
202    /// Get the number of possible states to save.
203    ///
204    /// @return
205    ///     The number of states that this TTY switcher object contains.
206    //------------------------------------------------------------------
207    uint32_t
208    GetNumberOfStates() const;
209
210    //------------------------------------------------------------------
211    /// Restore the TTY state for state at index \a idx.
212    ///
213    /// @return
214    ///     Returns \b true if the TTY state was successfully restored,
215    ///     \b false otherwise.
216    //------------------------------------------------------------------
217    bool
218    Restore (uint32_t idx) const;
219
220    //------------------------------------------------------------------
221    /// Save the TTY state information for the state at index \a idx.
222    /// The TTY state is saved for the file descriptor \a fd and
223    /// the process group information will also be saved if requested
224    /// by \a save_process_group.
225    ///
226    /// @param[in] idx
227    ///     The index into the state array where the state should be
228    ///     saved.
229    ///
230    /// @param[in] fd
231    ///     The file descriptor for which to save the settings.
232    ///
233    /// @param[in] save_process_group
234    ///     If \b true, save the process group information for the TTY.
235    ///
236    /// @return
237    ///     Returns \b true if the save was successful, \b false
238    ///     otherwise.
239    //------------------------------------------------------------------
240    bool
241    Save (uint32_t idx, int fd, bool save_process_group);
242
243protected:
244    //------------------------------------------------------------------
245    // Member variables
246    //------------------------------------------------------------------
247    mutable uint32_t m_currentState; ///< The currently active TTY state index.
248    TerminalState m_ttystates[2]; ///< The array of TTY states that holds saved TTY info.
249};
250
251} // namespace lldb_private
252
253#endif  // #if defined(__cplusplus)
254#endif  // #ifndef liblldb_Terminal_h_
255