summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-12-08 08:18:02 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-12-08 08:18:02 +0000
commitacd5a28545b4d6d037650c4bb9d04b7aa0bc8244 (patch)
treedbb4120d921788eb61add0a9228e91c65ea9f3fc
parent94ea88d817f045c17820c5a16ae15684bbb81cca (diff)
Re #1419: updated call transfer to allow both the transferee and the transfer destination to update the current call setting:
- for transferee (attended & unattended): via new PJSUA-LIB callback on_call_transfer_request2() - for transfer destination (attended only): via new PJSUA-LIB callback on_call_replace_request2() git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3903 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h123
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c36
2 files changed, 114 insertions, 45 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index b043f266..f8789307 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -566,6 +566,43 @@ typedef enum pjsua_create_media_transport_flag
/**
+ * Call settings.
+ */
+typedef struct pjsua_call_setting
+{
+ /**
+ * Bitmask of #pjsua_call_flag constants.
+ *
+ * Default: 0
+ */
+ unsigned flag;
+
+ /**
+ * This flag controls what methods to request keyframe are allowed on
+ * the call. Value is bitmask of #pjsua_vid_req_keyframe_method.
+ */
+ unsigned req_keyframe_method;
+
+ /**
+ * Number of simultaneous active audio streams for this call. Setting
+ * this to zero will disable audio in this call.
+ *
+ * Default: 1
+ */
+ unsigned audio_cnt;
+
+ /**
+ * Number of simultaneous active video streams for this call. Setting
+ * this to zero will disable video in this call.
+ *
+ * Default: 1 (if video feature is enabled, otherwise it is zero)
+ */
+ unsigned video_cnt;
+
+} pjsua_call_setting;
+
+
+/**
* This structure describes application callback to receive various event
* notification from PJSUA-API. All of these callbacks are OPTIONAL,
* although definitely application would want to implement some of
@@ -665,7 +702,8 @@ typedef struct pjsua_callback
* Application can decide to accept/reject transfer request
* by setting the code (default is 202). When this callback
* is not defined, the default behavior is to accept the
- * transfer.
+ * transfer. See also on_call_transfer_request2() callback for
+ * the version with \a pjsua_call_setting in the argument list.
*
* @param call_id The call index.
* @param dst The destination where the call will be
@@ -678,6 +716,26 @@ typedef struct pjsua_callback
pjsip_status_code *code);
/**
+ * Notify application on call being transfered (i.e. REFER is received).
+ * Application can decide to accept/reject transfer request
+ * by setting the code (default is 202). When this callback
+ * is not defined, the default behavior is to accept the
+ * transfer.
+ *
+ * @param call_id The call index.
+ * @param dst The destination where the call will be
+ * transfered to.
+ * @param code Status code to be returned for the call transfer
+ * request. On input, it contains status code 200.
+ * @param opt The current call setting, application can update
+ * this setting for the call being transfered.
+ */
+ void (*on_call_transfer_request2)(pjsua_call_id call_id,
+ const pj_str_t *dst,
+ pjsip_status_code *code,
+ pjsua_call_setting *opt);
+
+ /**
* Notify application of the status of previously sent call
* transfer request. Application can monitor the status of the
* call transfer request, for example to decide whether to
@@ -703,6 +761,8 @@ typedef struct pjsua_callback
/**
* Notify application about incoming INVITE with Replaces header.
* Application may reject the request by setting non-2xx code.
+ * See also on_call_replace_request2() callback for the version
+ * with \a pjsua_call_setting in the argument list.
*
* @param call_id The call ID to be replaced.
* @param rdata The incoming INVITE request to replace the call.
@@ -716,6 +776,24 @@ typedef struct pjsua_callback
pj_str_t *st_text);
/**
+ * Notify application about incoming INVITE with Replaces header.
+ * Application may reject the request by setting non-2xx code.
+ *
+ * @param call_id The call ID to be replaced.
+ * @param rdata The incoming INVITE request to replace the call.
+ * @param st_code Status code to be set by application. Application
+ * should only return a final status (200-699).
+ * @param st_text Optional status text to be set by application.
+ * @param opt The current call setting, application can update
+ * this setting for the call being replaced.
+ */
+ void (*on_call_replace_request2)(pjsua_call_id call_id,
+ pjsip_rx_data *rdata,
+ int *st_code,
+ pj_str_t *st_text,
+ pjsua_call_setting *opt);
+
+ /**
* Notify application that an existing call has been replaced with
* a new call. This happens when PJSUA-API receives incoming INVITE
* request with Replaces header.
@@ -3404,43 +3482,6 @@ typedef enum pjsua_vid_req_keyframe_method
/**
- * Call settings.
- */
-typedef struct pjsua_call_setting
-{
- /**
- * Bitmask of #pjsua_call_flag constants.
- *
- * Default: 0
- */
- unsigned flag;
-
- /**
- * This flag controls what methods to request keyframe are allowed on
- * the call. Value is bitmask of #pjsua_vid_req_keyframe_method.
- */
- unsigned req_keyframe_method;
-
- /**
- * Number of simultaneous active audio streams for this call. Setting
- * this to zero will disable audio in this call.
- *
- * Default: 1
- */
- unsigned audio_cnt;
-
- /**
- * Number of simultaneous active video streams for this call. Setting
- * this to zero will disable video in this call.
- *
- * Default: 1 (if video feature is enabled, otherwise it is zero)
- */
- unsigned video_cnt;
-
-} pjsua_call_setting;
-
-
-/**
* This structure describes the information and current status of a call.
*/
typedef struct pjsua_call_info
@@ -4066,7 +4107,8 @@ PJ_DECL(pj_status_t) pjsua_call_reinvite(pjsua_call_id call_id,
* the media state of the call has changed.
*
* @param call_id Call identification.
- * @param opt Optional call setting.
+ * @param opt Optional call setting, if NULL, the current call
+ * setting will remain unchanged.
* @param msg_data Optional message components to be sent with
* the request.
*
@@ -4096,7 +4138,8 @@ PJ_DECL(pj_status_t) pjsua_call_update(pjsua_call_id call_id,
* Send UPDATE request.
*
* @param call_id Call identification.
- * @param opt Optional call setting.
+ * @param opt Optional call setting, if NULL, the current call
+ * setting will remain unchanged.
* @param msg_data Optional message components to be sent with
* the request.
*
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 9c1c0500..15288538 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -964,7 +964,10 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
* about the request so that application can do subsequent checking
* if it wants to.
*/
- if (replaced_dlg != NULL && pjsua_var.ua_cfg.cb.on_call_replace_request) {
+ if (replaced_dlg != NULL &&
+ (pjsua_var.ua_cfg.cb.on_call_replace_request ||
+ pjsua_var.ua_cfg.cb.on_call_replace_request2))
+ {
pjsua_call *replaced_call;
int st_code = 200;
pj_str_t st_text = { "OK", 2 };
@@ -972,9 +975,22 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
/* Get the replaced call instance */
replaced_call = (pjsua_call*) replaced_dlg->mod_data[pjsua_var.mod.id];
+ /* Copy call setting from the replaced call */
+ call->opt = replaced_call->opt;
+
/* Notify application */
- pjsua_var.ua_cfg.cb.on_call_replace_request(replaced_call->index,
- rdata, &st_code, &st_text);
+ if (pjsua_var.ua_cfg.cb.on_call_replace_request) {
+ pjsua_var.ua_cfg.cb.on_call_replace_request(replaced_call->index,
+ rdata,
+ &st_code, &st_text);
+ }
+
+ if (pjsua_var.ua_cfg.cb.on_call_replace_request2) {
+ pjsua_var.ua_cfg.cb.on_call_replace_request2(replaced_call->index,
+ rdata,
+ &st_code, &st_text,
+ &call->opt);
+ }
/* Must specify final response */
PJ_ASSERT_ON_FAIL(st_code >= 200, st_code = 200);
@@ -3874,6 +3890,7 @@ static void on_call_transfered( pjsip_inv_session *inv,
pj_str_t tmp;
pjsip_status_code code;
pjsip_evsub *sub;
+ pjsua_call_setting call_opt;
pj_log_push_indent();
@@ -3910,10 +3927,19 @@ static void on_call_transfered( pjsip_inv_session *inv,
/* Notify callback */
code = PJSIP_SC_ACCEPTED;
- if (pjsua_var.ua_cfg.cb.on_call_transfer_request)
+ if (pjsua_var.ua_cfg.cb.on_call_transfer_request) {
(*pjsua_var.ua_cfg.cb.on_call_transfer_request)(existing_call->index,
&refer_to->hvalue,
&code);
+ }
+
+ call_opt = existing_call->opt;
+ if (pjsua_var.ua_cfg.cb.on_call_transfer_request2) {
+ (*pjsua_var.ua_cfg.cb.on_call_transfer_request2)(existing_call->index,
+ &refer_to->hvalue,
+ &code,
+ &call_opt);
+ }
if (code < 200)
code = PJSIP_SC_ACCEPTED;
@@ -4040,7 +4066,7 @@ static void on_call_transfered( pjsip_inv_session *inv,
/* Now make the outgoing call. */
tmp = pj_str(uri);
- status = pjsua_call_make_call(existing_call->acc_id, &tmp, 0,
+ status = pjsua_call_make_call(existing_call->acc_id, &tmp, &call_opt,
existing_call->user_data, &msg_data,
&new_call);
if (status != PJ_SUCCESS) {