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"
13*ceb6b139SCaroline 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 {
24*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
25*ceb6b139SCaroline Tice 
26*ceb6b139SCaroline Tice     if (log)
27*ceb6b139SCaroline Tice         log->Printf ("SBError::SBError () ==> this = %p", this);
2830fdc8d8SChris Lattner }
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner SBError::SBError (const SBError &rhs) :
316611103cSGreg Clayton     m_opaque_ap ()
3230fdc8d8SChris Lattner {
33*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
34*ceb6b139SCaroline Tice 
3530fdc8d8SChris Lattner     if (rhs.IsValid())
366611103cSGreg Clayton         m_opaque_ap.reset (new Error(*rhs));
37*ceb6b139SCaroline Tice 
38*ceb6b139SCaroline Tice     if (log)
39*ceb6b139SCaroline Tice     {
40*ceb6b139SCaroline Tice         SBStream sstr;
41*ceb6b139SCaroline Tice         GetDescription (sstr);
42*ceb6b139SCaroline Tice         log->Printf ("SBError::SBError (const SBError &rhs) rhs.m_opaque_ap.get() = %p ==> this = %p (%s)",
43*ceb6b139SCaroline Tice                      (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), this, sstr.GetData());
44*ceb6b139SCaroline Tice     }
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner SBError::~SBError()
4930fdc8d8SChris Lattner {
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner const SBError &
5330fdc8d8SChris Lattner SBError::operator = (const SBError &rhs)
5430fdc8d8SChris Lattner {
55*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
56*ceb6b139SCaroline Tice 
57*ceb6b139SCaroline Tice     if (log)
58*ceb6b139SCaroline Tice     {
59*ceb6b139SCaroline Tice         SBStream sstr;
60*ceb6b139SCaroline Tice         rhs.GetDescription (sstr);
61*ceb6b139SCaroline Tice         log->Printf ("SBError::operator= (const SBError &rhs) rhs.m_opaque_ap.get() = %p (%s)",
62*ceb6b139SCaroline Tice                      (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), sstr.GetData());
63*ceb6b139SCaroline Tice     }
64*ceb6b139SCaroline Tice 
6530fdc8d8SChris Lattner     if (rhs.IsValid())
6630fdc8d8SChris Lattner     {
676611103cSGreg Clayton         if (m_opaque_ap.get())
686611103cSGreg Clayton             *m_opaque_ap = *rhs;
6930fdc8d8SChris Lattner         else
706611103cSGreg Clayton             m_opaque_ap.reset (new Error(*rhs));
7130fdc8d8SChris Lattner     }
7230fdc8d8SChris Lattner     else
7330fdc8d8SChris Lattner     {
746611103cSGreg Clayton         m_opaque_ap.reset();
7530fdc8d8SChris Lattner     }
76*ceb6b139SCaroline Tice 
77*ceb6b139SCaroline Tice     if (log)
78*ceb6b139SCaroline Tice         log->Printf ("SBError::operator= ==> this = %p", this);
79*ceb6b139SCaroline Tice 
8030fdc8d8SChris Lattner     return *this;
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner const char *
8530fdc8d8SChris Lattner SBError::GetCString () const
8630fdc8d8SChris Lattner {
876611103cSGreg Clayton     if (m_opaque_ap.get())
886611103cSGreg Clayton         return m_opaque_ap->AsCString();
8930fdc8d8SChris Lattner     return NULL;
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner void
9330fdc8d8SChris Lattner SBError::Clear ()
9430fdc8d8SChris Lattner {
956611103cSGreg Clayton     if (m_opaque_ap.get())
966611103cSGreg Clayton         m_opaque_ap->Clear();
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner bool
10030fdc8d8SChris Lattner SBError::Fail () const
10130fdc8d8SChris Lattner {
102*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
103*ceb6b139SCaroline Tice 
104*ceb6b139SCaroline Tice     if (log)
105*ceb6b139SCaroline Tice         log->Printf ("SBError::Fail ()");
106*ceb6b139SCaroline Tice 
107*ceb6b139SCaroline Tice     bool ret_value = false;
1086611103cSGreg Clayton     if (m_opaque_ap.get())
109*ceb6b139SCaroline Tice         ret_value = m_opaque_ap->Fail();
110*ceb6b139SCaroline Tice 
111*ceb6b139SCaroline Tice     if (log)
112*ceb6b139SCaroline Tice         log->Printf ("SBError::Fail ==> %s", (ret_value ? "true" : "false"));
113*ceb6b139SCaroline Tice 
114*ceb6b139SCaroline Tice     return ret_value;
11530fdc8d8SChris Lattner }
11630fdc8d8SChris Lattner 
11730fdc8d8SChris Lattner bool
11830fdc8d8SChris Lattner SBError::Success () const
11930fdc8d8SChris Lattner {
1206611103cSGreg Clayton     if (m_opaque_ap.get())
1216611103cSGreg Clayton         return m_opaque_ap->Success();
12230fdc8d8SChris Lattner     return false;
12330fdc8d8SChris Lattner }
12430fdc8d8SChris Lattner 
12530fdc8d8SChris Lattner uint32_t
12630fdc8d8SChris Lattner SBError::GetError () const
12730fdc8d8SChris Lattner {
1286611103cSGreg Clayton     if (m_opaque_ap.get())
1296611103cSGreg Clayton         return m_opaque_ap->GetError();
13030fdc8d8SChris Lattner     return true;
13130fdc8d8SChris Lattner }
13230fdc8d8SChris Lattner 
13330fdc8d8SChris Lattner ErrorType
13430fdc8d8SChris Lattner SBError::GetType () const
13530fdc8d8SChris Lattner {
1366611103cSGreg Clayton     if (m_opaque_ap.get())
1376611103cSGreg Clayton         return m_opaque_ap->GetType();
13830fdc8d8SChris Lattner     return eErrorTypeInvalid;
13930fdc8d8SChris Lattner }
14030fdc8d8SChris Lattner 
14130fdc8d8SChris Lattner void
14230fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type)
14330fdc8d8SChris Lattner {
14430fdc8d8SChris Lattner     CreateIfNeeded ();
1456611103cSGreg Clayton     m_opaque_ap->SetError (err, type);
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner void
14930fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error)
15030fdc8d8SChris Lattner {
15130fdc8d8SChris Lattner     CreateIfNeeded ();
1526611103cSGreg Clayton     *m_opaque_ap = lldb_error;
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner 
15630fdc8d8SChris Lattner void
15730fdc8d8SChris Lattner SBError::SetErrorToErrno ()
15830fdc8d8SChris Lattner {
15930fdc8d8SChris Lattner     CreateIfNeeded ();
1606611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
16130fdc8d8SChris Lattner }
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner void
16430fdc8d8SChris Lattner SBError::SetErrorToGenericError ()
16530fdc8d8SChris Lattner {
16630fdc8d8SChris Lattner     CreateIfNeeded ();
1676611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner void
17130fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str)
17230fdc8d8SChris Lattner {
17330fdc8d8SChris Lattner     CreateIfNeeded ();
1746611103cSGreg Clayton     m_opaque_ap->SetErrorString (err_str);
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner int
17830fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...)
17930fdc8d8SChris Lattner {
18030fdc8d8SChris Lattner     CreateIfNeeded ();
18130fdc8d8SChris Lattner     va_list args;
18230fdc8d8SChris Lattner     va_start (args, format);
1836611103cSGreg Clayton     int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args);
18430fdc8d8SChris Lattner     va_end (args);
18530fdc8d8SChris Lattner     return num_chars;
18630fdc8d8SChris Lattner }
18730fdc8d8SChris Lattner 
18830fdc8d8SChris Lattner bool
18930fdc8d8SChris Lattner SBError::IsValid () const
19030fdc8d8SChris Lattner {
1916611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
19230fdc8d8SChris Lattner }
19330fdc8d8SChris Lattner 
19430fdc8d8SChris Lattner void
19530fdc8d8SChris Lattner SBError::CreateIfNeeded ()
19630fdc8d8SChris Lattner {
1976611103cSGreg Clayton     if (m_opaque_ap.get() == NULL)
1986611103cSGreg Clayton         m_opaque_ap.reset(new Error ());
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
20130fdc8d8SChris Lattner 
20230fdc8d8SChris Lattner lldb_private::Error *
20330fdc8d8SChris Lattner SBError::operator->()
20430fdc8d8SChris Lattner {
2056611103cSGreg Clayton     return m_opaque_ap.get();
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner lldb_private::Error *
20930fdc8d8SChris Lattner SBError::get()
21030fdc8d8SChris Lattner {
2116611103cSGreg Clayton     return m_opaque_ap.get();
21230fdc8d8SChris Lattner }
21330fdc8d8SChris Lattner 
21430fdc8d8SChris Lattner 
21530fdc8d8SChris Lattner const lldb_private::Error &
21630fdc8d8SChris Lattner SBError::operator*() const
21730fdc8d8SChris Lattner {
21830fdc8d8SChris Lattner     // Be sure to call "IsValid()" before calling this function or it will crash
2196611103cSGreg Clayton     return *m_opaque_ap;
22030fdc8d8SChris Lattner }
22130fdc8d8SChris Lattner 
222dde9cff3SCaroline Tice bool
223dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description)
224dde9cff3SCaroline Tice {
225dde9cff3SCaroline Tice     if (m_opaque_ap.get())
226dde9cff3SCaroline Tice     {
227dde9cff3SCaroline Tice         if (Success())
228dde9cff3SCaroline Tice             description.Printf ("Status: Success");
229dde9cff3SCaroline Tice         else
230dde9cff3SCaroline Tice         {
231dde9cff3SCaroline Tice             const char * err_string = GetCString();
232dde9cff3SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
233dde9cff3SCaroline Tice         }
234dde9cff3SCaroline Tice     }
235dde9cff3SCaroline Tice     else
236dde9cff3SCaroline Tice         description.Printf ("No value");
237dde9cff3SCaroline Tice 
238dde9cff3SCaroline Tice     return true;
239dde9cff3SCaroline Tice }
240*ceb6b139SCaroline Tice 
241*ceb6b139SCaroline Tice bool
242*ceb6b139SCaroline Tice SBError::GetDescription (SBStream &description) const
243*ceb6b139SCaroline Tice {
244*ceb6b139SCaroline Tice     if (m_opaque_ap.get())
245*ceb6b139SCaroline Tice     {
246*ceb6b139SCaroline Tice         if (Success())
247*ceb6b139SCaroline Tice             description.Printf ("Status: Success");
248*ceb6b139SCaroline Tice         else
249*ceb6b139SCaroline Tice         {
250*ceb6b139SCaroline Tice             const char * err_string = GetCString();
251*ceb6b139SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
252*ceb6b139SCaroline Tice         }
253*ceb6b139SCaroline Tice     }
254*ceb6b139SCaroline Tice     else
255*ceb6b139SCaroline Tice         description.Printf ("No value");
256*ceb6b139SCaroline Tice 
257*ceb6b139SCaroline Tice     return true;
258*ceb6b139SCaroline Tice }
259