Home | History | Annotate | Download | only in source
      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 
     23 const char *
     24 DNBError::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 
     62 void
     63 DNBError::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 
     84 void
     85 DNBError::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