/* $Id$ */
/* 
 * Copyright (C) 2003-2006 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_ISCOMPOSING_H__
#define __PJSIP_SIMPLE_ISCOMPOSING_H__

/**
 * @file iscomposing.h
 * @brief Support for Indication of Message Composition (RFC 3994)
 */
#include <pjsip-simple/types.h>
#include <pjlib-util/xml.h>


PJ_BEGIN_DECL


/**
 * Create XML message with MIME type "application/im-iscomposing+xml"
 * to indicate the message composition status.
 *
 * @param pool		    Pool to allocate memory.
 * @param is_composing	    Message composition indication status. Set to
 *			    PJ_TRUE (or non-zero) to indicate that application
 *			    is currently composing an instant message.
 * @param lst_actv	    Optional attribute to indicate time of last
 *			    activity. If none is to be specified, the value
 *			    MUST be set to NULL.
 * @param content_tp	    Optional attribute to indicate the content type of
 *			    message being composed. If none is to be specified, 
 *			    the value MUST be set to NULL.
 * @param refresh	    Optional attribute to indicate the interval when
 *			    next indication will be sent, only when 
 *			    is_composing is non-zero. If none is to be 
 *			    specified, the value MUST be set to -1.
 *
 * @return		    An XML message containing the message indication.
 *			    NULL will be returned when there's not enough
 *			    memory to allocate the message.
 */
PJ_DECL(pj_xml_node*) pjsip_iscomposing_create_xml(pj_pool_t *pool,
						   pj_bool_t is_composing,
						   const pj_time_val *lst_actv,
						   const pj_str_t *content_tp,
						   int refresh);


/**
 * Create message body with Content-Type "application/im-iscomposing+xml"
 * to indicate the message composition status.
 *
 * @param pool		    Pool to allocate memory.
 * @param is_composing	    Message composition indication status. Set to
 *			    PJ_TRUE (or non-zero) to indicate that application
 *			    is currently composing an instant message.
 * @param lst_actv	    Optional attribute to indicate time of last
 *			    activity. If none is to be specified, the value
 *			    MUST be set to NULL.
 * @param content_tp	    Optional attribute to indicate the content type of
 *			    message being composed. If none is to be specified, 
 *			    the value MUST be set to NULL.
 * @param refresh	    Optional attribute to indicate the interval when
 *			    next indication will be sent, only when 
 *			    is_composing is non-zero. If none is to be 
 *			    specified, the value MUST be set to -1.
 *
 * @return		    The SIP message body containing XML message 
 *			    indication. NULL will be returned when there's not
 *			    enough memory to allocate the message.
 */
PJ_DECL(pjsip_msg_body*) pjsip_iscomposing_create_body( pj_pool_t *pool,
						   pj_bool_t is_composing,
						   const pj_time_val *lst_actv,
						   const pj_str_t *content_tp,
						   int refresh);


/**
 * Parse the buffer and return message composition indication in the 
 * message.
 *
 * @param pool		    Pool to allocate memory for the parsing process.
 * @param msg		    The message to be parsed.
 * @param len		    Length of the message.
 * @param p_is_composing    Optional pointer to receive iscomposing status.
 * @param p_last_active	    Optional pointer to receive last active attribute.
 * @param p_content_type    Optional pointer to receive content type attribute.
 * @param p_refresh	    Optional pointer to receive refresh time.
 *
 * @return		    PJ_SUCCESS if message can be successfully parsed.
 */
PJ_DECL(pj_status_t) pjsip_iscomposing_parse( pj_pool_t *pool,
					      char *msg,
					      pj_size_t len,
					      pj_bool_t *p_is_composing,
					      pj_str_t **p_last_active,
					      pj_str_t **p_content_type,
					      int *p_refresh );



PJ_END_DECL


#endif	/* __PJSIP_SIMPLE_ISCOMPOSING_H__ */

