1*30fdc8d8SChris Lattner //===-- DNBError.cpp --------------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner // 10*30fdc8d8SChris Lattner // Created by Greg Clayton on 6/26/07. 11*30fdc8d8SChris Lattner // 12*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 13*30fdc8d8SChris Lattner 14*30fdc8d8SChris Lattner #include "DNBError.h" 15*30fdc8d8SChris Lattner #include "CFString.h" 16*30fdc8d8SChris Lattner #include "DNBLog.h" 17*30fdc8d8SChris Lattner #include "PThreadMutex.h" 18*30fdc8d8SChris Lattner 19*30fdc8d8SChris Lattner #if defined (__arm__) 20*30fdc8d8SChris Lattner #include <SpringBoardServices/SpringBoardServer.h> 21*30fdc8d8SChris Lattner #endif 22*30fdc8d8SChris Lattner 23*30fdc8d8SChris Lattner const char * 24*30fdc8d8SChris Lattner DNBError::AsString() const 25*30fdc8d8SChris Lattner { 26*30fdc8d8SChris Lattner if (Success()) 27*30fdc8d8SChris Lattner return NULL; 28*30fdc8d8SChris Lattner 29*30fdc8d8SChris Lattner if (m_str.empty()) 30*30fdc8d8SChris Lattner { 31*30fdc8d8SChris Lattner const char *s = NULL; 32*30fdc8d8SChris Lattner switch (m_flavor) 33*30fdc8d8SChris Lattner { 34*30fdc8d8SChris Lattner case MachKernel: 35*30fdc8d8SChris Lattner s = ::mach_error_string (m_err); 36*30fdc8d8SChris Lattner break; 37*30fdc8d8SChris Lattner 38*30fdc8d8SChris Lattner case POSIX: 39*30fdc8d8SChris Lattner s = ::strerror (m_err); 40*30fdc8d8SChris Lattner break; 41*30fdc8d8SChris Lattner 42*30fdc8d8SChris Lattner #if defined (__arm__) 43*30fdc8d8SChris Lattner case SpringBoard: 44*30fdc8d8SChris Lattner { 45*30fdc8d8SChris Lattner CFStringRef statusStr = SBSApplicationLaunchingErrorString (m_err); 46*30fdc8d8SChris Lattner if (CFString::UTF8 (statusStr, m_str) == NULL) 47*30fdc8d8SChris Lattner m_str.clear(); 48*30fdc8d8SChris Lattner } 49*30fdc8d8SChris Lattner break; 50*30fdc8d8SChris Lattner #endif 51*30fdc8d8SChris Lattner default: 52*30fdc8d8SChris Lattner break; 53*30fdc8d8SChris Lattner } 54*30fdc8d8SChris Lattner if (s) 55*30fdc8d8SChris Lattner m_str.assign(s); 56*30fdc8d8SChris Lattner } 57*30fdc8d8SChris Lattner if (m_str.empty()) 58*30fdc8d8SChris Lattner return NULL; 59*30fdc8d8SChris Lattner return m_str.c_str(); 60*30fdc8d8SChris Lattner } 61*30fdc8d8SChris Lattner 62*30fdc8d8SChris Lattner void 63*30fdc8d8SChris Lattner DNBError::LogThreadedIfError(const char *format, ...) const 64*30fdc8d8SChris Lattner { 65*30fdc8d8SChris Lattner if (Fail()) 66*30fdc8d8SChris Lattner { 67*30fdc8d8SChris Lattner char *arg_msg = NULL; 68*30fdc8d8SChris Lattner va_list args; 69*30fdc8d8SChris Lattner va_start (args, format); 70*30fdc8d8SChris Lattner ::vasprintf (&arg_msg, format, args); 71*30fdc8d8SChris Lattner va_end (args); 72*30fdc8d8SChris Lattner 73*30fdc8d8SChris Lattner if (arg_msg != NULL) 74*30fdc8d8SChris Lattner { 75*30fdc8d8SChris Lattner const char *err_str = AsString(); 76*30fdc8d8SChris Lattner if (err_str == NULL) 77*30fdc8d8SChris Lattner err_str = "???"; 78*30fdc8d8SChris Lattner DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err); 79*30fdc8d8SChris Lattner free (arg_msg); 80*30fdc8d8SChris Lattner } 81*30fdc8d8SChris Lattner } 82*30fdc8d8SChris Lattner } 83*30fdc8d8SChris Lattner 84*30fdc8d8SChris Lattner void 85*30fdc8d8SChris Lattner DNBError::LogThreaded(const char *format, ...) const 86*30fdc8d8SChris Lattner { 87*30fdc8d8SChris Lattner char *arg_msg = NULL; 88*30fdc8d8SChris Lattner va_list args; 89*30fdc8d8SChris Lattner va_start (args, format); 90*30fdc8d8SChris Lattner ::vasprintf (&arg_msg, format, args); 91*30fdc8d8SChris Lattner va_end (args); 92*30fdc8d8SChris Lattner 93*30fdc8d8SChris Lattner if (arg_msg != NULL) 94*30fdc8d8SChris Lattner { 95*30fdc8d8SChris Lattner if (Fail()) 96*30fdc8d8SChris Lattner { 97*30fdc8d8SChris Lattner const char *err_str = AsString(); 98*30fdc8d8SChris Lattner if (err_str == NULL) 99*30fdc8d8SChris Lattner err_str = "???"; 100*30fdc8d8SChris Lattner DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err); 101*30fdc8d8SChris Lattner } 102*30fdc8d8SChris Lattner else 103*30fdc8d8SChris Lattner { 104*30fdc8d8SChris Lattner DNBLogThreaded ("%s err = 0x%8.8x", arg_msg, m_err); 105*30fdc8d8SChris Lattner } 106*30fdc8d8SChris Lattner free (arg_msg); 107*30fdc8d8SChris Lattner } 108*30fdc8d8SChris Lattner } 109