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