| /* $Id$ */ |
| /* |
| * Copyright (C) 2008-2011 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_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> |
| #include <pj/timer.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__ */ |