diff options
Diffstat (limited to 'tools/debugserver/source/DNBError.cpp')
-rw-r--r-- | tools/debugserver/source/DNBError.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/tools/debugserver/source/DNBError.cpp b/tools/debugserver/source/DNBError.cpp new file mode 100644 index 0000000000000..c9d8ebd58d894 --- /dev/null +++ b/tools/debugserver/source/DNBError.cpp @@ -0,0 +1,128 @@ +//===-- DNBError.cpp --------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Created by Greg Clayton on 6/26/07. +// +//===----------------------------------------------------------------------===// + +#include "DNBError.h" +#include "CFString.h" +#include "DNBLog.h" +#include "PThreadMutex.h" + +#ifdef WITH_SPRINGBOARD +#include <SpringBoardServices/SpringBoardServer.h> +#endif + +const char * +DNBError::AsString() const +{ + if (Success()) + return NULL; + + if (m_str.empty()) + { + const char *s = NULL; + switch (m_flavor) + { + case MachKernel: + s = ::mach_error_string (m_err); + break; + + case POSIX: + s = ::strerror (m_err); + break; + +#ifdef WITH_SPRINGBOARD + case SpringBoard: + { + CFStringRef statusStr = SBSApplicationLaunchingErrorString (m_err); + if (CFString::UTF8 (statusStr, m_str) == NULL) + m_str.clear(); + } + break; +#endif +#ifdef WITH_BKS + case BackBoard: + { + // You have to call ObjC routines to get the error string from BackBoardServices. + // Not sure I want to make DNBError.cpp an .mm file. For now just make sure you + // pre-populate the error string when you make the DNBError of type BackBoard. + m_str.assign("Should have set BackBoard error when making the error string."); + } + break; +#endif +#ifdef WITH_FBS + case FrontBoard: + { + // You have to call ObjC routines to get the error string from FrontBoardServices. + // Not sure I want to make DNBError.cpp an .mm file. For now just make sure you + // pre-populate the error string when you make the DNBError of type FrontBoard. + m_str.assign("Should have set FrontBoard error when making the error string."); + } + break; +#endif + default: + break; + } + if (s) + m_str.assign(s); + } + if (m_str.empty()) + return NULL; + return m_str.c_str(); +} + +void +DNBError::LogThreadedIfError(const char *format, ...) const +{ + if (Fail()) + { + char *arg_msg = NULL; + va_list args; + va_start (args, format); + ::vasprintf (&arg_msg, format, args); + va_end (args); + + if (arg_msg != NULL) + { + const char *err_str = AsString(); + if (err_str == NULL) + err_str = "???"; + DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err); + free (arg_msg); + } + } +} + +void +DNBError::LogThreaded(const char *format, ...) const +{ + char *arg_msg = NULL; + va_list args; + va_start (args, format); + ::vasprintf (&arg_msg, format, args); + va_end (args); + + if (arg_msg != NULL) + { + if (Fail()) + { + const char *err_str = AsString(); + if (err_str == NULL) + err_str = "???"; + DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err); + } + else + { + DNBLogThreaded ("%s err = 0x%8.8x", arg_msg, m_err); + } + free (arg_msg); + } +} |