//===-- 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);
  }
}
