diff options
author | Chung-yih Wang <cywang@google.com> | 2010-03-03 19:10:15 +0800 |
---|---|---|
committer | Chung-yih Wang <cywang@google.com> | 2010-03-04 14:45:39 +0800 |
commit | fdcaaeb23fd2d1b538605b098e4ce3741b0b7685 (patch) | |
tree | cecad1d7f052c3e6bba46c5d77ded98bb10150ba | |
parent | 9c2b7692cd8a2ad205359e4eac046da1f4767c90 (diff) | |
download | nist-sip-fdcaaeb23fd2d1b538605b098e4ce3741b0b7685.tar.gz |
Add registration part
-rw-r--r-- | src/android/net/sip/AccountInfo.java | 37 | ||||
-rw-r--r-- | src/android/net/sip/SipHelper.java | 48 | ||||
-rw-r--r-- | src/android/net/sip/SipManager.java | 22 | ||||
-rw-r--r-- | src/android/net/sip/SipProfile.java | 15 |
4 files changed, 110 insertions, 12 deletions
diff --git a/src/android/net/sip/AccountInfo.java b/src/android/net/sip/AccountInfo.java new file mode 100644 index 0000000..7a33b63 --- /dev/null +++ b/src/android/net/sip/AccountInfo.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.sip; + +import javax.sip.ClientTransaction; + +import gov.nist.javax.sip.clientauthutils.AccountManager; +import gov.nist.javax.sip.clientauthutils.UserCredentials; + +public class AccountInfo implements AccountManager { + UserCredentials credential; + + public AccountInfo(SipProfile userProfile) { + credential = userProfile; + } + + public UserCredentials getCredentials(ClientTransaction + challengedTransaction, String realm) { + return credential; + } + +} + diff --git a/src/android/net/sip/SipHelper.java b/src/android/net/sip/SipHelper.java index f97657b..b9f050f 100644 --- a/src/android/net/sip/SipHelper.java +++ b/src/android/net/sip/SipHelper.java @@ -18,6 +18,10 @@ package android.net.sip; import android.util.Log; +import gov.nist.javax.sip.SipStackExt; +import gov.nist.javax.sip.clientauthutils.AccountManager; +import gov.nist.javax.sip.clientauthutils.AuthenticationHelper; + import java.text.ParseException; import java.util.ArrayList; import java.util.EventObject; @@ -45,6 +49,7 @@ import javax.sip.header.CSeqHeader; import javax.sip.header.CallIdHeader; import javax.sip.header.ContactHeader; import javax.sip.header.FromHeader; +import javax.sip.header.Header; import javax.sip.header.HeaderFactory; import javax.sip.header.MaxForwardsHeader; import javax.sip.header.ToHeader; @@ -127,7 +132,7 @@ class SipHelper { private ContactHeader createContactHeader(SipProfile profile) throws ParseException, InvalidArgumentException { ListeningPoint lp = mSipProvider.getListeningPoint("udp"); - SipURI contactURI = createSipUri(profile.getUsername(), lp); + SipURI contactURI = createSipUri(profile.getUserName(), lp); Address contactAddress = mAddressFactory.createAddress(contactURI); contactAddress.setDisplayName(profile.getDisplayName()); @@ -146,6 +151,47 @@ class SipHelper { return uri; } + public ClientTransaction sendRegister(SipProfile userProfile, String tag) + throws SipException { + try { + FromHeader fromHeader = createFromHeader(userProfile, tag); + ToHeader toHeader = createToHeader(userProfile); + SipURI requestURI = userProfile.getUri(); + List<ViaHeader> viaHeaders = createViaHeaders(); + CallIdHeader callIdHeader = createCallIdHeader(); + CSeqHeader cSeqHeader = createCSeqHeader(1, Request.REGISTER); + MaxForwardsHeader maxForwards = createMaxForwardsHeader(); + + Request request = mMessageFactory.createRequest(requestURI, + Request.REGISTER, callIdHeader, cSeqHeader, fromHeader, + toHeader, viaHeaders, maxForwards); + + request.addHeader(createContactHeader(userProfile)); + request.addHeader(mHeaderFactory.createExpiresHeader(60)); + Header userAgentHeader = mHeaderFactory.createHeader("User-Agent", + "AndroidSip/0.1.001"); + request.addHeader(userAgentHeader); + + ClientTransaction clientTransaction = + mSipProvider.getNewClientTransaction(request); + clientTransaction.sendRequest(); + return clientTransaction; + } catch (ParseException e) { + throw new SipException("sendRegister()", e); + } + } + + public void handleChallenge(ResponseEvent responseEvent, + SipProfile userProfile) throws SipException { + AuthenticationHelper authenticationHelper = + ((SipStackExt) mSipStack).getAuthenticationHelper( + new AccountInfo(userProfile), mHeaderFactory); + ClientTransaction tid = responseEvent.getClientTransaction(); + ClientTransaction ct = authenticationHelper.handleChallenge( + responseEvent.getResponse(), tid, mSipProvider, 5); + ct.sendRequest(); + } + public ClientTransaction sendInvite(SipProfile caller, SipProfile callee, SessionDescription sessionDescription, String tag) throws SipException { diff --git a/src/android/net/sip/SipManager.java b/src/android/net/sip/SipManager.java index e1efebc..4ae041c 100644 --- a/src/android/net/sip/SipManager.java +++ b/src/android/net/sip/SipManager.java @@ -377,9 +377,19 @@ public class SipManager implements SipListener { private boolean registeringToReady(EventObject evt) throws SipException { - // TODO: registration action - mState = SipSessionState.READY_FOR_CALL; - return true; + if (expectResponse(Response.OK, Request.REGISTER, evt)) { + reset(); + mListener.onRegistrationDone(this); + return true; + } + if (expectResponse(Response.UNAUTHORIZED, Request.REGISTER, evt) || + expectResponse(Response.PROXY_AUTHENTICATION_REQUIRED, + Request.REGISTER, evt)) { + mSipHelper.handleChallenge((ResponseEvent)evt, mLocalProfile); + return true; + } + //TODO: handle error conditions + return false; } private boolean readyForCall(EventObject evt) throws SipException { @@ -403,8 +413,10 @@ public class SipManager implements SipListener { mListener.onRinging(SipSessionImpl.this); return true; } else if (REGISTER == evt) { - // TODO: registration action - //mState = SipSessionState.REGISTERING; + mClientTransaction = mSipHelper.sendRegister(mLocalProfile, + generateTag()); + mDialog = mClientTransaction.getDialog(); + mState = SipSessionState.REGISTERING; return true; } return false; diff --git a/src/android/net/sip/SipProfile.java b/src/android/net/sip/SipProfile.java index 0e60e88..ffc6efb 100644 --- a/src/android/net/sip/SipProfile.java +++ b/src/android/net/sip/SipProfile.java @@ -16,6 +16,8 @@ package android.net.sip; +import gov.nist.javax.sip.clientauthutils.UserCredentials; + import java.text.ParseException; import javax.sip.InvalidArgumentException; import javax.sip.ListeningPoint; @@ -28,7 +30,7 @@ import javax.sip.address.URI; /** */ -public class SipProfile { +public class SipProfile implements UserCredentials { private Address mAddress; private String mPassword; private String mDomain; @@ -127,7 +129,8 @@ public class SipProfile { return mAddress.getDisplayName(); } - public String getUsername() { + /* UserCredentials APIs */ + public String getUserName() { return getUri().getUser(); } @@ -135,6 +138,10 @@ public class SipProfile { return mPassword; } + public String getSipDomain() { + return mDomain; + } + public String getServerAddress() { return getUri().getHost(); } @@ -143,10 +150,6 @@ public class SipProfile { return getUri().getPort(); } - public String getDomain() { - return mDomain; - } - public String getProtocol() { return mProtocol; } |