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