117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			117 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
 | 
						|
#ifdef WITH_FBS
 | 
						|
    case FrontBoard: {
 | 
						|
      // You have to call ObjC routines to get the error string from
 | 
						|
      // FrontBoardServices.
 | 
						|
      // 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
 | 
						|
      // FrontBoard.
 | 
						|
      m_str.assign(
 | 
						|
          "Should have set FrontBoard 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);
 | 
						|
  }
 | 
						|
}
 |