123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224 |
- /*
- * 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 __SIP_INVITE_SESSION_H__
- #define __SIP_INVITE_SESSION_H__
- /**
- * @file sip_inv.h
- * @brief INVITE sessions
- */
- #include <pjsip/sip_dialog.h>
- #include <pjmedia/sdp_neg.h>
- /**
- * @defgroup PJSIP_HIGH_UA User Agent Library
- * @brief Mid-level User Agent Library.
- *
- * This is the high level user agent library, which consists of:
- * - @ref PJSIP_INV, to encapsulate INVITE sessions and SDP
- * negotiation in the session,
- * - @ref PJSUA_REGC, high level client registration API, and
- * - @ref PJSUA_XFER.
- *
- * More detailed information is explained in
- * <A HREF="/docs.htm">PJSIP Developer's Guide</A>
- * PDF document, and readers are encouraged to read the document to
- * get the concept behind dialog, dialog usages, and INVITE sessions.
- *
- * The User Agent Library is implemented in <b>pjsip-ua</b> static
- * library.
- */
- /**
- * @defgroup PJSIP_INV INVITE Session
- * @ingroup PJSIP_HIGH_UA
- * @brief Provides INVITE session management.
- * @{
- *
- * The INVITE session uses the @ref PJSIP_DIALOG framework to manage
- * the underlying dialog, and is one type of usages that can use
- * a particular dialog instance (other usages are event subscription,
- * discussed in @ref PJSIP_EVENT_NOT). The INVITE session manages
- * the life-time of the session, and also manages the SDP negotiation.
- *
- * Application must link with <b>pjsip-ua</b> static library to use this API.
- *
- * More detailed information is explained in
- * <A HREF="/docs.htm">PJSIP Developer's Guide</A>
- * PDF document, and readers are encouraged to read the document to
- * get the concept behind dialog, dialog usages, and INVITE sessions.
- *
- * The INVITE session does NOT manage media. If application wants to
- * use API that encapsulates both signaling and media in a very easy
- * to use API, it can use @ref PJSUA_LIB for this purpose.
- */
- PJ_BEGIN_DECL
- /**
- * @see pjsip_inv_session
- */
- typedef struct pjsip_inv_session pjsip_inv_session;
- /**
- * This enumeration describes invite session state.
- */
- typedef enum pjsip_inv_state
- {
- PJSIP_INV_STATE_NULL, /**< Before INVITE is sent or received */
- PJSIP_INV_STATE_CALLING, /**< After INVITE is sent */
- PJSIP_INV_STATE_INCOMING, /**< After INVITE is received. */
- PJSIP_INV_STATE_EARLY, /**< After response with To tag. */
- PJSIP_INV_STATE_CONNECTING, /**< After 2xx is sent/received. */
- PJSIP_INV_STATE_CONFIRMED, /**< After ACK is sent/received. */
- PJSIP_INV_STATE_DISCONNECTED, /**< Session is terminated. */
- } pjsip_inv_state;
- /**
- * Structure to hold parameters when calling the callback
- * on_rx_offer2().
- */
- struct pjsip_inv_on_rx_offer_cb_param
- {
- const pjmedia_sdp_session *offer; /**< Remote offer. */
- const pjsip_rx_data *rdata; /**< The received request. */
- };
- /**
- * This structure contains callbacks to be registered by application to
- * receive notifications from the framework about various events in
- * the invite session.
- */
- typedef struct pjsip_inv_callback
- {
- /**
- * This callback is called when the invite sesion state has changed.
- * Application should inspect the session state (inv_sess->state) to get
- * the current state of the session.
- *
- * This callback is mandatory.
- *
- * @param inv The invite session.
- * @param e The event which has caused the invite session's
- * state to change.
- */
- void (*on_state_changed)(pjsip_inv_session *inv, pjsip_event *e);
- /**
- * This callback is called when the invite usage module has created
- * a new dialog and invite because of forked outgoing request.
- *
- * Currently the invite session does not create a new dialog in
- * forking scenario, so this callback will never be invoked.
- *
- * @param inv The new invite session.
- * @param e The event which has caused the dialog to fork.
- * The type of this event can be either
- * PJSIP_EVENT_RX_MSG or PJSIP_EVENT_RX_200_MSG.
- */
- void (*on_new_session)(pjsip_inv_session *inv, pjsip_event *e);
- /**
- * This callback is called whenever any transactions within the session
- * has changed their state. Application MAY implement this callback,
- * e.g. to monitor the progress of an outgoing request, or to send
- * response to unhandled incoming request (such as INFO).
- *
- * This callback is optional.
- *
- * @param inv The invite session.
- * @param tsx The transaction, which state has changed.
- * @param e The event which has caused the transation state's
- * to change.
- */
- void (*on_tsx_state_changed)(pjsip_inv_session *inv,
- pjsip_transaction *tsx,
- pjsip_event *e);
- /**
- * This callback is called when the invite session has received
- * new offer from peer. Application can inspect the remote offer
- * in "offer", and set the SDP answer with #pjsip_inv_set_sdp_answer().
- * When the application sends a SIP message to send the answer,
- * this SDP answer will be negotiated with the offer, and the result
- * will be sent with the SIP message.
- *
- * Note: if callback #on_rx_offer2() is implemented, this callback will
- * not be called.
- *
- * @param inv The invite session.
- * @param offer Remote offer.
- */
- void (*on_rx_offer)(pjsip_inv_session *inv,
- const pjmedia_sdp_session *offer);
- /**
- * This callback is called when the invite session has received
- * new offer from peer. Variant of #on_rx_offer() callback.
- *
- * @param inv The invite session.
- * @param param The callback parameters.
- */
- void (*on_rx_offer2)(pjsip_inv_session *inv,
- struct pjsip_inv_on_rx_offer_cb_param *param);
- /**
- * This callback is optional, and is called when the invite session has
- * received a re-INVITE from the peer. It will be called after
- * on_rx_offer() callback and works only for re-INVITEs. It allows more
- * fine-grained control over the response to a re-INVITE, e.g. sending
- * a provisional response first. Application can return PJ_SUCCESS and
- * send a reply using the function #pjsip_inv_initial_answer() or
- * #pjsip_inv_answer(), as with the initial INVITE. If application
- * returns non-PJ_SUCCESS, it needs to set the SDP answer with
- * #pjsip_inv_set_sdp_answer() and the re-INVITE will be answered
- * automatically.
- *
- * Remarks: Application may need to monitor on_tsx_state_changed()
- * callback to check whether the re-INVITE is already answered
- * automatically with 487 due to being cancelled.
- *
- * @param inv The invite session.
- * @param offer Remote offer.
- * @param rdata The received re-INVITE request.
- *
- * @return - PJ_SUCCESS: application will answer the re-INVITE
- * manually
- * - non-PJ_SUCCESS: answer the re-INVITE automatically
- * using the SDP set via #pjsip_inv_set_sdp_answer()
- */
- pj_status_t (*on_rx_reinvite)(pjsip_inv_session *inv,
- const pjmedia_sdp_session *offer,
- pjsip_rx_data *rdata);
- /**
- * This callback is optional, and it is used to ask the application
- * to create a fresh offer, when the invite session has received
- * re-INVITE without offer. This offer then will be sent in the
- * 200/OK response to the re-INVITE request.
- *
- * If application doesn't implement this callback, the invite session
- * will send the currently active SDP as the offer.
- *
- * @param inv The invite session.
- * @param p_offer Pointer to receive the SDP offer created by
- * application.
- */
- void (*on_create_offer)(pjsip_inv_session *inv,
- pjmedia_sdp_session **p_offer);
- /**
- * This callback is called after SDP offer/answer session has completed.
- * The status argument specifies the status of the offer/answer,
- * i.e. whether the SDP answer is valid or the negotiation result
- * as returned by pjmedia_sdp_neg_negotiate().
- *
- * This callback is optional (from the point of view of the framework),
- * but all useful applications normally need to implement this callback.
- *
- * @param inv The invite session.
- * @param status The negotiation status.
- */
- void (*on_media_update)(pjsip_inv_session *inv_ses,
- pj_status_t status);
- /**
- * This callback is called when the framework needs to send
- * ACK request after it receives incoming 2xx response for
- * INVITE. It allows application to manually handle the
- * transmission of ACK request, which is required by some 3PCC
- * scenarios. If this callback is not implemented, the framework
- * will handle the ACK transmission automatically.
- *
- * When this callback is overridden, application may delay the
- * sending of the ACK request (for example, when it needs to
- * wait for answer from the other call leg, in 3PCC scenarios).
- *
- * Application MUST create the ACK request using pjsip_inv_create_ack()
- * and send it using pjsip_inv_send_msg().
- *
- * Once it has sent the ACK request, the framework will keep
- * this ACK request in the cache. Subsequent receipt of 2xx response
- * will not cause this callback to be called (but see exception below),
- * and instead automatic retransmission of this ACK request from
- * the cache will be done by the framework.
- * Exception: if app has created the ACK but has not sent it,
- * while it receives a retransmission of 2xx response, this callback
- * will be called again.
- *
- * This callback is optional.
- */
- void (*on_send_ack)(pjsip_inv_session *inv, pjsip_rx_data *rdata);
- /**
- * This callback is called when the session is about to resend the
- * INVITE request to the specified target, following the previously
- * received redirection response.
- *
- * Application may accept the redirection to the specified target
- * (the default behavior if this callback is implemented), reject
- * this target only and make the session continue to try the next
- * target in the list if such target exists, stop the whole
- * redirection process altogether and cause the session to be
- * disconnected, or defer the decision to ask for user confirmation.
- *
- * This callback is optional. If this callback is not implemented,
- * the default behavior is to NOT follow the redirection response.
- *
- * @param inv The invite session.
- * @param target The current target to be tried.
- * @param e The event that caused this callback to be called.
- * This could be the receipt of 3xx response, or
- * 4xx/5xx response received for the INVITE sent to
- * subsequent targets, or NULL if this callback is
- * called from within #pjsip_inv_process_redirect()
- * context.
- *
- * @return Action to be performed for the target. Set this
- * parameter to one of the value below:
- * - PJSIP_REDIRECT_ACCEPT: immediately accept the
- * redirection to this target. When set, the
- * session will immediately resend INVITE request
- * to the target after this callback returns.
- * - PJSIP_REDIRECT_REJECT: immediately reject this
- * target. The session will continue retrying with
- * next target if present, or disconnect the call
- * if there is no more target to try.
- * - PJSIP_REDIRECT_STOP: stop the whole redirection
- * process and immediately disconnect the call. The
- * on_state_changed() callback will be called with
- * PJSIP_INV_STATE_DISCONNECTED state immediately
- * after this callback returns.
- * - PJSIP_REDIRECT_PENDING: set to this value if
- * no decision can be made immediately (for example
- * to request confirmation from user). Application
- * then MUST call #pjsip_inv_process_redirect()
- * to either accept or reject the redirection upon
- * getting user decision.
- */
- pjsip_redirect_op (*on_redirected)(pjsip_inv_session *inv,
- const pjsip_uri *target,
- const pjsip_event *e);
- } pjsip_inv_callback;
- /**
- * This enumeration shows various options that can be applied to a session.
- * The bitmask combination of these options need to be specified when
- * creating a session. After the dialog is established (including early),
- * the options member of #pjsip_inv_session shows which capabilities are
- * common in both endpoints.
- */
- enum pjsip_inv_option
- {
- /**
- * Indicate support for reliable provisional response extension
- */
- PJSIP_INV_SUPPORT_100REL = 1,
- /**
- * Indicate support for session timer extension.
- */
- PJSIP_INV_SUPPORT_TIMER = 2,
- /**
- * Indicate support for UPDATE method. This is automatically implied
- * when creating outgoing dialog. After the dialog is established,
- * the options member of #pjsip_inv_session shows whether peer supports
- * this method as well.
- */
- PJSIP_INV_SUPPORT_UPDATE = 4,
- /**
- * Indicate support for ICE
- */
- PJSIP_INV_SUPPORT_ICE = 8,
- /**
- * Require ICE support.
- */
- PJSIP_INV_REQUIRE_ICE = 16,
- /**
- * Require reliable provisional response extension.
- */
- PJSIP_INV_REQUIRE_100REL = 32,
- /**
- * Require session timer extension.
- */
- PJSIP_INV_REQUIRE_TIMER = 64,
- /**
- * Session timer extension will always be used even when peer doesn't
- * support/want session timer.
- */
- PJSIP_INV_ALWAYS_USE_TIMER = 128,
- /**
- * Indicate support for trickle ICE
- */
- PJSIP_INV_SUPPORT_TRICKLE_ICE = 256,
- /**
- * Require trickle ICE support.
- */
- PJSIP_INV_REQUIRE_TRICKLE_ICE = 512,
- };
- /* Forward declaration of Session Timers */
- struct pjsip_timer;
- /**
- * This structure describes the invite session.
- *
- * Note regarding the invite session's pools. The inv_sess used to have
- * only one pool, which is just a pointer to the dialog's pool. Ticket
- * https://github.com/pjsip/pjproject/issues/877 has found that the memory
- * usage will grow considerably everytime re-INVITE or UPDATE is
- * performed.
- *
- * Ticket #877 then created two more memory pools for the inv_sess, so
- * now we have three memory pools:
- * - pool: to be used to allocate long term data for the session
- * - pool_prov and pool_active: this is a flip-flop pools to be used
- * interchangably during re-INVITE and UPDATE. pool_prov is
- * "provisional" pool, used to allocate SDP offer or answer for
- * the re-INVITE and UPDATE. Once SDP negotiation is done, the
- * provisional pool will be made as the active pool, then the
- * existing active pool will be reset, to release the memory
- * back to the OS. So these pool's lifetime is synchronized to
- * the SDP offer-answer negotiation.
- *
- * Higher level application such as PJSUA-LIB has been modified to
- * make use of these flip-flop pools, i.e. by creating media objects
- * from the provisional pool rather than from the long term pool.
- *
- * Other applications that want to use these pools must understand
- * that the flip-flop pool's lifetimes are synchronized to the
- * SDP offer-answer negotiation.
- *
- * The lifetime of this session is controlled by the reference counter in this
- * structure, which is manipulated by calling #pjsip_inv_add_ref and
- * #pjsip_inv_dec_ref. When the reference counter has reached zero, then
- * this session will be destroyed.
- */
- struct pjsip_inv_session
- {
- char obj_name[PJ_MAX_OBJ_NAME]; /**< Log identification */
- pj_pool_t *pool; /**< Long term pool. */
- pj_pool_t *pool_prov; /**< Provisional pool */
- pj_pool_t *pool_active; /**< Active/current pool*/
- pjsip_inv_state state; /**< Invite sess state. */
- pj_bool_t cancelling; /**< CANCEL requested */
- pj_bool_t pending_cancel; /**< Wait to send CANCEL*/
- pjsip_tx_data *pending_bye; /**< BYE to send later */
- pjsip_status_code cause; /**< Disconnect cause. */
- pj_str_t cause_text; /**< Cause text. */
- pj_bool_t notify; /**< Internal. */
- pj_bool_t sdp_done_early_rel; /**< Nego done in early
- med was reliable? */
- unsigned cb_called; /**< Cb has been called */
- pjsip_dialog *dlg; /**< Underlying dialog. */
- pjsip_role_e role; /**< Invite role. */
- unsigned options; /**< Options in use. */
- pjmedia_sdp_neg *neg; /**< Negotiator. */
- unsigned sdp_neg_flags; /**< SDP neg flags. */
- pjsip_transaction *invite_tsx; /**< 1st invite tsx. */
- pjsip_tx_data *invite_req; /**< Saved invite req */
- pjsip_tx_data *last_answer; /**< Last INVITE resp. */
- pjsip_tx_data *last_ack; /**< Last ACK request */
- pj_int32_t last_ack_cseq; /**< CSeq of last ACK */
- void *mod_data[PJSIP_MAX_MODULE];/**< Modules data. */
- struct pjsip_timer *timer; /**< Session Timers. */
- pj_bool_t following_fork; /**< Internal, following
- forked media? */
- pj_atomic_t *ref_cnt; /**< Reference counter. */
- pj_bool_t updated_sdp_answer; /**< SDP answer just been
- updated? */
- };
- /**
- * This structure represents SDP information in a pjsip_(rx|tx)_data. Application
- * retrieve this information by calling #pjsip_get_sdp_info(). This
- * mechanism supports multipart message body.
- */
- typedef struct pjsip_sdp_info
- {
- /**
- * Pointer and length of the text body in the incoming message. If
- * the pointer is NULL, it means the message does not contain SDP
- * body.
- */
- pj_str_t body;
- /**
- * This will contain non-zero if an invalid SDP body is found in the
- * message.
- */
- pj_status_t sdp_err;
- /**
- * A parsed and validated SDP body.
- */
- pjmedia_sdp_session *sdp;
- } pjsip_sdp_info;
- /**
- * For backwards compatibility and completeness,
- * pjsip_rdata_sdp_info and pjsip_tdata_sdp_info
- * are typedef'd to pjsip_sdp_info.
- */
- typedef pjsip_sdp_info pjsip_rdata_sdp_info;
- /**
- * For backwards compatibility and completeness,
- * pjsip_rdata_sdp_info and pjsip_tdata_sdp_info
- * are typedef'd to pjsip_sdp_info.
- */
- typedef pjsip_sdp_info pjsip_tdata_sdp_info;
- /**
- * Initialize the invite usage module and register it to the endpoint.
- * The callback argument contains pointer to functions to be called on
- * occurences of events in invite sessions.
- *
- * @param endpt The endpoint instance.
- * @param cb Callback structure.
- *
- * @return PJ_SUCCESS on success, or the appropriate error code.
- */
- PJ_DECL(pj_status_t) pjsip_inv_usage_init(pjsip_endpoint *endpt,
- const pjsip_inv_callback *cb);
- /**
- * Get the INVITE usage module instance.
- *
- * @return PJ_SUCCESS on success, or the appropriate error code.
- */
- PJ_DECL(pjsip_module*) pjsip_inv_usage_instance(void);
- /**
- * Dump user agent contents (e.g. all dialogs).
- */
- PJ_DECL(void) pjsip_inv_usage_dump(void);
- /**
- * Create UAC invite session for the specified dialog in dlg.
- *
- * @param dlg The dialog which will be used by this invite session.
- * @param local_sdp If application has determined its media capability,
- * it can specify the SDP here. Otherwise it can leave
- * this to NULL, if app wishes to specify the SDP at
- * a later time using the API pjsip_inv_set_local_sdp(),
- * or if it wants to let remote UAS specify an offer.
- * @param options The options argument is bitmask combination of SIP
- * features in pjsip_inv_option enumeration.
- * @param p_inv On successful return, the invite session will be put
- * in this argument.
- *
- * @return The function will return PJ_SUCCESS if it can create
- * the session. Otherwise the appropriate error status
- * will be returned on failure.
- */
- PJ_DECL(pj_status_t) pjsip_inv_create_uac(pjsip_dialog *dlg,
- const pjmedia_sdp_session *local_sdp,
- unsigned options,
- pjsip_inv_session **p_inv);
- /**
- * Application SHOULD call this function upon receiving the initial INVITE
- * request in rdata before creating the invite session (or even dialog),
- * to verify that the invite session can handle the INVITE request.
- * This function verifies that local endpoint is capable to handle required
- * SIP extensions in the request (i.e. Require header) and also the media,
- * if media description is present in the request.
- *
- * @param rdata The incoming INVITE request.
- *
- * @param options Upon calling this function, the options argument
- * MUST contain the desired SIP extensions to be
- * applied to the session. Upon return, this argument
- * will contain the SIP extension that will be applied
- * to the session, after considering the Supported,
- * Require, and Allow headers in the request.
- *
- * @param sdp If local media capability has been determined,
- * and if application wishes to verify that it can
- * handle the media offer in the incoming INVITE
- * request, it SHOULD specify its local media capability
- * in this argument.
- * If it is not specified, media verification will not
- * be performed by this function.
- *
- * @param dlg If tdata is not NULL, application needs to specify
- * how to create the response. Either dlg or endpt
- * argument MUST be specified, with dlg argument takes
- * precedence when both are specified.
- *
- * If a dialog has been created prior to calling this
- * function, then it MUST be specified in dlg argument.
- * Otherwise application MUST specify the endpt argument
- * (this is useful e.g. when application wants to send
- * the response statelessly).
- *
- * @param endpt If tdata is not NULL, application needs to specify
- * how to create the response. Either dlg or endpt
- * argument MUST be specified, with dlg argument takes
- * precedence when both are specified.
- *
- * @param tdata If this argument is not NULL, this function will
- * create the appropriate non-2xx final response message
- * when the verification fails.
- *
- * @return If everything has been negotiated successfully,
- * the function will return PJ_SUCCESS. Otherwise it
- * will return the reason of the failure as the return
- * code.
- *
- * This function is capable to create the appropriate
- * response message when the verification has failed.
- * If tdata is specified, then a non-2xx final response
- * will be created and put in this argument upon return,
- * when the verification has failed.
- *
- * If a dialog has been created prior to calling this
- * function, then it MUST be specified in dlg argument.
- * Otherwise application MUST specify the endpt argument
- * (this is useful e.g. when application wants to send
- * the response statelessly).
- *
- * @see pjsip_inv_verify_request2()
- */
- PJ_DECL(pj_status_t) pjsip_inv_verify_request( pjsip_rx_data *rdata,
- unsigned *options,
- const pjmedia_sdp_session *sdp,
- pjsip_dialog *dlg,
- pjsip_endpoint *endpt,
- pjsip_tx_data **tdata);
- /**
- * Variant of #pjsip_inv_verify_request() which allows application to specify
- * the parsed SDP in the \a offer argument. This is useful to avoid having to
- * re-parse the SDP in the incoming request.
- *
- * @see pjsip_inv_verify_request()
- */
- PJ_DECL(pj_status_t) pjsip_inv_verify_request2( pjsip_rx_data *rdata,
- unsigned *options,
- const pjmedia_sdp_session *offer,
- const pjmedia_sdp_session *answer,
- pjsip_dialog *dlg,
- pjsip_endpoint *endpt,
- pjsip_tx_data **tdata);
- /**
- * Variant of #pjsip_inv_verify_request() which allows application not to
- * specify the rdata (i.e. pass NULL as the rdata parameter) and specify
- * the parsed SDP in the \a offer argument and a temporary pool in the
- * \a tmp_pool argument.
- * This is useful if application no longer has access to the rdata.
- *
- * @see pjsip_inv_verify_request()
- */
- PJ_DECL(pj_status_t) pjsip_inv_verify_request3( pjsip_rx_data *rdata,
- pj_pool_t *tmp_pool,
- unsigned *options,
- const pjmedia_sdp_session *offer,
- const pjmedia_sdp_session *answer,
- pjsip_dialog *dlg,
- pjsip_endpoint *endpt,
- pjsip_tx_data **tdata);
- /**
- * Create UAS invite session for the specified dialog in dlg. Application
- * SHOULD call the verification function before calling this function,
- * to ensure that it can create the session successfully.
- *
- * @param dlg The dialog to be used.
- * @param rdata Application MUST specify the received INVITE request
- * in rdata. The invite session needs to inspect the
- * received request to see if the request contains
- * features that it supports.
- * @param local_sdp If application has determined its media capability,
- * it can specify this capability in this argument.
- * If SDP is received in the initial INVITE, the UAS
- * capability specified in this argument doesn't have to
- * match the received offer; the SDP negotiator is able
- * to rearrange the media lines in the answer so that it
- * matches the offer.
- * @param options The options argument is bitmask combination of SIP
- * features in pjsip_inv_option enumeration.
- * @param p_inv Pointer to receive the newly created invite session.
- *
- * @return On successful, the invite session will be put in
- * p_inv argument and the function will return PJ_SUCCESS.
- * Otherwise the appropriate error status will be returned
- * on failure.
- */
- PJ_DECL(pj_status_t) pjsip_inv_create_uas(pjsip_dialog *dlg,
- pjsip_rx_data *rdata,
- const pjmedia_sdp_session *local_sdp,
- unsigned options,
- pjsip_inv_session **p_inv);
- /**
- * Add reference counter to the INVITE session. The reference counter controls
- * the life time of the session, ie. when the counter reaches zero, then it
- * will be destroyed.
- *
- * @param inv The INVITE session.
- * @return PJ_SUCCESS if the INVITE session reference counter
- * was increased.
- */
- PJ_DECL(pj_status_t) pjsip_inv_add_ref( pjsip_inv_session *inv );
- /**
- * Decrement reference counter of the INVITE session.
- * When the session is no longer used, it will be destroyed and
- * caller is informed with PJ_EGONE return status.
- *
- * @param inv The INVITE session.
- * @return PJ_SUCCESS if the INVITE session reference counter
- * was decreased. A status PJ_EGONE will be returned to
- * inform that session is destroyed.
- */
- PJ_DECL(pj_status_t) pjsip_inv_dec_ref( pjsip_inv_session *inv );
- /**
- * Forcefully terminate and destroy INVITE session, regardless of
- * the state of the session. Note that this function should only be used
- * when there is failure in the INVITE session creation. After the
- * invite session has been created and initialized, normally application
- * SHOULD use #pjsip_inv_end_session() to end the INVITE session instead.
- *
- * Note also that this function may terminate the underlying dialog, if
- * there are no other sessions in the dialog.
- *
- * @param inv The invite session.
- * @param st_code Status code for the reason of the termination.
- * @param notify If set to non-zero, then on_state_changed()
- * callback will be called.
- *
- * @return PJ_SUCCESS if the INVITE session has been
- * terminated.
- */
- PJ_DECL(pj_status_t) pjsip_inv_terminate( pjsip_inv_session *inv,
- int st_code,
- pj_bool_t notify );
- /**
- * Restart UAC session and prepare the session for a new initial INVITE.
- * This function can be called for example when the application wants to
- * follow redirection response with a new call reusing this session so
- * that the new call will have the same Call-ID and From headers. After
- * the session is restarted, application may create and send a new INVITE
- * request.
- *
- * @param inv The invite session.
- * @param new_offer Should be set to PJ_TRUE since the application will
- * restart the session.
- *
- * @return PJ_SUCCESS on successful operation.
- */
- PJ_DECL(pj_status_t) pjsip_inv_uac_restart(pjsip_inv_session *inv,
- pj_bool_t new_offer);
- /**
- * Accept or reject redirection response. Application MUST call this function
- * after it signaled PJSIP_REDIRECT_PENDING in the \a on_redirected()
- * callback, to notify the invite session whether to accept or reject the
- * redirection to the current target. Application can use the combination of
- * PJSIP_REDIRECT_PENDING command in \a on_redirected() callback and this
- * function to ask for user permission before redirecting the call.
- *
- * Note that if the application chooses to reject or stop redirection (by
- * using PJSIP_REDIRECT_REJECT or PJSIP_REDIRECT_STOP respectively), the
- * session disconnection callback will be called before this function returns.
- * And if the application rejects the target, the \a on_redirected() callback
- * may also be called before this function returns if there is another target
- * to try.
- *
- * @param inv The invite session.
- * @param cmd Redirection operation. The semantic of this argument
- * is similar to the description in the \a on_redirected()
- * callback, except that the PJSIP_REDIRECT_PENDING is
- * not accepted here.
- * @param e Should be set to NULL.
- *
- * @return PJ_SUCCESS on successful operation.
- */
- PJ_DECL(pj_status_t) pjsip_inv_process_redirect(pjsip_inv_session *inv,
- pjsip_redirect_op cmd,
- pjsip_event *e);
- /**
- * Create the initial INVITE request for this session. This function can only
- * be called for UAC session. If local media capability is specified when
- * the invite session was created, then this function will put an SDP offer
- * in the outgoing INVITE request. Otherwise the outgoing request will not
- * contain SDP body.
- *
- * @param inv The UAC invite session.
- * @param p_tdata The initial INVITE request will be put in this
- * argument if it can be created successfully.
- *
- * @return PJ_SUCCESS if the INVITE request can be created.
- */
- PJ_DECL(pj_status_t) pjsip_inv_invite( pjsip_inv_session *inv,
- pjsip_tx_data **p_tdata );
- /**
- * Create the initial response message for the incoming INVITE request in
- * rdata with status code st_code and optional status text st_text. Use
- * #pjsip_inv_answer() to create subsequent response message.
- *
- * When this function returning non-PJ_SUCCESS, it may be caused by an
- * unacceptable INVITE request. In such cases the function will generate
- * an appropriate answer in p_tdata,
- * e.g: when session timer header Session-Expires is too low,
- * the generated answer will include Min-SE header.
- * If the generated answer is not sent, it must be destroyed.
- * i.e: using #pjsip_tx_data_dec_ref(), to avoid resource leak.
- *
- * @param inv The UAS invite session.
- * @param rdata The incoming request message.
- * @param st_code The st_code contains the status code to be sent,
- * which may be a provisional or final response.
- * @param st_text If custom status text is desired, application can
- * specify the text in st_text; otherwise if this
- * argument is NULL, default status text will be used.
- * @param sdp If application has specified its media capability
- * during creation of UAS invite session, the sdp
- * argument MUST be NULL. This is because application
- * can not perform more than one SDP offer/answer session
- * in a single INVITE transaction.
- * If application has not specified its media capability
- * during creation of UAS invite session, it MAY or MUST
- * specify its capability in sdp argument,
- * depending whether st_code indicates a 2xx final
- * response.
- * @param p_tdata Pointer to receive the response message created by
- * this function.
- *
- * @return PJ_SUCCESS if response message was created
- * successfully.
- */
- PJ_DECL(pj_status_t) pjsip_inv_initial_answer( pjsip_inv_session *inv,
- pjsip_rx_data *rdata,
- int st_code,
- const pj_str_t *st_text,
- const pjmedia_sdp_session *sdp,
- pjsip_tx_data **p_tdata);
- /**
- * Create a response message to an INVITE request.
- *
- * @param inv The UAS invite session.
- * @param st_code The st_code contains the status code to be sent,
- * which may be a provisional or final response.
- * @param st_text If custom status text is desired, application can
- * specify the text in st_text; otherwise if this
- * argument is NULL, default status text will be used.
- * @param local_sdp If application has specified its media capability
- * during creation of UAS invite session, the local_sdp
- * argument MUST be NULL. This is because application
- * can not perform more than one SDP offer/answer session
- * in a single INVITE transaction.
- * If application has not specified its media capability
- * during creation of UAS invite session, it MAY or MUST
- * specify its capability in local_sdp argument,
- * depending whether st_code indicates a 2xx final
- * response.
- * @param p_tdata Pointer to receive the response message created by
- * this function.
- *
- * @return PJ_SUCCESS if response message was created
- * successfully.
- */
- PJ_DECL(pj_status_t) pjsip_inv_answer( pjsip_inv_session *inv,
- int st_code,
- const pj_str_t *st_text,
- const pjmedia_sdp_session *local_sdp,
- pjsip_tx_data **p_tdata );
- /**
- * Set local offer or answer depending on negotiator state (it may also
- * create a negotiator if it doesn't exist yet).
- *
- * @param inv The invite session.
- * @param sdp The SDP description which will be set as
- * an offer/answer to remote.
- *
- * @return PJ_SUCCESS if local offer/answer can be accepted by
- * SDP negotiator.
- */
- PJ_DECL(pj_status_t) pjsip_inv_set_local_sdp(pjsip_inv_session *inv,
- const pjmedia_sdp_session *sdp );
- /**
- * Set local answer to respond to remote SDP offer, to be carried by
- * subsequent response (or request).
- *
- * @param inv The invite session.
- * @param sdp The SDP description which will be set as answer
- * to remote.
- *
- * @return PJ_SUCCESS if local answer can be accepted by
- * SDP negotiator.
- */
- PJ_DECL(pj_status_t) pjsip_inv_set_sdp_answer(pjsip_inv_session *inv,
- const pjmedia_sdp_session *sdp );
- /**
- * Create a SIP message to initiate invite session termination. Depending on
- * the state of the session, this function may return CANCEL request,
- * a non-2xx final response, a BYE request, or even no request.
- *
- * For UAS, if the session has not answered the incoming INVITE, this function
- * creates the non-2xx final response with the specified status code in
- * \a st_code and optional status text in \a st_text.
- *
- * For UAC, if the original INVITE has not been answered with a final
- * response, the behavior depends on whether provisional response has been
- * received. If provisional response has been received, this function will
- * create CANCEL request. If no provisional response has been received, the
- * function will not create CANCEL request (the function will return
- * PJ_SUCCESS but the \a p_tdata will contain NULL) because we cannot send
- * CANCEL before receiving provisional response. If then a provisional
- * response is received, the invite session will send CANCEL automatically.
- *
- * For both UAC and UAS, if the INVITE session has been answered with final
- * response, a BYE request will be created.
- *
- * @param inv The invite session.
- * @param st_code Status code to be used for terminating the session.
- * @param st_text Optional status text.
- * @param p_tdata Pointer to receive the message to be created. Note
- * that it's possible to receive NULL here while the
- * function returns PJ_SUCCESS, see the description.
- *
- * @return PJ_SUCCESS if termination is initiated.
- */
- PJ_DECL(pj_status_t) pjsip_inv_end_session( pjsip_inv_session *inv,
- int st_code,
- const pj_str_t *st_text,
- pjsip_tx_data **p_tdata );
- /**
- * Create a CANCEL request for an ongoing re-INVITE transaction. If no
- * provisional response has been received, the function will not create
- * CANCEL request (the function will return PJ_SUCCESS but the \a p_tdata
- * will contain NULL) because we cannot send CANCEL before receiving
- * provisional response. If then a provisional response is received,
- * the invite session will send CANCEL automatically.
- *
- * @param inv The invite session.
- * @param p_tdata Pointer to receive the message to be created. Note
- * that it's possible to receive NULL here while the
- * function returns PJ_SUCCESS, see the description.
- *
- * @return PJ_SUCCESS if termination is initiated.
- */
- PJ_DECL(pj_status_t) pjsip_inv_cancel_reinvite( pjsip_inv_session *inv,
- pjsip_tx_data **p_tdata );
- /**
- * Create a re-INVITE request.
- *
- * @param inv The invite session.
- * @param new_contact If application wants to update its local contact and
- * inform peer to perform target refresh with a new
- * contact, it can specify the new contact in this
- * argument; otherwise this argument must be NULL.
- * @param new_offer Application MAY initiate a new SDP offer/answer
- * session in the request when there is no pending
- * answer to be sent or received. It can detect this
- * condition by observing the state of the SDP
- * negotiator of the invite session. If new offer
- * should be sent to remote, the offer must be specified
- * in this argument, otherwise it must be NULL.
- * @param p_tdata Pointer to receive the re-INVITE request message to
- * be created.
- *
- * @return PJ_SUCCESS if a re-INVITE request with the specified
- * characteristics (e.g. to contain new offer) can be
- * created.
- */
- PJ_DECL(pj_status_t) pjsip_inv_reinvite(pjsip_inv_session *inv,
- const pj_str_t *new_contact,
- const pjmedia_sdp_session *new_offer,
- pjsip_tx_data **p_tdata );
- /**
- * Create an UPDATE request to initiate new SDP offer.
- *
- * @param inv The invite session.
- * @param new_contact If application wants to update its local contact
- * and inform peer to perform target refresh with a new
- * contact, it can specify the new contact in this
- * argument; otherwise this argument must be NULL.
- * @param offer Offer to be sent to remote. This argument is
- * mandatory.
- * @param p_tdata Pointer to receive the UPDATE request message to
- * be created.
- *
- * @return PJ_SUCCESS if a UPDATE request with the specified
- * characteristics (e.g. to contain new offer) can be
- * created.
- */
- PJ_DECL(pj_status_t) pjsip_inv_update ( pjsip_inv_session *inv,
- const pj_str_t *new_contact,
- const pjmedia_sdp_session *offer,
- pjsip_tx_data **p_tdata );
- /**
- * Create an ACK request. Normally ACK request transmission is handled
- * by the framework. Application only needs to use this function if it
- * handles the ACK transmission manually, by overriding \a on_send_ack()
- * callback in #pjsip_inv_callback.
- *
- * Note that if the invite session has a pending offer to be answered
- * (for example when the last 2xx response to INVITE contains an offer),
- * application MUST have set the SDP answer with #pjsip_inv_set_sdp_answer()
- * prior to creating the ACK request. In this case, the ACK request
- * will be added with SDP message body.
- *
- * @param inv The invite session.
- * @param cseq Mandatory argument to specify the CSeq of the
- * ACK request. This value MUST match the value
- * of the INVITE transaction to be acknowledged.
- * @param p_tdata Pointer to receive the ACK request message to
- * be created.
- *
- * @return PJ_SUCCESS if ACK request has been created.
- */
- PJ_DECL(pj_status_t) pjsip_inv_create_ack(pjsip_inv_session *inv,
- int cseq,
- pjsip_tx_data **p_tdata);
- /**
- * Send request or response message in tdata.
- *
- * @param inv The invite session.
- * @param tdata The message to be sent.
- *
- * @return PJ_SUCCESS if transaction can be initiated
- * successfully to send this message. Note that the
- * actual final state of the transaction itself will
- * be reported later, in on_tsx_state_changed()
- * callback.
- */
- PJ_DECL(pj_status_t) pjsip_inv_send_msg(pjsip_inv_session *inv,
- pjsip_tx_data *tdata);
- /**
- * Get the invite session for the dialog, if any.
- *
- * @param dlg The dialog which invite session is being queried.
- *
- * @return The invite session instance which has been
- * associated with this dialog, or NULL.
- */
- PJ_DECL(pjsip_inv_session*) pjsip_dlg_get_inv_session(pjsip_dialog *dlg);
- /**
- * Get the invite session instance associated with transaction tsx, if any.
- *
- * @param tsx The transaction, which invite session is being
- * queried.
- *
- * @return The invite session instance which has been
- * associated with this transaction, or NULL.
- */
- PJ_DECL(pjsip_inv_session*) pjsip_tsx_get_inv_session(pjsip_transaction *tsx);
- /**
- * Get state names for INVITE session state.
- *
- * @param state The invite state.
- *
- * @return String describing the state.
- */
- PJ_DECL(const char *) pjsip_inv_state_name(pjsip_inv_state state);
- /**
- * This is a utility function to create SIP body for SDP content.
- *
- * @param pool Pool to allocate memory.
- * @param sdp SDP session to be put in the SIP message body.
- * @param p_body Pointer to receive SIP message body containing
- * the SDP session.
- *
- * @return PJ_SUCCESS on success.
- */
- PJ_DECL(pj_status_t) pjsip_create_sdp_body(pj_pool_t *pool,
- pjmedia_sdp_session *sdp,
- pjsip_msg_body **p_body);
- /**
- * This is a utility function to create a multipart body with the
- * SIP body as the first part.
- *
- * @param pool Pool to allocate memory.
- * @param sdp SDP session to be put in the SIP message body.
- * @param p_body Pointer to receive SIP message body containing
- * the SDP session.
- *
- * @return PJ_SUCCESS on success.
- */
- PJ_DECL(pj_status_t) pjsip_create_multipart_sdp_body( pj_pool_t *pool,
- pjmedia_sdp_session *sdp,
- pjsip_msg_body **p_body);
- /**
- * Retrieve SDP information from a message body. Application should
- * prefer to use this function rather than parsing the SDP manually since
- * this function supports multipart message body.
- *
- * This function will only parse the SDP once, the first time it is called
- * on the same message. Subsequent call on the same message will just pick
- * up the already parsed SDP from the message.
- *
- * @param pool Pool to allocate memory.
- * @param body The message body.
- * @param msg_media_type From the rdata or tdata Content-Type header, if available.
- * If NULL, the content_type from the body will be used.
- * @param search_media_type The media type to search for.
- * If NULL, "application/sdp" will be used.
- *
- * @return The SDP info.
- */
- PJ_DECL(pjsip_sdp_info*) pjsip_get_sdp_info(pj_pool_t *pool,
- pjsip_msg_body *body,
- pjsip_media_type *msg_media_type,
- const pjsip_media_type *search_media_type);
- /**
- * Retrieve SDP information from an incoming message. Application should
- * prefer to use this function rather than parsing the SDP manually since
- * this function supports multipart message body.
- *
- * This function will only parse the SDP once, the first time it is called
- * on the same message. Subsequent call on the same message will just pick
- * up the already parsed SDP from the message.
- *
- * @param rdata The incoming message.
- *
- * @return The SDP info.
- */
- PJ_DECL(pjsip_rdata_sdp_info*) pjsip_rdata_get_sdp_info(pjsip_rx_data *rdata);
- /**
- * Retrieve SDP information from an incoming message. Application should
- * prefer to use this function rather than parsing the SDP manually since
- * this function supports multipart message body.
- *
- * This function will only parse the SDP once, the first time it is called
- * on the same message. Subsequent call on the same message will just pick
- * up the already parsed SDP from the message.
- *
- * @param rdata The incoming message.
- * @param search_media_type The SDP media type to search for.
- * If NULL, "application/sdp" will be used.
- *
- * @return The SDP info.
- */
- PJ_DECL(pjsip_rdata_sdp_info*) pjsip_rdata_get_sdp_info2(
- pjsip_rx_data *rdata,
- const pjsip_media_type *search_media_type);
- /**
- * Retrieve SDP information from an outgoing message. Application should
- * prefer to use this function rather than parsing the SDP manually since
- * this function supports multipart message body.
- *
- * This function will only parse the SDP once, the first time it is called
- * on the same message. Subsequent call on the same message will just pick
- * up the already parsed SDP from the message.
- *
- * @param tdata The outgoing message.
- *
- * @return The SDP info.
- */
- PJ_DECL(pjsip_tdata_sdp_info*) pjsip_tdata_get_sdp_info(pjsip_tx_data *tdata);
- /**
- * Retrieve SDP information from an outgoing message. Application should
- * prefer to use this function rather than parsing the SDP manually since
- * this function supports multipart message body.
- *
- * This function will only parse the SDP once, the first time it is called
- * on the same message. Subsequent call on the same message will just pick
- * up the already parsed SDP from the message.
- *
- * @param tdata The outgoing message.
- * @param search_media_type The SDP media type to search for.
- * If NULL, "application/sdp" will be used.
- *
- * @return The SDP info.
- */
- PJ_DECL(pjsip_tdata_sdp_info*) pjsip_tdata_get_sdp_info2(
- pjsip_tx_data *tdata,
- const pjsip_media_type *search_media_type);
- PJ_END_DECL
- /**
- * @}
- */
- #endif /* __SIP_INVITE_SESSION_H__ */
|