SIP: misc fixes
+ check REQUEST_TERMINATED response on INVITE not CANCEL, + check if a TransactionTerminatedEvent matches the ongoing transaction, + add log to track SipConnection disconnect events. Change-Id: I28325be62ac44e4a7507d3c4b5b78b066c0ea2ad
This commit is contained in:
@@ -620,13 +620,15 @@ class SipSessionGroup implements SipListener {
|
|||||||
Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST);
|
Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST);
|
||||||
return true;
|
return true;
|
||||||
} else if (evt instanceof TransactionTerminatedEvent) {
|
} else if (evt instanceof TransactionTerminatedEvent) {
|
||||||
if (evt instanceof TimeoutEvent) {
|
if (isCurrentTransaction((TransactionTerminatedEvent) evt)) {
|
||||||
processTimeout((TimeoutEvent) evt);
|
if (evt instanceof TimeoutEvent) {
|
||||||
} else {
|
processTimeout((TimeoutEvent) evt);
|
||||||
processTransactionTerminated(
|
} else {
|
||||||
(TransactionTerminatedEvent) evt);
|
processTransactionTerminated(
|
||||||
|
(TransactionTerminatedEvent) evt);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
} else if (isRequestEvent(Request.OPTIONS, evt)) {
|
} else if (isRequestEvent(Request.OPTIONS, evt)) {
|
||||||
mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
|
mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
|
||||||
return true;
|
return true;
|
||||||
@@ -646,6 +648,34 @@ class SipSessionGroup implements SipListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isCurrentTransaction(TransactionTerminatedEvent event) {
|
||||||
|
Transaction current = event.isServerTransaction()
|
||||||
|
? mServerTransaction
|
||||||
|
: mClientTransaction;
|
||||||
|
Transaction target = event.isServerTransaction()
|
||||||
|
? event.getServerTransaction()
|
||||||
|
: event.getClientTransaction();
|
||||||
|
|
||||||
|
if ((current != target) && (mState != SipSession.State.PINGING)) {
|
||||||
|
Log.d(TAG, "not the current transaction; current="
|
||||||
|
+ toString(current) + ", target=" + toString(target));
|
||||||
|
return false;
|
||||||
|
} else if (current != null) {
|
||||||
|
Log.d(TAG, "transaction terminated: " + toString(current));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String toString(Transaction transaction) {
|
||||||
|
if (transaction == null) return "null";
|
||||||
|
Request request = transaction.getRequest();
|
||||||
|
Dialog dialog = transaction.getDialog();
|
||||||
|
CSeqHeader cseq = (CSeqHeader) request.getHeader(CSeqHeader.NAME);
|
||||||
|
return String.format("req=%s,%s,s=%s,ds=%s,", request.getMethod(),
|
||||||
|
cseq.getSeqNumber(), transaction.getState(),
|
||||||
|
((dialog == null) ? "-" : dialog.getState()));
|
||||||
|
}
|
||||||
|
|
||||||
private void processTransactionTerminated(
|
private void processTransactionTerminated(
|
||||||
TransactionTerminatedEvent event) {
|
TransactionTerminatedEvent event) {
|
||||||
switch (mState) {
|
switch (mState) {
|
||||||
@@ -661,19 +691,7 @@ class SipSessionGroup implements SipListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void processTimeout(TimeoutEvent event) {
|
private void processTimeout(TimeoutEvent event) {
|
||||||
Log.d(TAG, "processing Timeout..." + event);
|
Log.d(TAG, "processing Timeout...");
|
||||||
Transaction current = event.isServerTransaction()
|
|
||||||
? mServerTransaction
|
|
||||||
: mClientTransaction;
|
|
||||||
Transaction target = event.isServerTransaction()
|
|
||||||
? event.getServerTransaction()
|
|
||||||
: event.getClientTransaction();
|
|
||||||
|
|
||||||
if ((current != target) && (mState != SipSession.State.PINGING)) {
|
|
||||||
Log.d(TAG, "not the current transaction; current=" + current
|
|
||||||
+ ", timed out=" + target);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (mState) {
|
switch (mState) {
|
||||||
case SipSession.State.REGISTERING:
|
case SipSession.State.REGISTERING:
|
||||||
case SipSession.State.DEREGISTERING:
|
case SipSession.State.DEREGISTERING:
|
||||||
@@ -1000,19 +1018,19 @@ class SipSessionGroup implements SipListener {
|
|||||||
Response response = event.getResponse();
|
Response response = event.getResponse();
|
||||||
int statusCode = response.getStatusCode();
|
int statusCode = response.getStatusCode();
|
||||||
if (expectResponse(Request.CANCEL, evt)) {
|
if (expectResponse(Request.CANCEL, evt)) {
|
||||||
|
if (statusCode == Response.OK) {
|
||||||
|
// do nothing; wait for REQUEST_TERMINATED
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (expectResponse(Request.INVITE, evt)) {
|
||||||
switch (statusCode) {
|
switch (statusCode) {
|
||||||
case Response.OK:
|
case Response.OK:
|
||||||
// do nothing; wait for REQUEST_TERMINATED
|
outgoingCall(evt); // abort Cancel
|
||||||
return true;
|
return true;
|
||||||
case Response.REQUEST_TERMINATED:
|
case Response.REQUEST_TERMINATED:
|
||||||
endCallNormally();
|
endCallNormally();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (expectResponse(Request.INVITE, evt)) {
|
|
||||||
if (statusCode == Response.OK) {
|
|
||||||
outgoingCall(evt); // abort Cancel
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -590,7 +590,10 @@ public class SipPhone extends SipPhoneBase {
|
|||||||
// set state to DISCONNECTED only when all conns are disconnected
|
// set state to DISCONNECTED only when all conns are disconnected
|
||||||
if (state != State.DISCONNECTED) {
|
if (state != State.DISCONNECTED) {
|
||||||
boolean allConnectionsDisconnected = true;
|
boolean allConnectionsDisconnected = true;
|
||||||
|
Log.v(LOG_TAG, "---check if all connections are disconnected: "
|
||||||
|
+ connections.size());
|
||||||
for (Connection c : connections) {
|
for (Connection c : connections) {
|
||||||
|
Log.v(LOG_TAG, " state=" + c.getState() + ": " + c);
|
||||||
if (c.getState() != State.DISCONNECTED) {
|
if (c.getState() != State.DISCONNECTED) {
|
||||||
allConnectionsDisconnected = false;
|
allConnectionsDisconnected = false;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user