summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/sip/SipSessionGroup.java68
-rwxr-xr-xtelephony/java/com/android/internal/telephony/sip/SipPhone.java3
2 files changed, 46 insertions, 25 deletions
diff --git a/services/java/com/android/server/sip/SipSessionGroup.java b/services/java/com/android/server/sip/SipSessionGroup.java
index faa7a60..3282c7f 100644
--- a/services/java/com/android/server/sip/SipSessionGroup.java
+++ b/services/java/com/android/server/sip/SipSessionGroup.java
@@ -620,13 +620,15 @@ class SipSessionGroup implements SipListener {
Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST);
return true;
} else if (evt instanceof TransactionTerminatedEvent) {
- if (evt instanceof TimeoutEvent) {
- processTimeout((TimeoutEvent) evt);
- } else {
- processTransactionTerminated(
- (TransactionTerminatedEvent) evt);
+ if (isCurrentTransaction((TransactionTerminatedEvent) evt)) {
+ if (evt instanceof TimeoutEvent) {
+ processTimeout((TimeoutEvent) evt);
+ } else {
+ processTransactionTerminated(
+ (TransactionTerminatedEvent) evt);
+ }
+ return true;
}
- return true;
} else if (isRequestEvent(Request.OPTIONS, evt)) {
mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
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(
TransactionTerminatedEvent event) {
switch (mState) {
@@ -661,19 +691,7 @@ class SipSessionGroup implements SipListener {
}
private void processTimeout(TimeoutEvent event) {
- Log.d(TAG, "processing Timeout..." + 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=" + current
- + ", timed out=" + target);
- return;
- }
+ Log.d(TAG, "processing Timeout...");
switch (mState) {
case SipSession.State.REGISTERING:
case SipSession.State.DEREGISTERING:
@@ -1000,19 +1018,19 @@ class SipSessionGroup implements SipListener {
Response response = event.getResponse();
int statusCode = response.getStatusCode();
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) {
case Response.OK:
- // do nothing; wait for REQUEST_TERMINATED
+ outgoingCall(evt); // abort Cancel
return true;
case Response.REQUEST_TERMINATED:
endCallNormally();
return true;
}
- } else if (expectResponse(Request.INVITE, evt)) {
- if (statusCode == Response.OK) {
- outgoingCall(evt); // abort Cancel
- return true;
- }
} else {
return false;
}
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
index e7aaffe..999da9f 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
@@ -590,7 +590,10 @@ public class SipPhone extends SipPhoneBase {
// set state to DISCONNECTED only when all conns are disconnected
if (state != State.DISCONNECTED) {
boolean allConnectionsDisconnected = true;
+ Log.v(LOG_TAG, "---check if all connections are disconnected: "
+ + connections.size());
for (Connection c : connections) {
+ Log.v(LOG_TAG, " state=" + c.getState() + ": " + c);
if (c.getState() != State.DISCONNECTED) {
allConnectionsDisconnected = false;
break;