/* $Id$ */
/* 
 * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJPP_TYPES_HPP__
#define __PJPP_TYPES_HPP__

#include <pj/types.h>

class Pj_Pool;
class Pj_Socket ;
class Pj_Lock;


//
// PJLIB initializer.
//
class Pjlib
{
public:
    Pjlib()
    {
        pj_init();
    }
};

//
// Class Pj_Object is declared in pool.hpp
//

//
// Time value wrapper.
//
class Pj_Time_Val : public pj_time_val
{
public:
    Pj_Time_Val()
    {
    }

    Pj_Time_Val(long init_sec, long init_msec)
    {
        sec = init_sec;
        msec = init_msec;
    }

    Pj_Time_Val(const Pj_Time_Val &rhs) 
    { 
        sec=rhs.sec; 
        msec=rhs.msec; 
    }

    explicit Pj_Time_Val(const pj_time_val &tv) 
    { 
        sec = tv.sec; 
        msec = tv.msec; 
    }

    long get_sec()  const    
    { 
        return sec; 
    }

    long get_msec() const    
    { 
        return msec; 
    }

    void set_sec (long s)    
    { 
        sec = s; 
    }

    void set_msec(long ms)   
    { 
        msec = ms; 
        normalize(); 
    }

    long to_msec() const 
    { 
        return PJ_TIME_VAL_MSEC((*this)); 
    }

    bool operator == (const Pj_Time_Val &rhs) const 
    { 
        return PJ_TIME_VAL_EQ((*this), rhs);  
    }

    bool operator >  (const Pj_Time_Val &rhs) const 
    { 
        return PJ_TIME_VAL_GT((*this), rhs);  
    }

    bool operator >= (const Pj_Time_Val &rhs) const 
    { 
        return PJ_TIME_VAL_GTE((*this), rhs); 
    }

    bool operator <  (const Pj_Time_Val &rhs) const 
    { 
        return PJ_TIME_VAL_LT((*this), rhs);  
    }

    bool operator <= (const Pj_Time_Val &rhs) const 
    { 
        return PJ_TIME_VAL_LTE((*this), rhs); 
    }

    Pj_Time_Val & operator = (const Pj_Time_Val &rhs) 
    {
	sec = rhs.sec;
	msec = rhs.msec;
	return *this;
    }
 
    Pj_Time_Val & operator += (const Pj_Time_Val &rhs) 
    {
	PJ_TIME_VAL_ADD((*this), rhs);
	return *this;
    }

    Pj_Time_Val & operator -= (const Pj_Time_Val &rhs) 
    {
	PJ_TIME_VAL_SUB((*this), rhs);
	return *this;
    }

    /* Must include os.hpp to use these, otherwise unresolved in linking */
    inline pj_status_t	   gettimeofday();
    inline pj_parsed_time  decode();
    inline pj_status_t     encode(const pj_parsed_time *pt);
    inline pj_status_t     to_gmt();
    inline pj_status_t     to_local();


private:
    void normalize() 
    { 
        pj_time_val_normalize(this); 
    }

};

//
// Macro to declare common object comparison operators.
//
#define PJ_DECLARE_OPERATORS(rhs_type)			    \
	    bool operator!=(rhs_type rhs) const {	    \
		return !operator==(rhs); }		    \
	    bool operator<=(rhs_type rhs) const {	    \
		return operator<(rhs) || operator==(rhs); } \
	    bool operator>(rhs_type rhs) const {	    \
		return !operator<=(rhs); }		    \
	    bool operator>=(rhs_type rhs) const {	    \
		return !operator<(rhs); }


#endif	/* __PJPP_TYPES_HPP__ */

