summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_call.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-05-26 12:17:46 +0000
committerBenny Prijono <bennylp@teluu.com>2006-05-26 12:17:46 +0000
commitc01fdece34cb0eac0c1fdbafb5c1cc242ec01933 (patch)
treee48d300bf63489fd01dd66db8b75b8b49681be6d /pjsip/src/pjsua-lib/pjsua_call.c
parentb2627727779145512c9c414cb532cb7e18133ddd (diff)
First stage in pjsua library re-arrangements towards creating an easy to use high level API
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@476 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_call.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c136
1 files changed, 89 insertions, 47 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 4dbfb596..d6013a13 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -18,7 +18,7 @@
*/
#include <pjsua-lib/pjsua.h>
#include <pj/log.h>
-
+#include "pjsua_imp.h"
/*
* pjsua_call.c
@@ -56,7 +56,8 @@ static void call_on_timer(pj_timer_heap_t *ht, pj_timer_entry *e)
pjsua_call_hangup(call->index);
} else {
PJ_LOG(3,(THIS_FILE, "Refreshing call %d", call->index));
- schedule_call_timer(call,e,REFRESH_CALL_TIMER,pjsua.uas_refresh);
+ schedule_call_timer(call,e,REFRESH_CALL_TIMER,
+ pjsua.config.uas_refresh);
pjsua_call_reinvite(call->index);
}
@@ -126,15 +127,15 @@ static pj_status_t call_destroy_media(int call_index)
/**
* Make outgoing call.
*/
-pj_status_t pjsua_make_call(int acc_index,
- const char *cstr_dest_uri,
- int *p_call_index)
+PJ_DEF(pj_status_t) pjsua_make_call(int acc_index,
+ const char *cstr_dest_uri,
+ int *p_call_index)
{
pj_str_t dest_uri;
pjsip_dialog *dlg = NULL;
pjmedia_sdp_session *offer;
pjsip_inv_session *inv = NULL;
- int call_index = -1;
+ unsigned call_index;
pjsip_tx_data *tdata;
pj_status_t status;
@@ -143,12 +144,12 @@ pj_status_t pjsua_make_call(int acc_index,
dest_uri = pj_str((char*)cstr_dest_uri);
/* Find free call slot. */
- for (call_index=0; call_index<pjsua.max_calls; ++call_index) {
+ for (call_index=0; call_index<pjsua.config.max_calls; ++call_index) {
if (pjsua.calls[call_index].inv == NULL)
break;
}
- if (call_index == pjsua.max_calls) {
+ if (call_index == pjsua.config.max_calls) {
PJ_LOG(3,(THIS_FILE, "Error: too many calls!"));
return PJ_ETOOMANY;
}
@@ -161,8 +162,8 @@ pj_status_t pjsua_make_call(int acc_index,
/* Create outgoing dialog: */
status = pjsip_dlg_create_uac( pjsip_ua_instance(),
- &pjsua.acc[acc_index].local_uri,
- &pjsua.acc[acc_index].contact_uri,
+ &pjsua.config.acc_config[acc_index].id,
+ &pjsua.config.acc_config[acc_index].contact,
&dest_uri, &dest_uri,
&dlg);
if (status != PJ_SUCCESS) {
@@ -204,9 +205,12 @@ pj_status_t pjsua_make_call(int acc_index,
/* Set credentials: */
-
- pjsip_auth_clt_set_credentials( &dlg->auth_sess, pjsua.cred_count,
- pjsua.cred_info);
+ if (pjsua.config.acc_config[acc_index].cred_count) {
+ pjsua_acc_config *acc_cfg = &pjsua.config.acc_config[acc_index];
+ pjsip_auth_clt_set_credentials( &dlg->auth_sess,
+ acc_cfg->cred_count,
+ acc_cfg->cred_info);
+ }
/* Create initial INVITE: */
@@ -225,6 +229,12 @@ pj_status_t pjsua_make_call(int acc_index,
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Unable to send initial INVITE request",
status);
+
+ /* Upon failure to send first request, both dialog and invite
+ * session would have been cleared.
+ */
+ inv = NULL;
+ dlg = NULL;
goto on_error;
}
@@ -242,7 +252,7 @@ pj_status_t pjsua_make_call(int acc_index,
on_error:
if (inv != NULL) {
pjsip_inv_terminate(inv, PJSIP_SC_OK, PJ_FALSE);
- } else {
+ } else if (dlg) {
pjsip_dlg_terminate(dlg);
}
@@ -254,6 +264,36 @@ on_error:
/**
+ * Answer call.
+ */
+PJ_DEF(void) pjsua_call_answer(int call_index, int code)
+{
+ pjsip_tx_data *tdata;
+ pj_status_t status;
+
+ PJ_ASSERT_ON_FAIL(call_index >= 0 &&
+ call_index < (int)pjsua.config.max_calls,
+ return);
+
+ if (pjsua.calls[call_index].inv == NULL) {
+ PJ_LOG(3,(THIS_FILE, "Call %d already disconnected"));
+ return;
+ }
+
+ status = pjsip_inv_answer(pjsua.calls[call_index].inv,
+ code, NULL, NULL, &tdata);
+ if (status == PJ_SUCCESS)
+ status = pjsip_inv_send_msg(pjsua.calls[call_index].inv,
+ tdata);
+
+ if (status != PJ_SUCCESS)
+ pjsua_perror(THIS_FILE, "Unable to create/send response",
+ status);
+
+}
+
+
+/**
* Handle incoming INVITE request.
*/
pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
@@ -265,7 +305,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
unsigned options = 0;
pjsip_inv_session *inv = NULL;
int acc_index;
- int call_index = -1;
+ unsigned call_index;
pjmedia_sdp_session *answer;
pj_status_t status;
@@ -312,7 +352,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
*/
/* Find free call slot. */
- for (call_index=0; call_index < pjsua.max_calls; ++call_index) {
+ for (call_index=0; call_index < pjsua.config.max_calls; ++call_index) {
if (pjsua.calls[call_index].inv == NULL)
break;
}
@@ -353,7 +393,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
/* Create dialog: */
status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,
- &pjsua.acc[acc_index].contact_uri,
+ &pjsua.config.acc_config[acc_index].contact,
&dlg);
if (status != PJ_SUCCESS) {
pjsip_endpt_respond_stateless(pjsua.endpt, rdata, 500, NULL,
@@ -387,8 +427,8 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
*/
status = pjsip_inv_initial_answer(inv, rdata,
- (pjsua.auto_answer ? pjsua.auto_answer
- : 100),
+ (pjsua.config.auto_answer ?
+ pjsua.config.auto_answer : 100),
NULL, NULL, &response);
if (status != PJ_SUCCESS) {
@@ -400,7 +440,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
/* If failed to send 2xx response, there's a good chance that it is
* because SDP negotiation has failed.
*/
- if (pjsua.auto_answer/100 == 2)
+ if (pjsua.config.auto_answer/100 == 2)
st_code = PJSIP_SC_UNSUPPORTED_MEDIA_TYPE;
else
st_code = 500;
@@ -415,7 +455,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
pjsua_perror(THIS_FILE, "Unable to send 100 response", status);
}
- if (pjsua.auto_answer < 200) {
+ if (pjsua.config.auto_answer < 200) {
PJ_LOG(3,(THIS_FILE,
"\nIncoming call!!\n"
"From: %.*s\n"
@@ -432,26 +472,26 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
dlg->remote.info_str.ptr,
(int)dlg->local.info_str.slen,
dlg->local.info_str.ptr,
- pjsua.auto_answer,
- pjsip_get_status_text(pjsua.auto_answer)->ptr ));
+ pjsua.config.auto_answer,
+ pjsip_get_status_text(pjsua.config.auto_answer)->ptr ));
}
++pjsua.call_cnt;
/* Schedule timer to refresh. */
- if (pjsua.uas_refresh > 0) {
+ if (pjsua.config.uas_refresh > 0) {
schedule_call_timer( &pjsua.calls[call_index],
&pjsua.calls[call_index].refresh_tm,
REFRESH_CALL_TIMER,
- pjsua.uas_refresh);
+ pjsua.config.uas_refresh);
}
/* Schedule timer to hangup call. */
- if (pjsua.uas_duration > 0) {
+ if (pjsua.config.uas_duration > 0) {
schedule_call_timer( &pjsua.calls[call_index],
&pjsua.calls[call_index].hangup_tm,
HANGUP_CALL_TIMER,
- pjsua.uas_duration);
+ pjsua.config.uas_duration);
}
/* This INVITE request has been handled. */
@@ -550,7 +590,8 @@ static void pjsua_call_on_state_changed(pjsip_inv_session *inv,
}
- pjsua_ui_on_call_state(call->index, e);
+ if (pjsua.cb.on_call_state)
+ (*pjsua.cb.on_call_state)(call->index, e);
/* call->inv may be NULL now */
@@ -965,7 +1006,7 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
return;
}
- if (pjsua.null_audio)
+ if (pjsua.config.null_audio)
return;
/* Create media session info based on SDP parameters.
@@ -983,9 +1024,10 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
}
/* Override ptime, if this option is specified. */
- if (pjsua.ptime) {
+ if (pjsua.config.ptime) {
sess_info.stream_info[0].param->setting.frm_per_pkt = (pj_uint8_t)
- (pjsua.ptime / sess_info.stream_info[0].param->info.frm_ptime);
+ (pjsua.config.ptime /
+ sess_info.stream_info[0].param->info.frm_ptime);
if (sess_info.stream_info[0].param->setting.frm_per_pkt==0)
sess_info.stream_info[0].param->setting.frm_per_pkt = 1;
}
@@ -1037,7 +1079,7 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
/* If auto-play is configured, connect the call to the file player
* port
*/
- if (pjsua.auto_play && pjsua.wav_file &&
+ if (pjsua.config.auto_play && pjsua.config.wav_file.slen &&
call->inv->role == PJSIP_ROLE_UAS)
{
@@ -1045,19 +1087,19 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
call->conf_slot, 0);
}
- if (pjsua.auto_loop && call->inv->role == PJSIP_ROLE_UAS) {
+ if (pjsua.config.auto_loop && call->inv->role == PJSIP_ROLE_UAS) {
pjmedia_conf_connect_port( pjsua.mconf, call->conf_slot,
call->conf_slot, 0);
}
- if (pjsua.auto_conf) {
- int i;
+ if (pjsua.config.auto_conf) {
+ unsigned i;
pjmedia_conf_connect_port( pjsua.mconf, 0, call->conf_slot, 0);
pjmedia_conf_connect_port( pjsua.mconf, call->conf_slot, 0, 0);
- for (i=0; i < pjsua.max_calls; ++i) {
+ for (i=0; i < pjsua.config.max_calls; ++i) {
if (!pjsua.calls[i].session)
continue;
@@ -1073,8 +1115,8 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
/* Normal operation: if no auto_xx is given, connect new call to
* the sound device port (port zero) in the main conference bridge.
*/
- if (pjsua.auto_play == 0 && pjsua.auto_loop == 0 &&
- pjsua.auto_conf == 0)
+ if (pjsua.config.auto_play == 0 && pjsua.config.auto_loop == 0 &&
+ pjsua.config.auto_conf == 0)
{
pjmedia_conf_connect_port( pjsua.mconf, 0, call->conf_slot, 0);
pjmedia_conf_connect_port( pjsua.mconf, call->conf_slot, 0, 0);
@@ -1127,7 +1169,7 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
/*
* Hangup call.
*/
-void pjsua_call_hangup(int call_index)
+PJ_DEF(void) pjsua_call_hangup(int call_index)
{
pjsua_call *call;
int code;
@@ -1177,7 +1219,7 @@ void pjsua_call_hangup(int call_index)
/*
* Put call on-Hold.
*/
-void pjsua_call_set_hold(int call_index)
+PJ_DEF(void) pjsua_call_set_hold(int call_index)
{
pjmedia_sdp_session *sdp;
pjsua_call *call;
@@ -1218,7 +1260,7 @@ void pjsua_call_set_hold(int call_index)
/*
* re-INVITE.
*/
-void pjsua_call_reinvite(int call_index)
+PJ_DEF(void) pjsua_call_reinvite(int call_index)
{
pjmedia_sdp_session *sdp;
pjsip_tx_data *tdata;
@@ -1265,7 +1307,7 @@ void pjsua_call_reinvite(int call_index)
/*
* Transfer call.
*/
-void pjsua_call_xfer(int call_index, const char *dest)
+PJ_DEF(void) pjsua_call_xfer(int call_index, const char *dest)
{
pjsip_evsub *sub;
pjsip_tx_data *tdata;
@@ -1317,7 +1359,7 @@ void pjsua_call_xfer(int call_index, const char *dest)
/**
* Send instant messaging inside INVITE session.
*/
-void pjsua_call_send_im(int call_index, const char *str)
+PJ_DECL(void) pjsua_call_send_im(int call_index, const char *str)
{
pjsua_call *call;
const pj_str_t mime_text = pj_str("text");
@@ -1373,7 +1415,7 @@ on_return:
/**
* Send IM typing indication inside INVITE session.
*/
-void pjsua_call_typing(int call_index, pj_bool_t is_typing)
+PJ_DECL(void) pjsua_call_typing(int call_index, pj_bool_t is_typing)
{
pjsua_call *call;
pjsip_tx_data *tdata;
@@ -1415,11 +1457,11 @@ on_return:
/*
* Terminate all calls.
*/
-void pjsua_call_hangup_all(void)
+PJ_DEF(void) pjsua_call_hangup_all(void)
{
- int i;
+ unsigned i;
- for (i=0; i<pjsua.max_calls; ++i) {
+ for (i=0; i<pjsua.config.max_calls; ++i) {
pjsip_tx_data *tdata;
int st_code;
pjsua_call *call;