pjproject/pjsip/include/pjsip/sip_event.h

230 lines
6.7 KiB
C

/* $Id$ */
/*
* Copyright (C) 2003-2007 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_SIP_EVENT_H__
#define __PJSIP_SIP_EVENT_H__
/**
* @file sip_event.h
* @brief SIP Event
*/
PJ_BEGIN_DECL
/**
* @defgroup PJSIP_EVENT Event
* @ingroup PJSIP_CORE_CORE
* @brief Representation of events as they are distributed among modules.
* @{
*/
#include <pj/types.h>
/**
* Event IDs.
*/
typedef enum pjsip_event_id_e
{
/** Unidentified event. */
PJSIP_EVENT_UNKNOWN,
/** Timer event, normally only used internally in transaction. */
PJSIP_EVENT_TIMER,
/** Message transmission event. */
PJSIP_EVENT_TX_MSG,
/** Message received event. */
PJSIP_EVENT_RX_MSG,
/** Transport error event. */
PJSIP_EVENT_TRANSPORT_ERROR,
/** Transaction state changed event. */
PJSIP_EVENT_TSX_STATE,
/** Indicates that the event was triggered by user action. */
PJSIP_EVENT_USER
} pjsip_event_id_e;
/**
* This structure describe event descriptor to fully identify a SIP event.
*
* Events are the only way for a lower layer object to inform something
* to higher layer objects. Normally this is achieved by means of callback,
* i.e. the higher layer objects register a callback to handle the event on
* the lower layer objects.
*
* This event descriptor is used for example by transactions, to inform
* endpoint about events, and by transports, to inform endpoint about
* unexpected transport error.
*/
struct pjsip_event
{
/** This is necessary so that we can put events as a list. */
PJ_DECL_LIST_MEMBER(struct pjsip_event);
/** The event type, can be any value of \b pjsip_event_id_e.
*/
pjsip_event_id_e type;
/**
* The event body as union, which fields depends on the event type.
* By convention, the first member of each struct in the union must be
* the pointer which is relevant to the event.
*/
union
{
/** Timer event. */
struct
{
pj_timer_entry *entry; /**< The timer entry. */
} timer;
/** Transaction state has changed event. */
struct
{
union
{
pjsip_rx_data *rdata; /**< The incoming message. */
pjsip_tx_data *tdata; /**< The outgoing message. */
pj_timer_entry *timer; /**< The timer. */
pj_status_t status;/**< Transport error status. */
void *data; /**< Generic data. */
} src;
pjsip_transaction *tsx; /**< The transaction. */
int prev_state; /**< Previous state. */
pjsip_event_id_e type; /**< Type of event source:
* - PJSIP_EVENT_TX_MSG
* - PJSIP_EVENT_RX_MSG,
* - PJSIP_EVENT_TRANSPORT_ERROR
* - PJSIP_EVENT_TIMER
* - PJSIP_EVENT_USER
*/
} tsx_state;
/** Message transmission event. */
struct
{
pjsip_tx_data *tdata; /**< The transmit data buffer. */
} tx_msg;
/** Transmission error event. */
struct
{
pjsip_tx_data *tdata; /**< The transmit data. */
pjsip_transaction *tsx; /**< The transaction. */
} tx_error;
/** Message arrival event. */
struct
{
pjsip_rx_data *rdata; /**< The receive data buffer. */
} rx_msg;
/** User event. */
struct
{
void *user1; /**< User data 1. */
void *user2; /**< User data 2. */
void *user3; /**< User data 3. */
void *user4; /**< User data 4. */
} user;
} body;
};
/**
* Init timer event.
*/
#define PJSIP_EVENT_INIT_TIMER(event,pentry) \
do { \
(event).type = PJSIP_EVENT_TIMER; \
(event).body.timer.entry = pentry; \
} while (0)
/**
* Init tsx state event.
*/
#define PJSIP_EVENT_INIT_TSX_STATE(event,ptsx,ptype,pdata,prev) \
do { \
(event).type = PJSIP_EVENT_TSX_STATE; \
(event).body.tsx_state.tsx = ptsx; \
(event).body.tsx_state.type = ptype; \
(event).body.tsx_state.src.data = pdata; \
(event).body.tsx_state.prev_state = prev; \
} while (0)
/**
* Init tx msg event.
*/
#define PJSIP_EVENT_INIT_TX_MSG(event,ptdata) \
do { \
(event).type = PJSIP_EVENT_TX_MSG; \
(event).body.tx_msg.tdata = ptdata; \
} while (0)
/**
* Init rx msg event.
*/
#define PJSIP_EVENT_INIT_RX_MSG(event,prdata) \
do { \
(event).type = PJSIP_EVENT_RX_MSG; \
(event).body.rx_msg.rdata = prdata; \
} while (0)
/**
* Init transport error event.
*/
#define PJSIP_EVENT_INIT_TRANSPORT_ERROR(event,ptsx,ptdata) \
do { \
(event).type = PJSIP_EVENT_TRANSPORT_ERROR; \
(event).body.tx_error.tsx = ptsx; \
(event).body.tx_error.tdata = ptdata; \
} while (0)
/**
* Init user event.
*/
#define PJSIP_EVENT_INIT_USER(event,u1,u2,u3,u4) \
do { \
(event).type = PJSIP_EVENT_USER; \
(event).body.user.user1 = (void*)u1; \
(event).body.user.user2 = (void*)u2; \
(event).body.user.user3 = (void*)u3; \
(event).body.user.user4 = (void*)u4; \
} while (0)
/**
* Get the event string from the event ID.
* @param e the event ID.
* @note defined in sip_util.c
*/
PJ_DECL(const char *) pjsip_event_str(pjsip_event_id_e e);
/**
* @}
*/
PJ_END_DECL
#endif /* __PJSIP_SIP_EVENT_H__ */