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
23const char *
24DNBError::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
62void
63DNBError::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
84void
85DNBError::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