1254721Semaste//===-- SBCommandReturnObject.cpp -------------------------------*- 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#include "lldb/API/SBCommandReturnObject.h"
11254721Semaste#include "lldb/API/SBError.h"
12254721Semaste#include "lldb/API/SBStream.h"
13254721Semaste
14254721Semaste#include "lldb/Core/Error.h"
15254721Semaste#include "lldb/Core/Log.h"
16254721Semaste#include "lldb/Interpreter/CommandReturnObject.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21254721SemasteSBCommandReturnObject::SBCommandReturnObject () :
22254721Semaste    m_opaque_ap (new CommandReturnObject ())
23254721Semaste{
24254721Semaste}
25254721Semaste
26254721SemasteSBCommandReturnObject::SBCommandReturnObject (const SBCommandReturnObject &rhs):
27254721Semaste    m_opaque_ap ()
28254721Semaste{
29254721Semaste    if (rhs.m_opaque_ap.get())
30254721Semaste        m_opaque_ap.reset (new CommandReturnObject (*rhs.m_opaque_ap));
31254721Semaste}
32254721Semaste
33254721SemasteSBCommandReturnObject::SBCommandReturnObject (CommandReturnObject *ptr) :
34254721Semaste    m_opaque_ap (ptr)
35254721Semaste{
36254721Semaste}
37254721Semaste
38254721SemasteCommandReturnObject *
39254721SemasteSBCommandReturnObject::Release ()
40254721Semaste{
41254721Semaste    return m_opaque_ap.release();
42254721Semaste}
43254721Semaste
44254721Semasteconst SBCommandReturnObject &
45254721SemasteSBCommandReturnObject::operator = (const SBCommandReturnObject &rhs)
46254721Semaste{
47254721Semaste    if (this != &rhs)
48254721Semaste    {
49254721Semaste        if (rhs.m_opaque_ap.get())
50254721Semaste            m_opaque_ap.reset (new CommandReturnObject (*rhs.m_opaque_ap));
51254721Semaste        else
52254721Semaste            m_opaque_ap.reset();
53254721Semaste    }
54254721Semaste    return *this;
55254721Semaste}
56254721Semaste
57254721Semaste
58254721SemasteSBCommandReturnObject::~SBCommandReturnObject ()
59254721Semaste{
60254721Semaste    // m_opaque_ap will automatically delete any pointer it owns
61254721Semaste}
62254721Semaste
63254721Semastebool
64254721SemasteSBCommandReturnObject::IsValid() const
65254721Semaste{
66254721Semaste    return m_opaque_ap.get() != NULL;
67254721Semaste}
68254721Semaste
69254721Semaste
70254721Semasteconst char *
71254721SemasteSBCommandReturnObject::GetOutput ()
72254721Semaste{
73254721Semaste    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
74254721Semaste
75254721Semaste    if (m_opaque_ap.get())
76254721Semaste    {
77254721Semaste        if (log)
78254721Semaste            log->Printf ("SBCommandReturnObject(%p)::GetOutput () => \"%s\"", m_opaque_ap.get(),
79254721Semaste                         m_opaque_ap->GetOutputData());
80254721Semaste
81254721Semaste        return m_opaque_ap->GetOutputData();
82254721Semaste    }
83254721Semaste
84254721Semaste    if (log)
85254721Semaste        log->Printf ("SBCommandReturnObject(%p)::GetOutput () => NULL", m_opaque_ap.get());
86254721Semaste
87254721Semaste    return NULL;
88254721Semaste}
89254721Semaste
90254721Semasteconst char *
91254721SemasteSBCommandReturnObject::GetError ()
92254721Semaste{
93254721Semaste    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
94254721Semaste
95254721Semaste    if (m_opaque_ap.get())
96254721Semaste    {
97254721Semaste        if (log)
98254721Semaste            log->Printf ("SBCommandReturnObject(%p)::GetError () => \"%s\"", m_opaque_ap.get(),
99254721Semaste                         m_opaque_ap->GetErrorData());
100254721Semaste
101254721Semaste        return m_opaque_ap->GetErrorData();
102254721Semaste    }
103254721Semaste
104254721Semaste    if (log)
105254721Semaste        log->Printf ("SBCommandReturnObject(%p)::GetError () => NULL", m_opaque_ap.get());
106254721Semaste
107254721Semaste    return NULL;
108254721Semaste}
109254721Semaste
110254721Semastesize_t
111254721SemasteSBCommandReturnObject::GetOutputSize ()
112254721Semaste{
113254721Semaste    if (m_opaque_ap.get())
114254721Semaste        return strlen (m_opaque_ap->GetOutputData());
115254721Semaste    return 0;
116254721Semaste}
117254721Semaste
118254721Semastesize_t
119254721SemasteSBCommandReturnObject::GetErrorSize ()
120254721Semaste{
121254721Semaste    if (m_opaque_ap.get())
122254721Semaste        return strlen(m_opaque_ap->GetErrorData());
123254721Semaste    return 0;
124254721Semaste}
125254721Semaste
126254721Semastesize_t
127254721SemasteSBCommandReturnObject::PutOutput (FILE *fh)
128254721Semaste{
129254721Semaste    if (fh)
130254721Semaste    {
131254721Semaste        size_t num_bytes = GetOutputSize ();
132254721Semaste        if (num_bytes)
133254721Semaste            return ::fprintf (fh, "%s", GetOutput());
134254721Semaste    }
135254721Semaste    return 0;
136254721Semaste}
137254721Semaste
138254721Semastesize_t
139254721SemasteSBCommandReturnObject::PutError (FILE *fh)
140254721Semaste{
141254721Semaste    if (fh)
142254721Semaste    {
143254721Semaste        size_t num_bytes = GetErrorSize ();
144254721Semaste        if (num_bytes)
145254721Semaste            return ::fprintf (fh, "%s", GetError());
146254721Semaste    }
147254721Semaste    return 0;
148254721Semaste}
149254721Semaste
150254721Semastevoid
151254721SemasteSBCommandReturnObject::Clear()
152254721Semaste{
153254721Semaste    if (m_opaque_ap.get())
154254721Semaste        m_opaque_ap->Clear();
155254721Semaste}
156254721Semaste
157254721Semastelldb::ReturnStatus
158254721SemasteSBCommandReturnObject::GetStatus()
159254721Semaste{
160254721Semaste    if (m_opaque_ap.get())
161254721Semaste        return m_opaque_ap->GetStatus();
162254721Semaste    return lldb::eReturnStatusInvalid;
163254721Semaste}
164254721Semaste
165254721Semastevoid
166254721SemasteSBCommandReturnObject::SetStatus(lldb::ReturnStatus status)
167254721Semaste{
168254721Semaste    if (m_opaque_ap.get())
169254721Semaste         m_opaque_ap->SetStatus(status);
170254721Semaste}
171254721Semaste
172254721Semastebool
173254721SemasteSBCommandReturnObject::Succeeded ()
174254721Semaste{
175254721Semaste    if (m_opaque_ap.get())
176254721Semaste        return m_opaque_ap->Succeeded();
177254721Semaste    return false;
178254721Semaste}
179254721Semaste
180254721Semastebool
181254721SemasteSBCommandReturnObject::HasResult ()
182254721Semaste{
183254721Semaste    if (m_opaque_ap.get())
184254721Semaste        return m_opaque_ap->HasResult();
185254721Semaste    return false;
186254721Semaste}
187254721Semaste
188254721Semastevoid
189254721SemasteSBCommandReturnObject::AppendMessage (const char *message)
190254721Semaste{
191254721Semaste    if (m_opaque_ap.get())
192254721Semaste        m_opaque_ap->AppendMessage (message);
193254721Semaste}
194254721Semaste
195254721Semastevoid
196254721SemasteSBCommandReturnObject::AppendWarning (const char *message)
197254721Semaste{
198254721Semaste    if (m_opaque_ap.get())
199254721Semaste        m_opaque_ap->AppendWarning (message);
200254721Semaste}
201254721Semaste
202254721SemasteCommandReturnObject *
203254721SemasteSBCommandReturnObject::operator ->() const
204254721Semaste{
205254721Semaste    return m_opaque_ap.get();
206254721Semaste}
207254721Semaste
208254721SemasteCommandReturnObject *
209254721SemasteSBCommandReturnObject::get() const
210254721Semaste{
211254721Semaste    return m_opaque_ap.get();
212254721Semaste}
213254721Semaste
214254721SemasteCommandReturnObject &
215254721SemasteSBCommandReturnObject::operator *() const
216254721Semaste{
217254721Semaste    assert(m_opaque_ap.get());
218254721Semaste    return *(m_opaque_ap.get());
219254721Semaste}
220254721Semaste
221254721Semaste
222254721SemasteCommandReturnObject &
223254721SemasteSBCommandReturnObject::ref() const
224254721Semaste{
225254721Semaste    assert(m_opaque_ap.get());
226254721Semaste    return *(m_opaque_ap.get());
227254721Semaste}
228254721Semaste
229254721Semaste
230254721Semastevoid
231254721SemasteSBCommandReturnObject::SetLLDBObjectPtr (CommandReturnObject *ptr)
232254721Semaste{
233254721Semaste    if (m_opaque_ap.get())
234254721Semaste        m_opaque_ap.reset (ptr);
235254721Semaste}
236254721Semaste
237254721Semastebool
238254721SemasteSBCommandReturnObject::GetDescription (SBStream &description)
239254721Semaste{
240254721Semaste    Stream &strm = description.ref();
241254721Semaste
242254721Semaste    if (m_opaque_ap.get())
243254721Semaste    {
244254721Semaste        description.Printf ("Status:  ");
245254721Semaste        lldb::ReturnStatus status = m_opaque_ap->GetStatus();
246254721Semaste        if (status == lldb::eReturnStatusStarted)
247254721Semaste            strm.PutCString ("Started");
248254721Semaste        else if (status == lldb::eReturnStatusInvalid)
249254721Semaste            strm.PutCString ("Invalid");
250254721Semaste        else if (m_opaque_ap->Succeeded())
251254721Semaste            strm.PutCString ("Success");
252254721Semaste        else
253254721Semaste            strm.PutCString ("Fail");
254254721Semaste
255254721Semaste        if (GetOutputSize() > 0)
256254721Semaste            strm.Printf ("\nOutput Message:\n%s", GetOutput());
257254721Semaste
258254721Semaste        if (GetErrorSize() > 0)
259254721Semaste            strm.Printf ("\nError Message:\n%s", GetError());
260254721Semaste    }
261254721Semaste    else
262254721Semaste        strm.PutCString ("No value");
263254721Semaste
264254721Semaste    return true;
265254721Semaste}
266254721Semaste
267254721Semastevoid
268254721SemasteSBCommandReturnObject::SetImmediateOutputFile (FILE *fh)
269254721Semaste{
270254721Semaste    if (m_opaque_ap.get())
271254721Semaste        m_opaque_ap->SetImmediateOutputFile (fh);
272254721Semaste}
273254721Semaste
274254721Semastevoid
275254721SemasteSBCommandReturnObject::SetImmediateErrorFile (FILE *fh)
276254721Semaste{
277254721Semaste    if (m_opaque_ap.get())
278254721Semaste        m_opaque_ap->SetImmediateErrorFile (fh);
279254721Semaste}
280254721Semaste
281254721Semastevoid
282254721SemasteSBCommandReturnObject::PutCString(const char* string, int len)
283254721Semaste{
284254721Semaste    if (m_opaque_ap.get())
285254721Semaste    {
286254721Semaste        if (len == 0 || string == NULL || *string == 0)
287254721Semaste        {
288254721Semaste            return;
289254721Semaste        }
290254721Semaste        else if (len > 0)
291254721Semaste        {
292254721Semaste            std::string buffer(string, len);
293254721Semaste            m_opaque_ap->AppendMessage(buffer.c_str());
294254721Semaste        }
295254721Semaste        else
296254721Semaste            m_opaque_ap->AppendMessage(string);
297254721Semaste    }
298254721Semaste}
299254721Semaste
300254721Semasteconst char *
301254721SemasteSBCommandReturnObject::GetOutput (bool only_if_no_immediate)
302254721Semaste{
303254721Semaste    if (!m_opaque_ap.get())
304254721Semaste        return NULL;
305254721Semaste    if (only_if_no_immediate == false || m_opaque_ap->GetImmediateOutputStream().get() == NULL)
306254721Semaste        return GetOutput();
307254721Semaste    return NULL;
308254721Semaste}
309254721Semaste
310254721Semasteconst char *
311254721SemasteSBCommandReturnObject::GetError (bool only_if_no_immediate)
312254721Semaste{
313254721Semaste    if (!m_opaque_ap.get())
314254721Semaste        return NULL;
315254721Semaste    if (only_if_no_immediate == false || m_opaque_ap->GetImmediateErrorStream().get() == NULL)
316254721Semaste        return GetError();
317254721Semaste    return NULL;
318254721Semaste}
319254721Semaste
320254721Semastesize_t
321254721SemasteSBCommandReturnObject::Printf(const char* format, ...)
322254721Semaste{
323254721Semaste    if (m_opaque_ap.get())
324254721Semaste    {
325254721Semaste        va_list args;
326254721Semaste        va_start (args, format);
327254721Semaste        size_t result = m_opaque_ap->GetOutputStream().PrintfVarArg(format, args);
328254721Semaste        va_end (args);
329254721Semaste        return result;
330254721Semaste    }
331254721Semaste    return 0;
332254721Semaste}
333254721Semaste
334254721Semastevoid
335254721SemasteSBCommandReturnObject::SetError (lldb::SBError &error, const char *fallback_error_cstr)
336254721Semaste{
337254721Semaste    if (m_opaque_ap.get())
338254721Semaste    {
339254721Semaste        if (error.IsValid())
340254721Semaste            m_opaque_ap->SetError(error.ref(), fallback_error_cstr);
341254721Semaste        else if (fallback_error_cstr)
342254721Semaste            m_opaque_ap->SetError(Error(), fallback_error_cstr);
343254721Semaste    }
344254721Semaste}
345254721Semaste
346254721Semastevoid
347254721SemasteSBCommandReturnObject::SetError (const char *error_cstr)
348254721Semaste{
349254721Semaste    if (m_opaque_ap.get() && error_cstr)
350254721Semaste        m_opaque_ap->SetError(error_cstr);
351254721Semaste}
352254721Semaste
353