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"
12bf9a7730SZachary Turner #include "lldb/Utility/Error.h"
13*6f9e6901SZachary Turner #include "lldb/Utility/Log.h"
14dde9cff3SCaroline Tice 
159c68da97SEli Friedman #include <stdarg.h>
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner using namespace lldb;
1830fdc8d8SChris Lattner using namespace lldb_private;
1930fdc8d8SChris Lattner 
20b9c1b51eSKate Stone SBError::SBError() : m_opaque_ap() {}
2130fdc8d8SChris Lattner 
22b9c1b51eSKate Stone SBError::SBError(const SBError &rhs) : m_opaque_ap() {
2330fdc8d8SChris Lattner   if (rhs.IsValid())
246611103cSGreg Clayton     m_opaque_ap.reset(new Error(*rhs));
2530fdc8d8SChris Lattner }
2630fdc8d8SChris Lattner 
27b9c1b51eSKate Stone SBError::~SBError() {}
2830fdc8d8SChris Lattner 
29b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) {
30b9c1b51eSKate Stone   if (rhs.IsValid()) {
316611103cSGreg Clayton     if (m_opaque_ap.get())
326611103cSGreg Clayton       *m_opaque_ap = *rhs;
3330fdc8d8SChris Lattner     else
346611103cSGreg Clayton       m_opaque_ap.reset(new Error(*rhs));
35b9c1b51eSKate Stone   } else
366611103cSGreg Clayton     m_opaque_ap.reset();
37ceb6b139SCaroline Tice 
3830fdc8d8SChris Lattner   return *this;
3930fdc8d8SChris Lattner }
4030fdc8d8SChris Lattner 
41b9c1b51eSKate Stone const char *SBError::GetCString() const {
426611103cSGreg Clayton   if (m_opaque_ap.get())
436611103cSGreg Clayton     return m_opaque_ap->AsCString();
4430fdc8d8SChris Lattner   return NULL;
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
47b9c1b51eSKate Stone void SBError::Clear() {
486611103cSGreg Clayton   if (m_opaque_ap.get())
496611103cSGreg Clayton     m_opaque_ap->Clear();
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
52b9c1b51eSKate Stone bool SBError::Fail() const {
535160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
54ceb6b139SCaroline Tice 
55ceb6b139SCaroline Tice   bool ret_value = false;
566611103cSGreg Clayton   if (m_opaque_ap.get())
57ceb6b139SCaroline Tice     ret_value = m_opaque_ap->Fail();
58ceb6b139SCaroline Tice 
59ceb6b139SCaroline Tice   if (log)
60324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::Fail () => %i",
61324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), ret_value);
62ceb6b139SCaroline Tice 
63ceb6b139SCaroline Tice   return ret_value;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
66b9c1b51eSKate Stone bool SBError::Success() const {
675160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6816e0c686SJim Ingham   bool ret_value = true;
696611103cSGreg Clayton   if (m_opaque_ap.get())
704838131bSGreg Clayton     ret_value = m_opaque_ap->Success();
714838131bSGreg Clayton 
724838131bSGreg Clayton   if (log)
73324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::Success () => %i",
74324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), ret_value);
754838131bSGreg Clayton 
764838131bSGreg Clayton   return ret_value;
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
79b9c1b51eSKate Stone uint32_t SBError::GetError() const {
805160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
814838131bSGreg Clayton 
824838131bSGreg Clayton   uint32_t err = 0;
836611103cSGreg Clayton   if (m_opaque_ap.get())
844838131bSGreg Clayton     err = m_opaque_ap->GetError();
854838131bSGreg Clayton 
864838131bSGreg Clayton   if (log)
87324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::GetError () => 0x%8.8x",
88324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), err);
894838131bSGreg Clayton 
904838131bSGreg Clayton   return err;
9130fdc8d8SChris Lattner }
9230fdc8d8SChris Lattner 
93b9c1b51eSKate Stone ErrorType SBError::GetType() const {
945160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
954838131bSGreg Clayton   ErrorType err_type = eErrorTypeInvalid;
966611103cSGreg Clayton   if (m_opaque_ap.get())
974838131bSGreg Clayton     err_type = m_opaque_ap->GetType();
984838131bSGreg Clayton 
994838131bSGreg Clayton   if (log)
100324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::GetType () => %i",
101324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), err_type);
1024838131bSGreg Clayton 
1034838131bSGreg Clayton   return err_type;
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
106b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) {
10730fdc8d8SChris Lattner   CreateIfNeeded();
1086611103cSGreg Clayton   m_opaque_ap->SetError(err, type);
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
111b9c1b51eSKate Stone void SBError::SetError(const Error &lldb_error) {
11230fdc8d8SChris Lattner   CreateIfNeeded();
1136611103cSGreg Clayton   *m_opaque_ap = lldb_error;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
116b9c1b51eSKate Stone void SBError::SetErrorToErrno() {
11730fdc8d8SChris Lattner   CreateIfNeeded();
1186611103cSGreg Clayton   m_opaque_ap->SetErrorToErrno();
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
121b9c1b51eSKate Stone void SBError::SetErrorToGenericError() {
12230fdc8d8SChris Lattner   CreateIfNeeded();
1236611103cSGreg Clayton   m_opaque_ap->SetErrorToErrno();
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
126b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) {
12730fdc8d8SChris Lattner   CreateIfNeeded();
1286611103cSGreg Clayton   m_opaque_ap->SetErrorString(err_str);
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
131b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) {
13230fdc8d8SChris Lattner   CreateIfNeeded();
13330fdc8d8SChris Lattner   va_list args;
13430fdc8d8SChris Lattner   va_start(args, format);
1356611103cSGreg Clayton   int num_chars = m_opaque_ap->SetErrorStringWithVarArg(format, args);
13630fdc8d8SChris Lattner   va_end(args);
13730fdc8d8SChris Lattner   return num_chars;
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
140b9c1b51eSKate Stone bool SBError::IsValid() const { return m_opaque_ap.get() != NULL; }
14130fdc8d8SChris Lattner 
142b9c1b51eSKate Stone void SBError::CreateIfNeeded() {
1436611103cSGreg Clayton   if (m_opaque_ap.get() == NULL)
1446611103cSGreg Clayton     m_opaque_ap.reset(new Error());
14530fdc8d8SChris Lattner }
14630fdc8d8SChris Lattner 
147b9c1b51eSKate Stone lldb_private::Error *SBError::operator->() { return m_opaque_ap.get(); }
14830fdc8d8SChris Lattner 
149b9c1b51eSKate Stone lldb_private::Error *SBError::get() { return m_opaque_ap.get(); }
15030fdc8d8SChris Lattner 
151b9c1b51eSKate Stone lldb_private::Error &SBError::ref() {
1528f343b09SGreg Clayton   CreateIfNeeded();
1538f343b09SGreg Clayton   return *m_opaque_ap;
1548f343b09SGreg Clayton }
15530fdc8d8SChris Lattner 
156b9c1b51eSKate Stone const lldb_private::Error &SBError::operator*() const {
15730fdc8d8SChris Lattner   // Be sure to call "IsValid()" before calling this function or it will crash
1586611103cSGreg Clayton   return *m_opaque_ap;
15930fdc8d8SChris Lattner }
16030fdc8d8SChris Lattner 
161b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) {
162b9c1b51eSKate Stone   if (m_opaque_ap.get()) {
163262f80dfSGreg Clayton     if (m_opaque_ap->Success())
164262f80dfSGreg Clayton       description.Printf("success");
165b9c1b51eSKate Stone     else {
166dde9cff3SCaroline Tice       const char *err_string = GetCString();
167262f80dfSGreg Clayton       description.Printf("error: %s", (err_string != NULL ? err_string : ""));
168dde9cff3SCaroline Tice     }
169b9c1b51eSKate Stone   } else
170262f80dfSGreg Clayton     description.Printf("error: <NULL>");
171ceb6b139SCaroline Tice 
172ceb6b139SCaroline Tice   return true;
173ceb6b139SCaroline Tice }
174