//===-- DNBError.h ----------------------------------------------*- 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.
//
//===----------------------------------------------------------------------===//

#ifndef __DNBError_h__
#define __DNBError_h__

#include <errno.h>
#include <mach/mach.h>
#include <stdio.h>
#include <string>

class DNBError
{
public:
    typedef uint32_t ValueType;
    typedef enum
    {
        Generic = 0,
        MachKernel,
        POSIX
#if defined (__arm__)
        , SpringBoard
#endif
    } FlavorType;

    explicit DNBError(    ValueType err = 0,
                            FlavorType flavor = Generic) :
        m_err(err),
        m_flavor(flavor)
    {
    }

    const char * AsString() const;
    void Clear() { m_err = 0; m_flavor = Generic; m_str.clear(); }
    ValueType Error() const { return m_err; }
    FlavorType Flavor() const { return m_flavor; }

    ValueType operator = (kern_return_t err)
    {
        m_err = err;
        m_flavor = MachKernel;
        m_str.clear();
        return m_err;
    }

    void SetError(kern_return_t err)
    {
        m_err = err;
        m_flavor = MachKernel;
        m_str.clear();
    }

    void SetErrorToErrno()
    {
        m_err = errno;
        m_flavor = POSIX;
        m_str.clear();
    }

    void SetError(ValueType err, FlavorType flavor)
    {
        m_err = err;
        m_flavor = flavor;
        m_str.clear();
    }

    // Generic errors can set their own string values
    void SetErrorString(const char *err_str)
    {
        if (err_str && err_str[0])
            m_str = err_str;
        else
            m_str.clear();
    }
    bool Success() const { return m_err == 0; }
    bool Fail() const { return m_err != 0; }
    void LogThreadedIfError(const char *format, ...) const;
    void LogThreaded(const char *format, ...) const;
protected:
    ValueType    m_err;
    FlavorType    m_flavor;
    mutable std::string m_str;
};


#endif    // #ifndef __DNBError_h__
