/* libzz
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
*/

#ifndef zz_error_h
#define zz_error_h

#include <zz_string.h>
#include <deque>
#include <map>
#include <zz_export.h>

/**
    Error message

    @author Toni Thomsson, toni@tonjac.org  
*/
class ZZ_API CzzErrorMessage
{

public:  
    
    /**
        Create an empty error message
    */
    CzzErrorMessage( void );

    /**
        Copy constructor
    */
    CzzErrorMessage( const CzzErrorMessage& messageSrc );
    
    ~CzzErrorMessage();

    /**
        Set message
        @param  message Text
    */
    void SetMessage( const CzzString message );

    /**
        Get message string
    */
    CzzString GetMessage(void) const;

    
    /**
        Set error code
        @param  code    Error code
    */
    void SetCode( int code );

    /**
        Get error code
    */
    int GetCode(void) const;

private:
    CzzString m_Message;
    int m_Code;
};

/**
    Error stack

    @author Toni Thomsson, toni@tonjac.org  
*/
class CzzErrorStack : public deque<CzzErrorMessage*  >
{
public:

    /** Error stack */
    CzzErrorStack( void );  
    
    ~CzzErrorStack(); 

    /** Number of users */
    int GetUsageCount(void);

    /** Increment the number of users */
    void IncreaseUsageCount( void );

    /** Decrement the number of users */
    void DecreaseUsageCount( void );

private:
    int m_UsageCount;
};

/**
    Error history  

    @author Toni Thomsson, toni@tonjac.org  
*/  
class CzzErrorHistory : public CzzErrorStack
{
public:

    /** Error history */
    CzzErrorHistory( void );

    ~CzzErrorHistory( void );

    /** Number of messages on the error stack */
    int GetNumberOfMessages(void) const;

    /** Empty stack */
    bool IsEmpty(void);

    /** 
        Add message to the stack 
        @param message  Message
        @param code Error code
    */
    void PushMessage( const CzzString message, const int code );

    /** 
        Add message to the stack 
        @param message  Message
    */
    void PushMessage( CzzErrorMessage* message );

    /** 
        Get message on top of the stack 
        @param message  Message
        @param code Error code
    */
    void GetTopMessage( CzzString& message, int& code );
    
    /** 
        Get message on top of the stack 
        @param message  Message
    */
    void GetTopMessage( CzzErrorMessage*& message );

    /** Remove message from top of the stack */
    void PopTopMessage( void );

    /** 
        Get message from the bottom of the stack 
        @param message  Message
        @param code Error code
    */
    void GetBottomMessage( CzzString& message, int& code );

    /** 
        Get message from the bottom of the stack 
        @param message  Message
    */
    void GetBottomMessage( CzzErrorMessage*& message );

    /** Remove message from bottom of the stack */
    void PopBottomMessage( void );
};

#endif