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