124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBError.h ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Created by Greg Clayton on 6/26/07.
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __DNBError_h__
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __DNBError_h__
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <errno.h>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <mach/mach.h>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdio.h>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DNBError
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef uint32_t ValueType;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Generic = 0,
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        MachKernel,
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        POSIX
319a5bbd2a14cacac731424f7a253f6cc16b22c10aJason Molenda#ifdef WITH_SPRINGBOARD
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        , SpringBoard
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } FlavorType;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    explicit DNBError(    ValueType err = 0,
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            FlavorType flavor = Generic) :
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_err(err),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flavor(flavor)
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char * AsString() const;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void Clear() { m_err = 0; m_flavor = Generic; m_str.clear(); }
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueType Error() const { return m_err; }
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FlavorType Flavor() const { return m_flavor; }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueType operator = (kern_return_t err)
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_err = err;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flavor = MachKernel;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_str.clear();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_err;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void SetError(kern_return_t err)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_err = err;
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flavor = MachKernel;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_str.clear();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void SetErrorToErrno()
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_err = errno;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flavor = POSIX;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_str.clear();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void SetError(ValueType err, FlavorType flavor)
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_err = err;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flavor = flavor;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_str.clear();
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Generic errors can set their own string values
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void SetErrorString(const char *err_str)
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (err_str && err_str[0])
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_str = err_str;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_str.clear();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool Success() const { return m_err == 0; }
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool Fail() const { return m_err != 0; }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void LogThreadedIfError(const char *format, ...) const;
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void LogThreaded(const char *format, ...) const;
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueType    m_err;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FlavorType    m_flavor;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable std::string m_str;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif    // #ifndef __DNBError_h__
97