1 //===-- CommandReturnObject.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_CommandReturnObject_h_
11 #define liblldb_CommandReturnObject_h_
12 
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 // Project includes
17 #include "lldb/lldb-private.h"
18 #include "lldb/Core/STLUtils.h"
19 #include "lldb/Core/StreamFile.h"
20 #include "lldb/Core/StreamString.h"
21 #include "lldb/Core/StreamTee.h"
22 
23 namespace lldb_private {
24 
25 
26 class CommandReturnObject
27 {
28 public:
29 
30     CommandReturnObject ();
31 
32     ~CommandReturnObject ();
33 
34     const char *
GetOutputData()35     GetOutputData ()
36     {
37         lldb::StreamSP stream_sp (m_out_stream.GetStreamAtIndex (eStreamStringIndex));
38         if (stream_sp)
39             return static_cast<StreamString *>(stream_sp.get())->GetData();
40         return "";
41     }
42 
43     const char *
GetErrorData()44     GetErrorData ()
45     {
46         lldb::StreamSP stream_sp (m_err_stream.GetStreamAtIndex (eStreamStringIndex));
47         if (stream_sp)
48             return static_cast<StreamString *>(stream_sp.get())->GetData();
49         else
50             return "";
51     }
52 
53     Stream &
GetOutputStream()54     GetOutputStream ()
55     {
56         // Make sure we at least have our normal string stream output stream
57         lldb::StreamSP stream_sp (m_out_stream.GetStreamAtIndex (eStreamStringIndex));
58         if (!stream_sp)
59         {
60             stream_sp.reset (new StreamString());
61             m_out_stream.SetStreamAtIndex (eStreamStringIndex, stream_sp);
62         }
63         return m_out_stream;
64     }
65 
66     Stream &
GetErrorStream()67     GetErrorStream ()
68     {
69         // Make sure we at least have our normal string stream output stream
70         lldb::StreamSP stream_sp (m_err_stream.GetStreamAtIndex (eStreamStringIndex));
71         if (!stream_sp)
72         {
73             stream_sp.reset (new StreamString());
74             m_err_stream.SetStreamAtIndex (eStreamStringIndex, stream_sp);
75         }
76         return m_err_stream;
77     }
78 
79     void
80     SetImmediateOutputFile (FILE *fh, bool transfer_fh_ownership = false)
81     {
82         lldb::StreamSP stream_sp (new StreamFile (fh, transfer_fh_ownership));
83         m_out_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
84     }
85 
86     void
87     SetImmediateErrorFile (FILE *fh, bool transfer_fh_ownership = false)
88     {
89         lldb::StreamSP stream_sp (new StreamFile (fh, transfer_fh_ownership));
90         m_err_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
91     }
92 
93     void
SetImmediateOutputStream(const lldb::StreamSP & stream_sp)94     SetImmediateOutputStream (const lldb::StreamSP &stream_sp)
95     {
96         m_out_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
97     }
98 
99     void
SetImmediateErrorStream(const lldb::StreamSP & stream_sp)100     SetImmediateErrorStream (const lldb::StreamSP &stream_sp)
101     {
102         m_err_stream.SetStreamAtIndex (eImmediateStreamIndex, stream_sp);
103     }
104 
105     lldb::StreamSP
GetImmediateOutputStream()106     GetImmediateOutputStream ()
107     {
108         return m_out_stream.GetStreamAtIndex (eImmediateStreamIndex);
109     }
110 
111     lldb::StreamSP
GetImmediateErrorStream()112     GetImmediateErrorStream ()
113     {
114         return m_err_stream.GetStreamAtIndex (eImmediateStreamIndex);
115     }
116 
117     void
118     Clear();
119 
120     void
121     AppendMessage (const char *in_string);
122 
123     void
124     AppendMessageWithFormat (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
125 
126     void
127     AppendRawWarning (const char *in_string);
128 
129     void
130     AppendWarning (const char *in_string);
131 
132     void
133     AppendWarningWithFormat (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
134 
135     void
136     AppendError (const char *in_string);
137 
138     void
139     AppendRawError (const char *in_string);
140 
141     void
142     AppendErrorWithFormat (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
143 
144     void
145     SetError (const Error &error,
146               const char *fallback_error_cstr = NULL);
147 
148     void
149     SetError (const char *error_cstr);
150 
151     lldb::ReturnStatus
152     GetStatus();
153 
154     void
155     SetStatus (lldb::ReturnStatus status);
156 
157     bool
158     Succeeded ();
159 
160     bool
161     HasResult ();
162 
163     bool GetDidChangeProcessState ();
164 
165     void SetDidChangeProcessState (bool b);
166 
167 private:
168     enum
169     {
170         eStreamStringIndex = 0,
171         eImmediateStreamIndex = 1
172     };
173 
174     StreamTee    m_out_stream;
175     StreamTee    m_err_stream;
176 
177     lldb::ReturnStatus m_status;
178     bool m_did_change_process_state;
179 };
180 
181 } // namespace lldb_private
182 
183 #endif  // liblldb_CommandReturnObject_h_
184