Loading services/java/com/android/server/sip/SipSessionGroup.java +43 −25 Original line number Diff line number Diff line Loading @@ -620,6 +620,7 @@ class SipSessionGroup implements SipListener { Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST); return true; } else if (evt instanceof TransactionTerminatedEvent) { if (isCurrentTransaction((TransactionTerminatedEvent) evt)) { if (evt instanceof TimeoutEvent) { processTimeout((TimeoutEvent) evt); } else { Loading @@ -627,6 +628,7 @@ class SipSessionGroup implements SipListener { (TransactionTerminatedEvent) evt); } return true; } } else if (isRequestEvent(Request.OPTIONS, evt)) { mSipHelper.sendResponse((RequestEvent) evt, Response.OK); return true; Loading @@ -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) { Loading @@ -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: Loading Loading @@ -1000,18 +1018,18 @@ class SipSessionGroup implements SipListener { Response response = event.getResponse(); int statusCode = response.getStatusCode(); if (expectResponse(Request.CANCEL, evt)) { switch (statusCode) { case Response.OK: if (statusCode == Response.OK) { // do nothing; wait for REQUEST_TERMINATED return true; case Response.REQUEST_TERMINATED: endCallNormally(); return true; } } else if (expectResponse(Request.INVITE, evt)) { if (statusCode == Response.OK) { switch (statusCode) { case Response.OK: outgoingCall(evt); // abort Cancel return true; case Response.REQUEST_TERMINATED: endCallNormally(); return true; } } else { return false; Loading telephony/java/com/android/internal/telephony/sip/SipPhone.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
services/java/com/android/server/sip/SipSessionGroup.java +43 −25 Original line number Diff line number Diff line Loading @@ -620,6 +620,7 @@ class SipSessionGroup implements SipListener { Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST); return true; } else if (evt instanceof TransactionTerminatedEvent) { if (isCurrentTransaction((TransactionTerminatedEvent) evt)) { if (evt instanceof TimeoutEvent) { processTimeout((TimeoutEvent) evt); } else { Loading @@ -627,6 +628,7 @@ class SipSessionGroup implements SipListener { (TransactionTerminatedEvent) evt); } return true; } } else if (isRequestEvent(Request.OPTIONS, evt)) { mSipHelper.sendResponse((RequestEvent) evt, Response.OK); return true; Loading @@ -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) { Loading @@ -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: Loading Loading @@ -1000,18 +1018,18 @@ class SipSessionGroup implements SipListener { Response response = event.getResponse(); int statusCode = response.getStatusCode(); if (expectResponse(Request.CANCEL, evt)) { switch (statusCode) { case Response.OK: if (statusCode == Response.OK) { // do nothing; wait for REQUEST_TERMINATED return true; case Response.REQUEST_TERMINATED: endCallNormally(); return true; } } else if (expectResponse(Request.INVITE, evt)) { if (statusCode == Response.OK) { switch (statusCode) { case Response.OK: outgoingCall(evt); // abort Cancel return true; case Response.REQUEST_TERMINATED: endCallNormally(); return true; } } else { return false; Loading
telephony/java/com/android/internal/telephony/sip/SipPhone.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading