forked from OSchip/llvm-project
119 lines
3.0 KiB
C++
119 lines
3.0 KiB
C++
//===-- DNBError.cpp --------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Created by Greg Clayton on 6/26/07.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "DNBError.h"
|
|
#include "CFString.h"
|
|
#include "DNBLog.h"
|
|
#include "PThreadMutex.h"
|
|
|
|
#ifdef WITH_SPRINGBOARD
|
|
#include <SpringBoardServices/SpringBoardServer.h>
|
|
#endif
|
|
|
|
const char *
|
|
DNBError::AsString() const
|
|
{
|
|
if (Success())
|
|
return NULL;
|
|
|
|
if (m_str.empty())
|
|
{
|
|
const char *s = NULL;
|
|
switch (m_flavor)
|
|
{
|
|
case MachKernel:
|
|
s = ::mach_error_string (m_err);
|
|
break;
|
|
|
|
case POSIX:
|
|
s = ::strerror (m_err);
|
|
break;
|
|
|
|
#ifdef WITH_SPRINGBOARD
|
|
case SpringBoard:
|
|
{
|
|
CFStringRef statusStr = SBSApplicationLaunchingErrorString (m_err);
|
|
if (CFString::UTF8 (statusStr, m_str) == NULL)
|
|
m_str.clear();
|
|
}
|
|
break;
|
|
#endif
|
|
#ifdef WITH_BKS
|
|
case BackBoard:
|
|
{
|
|
// You have to call ObjC routines to get the error string from BackBoardServices.
|
|
// Not sure I want to make DNBError.cpp an .mm file. For now just make sure you
|
|
// pre-populate the error string when you make the DNBError of type BackBoard.
|
|
m_str.assign("Should have set Backboard error when making the error string.");
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
break;
|
|
}
|
|
if (s)
|
|
m_str.assign(s);
|
|
}
|
|
if (m_str.empty())
|
|
return NULL;
|
|
return m_str.c_str();
|
|
}
|
|
|
|
void
|
|
DNBError::LogThreadedIfError(const char *format, ...) const
|
|
{
|
|
if (Fail())
|
|
{
|
|
char *arg_msg = NULL;
|
|
va_list args;
|
|
va_start (args, format);
|
|
::vasprintf (&arg_msg, format, args);
|
|
va_end (args);
|
|
|
|
if (arg_msg != NULL)
|
|
{
|
|
const char *err_str = AsString();
|
|
if (err_str == NULL)
|
|
err_str = "???";
|
|
DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
|
|
free (arg_msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
DNBError::LogThreaded(const char *format, ...) const
|
|
{
|
|
char *arg_msg = NULL;
|
|
va_list args;
|
|
va_start (args, format);
|
|
::vasprintf (&arg_msg, format, args);
|
|
va_end (args);
|
|
|
|
if (arg_msg != NULL)
|
|
{
|
|
if (Fail())
|
|
{
|
|
const char *err_str = AsString();
|
|
if (err_str == NULL)
|
|
err_str = "???";
|
|
DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
|
|
}
|
|
else
|
|
{
|
|
DNBLogThreaded ("%s err = 0x%8.8x", arg_msg, m_err);
|
|
}
|
|
free (arg_msg);
|
|
}
|
|
}
|