|  | //===-- 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); | 
|  | } | 
|  | } |