blob: cd04358a4ecac091b7f85cf4d30b446c2de7ae51 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- 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
Jason Molenda42999a42012-02-22 02:18:59 +000019#ifdef WITH_SPRINGBOARD
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020#include <SpringBoardServices/SpringBoardServer.h>
21#endif
22
Kate Stoneb9c1b512016-09-06 20:57:50 +000023const char *DNBError::AsString() const {
24 if (Success())
25 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026
Kate Stoneb9c1b512016-09-06 20:57:50 +000027 if (m_str.empty()) {
28 const char *s = NULL;
29 switch (m_flavor) {
30 case MachKernel:
31 s = ::mach_error_string(m_err);
32 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033
Kate Stoneb9c1b512016-09-06 20:57:50 +000034 case POSIX:
35 s = ::strerror(m_err);
36 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037
Jason Molenda42999a42012-02-22 02:18:59 +000038#ifdef WITH_SPRINGBOARD
Kate Stoneb9c1b512016-09-06 20:57:50 +000039 case SpringBoard: {
40 CFStringRef statusStr = SBSApplicationLaunchingErrorString(m_err);
41 if (CFString::UTF8(statusStr, m_str) == NULL)
42 m_str.clear();
43 } break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044#endif
Jason Molendaa3329782014-03-29 18:54:20 +000045#ifdef WITH_BKS
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 case BackBoard: {
47 // You have to call ObjC routines to get the error string from
48 // BackBoardServices.
49 // Not sure I want to make DNBError.cpp an .mm file. For now just make
50 // sure you
51 // pre-populate the error string when you make the DNBError of type
52 // BackBoard.
53 m_str.assign(
54 "Should have set BackBoard error when making the error string.");
55 } break;
Jason Molendac611a742015-10-23 02:49:51 +000056#endif
57#ifdef WITH_FBS
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 case FrontBoard: {
59 // You have to call ObjC routines to get the error string from
60 // FrontBoardServices.
61 // Not sure I want to make DNBError.cpp an .mm file. For now just make
62 // sure you
63 // pre-populate the error string when you make the DNBError of type
64 // FrontBoard.
65 m_str.assign(
66 "Should have set FrontBoard error when making the error string.");
67 } break;
Jason Molendaa3329782014-03-29 18:54:20 +000068#endif
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 default:
70 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 if (s)
73 m_str.assign(s);
74 }
75 if (m_str.empty())
76 return NULL;
77 return m_str.c_str();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000078}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080void DNBError::LogThreadedIfError(const char *format, ...) const {
81 if (Fail()) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +000082 char *arg_msg = NULL;
83 va_list args;
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 va_start(args, format);
85 ::vasprintf(&arg_msg, format, args);
86 va_end(args);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 if (arg_msg != NULL) {
89 const char *err_str = AsString();
90 if (err_str == NULL)
91 err_str = "???";
92 DNBLogThreaded("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
93 free(arg_msg);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000094 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000095 }
96}
97
98void DNBError::LogThreaded(const char *format, ...) const {
99 char *arg_msg = NULL;
100 va_list args;
101 va_start(args, format);
102 ::vasprintf(&arg_msg, format, args);
103 va_end(args);
104
105 if (arg_msg != NULL) {
106 if (Fail()) {
107 const char *err_str = AsString();
108 if (err_str == NULL)
109 err_str = "???";
110 DNBLogThreaded("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
111 } else {
112 DNBLogThreaded("%s err = 0x%8.8x", arg_msg, m_err);
113 }
114 free(arg_msg);
115 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000116}