SIP: minor fixes.
+ Log error instead of crashing app process in SipManager's ListenerRelay.
+ Terminate dialog and transaction in SipSessionGroup.reset().
+ Remove redundant reset() in SipSessionGroup.
Change-Id: Ifbf29d2c9607ffe1a1a50b0c131ee3a4e81a0d0e
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
index a589fe9..bd859e8 100644
--- a/voip/java/android/net/sip/SipManager.java
+++ b/voip/java/android/net/sip/SipManager.java
@@ -23,6 +23,7 @@
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.util.Log;
import java.text.ParseException;
@@ -83,6 +84,8 @@
/** Part of the incoming call intent. */
public static final String EXTRA_OFFER_SD = "android:sipOfferSD";
+ private static final String TAG = "SipManager";
+
private ISipService mSipService;
private Context mContext;
@@ -525,8 +528,10 @@
return ((session == null)
? mUri
: session.getLocalProfile().getUriString());
- } catch (RemoteException e) {
- throw new RuntimeException(e);
+ } catch (Throwable e) {
+ // SipService died? SIP stack died?
+ Log.w(TAG, "getUri(): " + e);
+ return null;
}
}
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index c68fa1b..bc377cf 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -49,6 +49,7 @@
import javax.sip.IOExceptionEvent;
import javax.sip.InvalidArgumentException;
import javax.sip.ListeningPoint;
+import javax.sip.ObjectInUseException;
import javax.sip.RequestEvent;
import javax.sip.ResponseEvent;
import javax.sip.ServerTransaction;
@@ -415,11 +416,25 @@
mPeerProfile = null;
mState = SipSession.State.READY_TO_CALL;
mInviteReceived = null;
- mDialog = null;
- mServerTransaction = null;
- mClientTransaction = null;
mPeerSessionDescription = null;
+ if (mDialog != null) mDialog.delete();
+ mDialog = null;
+
+ try {
+ if (mServerTransaction != null) mServerTransaction.terminate();
+ } catch (ObjectInUseException e) {
+ // ignored
+ }
+ mServerTransaction = null;
+
+ try {
+ if (mClientTransaction != null) mClientTransaction.terminate();
+ } catch (ObjectInUseException e) {
+ // ignored
+ }
+ mClientTransaction = null;
+
cancelSessionTimer();
}
@@ -884,8 +899,8 @@
generateTag());
mDialog = mClientTransaction.getDialog();
addSipSession(this);
- mProxy.onCalling(this);
startSessionTimer(cmd.getTimeout());
+ mProxy.onCalling(this);
return true;
} else if (evt instanceof RegisterCommand) {
mState = SipSession.State.REGISTERING;
@@ -964,8 +979,8 @@
// ring back for better UX
if (mState == SipSession.State.OUTGOING_CALL) {
mState = SipSession.State.OUTGOING_CALL_RING_BACK;
- mProxy.onRingingBack(this);
cancelSessionTimer();
+ mProxy.onRingingBack(this);
}
return true;
case Response.OK:
@@ -1222,14 +1237,12 @@
}
private void onRegistrationFailed(Throwable exception) {
- reset();
exception = getRootCause(exception);
onRegistrationFailed(getErrorCode(exception),
exception.toString());
}
private void onRegistrationFailed(Response response) {
- reset();
int statusCode = response.getStatusCode();
onRegistrationFailed(getErrorCode(statusCode),
createErrorMessage(response));