I suspect the code in tsip_transac_layer.js, quoted below, is not working as
intended: When the code enters setTimeout(function ()
{o_transac.fsm_act(tsip_action_type_e.CANCEL, null); }, 1);} the calling object
o_transac may be changed again by the loop _before_ the function fires; this
happens if we at that time haven't reached the end of ao_transacs.
This causes my issue described below with multi-line support, and may cause
other issues.
tsip_transac_layer.prototype.cancel_by_dialog = function (o_dialog) {
if (!o_dialog) {
tsk_utils_log_error("Invalid argument");
return -1;
}
var o_transac = null;
while (this.b_locked){}
this.b_locked = true;
for (var i = 0; i < this.ao_transacs.length; ++i) {
o_transac = this.ao_transacs[i];
if (o_dialog.compare(o_transac.get_dialog()) == 0) {
// async call to avoid dealoc
setTimeout(function () { o_transac.fsm_act(tsip_action_type_e.CANCEL, null); }, 1);
}
}
this.b_locked = false;
return 0;
};
What steps will reproduce the problem?
1.
Adapt the demo-code to allow multi-line support; in the simplest case, change
your onSipEventStack to allow only 2 call sessions.
...
case 'i_new_call':
{
//e.newSession.hangup(); // comment this line for multi-line support
if (oSipSessionCall) {
oSipSessionCall2=e.newSession;
oSipSessionCall2.setConfiguration(oConfigCall);
}
else {
oSipSessionCall = e.newSession;
oSipSessionCall.setConfiguration(oConfigCall);
}
break;
}
...
2.
Start the sip-stack and register. Make two calls A and B TO your
SIPML5-sip-client. The Call A is made a few seconds before B.
3.
Hang Up (decline) Call A, // oSipSessionCall.hangup(oConfigCall);
Wait 3 seconds,
Answer Call B, // oSipSessionCall2.accept(oConfigCall);
What is the expected output? What do you see instead?
Expected: Call A should be terminated and Call B should be answered.
Actual: Call A is terminated, but trying to answer Call B results in error:
Failed to find associated server transaction.
SIPml-api.js:1
tsk_utils_log_error SIPml-api.js:1
tsip_dialog.response_send SIPml-api.js:3
tsip_dialog_invite.send_response SIPml-api.js:3
s0000_Ringing_2_Connected_X_Accept SIPml-api.js:3
tsk_fsm.act SIPml-api.js:1
tsip_dialog.fsm_act SIPml-api.js:3
tsip_session.__action_handle SIPml-api.js:3
tsip_session.__action_any SIPml-api.js:3
tsip_session.accept SIPml-api.js:3
SIPml.Session.accept SIPml-api.js:3
sipCall indexDemo.html:307
onclick
What version of the product are you using? On what operating system?
Windows, Chrome and SIPML5 1.3.214 but same error is seen with other platforms
and SIPML5 1.4
Please provide any additional information below.
The termination of A's dialog seemed to kill the invite-transaction associated
to B due to the code in tsip_transac_layer.js
a quick-fix was replacing
if (o_dialog.compare(o_transac.get_dialog()) == 0) {
// async call to avoid dealoc
setTimeout(function () { o_transac.fsm_act(tsip_action_type_e.CANCEL, null); }, 1);
}
with
if (o_dialog.compare(o_transac.get_dialog()) == 0) {
// async call to avoid dealoc
var tmp=o_transac
setTimeout(function () { tmp.fsm_act(tsip_action_type_e.CANCEL, null); }, 1);
}
Original issue reported on code.google.com by StefanEn...@gmail.com on 8 Apr 2014 at 8:30
Original issue reported on code.google.com by
StefanEn...@gmail.com
on 8 Apr 2014 at 8:30