blob: bdc909dd1ee53954835e3bf4a203891eb39c7331 [file] [log] [blame]
/* $Header: /pjproject/pjsip/src/pjsip_simple/event_notify.h 7 8/31/05 9:05p Bennylp $ */
#ifndef __PJSIP_SIMPLE_EVENT_NOTIFY_H__
#define __PJSIP_SIMPLE_EVENT_NOTIFY_H__
/**
* @file event_notify.h
* @brief SIP Specific Event Notification Extension (RFC 3265)
*/
#include <pjsip/sip_types.h>
#include <pjsip/sip_auth.h>
#include <pjsip_simple/event_notify_msg.h>
#include <pj/timer.h>
/**
* @defgroup PJSIP_EVENT_NOT SIP Event Notification (RFC 3265) Module
* @ingroup PJSIP_SIMPLE
* @{
*
* This module provides the implementation of SIP Extension for SIP Specific
* Event Notification (RFC 3265). It extends PJSIP by supporting SUBSCRIBE and
* NOTIFY methods.
*
* This module itself is extensible; new event packages can be registered to
* this module to handle specific extensions (such as presence).
*/
PJ_BEGIN_DECL
typedef struct pjsip_event_sub_cb pjsip_event_sub_cb;
typedef struct pjsip_event_sub pjsip_event_sub;
/**
* This enumeration describes subscription state as described in the RFC 3265.
* The standard specifies that extensions may define additional states. In the
* case where the state is not known, the subscription state will be set to
* PJSIP_EVENT_SUB_STATE_UNKNOWN, and the token will be kept in state_str
* member of the susbcription structure.
*/
typedef enum pjsip_event_sub_state
{
/** State is NULL. */
PJSIP_EVENT_SUB_STATE_NULL,
/** Subscription is active. */
PJSIP_EVENT_SUB_STATE_ACTIVE,
/** Subscription is pending. */
PJSIP_EVENT_SUB_STATE_PENDING,
/** Subscription is terminated. */
PJSIP_EVENT_SUB_STATE_TERMINATED,
/** Subscription state can not be determined. Application can query
* the state information in state_str member.
*/
PJSIP_EVENT_SUB_STATE_UNKNOWN,
} pjsip_event_sub_state;
/**
* This structure describes notification to be called when incoming SUBSCRIBE
* request is received. The module will call the callback registered by package
* that matches the event description in the incoming SUBSCRIBE.
*/
typedef struct pjsip_event_sub_pkg_cb
{
/**
* This callback is called to first enquery the package whether it wants
* to accept incoming SUBSCRIBE request. If it does, then on_subscribe
* will be called.
*
* @param rdata The incoming request.
* @param status The status code to be returned back to subscriber.
*/
void (*on_query_subscribe)(pjsip_rx_data *rdata, int *status);
/**
* This callback is called when the module receives incoming SUBSCRIBE
* request.
*
* @param sub The subscription instance.
* @param rdata The received buffer.
* @param cb Callback to be registered to the subscription instance.
* @param expires The expiration to be set.
*/
void (*on_subscribe)(pjsip_event_sub *sub, pjsip_rx_data *rdata,
pjsip_event_sub_cb **cb, int *expires);
} pjsip_event_sub_pkg_cb;
/**
* This structure describes callback that is registered by application or
* package to receive notifications about a subscription.
*/
struct pjsip_event_sub_cb
{
/**
* This callback is used by both subscriber and notifier. It is called
* when the subscription has been terminated.
*
* @param sub The subscription instance.
* @param reason The termination reason.
*/
void (*on_sub_terminated)(pjsip_event_sub *sub, const pj_str_t *reason);
/**
* This callback is called when we received SUBSCRIBE request to refresh
* the subscription.
*
* @param sub The subscription instance.
* @param rdata The received SUBSCRIBE request.
*/
void (*on_received_refresh)(pjsip_event_sub *sub, pjsip_rx_data *rdata);
/**
* This callback is called when the module receives final response on
* previously sent SUBSCRIBE request.
*
* @param sub The subscription instance.
* @param event The event.
*/
void (*on_received_sub_response)(pjsip_event_sub *sub, pjsip_event *event);
/**
* This callback is called when the module receives incoming NOTIFY
* request.
*
* @param sub The subscription instance.
* @param rdata The received data.
*/
void (*on_received_notify)(pjsip_event_sub *sub, pjsip_rx_data *rdata);
/**
* This callback is called when the module receives final response to
* previously sent NOTIFY request.
*
* @param sub The subscription instance.
* @param event The event.
*/
void (*on_received_notify_response)(pjsip_event_sub *sub, pjsip_event *event);
};
/**
* This structure describes an event subscription record. The structure is used
* to represent both subscriber and notifier.
*/
struct pjsip_event_sub
{
pj_pool_t *pool; /**< Pool. */
pjsip_endpoint *endpt; /**< Endpoint. */
pjsip_event_sub_cb cb; /**< Callback. */
pj_mutex_t *mutex; /**< Mutex. */
pjsip_role_e role; /**< Role (UAC=subscriber, UAS=notifier) */
pjsip_event_sub_state state; /**< Subscription state. */
pj_str_t state_str; /**< String describing the state. */
pjsip_from_hdr *from; /**< Cached local info (From) */
pjsip_to_hdr *to; /**< Cached remote info (To) */
pjsip_contact_hdr *contact; /**< Cached local contact. */
pjsip_cid_hdr *call_id; /**< Cached Call-ID */
int cseq; /**< Outgoing CSeq */
pjsip_event_hdr *event; /**< Event description. */
pjsip_expires_hdr *uac_expires; /**< Cached Expires header (UAC only). */
pjsip_accept_hdr *local_accept; /**< Local Accept header. */
pjsip_route_hdr route_set; /**< Route-set. */
pj_str_t key; /**< Key in the hash table. */
void *user_data; /**< Application data. */
int default_interval; /**< Refresh interval. */
pj_timer_entry timer; /**< Internal timer. */
pj_time_val expiry_time; /**< Time when subscription expires. */
int pending_tsx; /**< Number of pending transactions. */
pj_bool_t delete_flag; /**< Pending deletion flag. */
pjsip_auth_session auth_sess; /**< Authorization sessions. */
unsigned cred_cnt; /**< Number of credentials. */
pjsip_cred_info *cred_info; /**< Array of credentials. */
};
/**
* Initialize the module and get the instance of the module to be registered to
* endpoint.
*
* @return The module instance.
*/
PJ_DECL(pjsip_module*) pjsip_event_sub_get_module(void);
/**
* Register event package.
*
* @param event The event identification for the package.
* @param accept_cnt Number of strings in Accept array.
* @param accept Array of Accept value.
* @param cb Callback to receive incoming SUBSCRIBE for the package.
*
* @return Zero on success.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_register_pkg( const pj_str_t *event_name,
int accept_cnt,
const pj_str_t accept[],
const pjsip_event_sub_pkg_cb *cb );
/**
* Create initial subscription instance (client).
*
* @param endpt The endpoint.
* @param from URL to put in From header.
* @param to The target resource.
* @param event Event package.
* @param expires Expiration time.
* @param accept Accept specification.
* @param user_data Application data to attach to this subscription.
*
* @return New client subscription instance.
*/
PJ_DECL(pjsip_event_sub*) pjsip_event_sub_create( pjsip_endpoint *endpt,
const pj_str_t *from,
const pj_str_t *to,
const pj_str_t *event,
int expires,
int accept_cnt,
const pj_str_t accept[],
void *user_data,
const pjsip_event_sub_cb *cb);
/**
* Set credentials to be used for outgoing request messages.
*
* @param sub Subscription instance.
* @param count Number of credentials.
* @param cred Array of credential info.
*
* @return Zero on success.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_set_credentials( pjsip_event_sub *sub,
int count,
const pjsip_cred_info cred[]);
/**
* Set route set for outgoing requests.
*
* @param sub Subscription instance.
* @param route_set List of route headers.
*
* @return Zero on success.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_set_route_set( pjsip_event_sub *sub,
const pjsip_route_hdr *route_set );
/**
* Send SUBSCRIBE request.
*
* @param sub Subscription instance.
*
* @return Zero on success.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_subscribe( pjsip_event_sub *sub );
/**
* Terminate subscription (client). This will send unsubscription request to
* notifier.
*
* @param sub Client subscription instance.
*
* @return Zero on success.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_unsubscribe( pjsip_event_sub *sub );
/**
* For notifier, send NOTIFY request to subscriber, and set the state of
* the subscription.
*
* @param sub The server subscription (notifier) instance.
* @param state New state to set.
* @param reason Specify reason if new state is terminated, otherwise
* put NULL.
* @param type Description of content type.
* @param body Text body to send with the NOTIFY, or NULL if the
* NOTIFY request should not contain any message body.
*
* @return Zero on success.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_notify( pjsip_event_sub *sub,
pjsip_event_sub_state state,
const pj_str_t *reason,
pjsip_msg_body *body);
/**
* Destroy subscription instance.
*
* @param sub The client or server subscription instance.
*
* @return Zero on success, one if the subscription will be
* deleted automatically later, or -1 on error.
*/
PJ_DECL(pj_status_t) pjsip_event_sub_destroy(pjsip_event_sub *sub);
PJ_END_DECL
/**
* @}
*/
#endif /* __PJSIP_SIMPLE_EVENT_NOTIFY_H__ */