summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChung-yih Wang <cywang@google.com>2010-03-03 19:10:15 +0800
committerChung-yih Wang <cywang@google.com>2010-03-04 14:45:39 +0800
commitfdcaaeb23fd2d1b538605b098e4ce3741b0b7685 (patch)
treececad1d7f052c3e6bba46c5d77ded98bb10150ba
parent9c2b7692cd8a2ad205359e4eac046da1f4767c90 (diff)
downloadnist-sip-fdcaaeb23fd2d1b538605b098e4ce3741b0b7685.tar.gz
Add registration part
-rw-r--r--src/android/net/sip/AccountInfo.java37
-rw-r--r--src/android/net/sip/SipHelper.java48
-rw-r--r--src/android/net/sip/SipManager.java22
-rw-r--r--src/android/net/sip/SipProfile.java15
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;
}