130fdc8d8SChris Lattner //===-- DNBError.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner //
930fdc8d8SChris Lattner // Created by Greg Clayton on 6/26/07.
1030fdc8d8SChris Lattner //
1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
1230fdc8d8SChris Lattner
1330fdc8d8SChris Lattner #include "DNBError.h"
1430fdc8d8SChris Lattner #include "CFString.h"
1530fdc8d8SChris Lattner #include "DNBLog.h"
1630fdc8d8SChris Lattner #include "PThreadMutex.h"
1730fdc8d8SChris Lattner
1842999a48SJason Molenda #ifdef WITH_SPRINGBOARD
1930fdc8d8SChris Lattner #include <SpringBoardServices/SpringBoardServer.h>
2030fdc8d8SChris Lattner #endif
2130fdc8d8SChris Lattner
AsString() const22b9c1b51eSKate Stone const char *DNBError::AsString() const {
2330fdc8d8SChris Lattner if (Success())
2430fdc8d8SChris Lattner return NULL;
2530fdc8d8SChris Lattner
26b9c1b51eSKate Stone if (m_str.empty()) {
2730fdc8d8SChris Lattner const char *s = NULL;
28b9c1b51eSKate Stone switch (m_flavor) {
2930fdc8d8SChris Lattner case MachKernel:
3030fdc8d8SChris Lattner s = ::mach_error_string(m_err);
3130fdc8d8SChris Lattner break;
3230fdc8d8SChris Lattner
3330fdc8d8SChris Lattner case POSIX:
3430fdc8d8SChris Lattner s = ::strerror(m_err);
3530fdc8d8SChris Lattner break;
3630fdc8d8SChris Lattner
3742999a48SJason Molenda #ifdef WITH_SPRINGBOARD
38b9c1b51eSKate Stone case SpringBoard: {
3930fdc8d8SChris Lattner CFStringRef statusStr = SBSApplicationLaunchingErrorString(m_err);
4030fdc8d8SChris Lattner if (CFString::UTF8(statusStr, m_str) == NULL)
4130fdc8d8SChris Lattner m_str.clear();
42b9c1b51eSKate Stone } break;
4330fdc8d8SChris Lattner #endif
44a332978bSJason Molenda #ifdef WITH_BKS
45b9c1b51eSKate Stone case BackBoard: {
46b9c1b51eSKate Stone // You have to call ObjC routines to get the error string from
47b9c1b51eSKate Stone // BackBoardServices.
48b9c1b51eSKate Stone // Not sure I want to make DNBError.cpp an .mm file. For now just make
49b9c1b51eSKate Stone // sure you
50b9c1b51eSKate Stone // pre-populate the error string when you make the DNBError of type
51b9c1b51eSKate Stone // BackBoard.
52b9c1b51eSKate Stone m_str.assign(
53b9c1b51eSKate Stone "Should have set BackBoard error when making the error string.");
54b9c1b51eSKate Stone } break;
55c611a740SJason Molenda #endif
56c611a740SJason Molenda #ifdef WITH_FBS
57b9c1b51eSKate Stone case FrontBoard: {
58b9c1b51eSKate Stone // You have to call ObjC routines to get the error string from
59b9c1b51eSKate Stone // FrontBoardServices.
60b9c1b51eSKate Stone // Not sure I want to make DNBError.cpp an .mm file. For now just make
61b9c1b51eSKate Stone // sure you
62b9c1b51eSKate Stone // pre-populate the error string when you make the DNBError of type
63b9c1b51eSKate Stone // FrontBoard.
64b9c1b51eSKate Stone m_str.assign(
65b9c1b51eSKate Stone "Should have set FrontBoard error when making the error string.");
66b9c1b51eSKate Stone } break;
67a332978bSJason Molenda #endif
6830fdc8d8SChris Lattner default:
6930fdc8d8SChris Lattner break;
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner if (s)
7230fdc8d8SChris Lattner m_str.assign(s);
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner if (m_str.empty())
7530fdc8d8SChris Lattner return NULL;
7630fdc8d8SChris Lattner return m_str.c_str();
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner
LogThreadedIfError(const char * format,...) const79b9c1b51eSKate Stone void DNBError::LogThreadedIfError(const char *format, ...) const {
80b9c1b51eSKate Stone if (Fail()) {
8130fdc8d8SChris Lattner char *arg_msg = NULL;
8230fdc8d8SChris Lattner va_list args;
8330fdc8d8SChris Lattner va_start(args, format);
8430fdc8d8SChris Lattner ::vasprintf(&arg_msg, format, args);
8530fdc8d8SChris Lattner va_end(args);
8630fdc8d8SChris Lattner
87b9c1b51eSKate Stone if (arg_msg != NULL) {
8830fdc8d8SChris Lattner const char *err_str = AsString();
8930fdc8d8SChris Lattner if (err_str == NULL)
9030fdc8d8SChris Lattner err_str = "???";
9130fdc8d8SChris Lattner DNBLogThreaded("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
9230fdc8d8SChris Lattner free(arg_msg);
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner
LogThreaded(const char * format,...) const97b9c1b51eSKate Stone void DNBError::LogThreaded(const char *format, ...) const {
9830fdc8d8SChris Lattner char *arg_msg = NULL;
9930fdc8d8SChris Lattner va_list args;
10030fdc8d8SChris Lattner va_start(args, format);
10130fdc8d8SChris Lattner ::vasprintf(&arg_msg, format, args);
10230fdc8d8SChris Lattner va_end(args);
10330fdc8d8SChris Lattner
104b9c1b51eSKate Stone if (arg_msg != NULL) {
105b9c1b51eSKate Stone if (Fail()) {
10630fdc8d8SChris Lattner const char *err_str = AsString();
10730fdc8d8SChris Lattner if (err_str == NULL)
10830fdc8d8SChris Lattner err_str = "???";
10930fdc8d8SChris Lattner DNBLogThreaded("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
110b9c1b51eSKate Stone } else {
11130fdc8d8SChris Lattner DNBLogThreaded("%s err = 0x%8.8x", arg_msg, m_err);
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner free(arg_msg);
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner }
116