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