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 {
29750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
30ceb6b139SCaroline Tice 
3130fdc8d8SChris Lattner     if (rhs.IsValid())
326611103cSGreg Clayton         m_opaque_ap.reset (new Error(*rhs));
33ceb6b139SCaroline Tice 
34ceb6b139SCaroline Tice     if (log)
35ceb6b139SCaroline Tice     {
36ceb6b139SCaroline Tice         SBStream sstr;
37ceb6b139SCaroline Tice         GetDescription (sstr);
38*4838131bSGreg Clayton         log->Printf ("SBError::SBError (const SBError rhs.ap=%p) => SBError(%p): %s",
39*4838131bSGreg Clayton                      rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData());
40ceb6b139SCaroline Tice     }
4130fdc8d8SChris Lattner }
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner SBError::~SBError()
4530fdc8d8SChris Lattner {
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner const SBError &
4930fdc8d8SChris Lattner SBError::operator = (const SBError &rhs)
5030fdc8d8SChris Lattner {
51ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
52*4838131bSGreg Clayton     void *old_error = m_opaque_ap.get();
5330fdc8d8SChris Lattner     if (rhs.IsValid())
5430fdc8d8SChris Lattner     {
556611103cSGreg Clayton         if (m_opaque_ap.get())
566611103cSGreg Clayton             *m_opaque_ap = *rhs;
5730fdc8d8SChris Lattner         else
586611103cSGreg Clayton             m_opaque_ap.reset (new Error(*rhs));
5930fdc8d8SChris Lattner     }
6030fdc8d8SChris Lattner     else
6130fdc8d8SChris Lattner     {
626611103cSGreg Clayton         m_opaque_ap.reset();
6330fdc8d8SChris Lattner     }
64ceb6b139SCaroline Tice 
65ceb6b139SCaroline Tice     if (log)
66750cd175SCaroline Tice     {
67750cd175SCaroline Tice         SBStream sstr;
68750cd175SCaroline Tice         GetDescription (sstr);
69*4838131bSGreg Clayton         log->Printf ("SBError(%p)::operator= (SBError(%p)) => SBError(%s)",
70*4838131bSGreg Clayton                      old_error, rhs.m_opaque_ap.get(), sstr.GetData());
71750cd175SCaroline Tice     }
72ceb6b139SCaroline Tice 
7330fdc8d8SChris Lattner     return *this;
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner const char *
7830fdc8d8SChris Lattner SBError::GetCString () const
7930fdc8d8SChris Lattner {
806611103cSGreg Clayton     if (m_opaque_ap.get())
816611103cSGreg Clayton         return m_opaque_ap->AsCString();
8230fdc8d8SChris Lattner     return NULL;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
8530fdc8d8SChris Lattner void
8630fdc8d8SChris Lattner SBError::Clear ()
8730fdc8d8SChris Lattner {
886611103cSGreg Clayton     if (m_opaque_ap.get())
896611103cSGreg Clayton         m_opaque_ap->Clear();
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner bool
9330fdc8d8SChris Lattner SBError::Fail () const
9430fdc8d8SChris Lattner {
95ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
96ceb6b139SCaroline Tice 
97ceb6b139SCaroline Tice     bool ret_value = false;
986611103cSGreg Clayton     if (m_opaque_ap.get())
99ceb6b139SCaroline Tice         ret_value = m_opaque_ap->Fail();
100ceb6b139SCaroline Tice 
101ceb6b139SCaroline Tice     if (log)
102*4838131bSGreg Clayton         log->Printf ("SBError(%p)::Fail () => %i", m_opaque_ap.get(), ret_value);
103ceb6b139SCaroline Tice 
104ceb6b139SCaroline Tice     return ret_value;
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner 
10730fdc8d8SChris Lattner bool
10830fdc8d8SChris Lattner SBError::Success () const
10930fdc8d8SChris Lattner {
110*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
111*4838131bSGreg Clayton     bool ret_value = false;
1126611103cSGreg Clayton     if (m_opaque_ap.get())
113*4838131bSGreg Clayton         ret_value = m_opaque_ap->Success();
114*4838131bSGreg Clayton 
115*4838131bSGreg Clayton     if (log)
116*4838131bSGreg Clayton         log->Printf ("SBError(%p)::Success () => %i", m_opaque_ap.get(), ret_value);
117*4838131bSGreg Clayton 
118*4838131bSGreg Clayton     return ret_value;
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
12130fdc8d8SChris Lattner uint32_t
12230fdc8d8SChris Lattner SBError::GetError () const
12330fdc8d8SChris Lattner {
124*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
125*4838131bSGreg Clayton 
126*4838131bSGreg Clayton     uint32_t err = 0;
1276611103cSGreg Clayton     if (m_opaque_ap.get())
128*4838131bSGreg Clayton         err = m_opaque_ap->GetError();
129*4838131bSGreg Clayton 
130*4838131bSGreg Clayton     if (log)
131*4838131bSGreg Clayton         log->Printf ("SBError(%p)::GetError () => 0x%8.8x", m_opaque_ap.get(), err);
132*4838131bSGreg Clayton 
133*4838131bSGreg Clayton 
134*4838131bSGreg Clayton     return err;
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner ErrorType
13830fdc8d8SChris Lattner SBError::GetType () const
13930fdc8d8SChris Lattner {
140*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
141*4838131bSGreg Clayton     ErrorType err_type = eErrorTypeInvalid;
1426611103cSGreg Clayton     if (m_opaque_ap.get())
143*4838131bSGreg Clayton         err_type = m_opaque_ap->GetType();
144*4838131bSGreg Clayton 
145*4838131bSGreg Clayton     if (log)
146*4838131bSGreg Clayton         log->Printf ("SBError(%p)::GetType () => %i", m_opaque_ap.get(), err_type);
147*4838131bSGreg Clayton 
148*4838131bSGreg Clayton     return err_type;
14930fdc8d8SChris Lattner }
15030fdc8d8SChris Lattner 
15130fdc8d8SChris Lattner void
15230fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type)
15330fdc8d8SChris Lattner {
15430fdc8d8SChris Lattner     CreateIfNeeded ();
1556611103cSGreg Clayton     m_opaque_ap->SetError (err, type);
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
15830fdc8d8SChris Lattner void
15930fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error)
16030fdc8d8SChris Lattner {
16130fdc8d8SChris Lattner     CreateIfNeeded ();
1626611103cSGreg Clayton     *m_opaque_ap = lldb_error;
16330fdc8d8SChris Lattner }
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner 
16630fdc8d8SChris Lattner void
16730fdc8d8SChris Lattner SBError::SetErrorToErrno ()
16830fdc8d8SChris Lattner {
16930fdc8d8SChris Lattner     CreateIfNeeded ();
1706611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner void
17430fdc8d8SChris Lattner SBError::SetErrorToGenericError ()
17530fdc8d8SChris Lattner {
17630fdc8d8SChris Lattner     CreateIfNeeded ();
1776611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
17830fdc8d8SChris Lattner }
17930fdc8d8SChris Lattner 
18030fdc8d8SChris Lattner void
18130fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str)
18230fdc8d8SChris Lattner {
18330fdc8d8SChris Lattner     CreateIfNeeded ();
1846611103cSGreg Clayton     m_opaque_ap->SetErrorString (err_str);
18530fdc8d8SChris Lattner }
18630fdc8d8SChris Lattner 
18730fdc8d8SChris Lattner int
18830fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...)
18930fdc8d8SChris Lattner {
19030fdc8d8SChris Lattner     CreateIfNeeded ();
19130fdc8d8SChris Lattner     va_list args;
19230fdc8d8SChris Lattner     va_start (args, format);
1936611103cSGreg Clayton     int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args);
19430fdc8d8SChris Lattner     va_end (args);
19530fdc8d8SChris Lattner     return num_chars;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner bool
19930fdc8d8SChris Lattner SBError::IsValid () const
20030fdc8d8SChris Lattner {
2016611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner void
20530fdc8d8SChris Lattner SBError::CreateIfNeeded ()
20630fdc8d8SChris Lattner {
2076611103cSGreg Clayton     if (m_opaque_ap.get() == NULL)
2086611103cSGreg Clayton         m_opaque_ap.reset(new Error ());
20930fdc8d8SChris Lattner }
21030fdc8d8SChris Lattner 
21130fdc8d8SChris Lattner 
21230fdc8d8SChris Lattner lldb_private::Error *
21330fdc8d8SChris Lattner SBError::operator->()
21430fdc8d8SChris Lattner {
2156611103cSGreg Clayton     return m_opaque_ap.get();
21630fdc8d8SChris Lattner }
21730fdc8d8SChris Lattner 
21830fdc8d8SChris Lattner lldb_private::Error *
21930fdc8d8SChris Lattner SBError::get()
22030fdc8d8SChris Lattner {
2216611103cSGreg Clayton     return m_opaque_ap.get();
22230fdc8d8SChris Lattner }
22330fdc8d8SChris Lattner 
22430fdc8d8SChris Lattner 
22530fdc8d8SChris Lattner const lldb_private::Error &
22630fdc8d8SChris Lattner SBError::operator*() const
22730fdc8d8SChris Lattner {
22830fdc8d8SChris Lattner     // Be sure to call "IsValid()" before calling this function or it will crash
2296611103cSGreg Clayton     return *m_opaque_ap;
23030fdc8d8SChris Lattner }
23130fdc8d8SChris Lattner 
232dde9cff3SCaroline Tice bool
233dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description)
234dde9cff3SCaroline Tice {
235dde9cff3SCaroline Tice     if (m_opaque_ap.get())
236dde9cff3SCaroline Tice     {
237dde9cff3SCaroline Tice         if (Success())
238dde9cff3SCaroline Tice             description.Printf ("Status: Success");
239dde9cff3SCaroline Tice         else
240dde9cff3SCaroline Tice         {
241dde9cff3SCaroline Tice             const char * err_string = GetCString();
242dde9cff3SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
243dde9cff3SCaroline Tice         }
244dde9cff3SCaroline Tice     }
245dde9cff3SCaroline Tice     else
246dde9cff3SCaroline Tice         description.Printf ("No value");
247dde9cff3SCaroline Tice 
248dde9cff3SCaroline Tice     return true;
249dde9cff3SCaroline Tice }
250ceb6b139SCaroline Tice 
251ceb6b139SCaroline Tice bool
252ceb6b139SCaroline Tice SBError::GetDescription (SBStream &description) const
253ceb6b139SCaroline Tice {
254ceb6b139SCaroline Tice     if (m_opaque_ap.get())
255ceb6b139SCaroline Tice     {
256ceb6b139SCaroline Tice         if (Success())
257ceb6b139SCaroline Tice             description.Printf ("Status: Success");
258ceb6b139SCaroline Tice         else
259ceb6b139SCaroline Tice         {
260ceb6b139SCaroline Tice             const char * err_string = GetCString();
261ceb6b139SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
262ceb6b139SCaroline Tice         }
263ceb6b139SCaroline Tice     }
264ceb6b139SCaroline Tice     else
265ceb6b139SCaroline Tice         description.Printf ("No value");
266ceb6b139SCaroline Tice 
267ceb6b139SCaroline Tice     return true;
268ceb6b139SCaroline Tice }
269