/* $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 __PJSIP_SIMPLE_RPID_H__
#define __PJSIP_SIMPLE_RPID_H__

/**
 * @file rpid.h
 * @brief RPID: Rich Presence Extensions to the PIDF (RFC 4480)
 */
#include <pjsip-simple/types.h>
#include <pjsip-simple/pidf.h>

PJ_BEGIN_DECL


/**
 * @defgroup PJSIP_SIMPLE_RPID RPID/Rich Presence Extensions to PIDF (RFC 4480)
 * @ingroup PJSIP_SIMPLE
 * @brief RPID/Rich Presence Extensions to PIDF (RFC 4480)
 * @{
 *
 * This file provides tools for managing subset of RPID elements into
 * PIDF document.
 */

/**
 * This enumeration describes subset of standard activities as 
 * described by RFC 4880, RPID: Rich Presence Extensions to the 
 * Presence Information Data Format (PIDF). 
 */
typedef enum pjrpid_activity
{
    /** Activity is unknown. The activity would then be conceived
     *  in the "note" field.
     */
    PJRPID_ACTIVITY_UNKNOWN,

    /** The person is away */
    PJRPID_ACTIVITY_AWAY,

    /** The person is busy */
    PJRPID_ACTIVITY_BUSY

} pjrpid_activity;


/**
 * This enumeration describes types of RPID element.
 */
typedef enum pjrpid_element_type
{
    /** RPID <person> element */
    PJRPID_ELEMENT_TYPE_PERSON

} pjrpid_element_type;


/**
 * This structure describes person information in RPID document.
 */
typedef struct pjrpid_element
{
    /** Element type. */
    pjrpid_element_type	    type;

    /** Optional id to set on the element. */
    pj_str_t		    id;

    /** Activity type. */
    pjrpid_activity	    activity;

    /** Optional text describing the person/element. */
    pj_str_t		    note;

} pjrpid_element;


/**
 * Duplicate RPID element.
 *
 * @param pool	    Pool.
 * @param dst	    Destination structure.
 * @param src	    Source structure.
 */
PJ_DECL(void) pjrpid_element_dup(pj_pool_t *pool, pjrpid_element *dst,
				 const pjrpid_element *src);


/**
 * Add RPID element information into existing PIDF document. This will also
 * add the appropriate XML namespace attributes into the presence's XML
 * node, if the attributes are not already present, and also a <note> element
 * to the first <tuple> element of the PIDF document.
 *
 * @param pres	    The PIDF presence document.
 * @param pool	    Pool.
 * @param options   Currently unused, and must be zero.
 * @param elem	    RPID element information to be added into the PIDF
 *		    document.
 *
 * @return PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjrpid_add_element(pjpidf_pres *pres,
				        pj_pool_t *pool,
					unsigned options,
				        const pjrpid_element *elem);

/**
 * Get RPID element information from PIDF document, if any.
 *
 * @param pres	    The PIDF document containing RPID elements.
 * @param pool	    Pool to duplicate the information.
 * @param elem	    Structure to receive the element information.
 *
 * @return PJ_SUCCESS	if the document does contain RPID element
 *			and the information has been parsed successfully.
 */
PJ_DECL(pj_status_t) pjrpid_get_element(const pjpidf_pres *pres,
				        pj_pool_t *pool,
				        pjrpid_element *elem);


/**
 * @}
 */


PJ_END_DECL


#endif	/* __PJSIP_SIMPLE_RPID_H__ */

