summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/sip/SipHelper.java19
-rw-r--r--services/java/com/android/server/sip/SipService.java5
-rw-r--r--services/java/com/android/server/sip/SipSessionGroup.java43
-rw-r--r--services/java/com/android/server/sip/SipSessionListenerProxy.java4
-rw-r--r--voip/java/android/net/sip/ISipSession.aidl7
-rw-r--r--voip/java/android/net/sip/ISipSessionListener.aidl4
-rw-r--r--voip/java/android/net/sip/SdpSessionDescription.java4
-rw-r--r--voip/java/android/net/sip/SipAudioCall.java4
-rw-r--r--voip/java/android/net/sip/SipAudioCallImpl.java26
-rw-r--r--voip/java/android/net/sip/SipManager.java14
-rw-r--r--voip/java/android/net/sip/SipSessionAdapter.java6
11 files changed, 72 insertions, 64 deletions
diff --git a/services/java/com/android/server/sip/SipHelper.java b/services/java/com/android/server/sip/SipHelper.java
index 83eeb84..d9a1bbf 100644
--- a/services/java/com/android/server/sip/SipHelper.java
+++ b/services/java/com/android/server/sip/SipHelper.java
@@ -20,7 +20,6 @@ import gov.nist.javax.sip.SipStackExt;
import gov.nist.javax.sip.clientauthutils.AccountManager;
import gov.nist.javax.sip.clientauthutils.AuthenticationHelper;
-import android.net.sip.SessionDescription;
import android.net.sip.SipProfile;
import android.util.Log;
@@ -243,7 +242,7 @@ class SipHelper {
}
public ClientTransaction sendInvite(SipProfile caller, SipProfile callee,
- SessionDescription sessionDescription, String tag)
+ String sessionDescription, String tag)
throws SipException {
try {
FromHeader fromHeader = createFromHeader(caller, tag);
@@ -259,9 +258,9 @@ class SipHelper {
toHeader, viaHeaders, maxForwards);
request.addHeader(createContactHeader(caller));
- request.setContent(sessionDescription.getContent(),
+ request.setContent(sessionDescription,
mHeaderFactory.createContentTypeHeader(
- "application", sessionDescription.getType()));
+ "application", "sdp"));
ClientTransaction clientTransaction =
mSipProvider.getNewClientTransaction(request);
@@ -273,12 +272,12 @@ class SipHelper {
}
public ClientTransaction sendReinvite(Dialog dialog,
- SessionDescription sessionDescription) throws SipException {
+ String sessionDescription) throws SipException {
try {
Request request = dialog.createRequest(Request.INVITE);
- request.setContent(sessionDescription.getContent(),
+ request.setContent(sessionDescription,
mHeaderFactory.createContentTypeHeader(
- "application", sessionDescription.getType()));
+ "application", "sdp"));
ClientTransaction clientTransaction =
mSipProvider.getNewClientTransaction(request);
@@ -326,7 +325,7 @@ class SipHelper {
* @param event the INVITE request event
*/
public ServerTransaction sendInviteOk(RequestEvent event,
- SipProfile localProfile, SessionDescription sessionDescription,
+ SipProfile localProfile, String sessionDescription,
ServerTransaction inviteTransaction)
throws SipException {
try {
@@ -334,9 +333,9 @@ class SipHelper {
Response response = mMessageFactory.createResponse(Response.OK,
request);
response.addHeader(createContactHeader(localProfile));
- response.setContent(sessionDescription.getContent(),
+ response.setContent(sessionDescription,
mHeaderFactory.createContentTypeHeader(
- "application", sessionDescription.getType()));
+ "application", "sdp"));
if (inviteTransaction == null) {
inviteTransaction = getServerTransaction(event);
diff --git a/services/java/com/android/server/sip/SipService.java b/services/java/com/android/server/sip/SipService.java
index 626b488..563ce58 100644
--- a/services/java/com/android/server/sip/SipService.java
+++ b/services/java/com/android/server/sip/SipService.java
@@ -53,6 +53,9 @@ import java.util.TimerTask;
import java.util.TreeSet;
import javax.sip.SipException;
+/**
+ * @hide
+ */
public final class SipService extends ISipService.Stub {
private static final String TAG = "SipService";
private static final int EXPIRY_TIME = 3600;
@@ -442,7 +445,7 @@ public final class SipService extends ISipService.Stub {
@Override
public void onRinging(ISipSession session, SipProfile caller,
- byte[] sessionDescription) {
+ String sessionDescription) {
synchronized (SipService.this) {
try {
if (!isRegistered()) {
diff --git a/services/java/com/android/server/sip/SipSessionGroup.java b/services/java/com/android/server/sip/SipSessionGroup.java
index d33558b..8019bfa 100644
--- a/services/java/com/android/server/sip/SipSessionGroup.java
+++ b/services/java/com/android/server/sip/SipSessionGroup.java
@@ -20,6 +20,7 @@ import gov.nist.javax.sip.clientauthutils.AccountManager;
import gov.nist.javax.sip.clientauthutils.UserCredentials;
import gov.nist.javax.sip.header.SIPHeaderNames;
import gov.nist.javax.sip.header.WWWAuthenticate;
+import gov.nist.javax.sip.message.SIPMessage;
import android.net.sip.ISipSession;
import android.net.sip.ISipSessionListener;
@@ -31,6 +32,7 @@ import android.text.TextUtils;
import android.util.Log;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.net.DatagramSocket;
import java.text.ParseException;
import java.util.Collection;
@@ -284,6 +286,22 @@ class SipSessionGroup implements SipListener {
}
}
+ private String extractContent(Message message) {
+ // Currently we do not support secure MIME bodies.
+ byte[] bytes = message.getRawContent();
+ if (bytes != null) {
+ try {
+ if (message instanceof SIPMessage) {
+ return ((SIPMessage) message).getMessageContent();
+ } else {
+ return new String(bytes, "UTF-8");
+ }
+ } catch (UnsupportedEncodingException e) {
+ }
+ }
+ return null;
+ }
+
private class SipSessionCallReceiverImpl extends SipSessionImpl {
public SipSessionCallReceiverImpl(ISipSessionListener listener) {
super(listener);
@@ -302,7 +320,7 @@ class SipSessionGroup implements SipListener {
newSession.mPeerProfile = createPeerProfile(event.getRequest());
newSession.mState = SipSessionState.INCOMING_CALL;
newSession.mPeerSessionDescription =
- event.getRequest().getRawContent();
+ extractContent(event.getRequest());
addSipSession(newSession);
mProxy.onRinging(newSession, newSession.mPeerProfile,
newSession.mPeerSessionDescription);
@@ -321,7 +339,7 @@ class SipSessionGroup implements SipListener {
Dialog mDialog;
ServerTransaction mServerTransaction;
ClientTransaction mClientTransaction;
- byte[] mPeerSessionDescription;
+ String mPeerSessionDescription;
boolean mInCall;
boolean mReRegisterFlag = false;
@@ -401,12 +419,12 @@ class SipSessionGroup implements SipListener {
}
public void makeCall(SipProfile peerProfile,
- SessionDescription sessionDescription) {
+ String sessionDescription) {
doCommandAsync(
new MakeCallCommand(peerProfile, sessionDescription));
}
- public void answerCall(SessionDescription sessionDescription) {
+ public void answerCall(String sessionDescription) {
try {
processCommand(
new MakeCallCommand(mPeerProfile, sessionDescription));
@@ -419,7 +437,7 @@ class SipSessionGroup implements SipListener {
doCommandAsync(END_CALL);
}
- public void changeCall(SessionDescription sessionDescription) {
+ public void changeCall(String sessionDescription) {
doCommandAsync(
new MakeCallCommand(mPeerProfile, sessionDescription));
}
@@ -726,10 +744,9 @@ class SipSessionGroup implements SipListener {
if (evt instanceof MakeCallCommand) {
MakeCallCommand cmd = (MakeCallCommand) evt;
mPeerProfile = cmd.getPeerProfile();
- SessionDescription sessionDescription =
- cmd.getSessionDescription();
mClientTransaction = mSipHelper.sendInvite(mLocalProfile,
- mPeerProfile, sessionDescription, generateTag());
+ mPeerProfile, cmd.getSessionDescription(),
+ generateTag());
mDialog = mClientTransaction.getDialog();
addSipSession(this);
mState = SipSessionState.OUTGOING_CALL;
@@ -811,7 +828,7 @@ class SipSessionGroup implements SipListener {
return true;
case Response.OK:
mSipHelper.sendInviteAck(event, mDialog);
- mPeerSessionDescription = response.getRawContent();
+ mPeerSessionDescription = extractContent(response);
establishCall();
return true;
case Response.PROXY_AUTHENTICATION_REQUIRED:
@@ -897,7 +914,7 @@ class SipSessionGroup implements SipListener {
// got Re-INVITE
RequestEvent event = mInviteReceived = (RequestEvent) evt;
mState = SipSessionState.INCOMING_CALL;
- mPeerSessionDescription = event.getRequest().getRawContent();
+ mPeerSessionDescription = extractContent(event.getRequest());
mServerTransaction = null;
mProxy.onRinging(this, mPeerProfile, mPeerSessionDescription);
return true;
@@ -1060,10 +1077,10 @@ class SipSessionGroup implements SipListener {
}
private class MakeCallCommand extends EventObject {
- private SessionDescription mSessionDescription;
+ private String mSessionDescription;
public MakeCallCommand(SipProfile peerProfile,
- SessionDescription sessionDescription) {
+ String sessionDescription) {
super(peerProfile);
mSessionDescription = sessionDescription;
}
@@ -1072,7 +1089,7 @@ class SipSessionGroup implements SipListener {
return (SipProfile) getSource();
}
- public SessionDescription getSessionDescription() {
+ public String getSessionDescription() {
return mSessionDescription;
}
}
diff --git a/services/java/com/android/server/sip/SipSessionListenerProxy.java b/services/java/com/android/server/sip/SipSessionListenerProxy.java
index fd49fd8..7004204 100644
--- a/services/java/com/android/server/sip/SipSessionListenerProxy.java
+++ b/services/java/com/android/server/sip/SipSessionListenerProxy.java
@@ -56,7 +56,7 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
}
public void onRinging(final ISipSession session, final SipProfile caller,
- final byte[] sessionDescription) {
+ final String sessionDescription) {
if (mListener == null) return;
proxy(new Runnable() {
public void run() {
@@ -83,7 +83,7 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
}
public void onCallEstablished(final ISipSession session,
- final byte[] sessionDescription) {
+ final String sessionDescription) {
if (mListener == null) return;
proxy(new Runnable() {
public void run() {
diff --git a/voip/java/android/net/sip/ISipSession.aidl b/voip/java/android/net/sip/ISipSession.aidl
index fbcb056..1a23527 100644
--- a/voip/java/android/net/sip/ISipSession.aidl
+++ b/voip/java/android/net/sip/ISipSession.aidl
@@ -115,8 +115,7 @@ interface ISipSession {
* @param sessionDescription the session description of this call
* @see ISipSessionListener
*/
- void makeCall(in SipProfile callee,
- in SessionDescription sessionDescription);
+ void makeCall(in SipProfile callee, String sessionDescription);
/**
* Answers an incoming call with the specified session description. The
@@ -125,7 +124,7 @@ interface ISipSession {
*
* @param sessionDescription the session description to answer this call
*/
- void answerCall(in SessionDescription sessionDescription);
+ void answerCall(String sessionDescription);
/**
* Ends an established call, terminates an outgoing call or rejects an
@@ -143,5 +142,5 @@ interface ISipSession {
*
* @param sessionDescription the new session description
*/
- void changeCall(in SessionDescription sessionDescription);
+ void changeCall(String sessionDescription);
}
diff --git a/voip/java/android/net/sip/ISipSessionListener.aidl b/voip/java/android/net/sip/ISipSessionListener.aidl
index 8570958..c552a57 100644
--- a/voip/java/android/net/sip/ISipSessionListener.aidl
+++ b/voip/java/android/net/sip/ISipSessionListener.aidl
@@ -39,7 +39,7 @@ interface ISipSessionListener {
* @param sessionDescription the caller's session description
*/
void onRinging(in ISipSession session, in SipProfile caller,
- in byte[] sessionDescription);
+ String sessionDescription);
/**
* Called when a RINGING response is received for the INVITE request sent
@@ -55,7 +55,7 @@ interface ISipSessionListener {
* @param sessionDescription the peer's session description
*/
void onCallEstablished(in ISipSession session,
- in byte[] sessionDescription);
+ String sessionDescription);
/**
* Called when the session is terminated.
diff --git a/voip/java/android/net/sip/SdpSessionDescription.java b/voip/java/android/net/sip/SdpSessionDescription.java
index 0c29935..f6ae837 100644
--- a/voip/java/android/net/sip/SdpSessionDescription.java
+++ b/voip/java/android/net/sip/SdpSessionDescription.java
@@ -186,8 +186,8 @@ public class SdpSessionDescription extends SessionDescription {
}
}
- public SdpSessionDescription build() {
- return mSdp;
+ public String build() {
+ return mSdp.toString();
}
}
diff --git a/voip/java/android/net/sip/SipAudioCall.java b/voip/java/android/net/sip/SipAudioCall.java
index 3cdd114..8254543 100644
--- a/voip/java/android/net/sip/SipAudioCall.java
+++ b/voip/java/android/net/sip/SipAudioCall.java
@@ -168,9 +168,9 @@ public interface SipAudioCall {
* Attaches an incoming call to this call object.
*
* @param session the session that receives the incoming call
- * @param sdp the session description of the incoming call
+ * @param sessionDescription the session description of the incoming call
*/
- void attachCall(ISipSession session, SdpSessionDescription sdp)
+ void attachCall(ISipSession session, String sessionDescription)
throws SipException;
/** Ends a call. */
diff --git a/voip/java/android/net/sip/SipAudioCallImpl.java b/voip/java/android/net/sip/SipAudioCallImpl.java
index 5789cd4..a312f83 100644
--- a/voip/java/android/net/sip/SipAudioCallImpl.java
+++ b/voip/java/android/net/sip/SipAudioCallImpl.java
@@ -28,14 +28,6 @@ import android.net.rtp.AudioCodec;
import android.net.rtp.AudioGroup;
import android.net.rtp.AudioStream;
import android.net.rtp.RtpStream;
-import android.net.sip.ISipSession;
-import android.net.sip.SdpSessionDescription;
-import android.net.sip.SessionDescription;
-import android.net.sip.SipAudioCall;
-import android.net.sip.SipManager;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSessionAdapter;
-import android.net.sip.SipSessionState;
import android.net.wifi.WifiManager;
import android.os.Message;
import android.os.RemoteException;
@@ -200,7 +192,7 @@ public class SipAudioCallImpl extends SipSessionAdapter
@Override
public synchronized void onRinging(ISipSession session,
- SipProfile peerProfile, byte[] sessionDescription) {
+ SipProfile peerProfile, String sessionDescription) {
try {
if ((mSipSession == null) || !mInCall
|| !session.getCallId().equals(mSipSession.getCallId())) {
@@ -222,7 +214,7 @@ public class SipAudioCallImpl extends SipSessionAdapter
}
}
- private synchronized void establishCall(byte[] sessionDescription) {
+ private synchronized void establishCall(String sessionDescription) {
stopRingbackTone();
stopRinging();
try {
@@ -238,7 +230,7 @@ public class SipAudioCallImpl extends SipSessionAdapter
@Override
public void onCallEstablished(ISipSession session,
- byte[] sessionDescription) {
+ String sessionDescription) {
establishCall(sessionDescription);
Listener listener = mListener;
if (listener != null) {
@@ -316,10 +308,10 @@ public class SipAudioCallImpl extends SipSessionAdapter
}
public synchronized void attachCall(ISipSession session,
- SdpSessionDescription sdp) throws SipException {
+ String sessionDescription) throws SipException {
mSipSession = session;
- mPeerSd = sdp;
try {
+ mPeerSd = new SdpSessionDescription(sessionDescription);
session.setListener(this);
} catch (Throwable e) {
Log.e(TAG, "attachCall()", e);
@@ -394,12 +386,12 @@ public class SipAudioCallImpl extends SipSessionAdapter
if (audioGroup != null) audioGroup.setMode(AudioGroup.MODE_NORMAL);
}
- private SessionDescription createOfferSessionDescription() {
+ private String createOfferSessionDescription() {
AudioCodec[] codecs = AudioCodec.getSystemSupportedCodecs();
return createSdpBuilder(true, convert(codecs)).build();
}
- private SessionDescription createAnswerSessionDescription() {
+ private String createAnswerSessionDescription() {
try {
// choose an acceptable media from mPeerSd to answer
SdpSessionDescription.AudioCodec codec = getCodec(mPeerSd);
@@ -416,7 +408,7 @@ public class SipAudioCallImpl extends SipSessionAdapter
}
}
- private SessionDescription createHoldSessionDescription() {
+ private String createHoldSessionDescription() {
try {
return createSdpBuilder(false, mCodec)
.addMediaAttribute(AUDIO, "sendonly", (String) null)
@@ -448,7 +440,7 @@ public class SipAudioCallImpl extends SipSessionAdapter
return (mWm.getConnectionInfo().getBSSID() == null) ? false : true;
}
- private SessionDescription createContinueSessionDescription() {
+ private String createContinueSessionDescription() {
return createSdpBuilder(true, mCodec).build();
}
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
index 40792b9..700fb4e 100644
--- a/voip/java/android/net/sip/SipManager.java
+++ b/voip/java/android/net/sip/SipManager.java
@@ -298,21 +298,19 @@ public class SipManager {
throw new SipException("Call ID missing in incoming call intent");
}
- byte[] offerSd = getOfferSessionDescription(incomingCallIntent);
+ String offerSd = getOfferSessionDescription(incomingCallIntent);
if (offerSd == null) {
throw new SipException("Session description missing in incoming "
+ "call intent");
}
try {
- SdpSessionDescription sdp = new SdpSessionDescription(offerSd);
-
ISipSession session = mSipService.getPendingSession(callId);
if (session == null) return null;
SipAudioCall call = new SipAudioCallImpl(
context, session.getLocalProfile());
call.setRingtoneEnabled(ringtoneEnabled);
- call.attachCall(session, sdp);
+ call.attachCall(session, offerSd);
call.setListener(listener);
return call;
} catch (Throwable t) {
@@ -329,7 +327,7 @@ public class SipManager {
public static boolean isIncomingCallIntent(Intent intent) {
if (intent == null) return false;
String callId = getCallId(intent);
- byte[] offerSd = getOfferSessionDescription(intent);
+ String offerSd = getOfferSessionDescription(intent);
return ((callId != null) && (offerSd != null));
}
@@ -351,8 +349,8 @@ public class SipManager {
* @return the offer session description or null if the intent does not
* have it
*/
- public static byte[] getOfferSessionDescription(Intent incomingCallIntent) {
- return incomingCallIntent.getByteArrayExtra(OFFER_SD_KEY);
+ public static String getOfferSessionDescription(Intent incomingCallIntent) {
+ return incomingCallIntent.getStringExtra(OFFER_SD_KEY);
}
/**
@@ -365,7 +363,7 @@ public class SipManager {
* @hide
*/
public static Intent createIncomingCallBroadcast(String action,
- String callId, byte[] sessionDescription) {
+ String callId, String sessionDescription) {
Intent intent = new Intent(action);
intent.putExtra(CALL_ID_KEY, callId);
intent.putExtra(OFFER_SD_KEY, sessionDescription);
diff --git a/voip/java/android/net/sip/SipSessionAdapter.java b/voip/java/android/net/sip/SipSessionAdapter.java
index cfb71d7..770d4eb 100644
--- a/voip/java/android/net/sip/SipSessionAdapter.java
+++ b/voip/java/android/net/sip/SipSessionAdapter.java
@@ -26,14 +26,14 @@ public class SipSessionAdapter extends ISipSessionListener.Stub {
}
public void onRinging(ISipSession session, SipProfile caller,
- byte[] sessionDescription) {
+ String sessionDescription) {
}
public void onRingingBack(ISipSession session) {
}
- public void onCallEstablished(
- ISipSession session, byte[] sessionDescription) {
+ public void onCallEstablished(ISipSession session,
+ String sessionDescription) {
}
public void onCallEnded(ISipSession session) {