130fdc8d8SChris Lattner //===-- SBError.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBError.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1230fdc8d8SChris Lattner #include "lldb/Core/Error.h"
13ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
14dde9cff3SCaroline Tice 
159c68da97SEli Friedman #include <stdarg.h>
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner using namespace lldb;
1830fdc8d8SChris Lattner using namespace lldb_private;
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner SBError::SBError () :
226611103cSGreg Clayton     m_opaque_ap ()
2330fdc8d8SChris Lattner {
2430fdc8d8SChris Lattner }
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner SBError::SBError (const SBError &rhs) :
276611103cSGreg Clayton     m_opaque_ap ()
2830fdc8d8SChris Lattner {
2930fdc8d8SChris Lattner     if (rhs.IsValid())
306611103cSGreg Clayton         m_opaque_ap.reset (new Error(*rhs));
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner SBError::~SBError()
3530fdc8d8SChris Lattner {
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner const SBError &
3930fdc8d8SChris Lattner SBError::operator = (const SBError &rhs)
4030fdc8d8SChris Lattner {
4130fdc8d8SChris Lattner     if (rhs.IsValid())
4230fdc8d8SChris Lattner     {
436611103cSGreg Clayton         if (m_opaque_ap.get())
446611103cSGreg Clayton             *m_opaque_ap = *rhs;
4530fdc8d8SChris Lattner         else
466611103cSGreg Clayton             m_opaque_ap.reset (new Error(*rhs));
4730fdc8d8SChris Lattner     }
4830fdc8d8SChris Lattner     else
496611103cSGreg Clayton         m_opaque_ap.reset();
50ceb6b139SCaroline Tice 
5130fdc8d8SChris Lattner     return *this;
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner const char *
5630fdc8d8SChris Lattner SBError::GetCString () const
5730fdc8d8SChris Lattner {
586611103cSGreg Clayton     if (m_opaque_ap.get())
596611103cSGreg Clayton         return m_opaque_ap->AsCString();
6030fdc8d8SChris Lattner     return NULL;
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner void
6430fdc8d8SChris Lattner SBError::Clear ()
6530fdc8d8SChris Lattner {
666611103cSGreg Clayton     if (m_opaque_ap.get())
676611103cSGreg Clayton         m_opaque_ap->Clear();
6830fdc8d8SChris Lattner }
6930fdc8d8SChris Lattner 
7030fdc8d8SChris Lattner bool
7130fdc8d8SChris Lattner SBError::Fail () const
7230fdc8d8SChris Lattner {
73*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
74ceb6b139SCaroline Tice 
75ceb6b139SCaroline Tice     bool ret_value = false;
766611103cSGreg Clayton     if (m_opaque_ap.get())
77ceb6b139SCaroline Tice         ret_value = m_opaque_ap->Fail();
78ceb6b139SCaroline Tice 
79ceb6b139SCaroline Tice     if (log)
804838131bSGreg Clayton         log->Printf ("SBError(%p)::Fail () => %i", m_opaque_ap.get(), ret_value);
81ceb6b139SCaroline Tice 
82ceb6b139SCaroline Tice     return ret_value;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
8530fdc8d8SChris Lattner bool
8630fdc8d8SChris Lattner SBError::Success () const
8730fdc8d8SChris Lattner {
88*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
894838131bSGreg Clayton     bool ret_value = false;
906611103cSGreg Clayton     if (m_opaque_ap.get())
914838131bSGreg Clayton         ret_value = m_opaque_ap->Success();
924838131bSGreg Clayton 
934838131bSGreg Clayton     if (log)
944838131bSGreg Clayton         log->Printf ("SBError(%p)::Success () => %i", m_opaque_ap.get(), ret_value);
954838131bSGreg Clayton 
964838131bSGreg Clayton     return ret_value;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner uint32_t
10030fdc8d8SChris Lattner SBError::GetError () const
10130fdc8d8SChris Lattner {
102*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1034838131bSGreg Clayton 
1044838131bSGreg Clayton     uint32_t err = 0;
1056611103cSGreg Clayton     if (m_opaque_ap.get())
1064838131bSGreg Clayton         err = m_opaque_ap->GetError();
1074838131bSGreg Clayton 
1084838131bSGreg Clayton     if (log)
1094838131bSGreg Clayton         log->Printf ("SBError(%p)::GetError () => 0x%8.8x", m_opaque_ap.get(), err);
1104838131bSGreg Clayton 
1114838131bSGreg Clayton 
1124838131bSGreg Clayton     return err;
11330fdc8d8SChris Lattner }
11430fdc8d8SChris Lattner 
11530fdc8d8SChris Lattner ErrorType
11630fdc8d8SChris Lattner SBError::GetType () const
11730fdc8d8SChris Lattner {
118*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1194838131bSGreg Clayton     ErrorType err_type = eErrorTypeInvalid;
1206611103cSGreg Clayton     if (m_opaque_ap.get())
1214838131bSGreg Clayton         err_type = m_opaque_ap->GetType();
1224838131bSGreg Clayton 
1234838131bSGreg Clayton     if (log)
1244838131bSGreg Clayton         log->Printf ("SBError(%p)::GetType () => %i", m_opaque_ap.get(), err_type);
1254838131bSGreg Clayton 
1264838131bSGreg Clayton     return err_type;
12730fdc8d8SChris Lattner }
12830fdc8d8SChris Lattner 
12930fdc8d8SChris Lattner void
13030fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type)
13130fdc8d8SChris Lattner {
13230fdc8d8SChris Lattner     CreateIfNeeded ();
1336611103cSGreg Clayton     m_opaque_ap->SetError (err, type);
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner void
13730fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error)
13830fdc8d8SChris Lattner {
13930fdc8d8SChris Lattner     CreateIfNeeded ();
1406611103cSGreg Clayton     *m_opaque_ap = lldb_error;
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
14330fdc8d8SChris Lattner 
14430fdc8d8SChris Lattner void
14530fdc8d8SChris Lattner SBError::SetErrorToErrno ()
14630fdc8d8SChris Lattner {
14730fdc8d8SChris Lattner     CreateIfNeeded ();
1486611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
14930fdc8d8SChris Lattner }
15030fdc8d8SChris Lattner 
15130fdc8d8SChris Lattner void
15230fdc8d8SChris Lattner SBError::SetErrorToGenericError ()
15330fdc8d8SChris Lattner {
15430fdc8d8SChris Lattner     CreateIfNeeded ();
1556611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
15830fdc8d8SChris Lattner void
15930fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str)
16030fdc8d8SChris Lattner {
16130fdc8d8SChris Lattner     CreateIfNeeded ();
1626611103cSGreg Clayton     m_opaque_ap->SetErrorString (err_str);
16330fdc8d8SChris Lattner }
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner int
16630fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...)
16730fdc8d8SChris Lattner {
16830fdc8d8SChris Lattner     CreateIfNeeded ();
16930fdc8d8SChris Lattner     va_list args;
17030fdc8d8SChris Lattner     va_start (args, format);
1716611103cSGreg Clayton     int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args);
17230fdc8d8SChris Lattner     va_end (args);
17330fdc8d8SChris Lattner     return num_chars;
17430fdc8d8SChris Lattner }
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner bool
17730fdc8d8SChris Lattner SBError::IsValid () const
17830fdc8d8SChris Lattner {
1796611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner void
18330fdc8d8SChris Lattner SBError::CreateIfNeeded ()
18430fdc8d8SChris Lattner {
1856611103cSGreg Clayton     if (m_opaque_ap.get() == NULL)
1866611103cSGreg Clayton         m_opaque_ap.reset(new Error ());
18730fdc8d8SChris Lattner }
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner lldb_private::Error *
19130fdc8d8SChris Lattner SBError::operator->()
19230fdc8d8SChris Lattner {
1936611103cSGreg Clayton     return m_opaque_ap.get();
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner lldb_private::Error *
19730fdc8d8SChris Lattner SBError::get()
19830fdc8d8SChris Lattner {
1996611103cSGreg Clayton     return m_opaque_ap.get();
20030fdc8d8SChris Lattner }
20130fdc8d8SChris Lattner 
2028f343b09SGreg Clayton lldb_private::Error &
2038f343b09SGreg Clayton SBError::ref()
2048f343b09SGreg Clayton {
2058f343b09SGreg Clayton     CreateIfNeeded();
2068f343b09SGreg Clayton     return *m_opaque_ap;
2078f343b09SGreg Clayton }
20830fdc8d8SChris Lattner 
20930fdc8d8SChris Lattner const lldb_private::Error &
21030fdc8d8SChris Lattner SBError::operator*() const
21130fdc8d8SChris Lattner {
21230fdc8d8SChris Lattner     // Be sure to call "IsValid()" before calling this function or it will crash
2136611103cSGreg Clayton     return *m_opaque_ap;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
216dde9cff3SCaroline Tice bool
217dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description)
218dde9cff3SCaroline Tice {
219dde9cff3SCaroline Tice     if (m_opaque_ap.get())
220dde9cff3SCaroline Tice     {
221dde9cff3SCaroline Tice         if (Success())
222dde9cff3SCaroline Tice             description.Printf ("Status: Success");
223dde9cff3SCaroline Tice         else
224dde9cff3SCaroline Tice         {
225dde9cff3SCaroline Tice             const char * err_string = GetCString();
226dde9cff3SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
227dde9cff3SCaroline Tice         }
228dde9cff3SCaroline Tice     }
229dde9cff3SCaroline Tice     else
230dde9cff3SCaroline Tice         description.Printf ("No value");
231dde9cff3SCaroline Tice 
232dde9cff3SCaroline Tice     return true;
233dde9cff3SCaroline Tice }
234ceb6b139SCaroline Tice 
235ceb6b139SCaroline Tice bool
236ceb6b139SCaroline Tice SBError::GetDescription (SBStream &description) const
237ceb6b139SCaroline Tice {
238ceb6b139SCaroline Tice     if (m_opaque_ap.get())
239ceb6b139SCaroline Tice     {
240ceb6b139SCaroline Tice         if (Success())
241ceb6b139SCaroline Tice             description.Printf ("Status: Success");
242ceb6b139SCaroline Tice         else
243ceb6b139SCaroline Tice         {
244ceb6b139SCaroline Tice             const char * err_string = GetCString();
245ceb6b139SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
246ceb6b139SCaroline Tice         }
247ceb6b139SCaroline Tice     }
248ceb6b139SCaroline Tice     else
249ceb6b139SCaroline Tice         description.Printf ("No value");
250ceb6b139SCaroline Tice 
251ceb6b139SCaroline Tice     return true;
252ceb6b139SCaroline Tice }
253