diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-01-30 18:40:05 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-01-30 18:40:05 +0000 |
commit | 0d61adeb5f784b45f76d76dad9974f4111fb3c8c (patch) | |
tree | 4fe8830715bd6af57dd91ebca780318a645435cd /pjsip/include | |
parent | 7638eeee106fe58a1225f642e733629f29418818 (diff) |
Finished implementation of UA layer (to be tested)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@127 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/include')
-rw-r--r-- | pjsip/include/pjsip-ua/sip_dialog.h | 635 | ||||
-rw-r--r-- | pjsip/include/pjsip.h (renamed from pjsip/include/pjsip_core.h) | 40 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_auth.h | 12 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_config.h | 4 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_dialog.h | 324 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_endpoint.h | 91 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_errno.h | 16 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_module.h | 11 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_msg.h | 524 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_transaction.h | 1 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_transport.h | 8 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_types.h | 17 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_ua_layer.h (renamed from pjsip/include/pjsip-ua/sip_ua.h) | 45 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_uri.h | 16 |
14 files changed, 991 insertions, 753 deletions
diff --git a/pjsip/include/pjsip-ua/sip_dialog.h b/pjsip/include/pjsip-ua/sip_dialog.h deleted file mode 100644 index d46e3873..00000000 --- a/pjsip/include/pjsip-ua/sip_dialog.h +++ /dev/null @@ -1,635 +0,0 @@ -/* $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_DIALOG_H__ -#define __PJSIP_DIALOG_H__ - -/** - * @file dialog.h - * @brief SIP Dialog abstraction - */ - -#include <pjsip/sip_msg.h> -#include <pjsip/sip_auth.h> -#include <pj/sock.h> - -PJ_BEGIN_DECL - -/** - * @defgroup PJSUA_DIALOG SIP Dialog - * @ingroup PJSUA - * @{ - * \brief - * This file contains SIP dialog, a higher level abstraction of SIP session. - * - * \par Overview - * A SIP dialog is an abstraction of communication session between two user - * agents that persist for some time. The dialog facilitates sequencing of - * messages between the user agents and proper routing of requests between both - * of them. The dialog represents a context in which to interpret SIP messages. - * However method independent User Agent processing for requests and responses - * outside of a dialog exists, hence a dialog is not necessary for message - * processing. - * - * A dialog is identified at each User Agent with a dialog Id, which consists - * of a Call-Id value, a local tag and a remote tag. - * - * A dialog contains certain pieces of data needed for further message - * transmissions within the dialog. This data consists of: - * - Dialog Id - used to identify the dialog. - * - Local sequence number - used to order requests from the UA to its peer. - * - Remote sequence number - used to order requests from its peer to the UA. - * - Local URI - the address of the local party. - * - Remote URI - the address of the remote party. - * - Remote target - the address from the Contact header field of the request - * or response or refresh request or response. - * - "secure" boolean - determines if the dialog is secure. - * - Route set - an ordered list of URIs. The route set is the list of servers - * that need to be traversed to send a request to the peer. - * - Authentication info - array of authentication credentials to be used - * by the dialog to authenticate to proxies and servers. - * - * \par Manipulating Dialog - * Application should use functions declared in this file to do something with - * the dialog. Among other things, application can: - * - create outgoing dialog (#pjsip_dlg_init()). - * - sends outgoing invitation (#pjsip_dlg_invite()). - * - sends response (provisional and final) to incoming invitation - * (#pjsip_dlg_answer()) - * - disconnect dialog (#pjsip_dlg_disconnect()). - * - send other request (#pjsip_dlg_create_request() and #pjsip_dlg_send_msg()) - * - * \par Getting Dialog's Notification - * Dialog emits notification about various things that's happening to it (e.g. - * a message is received, dialog state has changed, etc.). Normally it is in - * the interest of the application to capture these notifications, by - * supplying the function to be called when the event occurs in #pjsip_dlg_callback - * structure, and register this structure to user agent by calling - * #pjsip_ua_set_dialog_callback(). - * - * \par Incoming Invitation - * Upon receiving a new incoming invitation, user agent will automatically create - * a new dialog, and inform application via \b pjsip_dlg_callback. - */ - -/** Forward declaration for user agent structure. */ -typedef struct pjsip_user_agent pjsip_user_agent; - -/** Forward declaration for dialog structure. */ -typedef struct pjsip_dlg pjsip_dlg; - -/** - * \brief Type of events that are reported by the dialog to the application callback - * function. - */ -typedef enum pjsip_dlg_event_e -{ - /** Dialog state has changed. */ - PJSIP_DIALOG_EVENT_STATE_CHANGED, - - /** Any mid-call messages (reinvitation, message, etc.). */ - PJSIP_DIALOG_EVENT_MID_CALL_REQUEST, - - /** Other events (low level events). */ - PJSIP_DIALOG_EVENT_OTHER, - -} pjsip_dlg_event_e; - - -/** - * \brief Structure registered by applications to receive dialog notifications - * from the User Agent. - * - * Applications registers this structure to get notifications from the User Agent - * about dialog state changes and other events. Application can set any of - * the callback function to NULL if it doesn't want to handle the notification, - * however, setting some callbacks to NULL probably will cause some undesired - * result (such as setting \b on_incoming to NULL will cause the creation of - * a lot of dialogs with no owner). - */ -struct pjsip_dlg_callback -{ - /** - * This is a low level, uninterpreted callback that is called by framework - * for all kinds of events, such as transaction events, dialog events, etc. - * @param dlg The dialog. - * @param dlg_event The type of dialog event. - * @param event The event descriptor. - */ - void (*on_all_events)(pjsip_dlg *dlg, pjsip_dlg_event_e dlg_event, - pjsip_event *event ); - - /** - * This is a low level callback that is called by the framework when the - * underlying transaction is about to send outgoing message. This callback - * is provided to allow application to modify the message before it is - * transmitted. - * @param dlg The dialog. - * @param tsx The transaction that transmits the message. - * @param tdata The transmission data, which contains the message. - * @param retransmission The number of times this message has been sent. - * Zero indicates the message is about to be sent the first time, - * one indicates this is the first retransmission, etc. - */ - void (*on_before_tx)(pjsip_dlg *dlg, pjsip_transaction *tsx, - pjsip_tx_data *tdata, pj_bool_t retransmission); - - /** - * This is a low level callback that is called by the framework when the dialog - * has sent a message. Note that a receive of retransmission will not trigger - * this callback since retransmission is handled internally by transaction. - * @param dlg The dialog. - * @param tsx The transaction that transmits the message. - * @param tdata The transmission data, which contains the message. - */ - void (*on_tx_msg)(pjsip_dlg *dlg, pjsip_transaction *tsx, - pjsip_tx_data *tdata); - - /** - * This is a low level callback that is called by the framework when the - * dialog has received a message. Note that a receipt of retransmission - * will not trigger this callback since retransmission is handled internally - * by transaction. - * @param dlg The dialog. - * @param tsx The transaction that receives the message. - * @param rdata The receive data, which contains the message. - */ - void (*on_rx_msg)(pjsip_dlg *dlg, pjsip_transaction *tsx, - pjsip_rx_data *rdata); - - /** - * This callback is called by the framework when the user agent - * instance receives an incoming INVITE message. - * @param dlg The new dialog that's just created to handle the incoming call. - * @param tsx The INVITE transaction that's just created. - * @param rdata The receive data, which contains the INVITE message. - */ - void (*on_incoming)(pjsip_dlg *dlg, pjsip_transaction *tsx, - pjsip_rx_data *rdata); - - /** - * This callback is called by the framework when the dialog is sending - * the first outgoing INVITE message. - * @param dlg The dialog. - * @param tsx The INVITE transaction. - * @param tdata The transmit data, which contains the INVITE message. - */ - void (*on_calling)(pjsip_dlg *dlg, pjsip_transaction *tsx, - pjsip_tx_data *tdata); - - /** - * This callback is called by the framework when the initial INVITE - * transaction has sent/received provisional response. - * @param dlg The dialog. - * @param tsx The transaction. - * @param event The event, which src_type will always be either - * PJSIP_EVENT_RX_MSG or PJSIP_EVENT_TX_MSG. The provisional - * response message itself will be in either \b rdata or \b tdata. - * @see pjsip_event. - */ - void (*on_provisional)(pjsip_dlg *dlg, pjsip_transaction *tsx, - pjsip_event *event); - - /** - * This callback is called for both UAS and UAC dialog when 200 response - * to INVITE is sent or received. - * @param dlg The dialog. - * @param event The event, which src_type can only be either - * PJSIP_EVENT_TX_MSG or PJSIP_EVENT_RX_MSG. - * @see pjsip_event - */ - void (*on_connecting)(pjsip_dlg *dlg, pjsip_event *event); - - /** - * This callback is called for both UAS and UAC when an ACK request is - * sent or received by the dialog. - * @param dlg The dialog. - * @param event The event, which src_type can only be either - * PJSIP_EVENT_TX_MSG or PJSIP_EVENT_RX_MSG. - * @see pjsip_event - */ - void (*on_established)(pjsip_dlg *dlg, pjsip_event *event); - - /** - * This callback is called when the dialog is disconnected, i.e. upon - * sending/receiving non-200 response to INVITE, sending/receiving - * CANCEL to initial INVITE, and sending/receiving BYE. - * - * @param dlg The dialog. - * @param event The event. - * @see pjsip_event - */ - void (*on_disconnected)(pjsip_dlg *dlg, pjsip_event *event); - - /** - * This callback is called when the dialog is about to be destroyed. - * @param dlg The dialog. - */ - void (*on_terminated)(pjsip_dlg *dlg); - - /** - * This callback will be called when the dialog receives mid call events - * such as re-invitation or incoming pager. - * - * @param dlg The dialog. - * @param event The event. - */ - void (*on_mid_call_events)(pjsip_dlg *dlg, pjsip_event *event); - -}; /* struct pjsip_dlg_callback */ - - - -/** - * Dialog state. - */ -typedef enum pjsip_dlg_state_e -{ - /** - * State NULL is after the dialog is instantiated but before any - * initialization is done. - */ - PJSIP_DIALOG_STATE_NULL, - - /** - * State INCOMING is after the (callee) dialog has been initialized with - * the incoming request, but before any responses is sent by the dialog. - */ - PJSIP_DIALOG_STATE_INCOMING, - - /** - * State CALLING is after the (caller) dialog has sent outgoing invitation - * but before any responses are received. - */ - PJSIP_DIALOG_STATE_CALLING, - - /** - * State PROCEEDING is after the dialog sent/received provisional - * responses, but before final response is sent/received. - */ - PJSIP_DIALOG_STATE_PROCEEDING, - - /** - * State CONNECTING is after the dialog has sent/received final response - * to the invitation, but before acknowledgement is sent. - */ - PJSIP_DIALOG_STATE_CONNECTING, - - /** - * State ESTABLISHED occurs after the invitation has been accepted and - * acknowledged. - */ - PJSIP_DIALOG_STATE_ESTABLISHED, - - /** - * State DISCONNECTED occurs after either party successfully disconnect - * the session. - */ - PJSIP_DIALOG_STATE_DISCONNECTED, - - /** - * State TERMINATE occurs when the dialog is ready to be destroyed. - */ - PJSIP_DIALOG_STATE_TERMINATED, - -} pjsip_dlg_state_e; - - -/** - * Get the dialog string state. - * - * @param state Dialog state. - * @return The string describing the state. - */ -const char *pjsip_dlg_state_str(pjsip_dlg_state_e state); - -/** - * This structure is used to describe dialog's participants, which in this - * case is local party (i.e. us) and remote party. - */ -typedef struct pjsip_dlg_party -{ - pjsip_uri *target; /**< Target URL. */ - pjsip_fromto_hdr *info; /**< URL in From/To header. */ - pj_str_t tag; /**< Tag. */ - pjsip_contact_hdr *contact; /**< URL in Contact. */ - pj_sockaddr_in addr; /**< The current transport address. */ - int cseq; /**< Sequence number counter. */ -} pjsip_dlg_party; - - -/** - * This structure describes the dialog structure. - */ -struct pjsip_dlg -{ - PJ_DECL_LIST_MEMBER(struct pjsip_dlg) - - char obj_name[PJ_MAX_OBJ_NAME]; /**< Log identification. */ - - pjsip_user_agent *ua; /**< User agent instance. */ - pj_pool_t *pool; /**< Dialog's pool. */ - pjsip_dlg_state_e state; /**< Dialog's call state. */ - pjsip_role_e role; /**< Dialog's role. */ - pj_mutex_t *mutex; /**< Dialog's mutex. */ - - pjsip_dlg_party local; /**< Local party info. */ - pjsip_dlg_party remote; /**< Remote party info. */ - - pjsip_cid_hdr *call_id; /**< Call-ID */ - pj_bool_t secure; /**< Use secure transport? */ - - pjsip_route_hdr route_set; /**< Dialog's route set. */ - pjsip_transaction *invite_tsx; /**< Current INVITE transaction. */ - int pending_tsx_count; /**< Total pending tsx count. */ - - int cred_count; /**< Number of credentials. */ - pjsip_cred_info *cred_info; /**< Array of credentials. */ - - pjsip_auth_session auth_sess; /**< List of auth session. */ - - pjsip_msg_body *body; - - void *user_data; /**< Application's data. */ - - int (*handle_tsx_event)(struct pjsip_dlg *, /**< Internal state handler.*/ - pjsip_transaction *, - pjsip_event *); -}; - - -/** - * Initialize dialog with local and remote info. This function is normally - * called after application creates the dialog with #pjsip_ua_create_dialog - * for UAC dialogs. - * - * This function will initialize local and remote info from the URL, generate - * a globally unique Call-ID, initialize CSeq, and initialize other dialog's - * internal attributes. - * - * @param dlg The dialog to initialize. - * @param local_info URI/name address to be used as local info - * (From and Contact headers). - * @param remote_info URI/name address to be used as remote info (To header). - * @param target URI for initial remote's target, or NULL to set the - * initial target the same as remote_info. - * - * @return zero on success. - */ -PJ_DECL(pj_status_t) pjsip_dlg_init( pjsip_dlg *dlg, - const pj_str_t *local_info, - const pj_str_t *remote_info, - const pj_str_t *target); - - -/** - * Set authentication credentials to be used by this dialog. - * - * If authentication credentials are set for the dialog, the dialog will try to - * perform authentication automatically using the credentials supplied, and - * also cache the last Authorization or Proxy-Authorization headers for next - * requests. - * - * If none of the credentials are suitable or accepted by remote, then - * the dialog will just pass the authorization failure response back to - * application. - * - * @param dlg The dialog. - * @param count Number of credentials in the array. - * @param cred Array of credentials. - * - * @return Zero on success. - */ -PJ_DECL(pj_status_t) pjsip_dlg_set_credentials( pjsip_dlg *dlg, - int count, - const pjsip_cred_info cred[]); - -/** - * Override local contact details. - * - * Call this function to change the contact details to be advertised in Contact - * header. Application normally need to call this function for incoming calls - * before answering the call with 200/OK, because for an incoming dialogs, the - * initial local contact info are generated from the To header, which is - * normally not the appropriate one. - * - * @param dlg The dialog. - * @param contact The contact to use. - * - * @return Zero on success. - */ -PJ_DECL(pj_status_t) pjsip_dlg_set_contact( pjsip_dlg *dlg, - const pj_str_t *contact ); - - -/** - * Set initial route set to be used by the dialog. This initial route set - * governs where and how the initial INVITE request will be routed. This - * initial route set will be overwritten with the route set found in the - * 2xx response of INVITE. - * - * Application only needs to call this function if it wants to have custom - * route for individual dialogs. If only a single route for all dialogs is - * needed, then application can set the global route by calling function - * #pjsip_endpt_set_proxies(). - * - * @param dlg The dialog. - * @param route_set The route set list. - * - * @return Zero on success. - */ -PJ_DECL(pj_status_t) pjsip_dlg_set_route_set( pjsip_dlg *dlg, - const pjsip_route_hdr *route_set ); - - -/** - * Variation of #pjsip_dlg_set_route_set where the headers will be used - * as it is (i.e. without cloned). - * - * @param dlg The dialog. - * @param route_set The route set list. - * - * @return Zero on success. - */ -PJ_DECL(pj_status_t) pjsip_dlg_set_route_set_np( pjsip_dlg *dlg, - pjsip_route_hdr *route_set); - -/** - * Create initial outgoing INVITE message. - * - * This function is just a simple wrapper to #pjsip_dlg_create_request(), - * so it follows the same rule there. In addition, this function also adds - * \b Allow header to the outgoing request. - * - * After the message is successfully created, application must call - * #pjsip_dlg_send_msg() to actually send the message and update the dialog's - * state. Note that upon return the reference counter of the transmit data - * will be set to one. - * - * @param dlg The dialog. - * - * @return The dialog transmit data, or NULL. - */ -PJ_DECL(pjsip_tx_data*) pjsip_dlg_invite( pjsip_dlg *dlg ); - - -/** - * Answer incoming dialog invitation, with either provisional responses - * or a final response. Application can only call this function when there's - * a pending invitation to be answered. - * - * After the message is successfully created, application must call - * #pjsip_dlg_send_msg() to actually send the message and update the dialog's - * state. Note that upon return the reference counter of the transmit data - * will be set to one. - * - * @param dlg The dialog. - * @param code The response code, which can be: - * - 100-199 Provisional response (application can issue multiple - * provisional responses). - * - 200-299 To answer the invitation (normally status code 200 - * is sent). - * - 300-699 To reject the invitation. - * @return Transmit data if successfull. - */ -PJ_DECL(pjsip_tx_data*) pjsip_dlg_answer( pjsip_dlg *dlg, int code ); - - -/** - * High level function to create message to disconnect dialog. Depending - * on dialog's state, this function will either create CANCEL, final response, - * or BYE message. A status code must be supplied, which will be set if dialog - * will be transmitting a final response to INVITE. - * - * After the message is successfully created, application must call - * #pjsip_dlg_send_msg to actually send the message and update the dialog's - * state. Note that upon return the reference counter of the transmit data - * will be set to one. - * - * @param dlg The dialog. - * @param status_code The status code for disconnection. - * @return Transmit data if successfull. - */ -PJ_DECL(pjsip_tx_data*) pjsip_dlg_disconnect( pjsip_dlg *dlg, int status_code); - -/** - * Create CANCEL message to cancel pending outgoing dialog invitation. - * Normally application should call #pjsip_dlg_disconnect() instead, because - * that function will create the correct message regardless of the state of - * the dialog. - * - * Application can call this function at anytime after it issues outgoing - * invitation and before receiving final response. However, there's no - * guarantee that the invitation will be successfully cancelled, since the - * CANCEL request and the final response can pass over in the wire. So the - * application must prepare to have the dialog connected even after the - * dialog is cancelled. - * - * The final state of the dialog will be reported in the dialog callback. - * If the CANCEL request succeeded, then the dialog will be disconnected with - * status code \a PJSIP_SC_REQUEST_TERMINATED. - * - * After the message is successfully created, application must call - * #pjsip_dlg_send_msg() to actually send the message and update the dialog's - * state. - * - * Upon return of this function, the reference counter of the transmit data - * will be set to one. - * - * @param dlg The dialog. - * @return The dialog transmit data containing the CANCEL message, - * or NULL. - */ -PJ_DECL(pjsip_tx_data*) pjsip_dlg_cancel( pjsip_dlg *dlg ); - - -/** - * Create BYE message. Application shouldn't normally need to use this function, - * but rather it's preferable to use #pjsip_dlg_disconnect() instead because - * that function will work to disconnect the session no matter what the state - * is. - * - * After the message is successfully created, application must call - * #pjsip_dlg_send_msg() to actually send the message and update the dialog's - * state. Note that upon return the reference counter of the transmit data - * will be set to one. - * - * @param dlg The dialog. - * @return The BYE message or NULL. - */ -PJ_DECL(pjsip_tx_data*) pjsip_dlg_bye( pjsip_dlg *dlg ); - -/** - * This function is called by application to create new outgoing request - * message for this dialog. After the request is created, application can - * modify the message (such adding headers), and eventually send the request - * by calling #pjsip_dlg_send_msg(). - * - * This function will initialize the request message with dialog's properties - * as follows: - * - the request line is initialized with the method and the target is - * initialized from current remote target. - * - \b From, \b To, \b Contact, and \b Call-Id headers will be added. - * - An initial \b CSeq header will be provided (although the value will be - * verified again when the message is actually sent with #pjsip_dlg_send_msg(). - * - \b Route headers will be added from dialog's route set. - * - Authentication headers (\b Authorization or \b Proxy-Authorization) will - * be added from dialog's authorization cache. - * - * Note that upon return the reference counter of the transmit data - * will be set to one. When the message is sent, #pjsip_dlg_send_msg() will - * decrement the reference counter, and when the reference counter reach zero, - * the message will be deleted. - * - * @param dlg The dialog. - * @param method The request method. - * @param cseq Specify CSeq, or -1 to let the dialog specify CSeq. - * - * @return Transmit data for the new request. - * - * @see pjsip_dlg_send_msg() - */ -PJ_DECL(pjsip_tx_data*) pjsip_dlg_create_request( pjsip_dlg *dlg, - const pjsip_method *method, - int cseq); - - -/** - * This function can be called by application to send outgoing message (request - * or response) to remote party. Note that after calling this function, the - * transmit data will be deleted regardless of the return status. To prevent - * deletion, application must increase the reference count, but then it will - * be responsible to delete this transmit data itself (by decreasing the - * reference count). - * - * @param dlg The dialog. - * @param tdata The transmit data, which contains the request message. - * @return zero on success. - */ -PJ_DECL(pj_status_t) pjsip_dlg_send_msg( pjsip_dlg *dlg, - pjsip_tx_data *tdata ); - - -/** - * @} - */ - -PJ_END_DECL - -#endif /* __PJSIP_DIALOG_H__ */ - diff --git a/pjsip/include/pjsip_core.h b/pjsip/include/pjsip.h index 5947d4b1..b7f2dd95 100644 --- a/pjsip/include/pjsip_core.h +++ b/pjsip/include/pjsip.h @@ -16,25 +16,41 @@ * 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_CORE_H__ -#define __PJSIP_CORE_H__ +#ifndef __PJSIP_H__ +#define __PJSIP_H__ +/* Base types. */ #include <pjsip/sip_types.h> -#include <pjsip/sip_auth.h> -#include <pjsip/sip_endpoint.h> #include <pjsip/sip_errno.h> -#include <pjsip/sip_event.h> -#include <pjsip/sip_module.h> + +/* Messaging and parsing. */ +#include <pjsip/sip_uri.h> +#include <pjsip/sip_tel_uri.h> #include <pjsip/sip_msg.h> #include <pjsip/sip_parser.h> -#include <pjsip/sip_resolve.h> -#include <pjsip/sip_tel_uri.h> -#include <pjsip/sip_transaction.h> + +/* Core */ +#include <pjsip/sip_event.h> +#include <pjsip/sip_module.h> +#include <pjsip/sip_endpoint.h> +#include <pjsip/sip_util.h> + +/* Transport layer */ #include <pjsip/sip_transport.h> #include <pjsip/sip_transport_udp.h> #include <pjsip/sip_transport_loop.h> -#include <pjsip/sip_uri.h> -#include <pjsip/sip_util.h> +#include <pjsip/sip_resolve.h> + +/* Authentication. */ +#include <pjsip/sip_auth.h> + +/* Transaction layer. */ +#include <pjsip/sip_transaction.h> + +/* UA Layer. */ +#include <pjsip/sip_ua_layer.h> +#include <pjsip/sip_dialog.h> + -#endif /* __PJSIP_CORE_H__ */ +#endif /* __PJSIP_H__ */ diff --git a/pjsip/include/pjsip/sip_auth.h b/pjsip/include/pjsip/sip_auth.h index e5f80655..7a8eb610 100644 --- a/pjsip/include/pjsip/sip_auth.h +++ b/pjsip/include/pjsip/sip_auth.h @@ -187,6 +187,18 @@ PJ_DECL(pj_status_t) pjsip_auth_clt_init( pjsip_auth_clt_sess *sess, unsigned options); +/** + * Clone client initialization session. + * + * @param pool Pool to use. + * @param sess Structure to put the duplicated session. + * @param rhs The client session to be cloned. + * + * @return PJ_SUCCESS on success; + */ +PJ_DECL(pj_status_t) pjsip_auth_clt_clone( pj_pool_t *pool, + pjsip_auth_clt_sess *sess, + const pjsip_auth_clt_sess *rhs); /** * Set the credentials to be used during the session. This will duplicate diff --git a/pjsip/include/pjsip/sip_config.h b/pjsip/include/pjsip/sip_config.h index 158d4a75..ec4a4aad 100644 --- a/pjsip/include/pjsip/sip_config.h +++ b/pjsip/include/pjsip/sip_config.h @@ -53,6 +53,10 @@ #define PJSIP_POOL_TSX_INC 256 #define PJSIP_MAX_TSX_KEY_LEN (PJSIP_MAX_URL_SIZE*2) +/* User agent. */ +#define PJSIP_POOL_LEN_USER_AGENT 1024 +#define PJSIP_POOL_INC_USER_AGENT 1024 + /* Message/URL related constants. */ #define PJSIP_MAX_CALL_ID_LEN PJ_GUID_STRING_LENGTH #define PJSIP_MAX_TAG_LEN PJ_GUID_STRING_LENGTH diff --git a/pjsip/include/pjsip/sip_dialog.h b/pjsip/include/pjsip/sip_dialog.h new file mode 100644 index 00000000..9e827c78 --- /dev/null +++ b/pjsip/include/pjsip/sip_dialog.h @@ -0,0 +1,324 @@ +/* $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_SIP_DIALOG_H__ +#define __PJSIP_SIP_DIALOG_H__ + + +/** + * @file dialog.h + * @brief SIP Dialog abstraction + */ + +#include <pjsip/sip_msg.h> +#include <pjsip/sip_auth.h> +#include <pjsip/sip_errno.h> +#include <pj/sock.h> +#include <pj/assert.h> + +PJ_BEGIN_DECL + + +/** + * This structure is used to describe dialog's participants, which in this + * case is local party (i.e. us) and remote party. + */ +typedef struct pjsip_dlg_party +{ + pjsip_fromto_hdr *info; /**< From/To header, inc tag. */ + pj_uint32_t tag_hval; /**< Hashed value of the tag. */ + pjsip_contact_hdr *contact; /**< Contact header. */ + pj_int32_t first_cseq;/**< First CSeq seen. */ + pj_int32_t cseq; /**< Next sequence number. */ +} pjsip_dlg_party; + + +/** + * This structure describes the dialog structure. + */ +struct pjsip_dialog +{ + /** The dialog set list. */ + PJ_DECL_LIST_MEMBER(pjsip_dialog); + + /* Dialog's system properties. */ + char obj_name[PJ_MAX_OBJ_NAME]; /**< Standard id. */ + pj_pool_t *pool; /**< Dialog's pool. */ + pj_mutex_t *mutex; /**< Dialog's mutex. */ + pjsip_user_agent *ua; /**< User agent instance. */ + + /* The dialog set. */ + void *dlg_set; + + /* Dialog's session properties. */ + pjsip_uri *target; /**< Current target. */ + pjsip_dlg_party local; /**< Local party info. */ + pjsip_dlg_party remote; /**< Remote party info. */ + pjsip_role_e role; /**< Initial role. */ + pj_bool_t secure; /**< Use secure transport? */ + pjsip_cid_hdr *call_id; /**< Call-ID header. */ + pjsip_route_hdr route_set; /**< Route set. */ + pjsip_auth_clt_sess auth_sess; /**< Client authentication session. */ + + /** Session counter. */ + int sess_count; + + /** Transaction counter. */ + int tsx_count; + + /* Dialog usages. */ + unsigned usage_cnt; /**< Number of registered usages. */ + pjsip_module *usage[PJSIP_MAX_MODULE]; /**< Array of usages, priority sorted */ + + /** Module specific data. */ + void *mod_data[PJSIP_MAX_MODULE]; +}; + + +/** + * This utility function returns PJ_TRUE if the specified method is a + * dialog creating request. This method property is used to determine + * whether Contact header should be included in outgoing request. + */ +PJ_DECL(pj_bool_t) pjsip_method_creates_dialog(const pjsip_method *m); + +/** + * Create a new dialog and return the instance in p_dlg parameter. + * After creating the dialog, application can add modules as dialog usages + * by calling #pjsip_dlg_add_usage(). + * + * If the request has To tag parameter, dialog's local tag will be initialized + * from this value. Otherwise a globally unique id generator will be invoked to + * create dialog's local tag. + * + * This function also initializes the dialog's route set based on the + * Record-Route headers in the request, if present. + * + * Note that initially, the session count in the dialog will be initialized + * to zero. + */ +PJ_DECL(pj_status_t) pjsip_dlg_create_uac( pjsip_user_agent *ua, + const pj_str_t *local_uri, + const pj_str_t *local_contact_uri, + const pj_str_t *remote_uri, + const pj_str_t *target, + pjsip_dialog **p_dlg); + + +/** + * Initialize UAS dialog from the information found in the incoming request + * that creates a dialog (such as INVITE, REFER, or SUBSCRIBE), and set the + * local Contact to contact. If contact is not specified, the local contact + * is initialized from the URI in the To header in the request. + * + * Note that initially, the session count in the dialog will be initialized + * to zero. + */ +PJ_DECL(pj_status_t) pjsip_dlg_create_uas( pjsip_user_agent *ua, + pjsip_rx_data *rdata, + const pj_str_t *contact, + pjsip_dialog **p_dlg); + + +/** + * Create a new (forked) dialog on receipt on forked response in rdata. + * The new dialog will be created from original_dlg, except that it will have + * new remote tag as copied from the To header in the response. Upon return, + * the new_dlg will have been registered to the user agent. Applications just + * need to add modules as dialog's usages. + * + * Note that initially, the session count in the dialog will be initialized + * to zero. + */ +PJ_DECL(pj_status_t) pjsip_dlg_fork(const pjsip_dialog *original_dlg, + const pjsip_rx_data *rdata, + pjsip_dialog **new_dlg ); + +/** + * Set dialog's initial route set to route_set list. This can only be called + * for UAC dialog, before any request is sent. After dialog has been + * established, the route set can not be changed. + * + * For UAS dialog,the route set will be initialized in pjsip_dlg_create_uas() + * from the Record-Route headers in the incoming request. + * + * The route_set argument is standard list of Route headers (i.e. with + * sentinel). + */ +PJ_DECL(pj_status_t) pjsip_dlg_set_route_set( pjsip_dialog *dlg, + const pjsip_route_hdr *route_set ); + +/** + * Increment the number of sessions in the dialog. Note that initially + * (after created) the dialog has the session counter set to zero. + */ +PJ_DECL(pj_status_t) pjsip_dlg_inc_session( pjsip_dialog *dlg ); + + +/** + * Decrement the number of sessions in the dialog. Once the session counter + * reach zero and there is no pending transaction, the dialog will be + * destroyed. Note that this function may destroy the dialog immediately + * if there is no pending transaction when this function is called. + */ +PJ_DECL(pj_status_t) pjsip_dlg_dec_session( pjsip_dialog *dlg ); + +/** + * Add a module as dialog usage, and optionally set the module specific data. + */ +PJ_DECL(pj_status_t) pjsip_dlg_add_usage( pjsip_dialog *dlg, + pjsip_module *module, + void *mod_data ); + +/** + * Attach module specific data to the dialog. Application can also set + * the value directly by accessing dlg->mod_data[module_id]. + */ +PJ_INLINE(pj_status_t) pjsip_dlg_set_mod_data( pjsip_dialog *dlg, + int mod_id, + void *data ) +{ + PJ_ASSERT_RETURN(dlg, PJ_EINVAL); + PJ_ASSERT_RETURN(mod_id >= 0 && mod_id < PJSIP_MAX_MODULE, + PJ_EINVAL); + dlg->mod_data[mod_id] = data; + return PJ_SUCCESS; +} + +/** + * Get module specific data previously attached to the dialog. Application + * can also get value directly by accessing dlg->mod_data[module_id]. + */ +PJ_INLINE(void*) pjsip_dlg_get_mod_data(pjsip_dialog *dlg, + int mod_id) +{ + PJ_ASSERT_RETURN(dlg, NULL); + PJ_ASSERT_RETURN(mod_id >= 0 && mod_id < PJSIP_MAX_MODULE, + NULL); + return dlg->mod_data[mod_id]; +} + + + +/** + * Get the dialog instance in the incoming rdata. If an incoming message + * matches an existing dialog, the user agent must have put the matching + * dialog instance in the rdata, or otherwise this function will return + * NULL if the message didn't match any existing dialog. + */ +PJ_DECL(pjsip_dialog*) pjsip_rdata_get_dlg( pjsip_rx_data *rdata ); + +/** + * Get the associated dialog in a transaction. + */ +PJ_DECL(pjsip_dialog*) pjsip_tsx_get_dlg( pjsip_transaction *tsx ); + + +/** + * Create a basic/generic request with the specified method and optionally + * specify the cseq. Use value -1 for cseq to have the dialog automatically + * put next cseq number for the request. Otherwise for some requests, + * e.q. CANCEL and ACK, application must put the CSeq in the original + * INVITE request as the parameter. + * + * This function will also put Contact header where appropriate. + */ +PJ_DECL(pj_status_t) pjsip_dlg_create_request( pjsip_dialog *dlg, + const pjsip_method *method, + int cseq, + pjsip_tx_data **tdata); + + +/** + * Send request message to remote peer. If the request is not an ACK request, + * the dialog will send the request statefully, by creating an UAC transaction + * and send the request with the transaction. + * + * Also when the request is not ACK or CANCEL, the dialog will increment its + * local cseq number and update the cseq in the request according to dialog's + * cseq. + * + * If p_tsx is not null, this argument will be set with the transaction + * instance that was used to send the request. + * + * This function will decrement the transmit data's reference counter + * regardless the status of the operation. + */ +PJ_DECL(pj_status_t) pjsip_dlg_send_request ( pjsip_dialog *dlg, + pjsip_tx_data *tdata, + pjsip_transaction **p_tsx ); + + +/** + * Create a response message for the incoming request in rdata with status + * code st_code and optional status text st_text. This function is different + * than endpoint's API #pjsip_endpt_create_response() in that the dialog + * function adds Contact header and Record-Routes headers in the response + * where appropriate. + */ +PJ_DECL(pj_status_t) pjsip_dlg_create_response( pjsip_dialog *dlg, + pjsip_rx_data *rdata, + int st_code, + const pj_str_t *st_text, + pjsip_tx_data **tdata); + + +/** + * Modify previously sent response with other status code. Contact header + * will be added when appropriate. + */ +PJ_DECL(pj_status_t) pjsip_dlg_modify_response( pjsip_dialog *dlg, + pjsip_tx_data *tdata, + int st_code, + const pj_str_t *st_text); + + +/** + * Send response message statefully. The transaction instance MUST be the + * transaction that was reported on on_rx_request() callback. + * + * This function decrements the transmit data's reference counter regardless + * the status of the operation. + */ +PJ_DECL(pj_status_t) pjsip_dlg_send_response( pjsip_dialog *dlg, + pjsip_transaction *tsx, + pjsip_tx_data *tdata); + + + +/* Receives transaction event (called by user_agent module) */ +void pjsip_dlg_on_tsx_state( pjsip_dialog *dlg, + pjsip_transaction *tsx, + pjsip_event *e ); + +void pjsip_dlg_on_rx_request( pjsip_dialog *dlg, + pjsip_rx_data *rdata ); + +void pjsip_dlg_on_rx_response( pjsip_dialog *dlg, + pjsip_rx_data *rdata ); + + +/** + * @} + */ + +PJ_END_DECL + + +#endif /* __PJSIP_SIP_DIALOG_H__ */ + diff --git a/pjsip/include/pjsip/sip_endpoint.h b/pjsip/include/pjsip/sip_endpoint.h index 527cd886..ef9d44c9 100644 --- a/pjsip/include/pjsip/sip_endpoint.h +++ b/pjsip/include/pjsip/sip_endpoint.h @@ -228,6 +228,19 @@ PJ_DECL(pj_status_t) pjsip_endpt_create_tsx(pjsip_endpoint *endpt, pjsip_transaction **p_tsx); /** + * Find transaction in endpoint's transaction table by the transaction's key. + * This function normally is only used by modules. The key for a transaction + * can be created by calling #pjsip_tsx_create_key. + * + * @param endpt The endpoint instance. + * @param key Transaction key, as created with #pjsip_tsx_create_key. + * + * @return The transaction, or NULL if it's not found. + */ +PJ_DECL(pjsip_transaction*) pjsip_endpt_find_tsx( pjsip_endpoint *endpt, + const pj_str_t *key ); + +/** * Register the transaction to the endpoint's transaction table. * Before the transaction is registered, it must have been initialized as * either UAS or UAC by calling #pjsip_tsx_init_uac or #pjsip_tsx_init_uas. @@ -316,40 +329,78 @@ pjsip_endpt_acquire_transport( pjsip_endpoint *endpt, int addr_len, pjsip_transport **p_transport); -/** - * Get additional headers to be put in outgoing request message. - * This function is normally called by transaction layer when sending outgoing - * requests. - * - * @param endpt The endpoint. + +/***************************************************************************** * - * @return List of additional headers to be put in outgoing requests. + * Capabilities Management + * + * Modules may implement new capabilities to the stack. These capabilities + * are indicated by the appropriate SIP header fields, such as Accept, + * Accept-Encoding, Accept-Language, Allow, Supported, etc. + * + * When a module provides new capabilities to the stack, it registers these + * capabilities to the endpoint by supplying new tags (strings) to the + * appropriate header fields. Application (or other modules) can then query + * these header fields to get the list of supported capabilities, and may + * include these headers in the outgoing message. + ***************************************************************************** */ -PJ_DECL(const pjsip_hdr*) pjsip_endpt_get_request_headers(pjsip_endpoint *endpt); /** - * Get "Allow" header from endpoint. The endpoint builds the "Allow" header - * from the list of methods supported by modules. + * Get the value of the specified capability header field. * * @param endpt The endpoint. + * @param htype The header type to be retrieved, which value may be: + * - PJSIP_H_ACCEPT + * - PJSIP_H_ALLOW + * - PJSIP_H_SUPPORTED + * @param hname If htype specifies PJSIP_H_OTHER, then the header name + * must be supplied in this argument. Otherwise the value + * must be set to NULL. * - * @return "Allow" header, or NULL if endpoint doesn't have "Allow" header. + * @return The appropriate header, or NULL if the header is not + * available. */ -PJ_DECL(const pjsip_allow_hdr*) pjsip_endpt_get_allow_hdr( pjsip_endpoint *endpt ); +PJ_DECL(const pjsip_hdr*) pjsip_endpt_get_capability( pjsip_endpoint *endpt, + int htype, + const pj_str_t *hname); /** - * Find transaction in endpoint's transaction table by the transaction's key. - * This function normally is only used by modules. The key for a transaction - * can be created by calling #pjsip_tsx_create_key. + * Add or register new capabilities as indicated by the tags to the + * appropriate header fields in the endpoint. * - * @param endpt The endpoint instance. - * @param key Transaction key, as created with #pjsip_tsx_create_key. + * @param endpt The endpoint. + * @param mod The module which registers the capability. + * @param htype The header type to be set, which value may be: + * - PJSIP_H_ACCEPT + * - PJSIP_H_ALLOW + * - PJSIP_H_SUPPORTED + * @param hname If htype specifies PJSIP_H_OTHER, then the header name + * must be supplied in this argument. Otherwise the value + * must be set to NULL. + * @param count The number of tags in the array. + * @param tags Array of tags describing the capabilities or extensions + * to be added to the appropriate header. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjsip_endpt_add_capability( pjsip_endpoint *endpt, + pjsip_module *mod, + int htype, + const pj_str_t *hname, + unsigned count, + const pj_str_t tags[]); + +/** + * Get list of additional headers to be put in outgoing request message. * - * @return The transaction, or NULL if it's not found. + * @param e The endpoint. + * + * @return List of headers. */ -PJ_DECL(pjsip_transaction*) pjsip_endpt_find_tsx( pjsip_endpoint *endpt, - const pj_str_t *key ); +PJ_DECL(const pjsip_hdr*) pjsip_endpt_get_request_headers(pjsip_endpoint *e); + /** * Set list of SIP proxies to be visited for all outbound request messages. diff --git a/pjsip/include/pjsip/sip_errno.h b/pjsip/include/pjsip/sip_errno.h index 9c04c755..f7dc18cc 100644 --- a/pjsip/include/pjsip/sip_errno.h +++ b/pjsip/include/pjsip/sip_errno.h @@ -140,6 +140,11 @@ PJ_DECL(pj_str_t) pjsip_strerror( pj_status_t status, char *buffer, /** * @hideinitializer + * General Invalid URI error. + */ +#define PJSIP_EINVALIDURI (PJSIP_ERRNO_START_PJSIP + 39) /* 171039 */ +/** + * @hideinitializer * Unsupported URL scheme. */ #define PJSIP_EINVALIDSCHEME (PJSIP_ERRNO_START_PJSIP + 40) /* 171040 */ @@ -347,6 +352,17 @@ PJ_DECL(pj_str_t) pjsip_strerror( pj_status_t status, char *buffer, #define PJSIP_EAUTHINVALIDDIGEST (PJSIP_ERRNO_START_PJSIP+110) /* 171110 */ +/************************************************************ + * UA AND DIALOG ERRORS + ***********************************************************/ +/** + * @hideinitializer + * Missing From/To tag. + */ +#define PJSIP_EMISSINGTAG (PJSIP_ERRNO_START_PJSIP+120) /* 171120 */ + + + PJ_END_DECL #endif /* __PJSIP_SIP_ERRNO_H__ */ diff --git a/pjsip/include/pjsip/sip_module.h b/pjsip/include/pjsip/sip_module.h index 161e43d2..57d1652d 100644 --- a/pjsip/include/pjsip/sip_module.h +++ b/pjsip/include/pjsip/sip_module.h @@ -24,6 +24,7 @@ * @brief Module helpers */ #include <pjsip/sip_types.h> +#include <pj/list.h> PJ_BEGIN_DECL @@ -68,16 +69,6 @@ struct pjsip_module void *user_data; /** - * Number of methods supported by this module. - */ - int method_cnt; - - /** - * Array of methods supported by this module. - */ - const pjsip_method *methods[8]; - - /** * Pointer to function to be called to initialize the module. * * @param endpt The endpoint instance. diff --git a/pjsip/include/pjsip/sip_msg.h b/pjsip/include/pjsip/sip_msg.h index 3be3c2f8..cebaf3f0 100644 --- a/pjsip/include/pjsip/sip_msg.h +++ b/pjsip/include/pjsip/sip_msg.h @@ -173,48 +173,48 @@ typedef enum pjsip_hdr_e * DO NOT CHANGE THE VALUE/ORDER OF THE HEADER IDs!!!. */ PJSIP_H_ACCEPT, - PJSIP_H_ACCEPT_ENCODING_UNIMP, - PJSIP_H_ACCEPT_LANGUAGE_UNIMP, - PJSIP_H_ALERT_INFO_UNIMP, + PJSIP_H_ACCEPT_ENCODING_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_ACCEPT_LANGUAGE_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_ALERT_INFO_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_ALLOW, - PJSIP_H_AUTHENTICATION_INFO_UNIMP, + PJSIP_H_AUTHENTICATION_INFO_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_AUTHORIZATION, PJSIP_H_CALL_ID, - PJSIP_H_CALL_INFO_UNIMP, + PJSIP_H_CALL_INFO_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_CONTACT, - PJSIP_H_CONTENT_DISPOSITION_UNIMP, - PJSIP_H_CONTENT_ENCODING_UNIMP, - PJSIP_H_CONTENT_LANGUAGE_UNIMP, + PJSIP_H_CONTENT_DISPOSITION_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_CONTENT_ENCODING_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_CONTENT_LANGUAGE_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_CONTENT_LENGTH, PJSIP_H_CONTENT_TYPE, PJSIP_H_CSEQ, - PJSIP_H_DATE_UNIMP, - PJSIP_H_ERROR_INFO_UNIMP, + PJSIP_H_DATE_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_ERROR_INFO_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_EXPIRES, PJSIP_H_FROM, - PJSIP_H_IN_REPLY_TO_UNIMP, + PJSIP_H_IN_REPLY_TO_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_MAX_FORWARDS, - PJSIP_H_MIME_VERSION_UNIMP, + PJSIP_H_MIME_VERSION_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_MIN_EXPIRES, - PJSIP_H_ORGANIZATION_UNIMP, - PJSIP_H_PRIORITY_UNIMP, + PJSIP_H_ORGANIZATION_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_PRIORITY_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_PROXY_AUTHENTICATE, PJSIP_H_PROXY_AUTHORIZATION, - PJSIP_H_PROXY_REQUIRE_UNIMP, + PJSIP_H_PROXY_REQUIRE_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_RECORD_ROUTE, - PJSIP_H_REPLY_TO_UNIMP, + PJSIP_H_REPLY_TO_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_REQUIRE, PJSIP_H_RETRY_AFTER, PJSIP_H_ROUTE, - PJSIP_H_SERVER_UNIMP, - PJSIP_H_SUBJECT_UNIMP, + PJSIP_H_SERVER_UNIMP, /* N/A, use pjsip_generic_string_hdr */ + PJSIP_H_SUBJECT_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_SUPPORTED, - PJSIP_H_TIMESTAMP_UNIMP, + PJSIP_H_TIMESTAMP_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_TO, PJSIP_H_UNSUPPORTED, - PJSIP_H_USER_AGENT_UNIMP, + PJSIP_H_USER_AGENT_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_VIA, - PJSIP_H_WARNING_UNIMP, + PJSIP_H_WARNING_UNIMP, /* N/A, use pjsip_generic_string_hdr */ PJSIP_H_WWW_AUTHENTICATE, PJSIP_H_OTHER, @@ -748,6 +748,49 @@ PJ_INLINE(void) pjsip_msg_insert_first_hdr( pjsip_msg *msg, pjsip_hdr *hdr ) PJ_DECL(pj_ssize_t) pjsip_msg_print(const pjsip_msg *msg, char *buf, pj_size_t size); + +/* + * Some usefull macros to find common headers. + */ + + +/** + * Find Call-ID header. + * + * @param msg The message. + * @return Call-ID header instance. + */ +#define PJSIP_MSG_CID_HDR(msg) \ + ((pjsip_cid_hdr*)pjsip_msg_find_hdr(msg, PJSIP_H_CALL_ID, NULL)) + +/** + * Find CSeq header. + * + * @param msg The message. + * @return CSeq header instance. + */ +#define PJSIP_MSG_CSEQ_HDR(msg) \ + ((pjsip_cseq_hdr*)pjsip_msg_find_hdr(msg, PJSIP_H_CSEQ, NULL)) + +/** + * Find From header. + * + * @param msg The message. + * @return From header instance. + */ +#define PJSIP_MSG_FROM_HDR(msg) \ + ((pjsip_from_hdr*)pjsip_msg_find_hdr(msg, PJSIP_H_FROM, NULL)) + +/** + * Find To header. + * + * @param msg The message. + * @return To header instance. + */ +#define PJSIP_MSG_TO_HDR(msg) \ + ((pjsip_to_hdr*)pjsip_msg_find_hdr(msg, PJSIP_H_TO, NULL)) + + /** * @} */ @@ -766,8 +809,10 @@ PJ_DECL(pj_ssize_t) pjsip_msg_print(const pjsip_msg *msg, */ typedef struct pjsip_generic_string_hdr { - PJSIP_DECL_HDR_MEMBER(struct pjsip_generic_string_hdr); /**< Standard header field. */ - pj_str_t hvalue; /**< hvalue */ + /** Standard header field. */ + PJSIP_DECL_HDR_MEMBER(struct pjsip_generic_string_hdr); + /** hvalue */ + pj_str_t hvalue; } pjsip_generic_string_hdr; @@ -778,25 +823,38 @@ typedef struct pjsip_generic_string_hdr * @param pool The pool. * @param hname The header name to be assigned to the header, or NULL to * assign the header name with some string. + * @param hvalue Optional string to be assigned as the value. * * @return The header, or THROW exception. */ -PJ_DECL(pjsip_generic_string_hdr*) pjsip_generic_string_hdr_create( pj_pool_t *pool, - const pj_str_t *hname ); +PJ_DECL(pjsip_generic_string_hdr*) +pjsip_generic_string_hdr_create( pj_pool_t *pool, + const pj_str_t *hname, + const pj_str_t *hvalue); /** - * Create a generic header along with the text content. + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. * - * @param pool The pool. - * @param hname The header name. - * @param hvalue The header text content. + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param hname The header name to be assigned to the header, or NULL to + * assign the header name with some string later. + * @param hvalue Optional string to be assigned as the value. * - * @return The header instance. + * @return The header instance, which points to the same memory + * location as the mem argument. */ PJ_DECL(pjsip_generic_string_hdr*) -pjsip_generic_string_hdr_create_with_text( pj_pool_t *pool, - const pj_str_t *hname, - const pj_str_t *hvalue); +pjsip_generic_string_hdr_init( pj_pool_t *pool, + void *mem, + const pj_str_t *hname, + const pj_str_t *hvalue); + /** * @} @@ -827,25 +885,36 @@ typedef struct pjsip_generic_int_hdr * @param pool The pool. * @param hname The header name to be assigned to the header, or NULL to * assign the header name with some string. + * @param hvalue The value to be assigned to the header. * * @return The header, or THROW exception. */ -PJ_DECL(pjsip_generic_int_hdr*) pjsip_generic_int_hdr_create( pj_pool_t *pool, - const pj_str_t *hname ); +PJ_DECL(pjsip_generic_int_hdr*) pjsip_generic_int_hdr_create( pj_pool_t *pool, + const pj_str_t *hname, + int hvalue ); + /** - * Create a generic header along with the value. + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. * - * @param pool The pool. - * @param hname The header name. - * @param value The header value content. + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param hname The header name to be assigned to the header, or NULL to + * assign the header name with some string later. + * @param value Value to be assigned to the header. * - * @return The header instance. + * @return The header instance, which points to the same memory + * location as the mem argument. */ -PJ_DECL(pjsip_generic_int_hdr*) -pjsip_generic_int_hdr_create_with_value( pj_pool_t *pool, - const pj_str_t *hname, - int value); +PJ_DECL(pjsip_generic_int_hdr*) pjsip_generic_int_hdr_init( pj_pool_t *pool, + void *mem, + const pj_str_t *hname, + int value ); /** * @} @@ -873,11 +942,33 @@ typedef struct pjsip_generic_array_hdr * Create generic array header. * * @param pool Pool to allocate memory from. + * @param hname Header name. * * @return New generic array header. */ -PJ_DECL(pjsip_generic_array_hdr*) pjsip_generic_array_create(pj_pool_t *pool, - const pj_str_t *hnames); +PJ_DECL(pjsip_generic_array_hdr*) pjsip_generic_array_hdr_create(pj_pool_t *pool, + const pj_str_t *hname); + +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param hname The header name to be assigned to the header, or NULL to + * assign the header name with some string later. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_generic_array_hdr*) pjsip_generic_array_hdr_init(pj_pool_t *pool, + void *mem, + const pj_str_t *hname); + /** * @} @@ -905,6 +996,22 @@ typedef pjsip_generic_array_hdr pjsip_accept_hdr; */ PJ_DECL(pjsip_accept_hdr*) pjsip_accept_hdr_create(pj_pool_t *pool); +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_accept_hdr*) pjsip_accept_hdr_init( pj_pool_t *pool, + void *mem ); /** * @} @@ -929,6 +1036,24 @@ typedef pjsip_generic_array_hdr pjsip_allow_hdr; PJ_DECL(pjsip_allow_hdr*) pjsip_allow_hdr_create(pj_pool_t *pool); + +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_allow_hdr*) pjsip_allow_hdr_init( pj_pool_t *pool, + void *mem ); + /** * @} */ @@ -961,6 +1086,24 @@ PJ_DECL(pjsip_cid_hdr*) pjsip_cid_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_cid_hdr*) pjsip_cid_hdr_init( pj_pool_t *pool, + void *mem ); + + +/** * @} */ @@ -989,6 +1132,24 @@ typedef struct pjsip_clen_hdr PJ_DECL(pjsip_clen_hdr*) pjsip_clen_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_clen_hdr*) pjsip_clen_hdr_init( pj_pool_t *pool, + void *mem ); + + +/** * @} */ @@ -1018,6 +1179,23 @@ typedef struct pjsip_cseq_hdr PJ_DECL(pjsip_cseq_hdr*) pjsip_cseq_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_cseq_hdr*) pjsip_cseq_hdr_init( pj_pool_t *pool, + void *mem ); + +/** * @} */ @@ -1054,6 +1232,23 @@ typedef struct pjsip_contact_hdr PJ_DECL(pjsip_contact_hdr*) pjsip_contact_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_contact_hdr*) pjsip_contact_hdr_init( pj_pool_t *pool, + void *mem ); + +/** * @} */ @@ -1083,6 +1278,23 @@ typedef struct pjsip_ctype_hdr PJ_DECL(pjsip_ctype_hdr*) pjsip_ctype_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_ctype_hdr*) pjsip_ctype_hdr_init( pj_pool_t *pool, + void *mem ); + +/** * @} */ @@ -1099,10 +1311,33 @@ typedef pjsip_generic_int_hdr pjsip_expires_hdr; /** * Create a new Expires header. * - * @param pool The pool. - * @return A new Expires header. + * @param pool The pool. + * @param value The expiration value. + * + * @return A new Expires header. */ -PJ_DECL(pjsip_expires_hdr*) pjsip_expires_hdr_create( pj_pool_t *pool ); +PJ_DECL(pjsip_expires_hdr*) pjsip_expires_hdr_create( pj_pool_t *pool, + int value); + +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param value The expiration value. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_expires_hdr*) pjsip_expires_hdr_init( pj_pool_t *pool, + void *mem, + int value ); + /** * @} @@ -1141,6 +1376,23 @@ typedef pjsip_fromto_hdr pjsip_to_hdr; PJ_DECL(pjsip_from_hdr*) pjsip_from_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_from_hdr*) pjsip_from_hdr_init( pj_pool_t *pool, + void *mem ); + +/** * Create a To header. * * @param pool The pool. @@ -1149,12 +1401,29 @@ PJ_DECL(pjsip_from_hdr*) pjsip_from_hdr_create( pj_pool_t *pool ); PJ_DECL(pjsip_to_hdr*) pjsip_to_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_to_hdr*) pjsip_to_hdr_init( pj_pool_t *pool, + void *mem ); + +/** * Convert the header to a From header. * * @param pool The pool. * @return "From" header. */ -PJ_DECL(pjsip_from_hdr*) pjsip_fromto_set_from( pjsip_fromto_hdr *hdr ); +PJ_DECL(pjsip_from_hdr*) pjsip_fromto_hdr_set_from( pjsip_fromto_hdr *hdr ); /** * Convert the header to a To header. @@ -1162,7 +1431,7 @@ PJ_DECL(pjsip_from_hdr*) pjsip_fromto_set_from( pjsip_fromto_hdr *hdr ); * @param pool The pool. * @return "To" header. */ -PJ_DECL(pjsip_to_hdr*) pjsip_fromto_set_to( pjsip_fromto_hdr *hdr ); +PJ_DECL(pjsip_to_hdr*) pjsip_fromto_hdr_set_to( pjsip_fromto_hdr *hdr ); /** * @} @@ -1176,19 +1445,39 @@ PJ_DECL(pjsip_to_hdr*) pjsip_fromto_set_to( pjsip_fromto_hdr *hdr ); * @ingroup PJSIP_MSG * @{ */ -typedef pjsip_generic_int_hdr pjsip_max_forwards_hdr; +typedef pjsip_generic_int_hdr pjsip_max_fwd_hdr; /** * Create new Max-Forwards header instance. * * @param pool The pool. + * @param value The Max-Forwards value. * * @return New Max-Forwards header instance. */ -PJ_DECL(pjsip_max_forwards_hdr*) pjsip_max_forwards_hdr_create(pj_pool_t *pool); +PJ_DECL(pjsip_max_fwd_hdr*) +pjsip_max_fwd_hdr_create(pj_pool_t *pool, int value); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param value The Max-Forwards value. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_max_fwd_hdr*) +pjsip_max_fwd_hdr_init( pj_pool_t *pool, void *mem, int value ); + +/** * @} */ @@ -1203,16 +1492,37 @@ PJ_DECL(pjsip_max_forwards_hdr*) pjsip_max_forwards_hdr_create(pj_pool_t *pool); typedef pjsip_generic_int_hdr pjsip_min_expires_hdr; /** - * Create new Max-Forwards header instance. + * Create new Min-Expires header instance. * * @param pool The pool. + * @param value The Min-Expires value. * - * @return New Max-Forwards header instance. + * @return New Min-Expires header instance. */ -PJ_DECL(pjsip_min_expires_hdr*) pjsip_min_expires_hdr_create(pj_pool_t *pool); +PJ_DECL(pjsip_min_expires_hdr*) pjsip_min_expires_hdr_create(pj_pool_t *pool, + int value); /** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param value The Min-Expires value. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_min_expires_hdr*) pjsip_min_expires_hdr_init( pj_pool_t *pool, + void *mem, + int value ); + +/** * @} */ @@ -1249,6 +1559,23 @@ typedef pjsip_routing_hdr pjsip_route_hdr; */ PJ_DECL(pjsip_rr_hdr*) pjsip_rr_hdr_create( pj_pool_t *pool ); +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_rr_hdr*) pjsip_rr_hdr_init( pj_pool_t *pool, + void *mem ); + /** * Create new Route header from the pool. * @@ -1257,6 +1584,23 @@ PJ_DECL(pjsip_rr_hdr*) pjsip_rr_hdr_create( pj_pool_t *pool ); */ PJ_DECL(pjsip_route_hdr*) pjsip_route_hdr_create( pj_pool_t *pool ); +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_route_hdr*) pjsip_route_hdr_init( pj_pool_t *pool, + void *mem ); + /** * Convert generic routing header to Record-Route header. * @@ -1295,6 +1639,22 @@ typedef pjsip_generic_array_hdr pjsip_require_hdr; */ PJ_DECL(pjsip_require_hdr*) pjsip_require_hdr_create(pj_pool_t *pool); +/** + * Initialize a preallocated memory with the header structure. This function + * should only be called when application uses its own memory allocation to + * allocate memory block for the specified header (e.g. in C++, when the + * header is allocated with "new" operator). + * For normal applications, they should use pjsip_xxx_hdr_create() instead, + * which allocates memory and initialize it in one go. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_require_hdr*) pjsip_require_hdr_init( pj_pool_t *pool, + void *mem ); /** * @} @@ -1314,10 +1674,26 @@ typedef pjsip_generic_int_hdr pjsip_retry_after_hdr; * Create new Retry-After header instance. * * @param pool The pool. + * @param value The Retry-After value. * * @return New Retry-After header instance. */ -PJ_DECL(pjsip_retry_after_hdr*) pjsip_retry_after_hdr_create(pj_pool_t *pool); +PJ_DECL(pjsip_retry_after_hdr*) pjsip_retry_after_hdr_create(pj_pool_t *pool, + int value); + +/** + * Initialize a preallocated memory with the header structure. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * @param value The Retry-After value. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_retry_after_hdr*) pjsip_retry_after_hdr_init( pj_pool_t *pool, + void *mem, + int value ); /** @@ -1342,6 +1718,17 @@ typedef pjsip_generic_array_hdr pjsip_supported_hdr; */ PJ_DECL(pjsip_supported_hdr*) pjsip_supported_hdr_create(pj_pool_t *pool); +/** + * Initialize a preallocated memory with the header structure. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_supported_hdr*) pjsip_supported_hdr_init( pj_pool_t *pool, + void *mem ); /** * @} @@ -1365,6 +1752,17 @@ typedef pjsip_generic_array_hdr pjsip_unsupported_hdr; */ PJ_DECL(pjsip_unsupported_hdr*) pjsip_unsupported_hdr_create(pj_pool_t *pool); +/** + * Initialize a preallocated memory with the header structure. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_unsupported_hdr*) pjsip_unsupported_hdr_init( pj_pool_t *pool, + void *mem ); /** * @} @@ -1408,6 +1806,18 @@ typedef struct pjsip_via_hdr PJ_DECL(pjsip_via_hdr*) pjsip_via_hdr_create( pj_pool_t *pool ); /** + * Initialize a preallocated memory with the header structure. + * + * @param pool Pool for additional memory allocation if required. + * @param mem Pre-allocated memory to be initialized as the header. + * + * @return The header instance, which points to the same memory + * location as the mem argument. + */ +PJ_DECL(pjsip_via_hdr*) pjsip_via_hdr_init( pj_pool_t *pool, + void *mem ); + +/** * @} */ diff --git a/pjsip/include/pjsip/sip_transaction.h b/pjsip/include/pjsip/sip_transaction.h index 065b71c2..712fa8ad 100644 --- a/pjsip/include/pjsip/sip_transaction.h +++ b/pjsip/include/pjsip/sip_transaction.h @@ -75,6 +75,7 @@ struct pjsip_transaction pjsip_method method; /**< The method. */ int cseq; /**< The CSeq */ pj_str_t transaction_key;/**< Hash table key. */ + pj_uint32_t hashed_key; /**< Key's hashed value. */ pj_str_t branch; /**< The branch Id. */ /* diff --git a/pjsip/include/pjsip/sip_transport.h b/pjsip/include/pjsip/sip_transport.h index f8968f90..5dd23c1f 100644 --- a/pjsip/include/pjsip/sip_transport.h +++ b/pjsip/include/pjsip/sip_transport.h @@ -67,6 +67,12 @@ enum pjsip_transport_flags_e ((tp)->flag & PJSIP_TRANSPORT_RELIABLE) /** + * Check if transport tp is secure. + */ +#define PJSIP_TRANSPORT_IS_SECURE(tp) \ + ((tp)->flag & PJSIP_TRANSPORT_SECURE) + +/** * Get the transport type from the transport name. * * @param name Transport name, such as "TCP", or "UDP". @@ -233,7 +239,7 @@ struct pjsip_rx_data pjsip_cseq_hdr *cseq; /** Max forwards header. */ - pjsip_max_forwards_hdr *max_fwd; + pjsip_max_fwd_hdr *max_fwd; /** The first route header. */ pjsip_route_hdr *route; diff --git a/pjsip/include/pjsip/sip_types.h b/pjsip/include/pjsip/sip_types.h index 72fe3af5..fc79f95a 100644 --- a/pjsip/include/pjsip/sip_types.h +++ b/pjsip/include/pjsip/sip_types.h @@ -102,6 +102,11 @@ typedef struct pjsip_hdr pjsip_hdr; typedef struct pjsip_uri pjsip_uri; /** + * Forward declaration for SIP method (sip_msg.h) + */ +typedef struct pjsip_method pjsip_method; + +/** * Opaque data type for the resolver engine (sip_resolve.h). */ typedef struct pjsip_resolver_t pjsip_resolver_t; @@ -117,6 +122,18 @@ typedef struct pjsip_cred_info pjsip_cred_info; */ typedef struct pjsip_module pjsip_module; + +/** + * Forward declaration for user agent type (sip_ua_layer.h). + */ +typedef pjsip_module pjsip_user_agent; + +/** + * Forward declaration for dialog (sip_dialog.h). + */ +typedef struct pjsip_dialog pjsip_dialog; + + /** * Transaction role. */ diff --git a/pjsip/include/pjsip-ua/sip_ua.h b/pjsip/include/pjsip/sip_ua_layer.h index a1d7c423..e12a55a8 100644 --- a/pjsip/include/pjsip-ua/sip_ua.h +++ b/pjsip/include/pjsip/sip_ua_layer.h @@ -16,13 +16,14 @@ * 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_UA_H__ -#define __PJSIP_SIP_UA_H__ +#ifndef __PJSIP_SIP_UA_LAYER_H__ +#define __PJSIP_SIP_UA_LAYER_H__ /** - * @file sip_ua.h - * @brief SIP User Agent Module + * @file sip_ua_layer.h + * @brief SIP User Agent Layer Module */ +#include <pjsip/sip_types.h> PJ_BEGIN_DECL @@ -32,26 +33,30 @@ PJ_BEGIN_DECL */ /** - * @defgroup PJSUA_UA SIP User Agent + * @defgroup PJSUA_UA SIP User Agent Module * @ingroup PJSUA * @{ * \brief * User Agent manages the interactions between application and SIP dialogs. */ -/** User agent type. */ -typedef pjsip_module pjsip_user_agent; - +/** User agent initialization parameter. */ +typedef struct pjsip_ua_init_param +{ + pjsip_dialog* (*on_dlg_forked)(pjsip_dialog *first_set, pjsip_rx_data *res); +} pjsip_ua_init_param; /** * Initialize user agent layer and register it to the specified endpoint. * * @param endpt The endpoint where the user agent will be * registered. + * @param prm UA initialization parameter. * * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjsip_ua_init(pjsip_endpoint *endpt); +PJ_DECL(pj_status_t) pjsip_ua_init(pjsip_endpoint *endpt, + const pjsip_ua_init_param *prm); /** * Get the instance of the user agent. @@ -67,6 +72,26 @@ PJ_DECL(pjsip_user_agent*) pjsip_ua_instance(void); */ PJ_DECL(pj_status_t) pjsip_ua_destroy(void); +/** + * Get the endpoint instance of a user agent module. + * + * @param ua The user agent instance. + * + * @return The endpoint instance where the user agent is + * registered. + */ +PJ_DECL(pjsip_endpoint*) pjsip_ua_get_endpt(pjsip_user_agent *ua); + + +/* + * Internal. + */ + +PJ_DECL(pj_status_t) pjsip_ua_register_dlg( pjsip_user_agent *ua, + pjsip_dialog *dlg ); +PJ_DECL(pj_status_t) pjsip_ua_unregister_dlg(pjsip_user_agent *ua, + pjsip_dialog *dlg ); + /** * @} @@ -75,5 +100,5 @@ PJ_DECL(pj_status_t) pjsip_ua_destroy(void); PJ_END_DECL -#endif /* __PJSIP_UA_H__ */ +#endif /* __PJSIP_SIP_UA_LAYER_H__ */ diff --git a/pjsip/include/pjsip/sip_uri.h b/pjsip/include/pjsip/sip_uri.h index 3ee19354..6973c524 100644 --- a/pjsip/include/pjsip/sip_uri.h +++ b/pjsip/include/pjsip/sip_uri.h @@ -161,9 +161,9 @@ typedef struct pjsip_uri_vptr * @param size the size of the buffer. * @return the length printed. */ - int (*p_print)(pjsip_uri_context_e context, - const void *uri, - char *buf, pj_size_t size); + pj_ssize_t (*p_print)(pjsip_uri_context_e context, + const void *uri, + char *buf, pj_size_t size); /** * Compare two URIs according to the context. @@ -332,20 +332,20 @@ PJ_INLINE(void*) pjsip_uri_clone( pj_pool_t *pool, const void *uri ) * @param secure Tlag to indicate whether secure transport should be used. * @return SIP URL. */ -PJ_DECL(pjsip_sip_uri*) pjsip_url_create( pj_pool_t *pool, int secure ); +PJ_DECL(pjsip_sip_uri*) pjsip_sip_uri_create( pj_pool_t *pool, int secure ); /** * Create new SIPS URL and initialize all fields with zero or NULL. * @param pool The pool. * @return SIPS URL. */ -PJ_DECL(pjsip_sip_uri*) pjsips_url_create( pj_pool_t *pool ); +PJ_DECL(pjsip_sip_uri*) pjsip_sips_uri_create( pj_pool_t *pool ); /** * Initialize SIP URL (all fields are set to NULL or zero). * @param url The URL. */ -PJ_DECL(void) pjsip_url_init(pjsip_sip_uri *url, int secure); +PJ_DECL(void) pjsip_sip_uri_init(pjsip_sip_uri *url, int secure); /** * Perform full assignment to the SIP URL. @@ -353,8 +353,8 @@ PJ_DECL(void) pjsip_url_init(pjsip_sip_uri *url, int secure); * @param url Destination URL. * @param rhs The source URL. */ -PJ_DECL(void) pjsip_url_assign(pj_pool_t *pool, pjsip_sip_uri *url, - const pjsip_sip_uri *rhs); +PJ_DECL(void) pjsip_sip_uri_assign(pj_pool_t *pool, pjsip_sip_uri *url, + const pjsip_sip_uri *rhs); /** * Create new instance of name address and initialize all fields with zero or |