1 //===-- SBCommandReturnObject.cpp -------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 // Other libraries and framework includes
14 #include "lldb/API/SBCommandReturnObject.h"
15 #include "lldb/API/SBError.h"
16 #include "lldb/API/SBStream.h"
18 #include "lldb/Core/Error.h"
19 #include "lldb/Core/Log.h"
20 #include "lldb/Interpreter/CommandReturnObject.h"
23 using namespace lldb_private;
25 SBCommandReturnObject::SBCommandReturnObject () :
26 m_opaque_ap (new CommandReturnObject ())
30 SBCommandReturnObject::SBCommandReturnObject (const SBCommandReturnObject &rhs):
34 m_opaque_ap.reset (new CommandReturnObject (*rhs.m_opaque_ap));
37 SBCommandReturnObject::SBCommandReturnObject (CommandReturnObject *ptr) :
42 SBCommandReturnObject::~SBCommandReturnObject() = default;
45 SBCommandReturnObject::Release ()
47 return m_opaque_ap.release();
50 const SBCommandReturnObject &
51 SBCommandReturnObject::operator = (const SBCommandReturnObject &rhs)
56 m_opaque_ap.reset (new CommandReturnObject (*rhs.m_opaque_ap));
64 SBCommandReturnObject::IsValid() const
66 return m_opaque_ap.get() != nullptr;
70 SBCommandReturnObject::GetOutput ()
72 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
77 log->Printf ("SBCommandReturnObject(%p)::GetOutput () => \"%s\"",
78 static_cast<void*>(m_opaque_ap.get()),
79 m_opaque_ap->GetOutputData());
81 return m_opaque_ap->GetOutputData();
85 log->Printf ("SBCommandReturnObject(%p)::GetOutput () => nullptr",
86 static_cast<void*>(m_opaque_ap.get()));
92 SBCommandReturnObject::GetError ()
94 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
99 log->Printf ("SBCommandReturnObject(%p)::GetError () => \"%s\"",
100 static_cast<void*>(m_opaque_ap.get()),
101 m_opaque_ap->GetErrorData());
103 return m_opaque_ap->GetErrorData();
107 log->Printf ("SBCommandReturnObject(%p)::GetError () => nullptr",
108 static_cast<void*>(m_opaque_ap.get()));
114 SBCommandReturnObject::GetOutputSize()
116 return (m_opaque_ap ? strlen(m_opaque_ap->GetOutputData()) : 0);
120 SBCommandReturnObject::GetErrorSize()
122 return (m_opaque_ap ? strlen(m_opaque_ap->GetErrorData()) : 0);
126 SBCommandReturnObject::PutOutput (FILE *fh)
130 size_t num_bytes = GetOutputSize ();
132 return ::fprintf (fh, "%s", GetOutput());
138 SBCommandReturnObject::PutError (FILE *fh)
142 size_t num_bytes = GetErrorSize ();
144 return ::fprintf (fh, "%s", GetError());
150 SBCommandReturnObject::Clear()
153 m_opaque_ap->Clear();
157 SBCommandReturnObject::GetStatus()
159 return (m_opaque_ap ? m_opaque_ap->GetStatus() : lldb::eReturnStatusInvalid);
163 SBCommandReturnObject::SetStatus(lldb::ReturnStatus status)
166 m_opaque_ap->SetStatus(status);
170 SBCommandReturnObject::Succeeded()
172 return (m_opaque_ap ? m_opaque_ap->Succeeded() : false);
176 SBCommandReturnObject::HasResult()
178 return (m_opaque_ap ? m_opaque_ap->HasResult() : false);
182 SBCommandReturnObject::AppendMessage (const char *message)
185 m_opaque_ap->AppendMessage (message);
189 SBCommandReturnObject::AppendWarning (const char *message)
192 m_opaque_ap->AppendWarning (message);
195 CommandReturnObject *
196 SBCommandReturnObject::operator ->() const
198 return m_opaque_ap.get();
201 CommandReturnObject *
202 SBCommandReturnObject::get() const
204 return m_opaque_ap.get();
207 CommandReturnObject &
208 SBCommandReturnObject::operator *() const
210 assert(m_opaque_ap.get());
211 return *(m_opaque_ap.get());
214 CommandReturnObject &
215 SBCommandReturnObject::ref() const
217 assert(m_opaque_ap.get());
218 return *(m_opaque_ap.get());
222 SBCommandReturnObject::SetLLDBObjectPtr (CommandReturnObject *ptr)
225 m_opaque_ap.reset (ptr);
229 SBCommandReturnObject::GetDescription (SBStream &description)
231 Stream &strm = description.ref();
235 description.Printf ("Status: ");
236 lldb::ReturnStatus status = m_opaque_ap->GetStatus();
237 if (status == lldb::eReturnStatusStarted)
238 strm.PutCString ("Started");
239 else if (status == lldb::eReturnStatusInvalid)
240 strm.PutCString ("Invalid");
241 else if (m_opaque_ap->Succeeded())
242 strm.PutCString ("Success");
244 strm.PutCString ("Fail");
246 if (GetOutputSize() > 0)
247 strm.Printf ("\nOutput Message:\n%s", GetOutput());
249 if (GetErrorSize() > 0)
250 strm.Printf ("\nError Message:\n%s", GetError());
253 strm.PutCString ("No value");
259 SBCommandReturnObject::SetImmediateOutputFile(FILE *fh)
261 SetImmediateOutputFile(fh, false);
265 SBCommandReturnObject::SetImmediateErrorFile(FILE *fh)
267 SetImmediateErrorFile(fh, false);
271 SBCommandReturnObject::SetImmediateOutputFile(FILE *fh, bool transfer_ownership)
274 m_opaque_ap->SetImmediateOutputFile(fh, transfer_ownership);
278 SBCommandReturnObject::SetImmediateErrorFile(FILE *fh, bool transfer_ownership)
281 m_opaque_ap->SetImmediateErrorFile(fh, transfer_ownership);
285 SBCommandReturnObject::PutCString(const char* string, int len)
289 if (len == 0 || string == nullptr || *string == 0)
295 std::string buffer(string, len);
296 m_opaque_ap->AppendMessage(buffer.c_str());
299 m_opaque_ap->AppendMessage(string);
304 SBCommandReturnObject::GetOutput (bool only_if_no_immediate)
308 if (!only_if_no_immediate || m_opaque_ap->GetImmediateOutputStream().get() == nullptr)
314 SBCommandReturnObject::GetError (bool only_if_no_immediate)
318 if (!only_if_no_immediate || m_opaque_ap->GetImmediateErrorStream().get() == nullptr)
324 SBCommandReturnObject::Printf(const char* format, ...)
329 va_start (args, format);
330 size_t result = m_opaque_ap->GetOutputStream().PrintfVarArg(format, args);
338 SBCommandReturnObject::SetError (lldb::SBError &error, const char *fallback_error_cstr)
343 m_opaque_ap->SetError(error.ref(), fallback_error_cstr);
344 else if (fallback_error_cstr)
345 m_opaque_ap->SetError(Error(), fallback_error_cstr);
350 SBCommandReturnObject::SetError (const char *error_cstr)
352 if (m_opaque_ap && error_cstr)
353 m_opaque_ap->SetError(error_cstr);