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"
11*dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1230fdc8d8SChris Lattner #include "lldb/Core/Error.h"
13*dde9cff3SCaroline Tice 
149c68da97SEli Friedman #include <stdarg.h>
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner using namespace lldb;
1730fdc8d8SChris Lattner using namespace lldb_private;
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner SBError::SBError () :
216611103cSGreg Clayton     m_opaque_ap ()
2230fdc8d8SChris Lattner {
2330fdc8d8SChris Lattner }
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner SBError::SBError (const SBError &rhs) :
266611103cSGreg Clayton     m_opaque_ap ()
2730fdc8d8SChris Lattner {
2830fdc8d8SChris Lattner     if (rhs.IsValid())
296611103cSGreg Clayton         m_opaque_ap.reset (new Error(*rhs));
3030fdc8d8SChris Lattner }
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner SBError::~SBError()
3430fdc8d8SChris Lattner {
3530fdc8d8SChris Lattner }
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner const SBError &
3830fdc8d8SChris Lattner SBError::operator = (const SBError &rhs)
3930fdc8d8SChris Lattner {
4030fdc8d8SChris Lattner     if (rhs.IsValid())
4130fdc8d8SChris Lattner     {
426611103cSGreg Clayton         if (m_opaque_ap.get())
436611103cSGreg Clayton             *m_opaque_ap = *rhs;
4430fdc8d8SChris Lattner         else
456611103cSGreg Clayton             m_opaque_ap.reset (new Error(*rhs));
4630fdc8d8SChris Lattner     }
4730fdc8d8SChris Lattner     else
4830fdc8d8SChris Lattner     {
496611103cSGreg Clayton         m_opaque_ap.reset();
5030fdc8d8SChris Lattner     }
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 {
736611103cSGreg Clayton     if (m_opaque_ap.get())
746611103cSGreg Clayton         return m_opaque_ap->Fail();
7530fdc8d8SChris Lattner     return false;
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner bool
7930fdc8d8SChris Lattner SBError::Success () const
8030fdc8d8SChris Lattner {
816611103cSGreg Clayton     if (m_opaque_ap.get())
826611103cSGreg Clayton         return m_opaque_ap->Success();
8330fdc8d8SChris Lattner     return false;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner uint32_t
8730fdc8d8SChris Lattner SBError::GetError () const
8830fdc8d8SChris Lattner {
896611103cSGreg Clayton     if (m_opaque_ap.get())
906611103cSGreg Clayton         return m_opaque_ap->GetError();
9130fdc8d8SChris Lattner     return true;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner ErrorType
9530fdc8d8SChris Lattner SBError::GetType () const
9630fdc8d8SChris Lattner {
976611103cSGreg Clayton     if (m_opaque_ap.get())
986611103cSGreg Clayton         return m_opaque_ap->GetType();
9930fdc8d8SChris Lattner     return eErrorTypeInvalid;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
10230fdc8d8SChris Lattner void
10330fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type)
10430fdc8d8SChris Lattner {
10530fdc8d8SChris Lattner     CreateIfNeeded ();
1066611103cSGreg Clayton     m_opaque_ap->SetError (err, type);
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner void
11030fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error)
11130fdc8d8SChris Lattner {
11230fdc8d8SChris Lattner     CreateIfNeeded ();
1136611103cSGreg Clayton     *m_opaque_ap = lldb_error;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner 
11730fdc8d8SChris Lattner void
11830fdc8d8SChris Lattner SBError::SetErrorToErrno ()
11930fdc8d8SChris Lattner {
12030fdc8d8SChris Lattner     CreateIfNeeded ();
1216611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner void
12530fdc8d8SChris Lattner SBError::SetErrorToGenericError ()
12630fdc8d8SChris Lattner {
12730fdc8d8SChris Lattner     CreateIfNeeded ();
1286611103cSGreg Clayton     m_opaque_ap->SetErrorToErrno ();
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner void
13230fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str)
13330fdc8d8SChris Lattner {
13430fdc8d8SChris Lattner     CreateIfNeeded ();
1356611103cSGreg Clayton     m_opaque_ap->SetErrorString (err_str);
13630fdc8d8SChris Lattner }
13730fdc8d8SChris Lattner 
13830fdc8d8SChris Lattner int
13930fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...)
14030fdc8d8SChris Lattner {
14130fdc8d8SChris Lattner     CreateIfNeeded ();
14230fdc8d8SChris Lattner     va_list args;
14330fdc8d8SChris Lattner     va_start (args, format);
1446611103cSGreg Clayton     int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args);
14530fdc8d8SChris Lattner     va_end (args);
14630fdc8d8SChris Lattner     return num_chars;
14730fdc8d8SChris Lattner }
14830fdc8d8SChris Lattner 
14930fdc8d8SChris Lattner bool
15030fdc8d8SChris Lattner SBError::IsValid () const
15130fdc8d8SChris Lattner {
1526611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner void
15630fdc8d8SChris Lattner SBError::CreateIfNeeded ()
15730fdc8d8SChris Lattner {
1586611103cSGreg Clayton     if (m_opaque_ap.get() == NULL)
1596611103cSGreg Clayton         m_opaque_ap.reset(new Error ());
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner lldb_private::Error *
16430fdc8d8SChris Lattner SBError::operator->()
16530fdc8d8SChris Lattner {
1666611103cSGreg Clayton     return m_opaque_ap.get();
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner lldb_private::Error *
17030fdc8d8SChris Lattner SBError::get()
17130fdc8d8SChris Lattner {
1726611103cSGreg Clayton     return m_opaque_ap.get();
17330fdc8d8SChris Lattner }
17430fdc8d8SChris Lattner 
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner const lldb_private::Error &
17730fdc8d8SChris Lattner SBError::operator*() const
17830fdc8d8SChris Lattner {
17930fdc8d8SChris Lattner     // Be sure to call "IsValid()" before calling this function or it will crash
1806611103cSGreg Clayton     return *m_opaque_ap;
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
183*dde9cff3SCaroline Tice bool
184*dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description)
185*dde9cff3SCaroline Tice {
186*dde9cff3SCaroline Tice     if (m_opaque_ap.get())
187*dde9cff3SCaroline Tice     {
188*dde9cff3SCaroline Tice         if (Success())
189*dde9cff3SCaroline Tice             description.Printf ("Status: Success");
190*dde9cff3SCaroline Tice         else
191*dde9cff3SCaroline Tice         {
192*dde9cff3SCaroline Tice             const char * err_string = GetCString();
193*dde9cff3SCaroline Tice             description.Printf ("Status:  Error: %s",  (err_string != NULL ? err_string : ""));
194*dde9cff3SCaroline Tice         }
195*dde9cff3SCaroline Tice     }
196*dde9cff3SCaroline Tice     else
197*dde9cff3SCaroline Tice         description.Printf ("No value");
198*dde9cff3SCaroline Tice 
199*dde9cff3SCaroline Tice     return true;
200*dde9cff3SCaroline Tice }
201*dde9cff3SCaroline Tice 
202*dde9cff3SCaroline Tice PyObject *
203*dde9cff3SCaroline Tice SBError::__repr__ ()
204*dde9cff3SCaroline Tice {
205*dde9cff3SCaroline Tice     SBStream description;
206*dde9cff3SCaroline Tice     GetDescription (description);
207*dde9cff3SCaroline Tice     return PyString_FromString (description.GetData());
208*dde9cff3SCaroline Tice }
209