1254721Semaste//===-- CommandReturnObject.h -----------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_CommandReturnObject_h_
11254721Semaste#define liblldb_CommandReturnObject_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste// Other libraries and framework includes
16254721Semaste// Project includes
17254721Semaste#include "lldb/lldb-private.h"
18254721Semaste#include "lldb/Core/STLUtils.h"
19254721Semaste#include "lldb/Core/StreamFile.h"
20254721Semaste#include "lldb/Core/StreamString.h"
21254721Semaste#include "lldb/Core/StreamTee.h"
22254721Semaste
23254721Semastenamespace lldb_private {
24254721Semaste
25254721Semaste
26254721Semasteclass CommandReturnObject
27254721Semaste{
28254721Semastepublic:
29254721Semaste
30254721Semaste    CommandReturnObject ();
31254721Semaste
32254721Semaste    ~CommandReturnObject ();
33254721Semaste
34254721Semaste    const char *
35254721Semaste    GetOutputData ()
36254721Semaste    {
37254721Semaste        lldb::StreamSP stream_sp (m_out_stream.GetStreamAtIndex (eStreamStringIndex));
38254721Semaste        if (stream_sp)
39254721Semaste            return static_cast<StreamString *>(stream_sp.get())->GetData();
40254721Semaste        return "";
41254721Semaste    }
42254721Semaste
43254721Semaste    const char *
44254721Semaste    GetErrorData ()
45254721Semaste    {
46254721Semaste        lldb::StreamSP stream_sp (m_err_stream.GetStreamAtIndex (eStreamStringIndex));
47254721Semaste        if (stream_sp)
48254721Semaste            return static_cast<StreamString *>(stream_sp.get())->GetData();
49254721Semaste        else
50254721Semaste            return "";
51254721Semaste    }
52254721Semaste
53254721Semaste    Stream &
54254721Semaste    GetOutputStream ()
55254721Semaste    {
56254721Semaste        // Make sure we at least have our normal string stream output stream
57254721Semaste        lldb::StreamSP stream_sp (m_out_stream.GetStreamAtIndex (eStreamStringIndex));
58254721Semaste        if (!stream_sp)
59254721Semaste        {
60254721Semaste            stream_sp.reset (new StreamString());
61254721Semaste            m_out_stream.SetStreamAtIndex (eStreamStringIndex, stream_sp);
62254721Semaste        }
63254721Semaste        return m_out_stream;
64254721Semaste    }
65254721Semaste
66254721Semaste    Stream &
67254721Semaste    GetErrorStream ()
68254721Semaste    {
69254721Semaste        // Make sure we at least have our normal string stream output stream
70254721Semaste        lldb::StreamSP stream_sp (m_err_stream.GetStreamAtIndex (eStreamStringIndex));
71254721Semaste        if (!stream_sp)
72254721Semaste        {
73254721Semaste            stream_sp.reset (new StreamString());
74254721Semaste            m_err_stream.SetStreamAtIndex (eStreamStringIndex, stream_sp);
75254721Semaste        }
76254721Semaste        return m_err_stream;
77254721Semaste    }
78254721Semaste
79254721Semaste    void
80254721Semaste    SetImmediateOutputFile (FILE *fh, bool transfer_fh_ownership = false)
81254721Semaste    {
82254721Semaste        lldb::StreamSP stream_sp (new StreamFile (fh, transfer_fh_ownership));
83254721Semaste        m_out_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
84254721Semaste    }
85254721Semaste
86254721Semaste    void
87254721Semaste    SetImmediateErrorFile (FILE *fh, bool transfer_fh_ownership = false)
88254721Semaste    {
89254721Semaste        lldb::StreamSP stream_sp (new StreamFile (fh, transfer_fh_ownership));
90254721Semaste        m_err_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
91254721Semaste    }
92254721Semaste
93254721Semaste    void
94254721Semaste    SetImmediateOutputStream (const lldb::StreamSP &stream_sp)
95254721Semaste    {
96254721Semaste        m_out_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
97254721Semaste    }
98254721Semaste
99254721Semaste    void
100254721Semaste    SetImmediateErrorStream (const lldb::StreamSP &stream_sp)
101254721Semaste    {
102254721Semaste        m_err_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
103254721Semaste    }
104254721Semaste
105254721Semaste    lldb::StreamSP
106254721Semaste    GetImmediateOutputStream ()
107254721Semaste    {
108254721Semaste        return m_out_stream.GetStreamAtIndex (eImmediateStreamIndex);
109254721Semaste    }
110254721Semaste
111254721Semaste    lldb::StreamSP
112254721Semaste    GetImmediateErrorStream ()
113254721Semaste    {
114254721Semaste        return m_err_stream.GetStreamAtIndex (eImmediateStreamIndex);
115254721Semaste    }
116254721Semaste
117254721Semaste    void
118254721Semaste    Clear();
119254721Semaste
120254721Semaste    void
121254721Semaste    AppendMessage (const char *in_string);
122254721Semaste
123254721Semaste    void
124254721Semaste    AppendMessageWithFormat (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
125254721Semaste
126254721Semaste    void
127254721Semaste    AppendRawWarning (const char *in_string);
128254721Semaste
129254721Semaste    void
130254721Semaste    AppendWarning (const char *in_string);
131254721Semaste
132254721Semaste    void
133254721Semaste    AppendWarningWithFormat (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
134254721Semaste
135254721Semaste    void
136254721Semaste    AppendError (const char *in_string);
137254721Semaste
138254721Semaste    void
139254721Semaste    AppendRawError (const char *in_string);
140254721Semaste
141254721Semaste    void
142254721Semaste    AppendErrorWithFormat (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
143254721Semaste
144254721Semaste    void
145254721Semaste    SetError (const Error &error,
146254721Semaste              const char *fallback_error_cstr = NULL);
147254721Semaste
148254721Semaste    void
149254721Semaste    SetError (const char *error_cstr);
150254721Semaste
151254721Semaste    lldb::ReturnStatus
152254721Semaste    GetStatus();
153254721Semaste
154254721Semaste    void
155254721Semaste    SetStatus (lldb::ReturnStatus status);
156254721Semaste
157254721Semaste    bool
158254721Semaste    Succeeded ();
159254721Semaste
160254721Semaste    bool
161254721Semaste    HasResult ();
162254721Semaste
163254721Semaste    bool GetDidChangeProcessState ();
164254721Semaste
165254721Semaste    void SetDidChangeProcessState (bool b);
166254721Semaste
167254721Semasteprivate:
168254721Semaste    enum
169254721Semaste    {
170254721Semaste        eStreamStringIndex = 0,
171254721Semaste        eImmediateStreamIndex = 1
172254721Semaste    };
173254721Semaste
174254721Semaste    StreamTee    m_out_stream;
175254721Semaste    StreamTee    m_err_stream;
176254721Semaste
177254721Semaste    lldb::ReturnStatus m_status;
178254721Semaste    bool m_did_change_process_state;
179254721Semaste};
180254721Semaste
181254721Semaste} // namespace lldb_private
182254721Semaste
183254721Semaste#endif  // liblldb_CommandReturnObject_h_
184