198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang/*
298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Copyright (C) 2010 The Android Open Source Project
398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang *
498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License");
598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * you may not use this file except in compliance with the License.
698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * You may obtain a copy of the License at
798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang *
898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang *      http://www.apache.org/licenses/LICENSE-2.0
998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang *
1098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Unless required by applicable law or agreed to in writing, software
1198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS,
1298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * See the License for the specific language governing permissions and
1498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * limitations under the License.
1598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang */
1698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
1798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangpackage android.net.sip;
1898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
1998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport android.os.Parcel;
2098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport android.os.Parcelable;
2198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport android.text.TextUtils;
2298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
232e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wangimport java.io.ObjectStreamException;
2498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport java.io.Serializable;
2598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport java.text.ParseException;
2698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.InvalidArgumentException;
2798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.ListeningPoint;
2898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.PeerUnavailableException;
2998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.SipFactory;
3098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.address.Address;
3198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.address.AddressFactory;
3298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.address.SipURI;
3398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport javax.sip.address.URI;
3498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
3598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang/**
3616b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * Defines a SIP profile, including a SIP account, domain and server information.
3716b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * <p>You can create a {@link SipProfile} using {@link
3816b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * SipProfile.Builder}. You can also retrieve one from a {@link SipSession}, using {@link
3916b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * SipSession#getLocalProfile} and {@link SipSession#getPeerProfile}.</p>
40b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez *
41b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez * <div class="special reference">
42b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez * <h3>Developer Guides</h3>
43b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez * <p>For more information about using SIP, read the
44b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez * <a href="{@docRoot}guide/topics/network/sip.html">Session Initiation Protocol</a>
45b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez * developer guide.</p>
46b4074803f775e5a4616287804f3405fd17eecab3Joe Fernandez * </div>
4798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang */
485fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyanpublic class SipProfile implements Parcelable, Serializable, Cloneable {
4998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private static final long serialVersionUID = 1L;
5098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private static final int DEFAULT_PORT = 5060;
512e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang    private static final String TCP = "TCP";
522e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang    private static final String UDP = "UDP";
5398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private Address mAddress;
5498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private String mProxyAddress;
5598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private String mPassword;
5698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private String mDomain;
572e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang    private String mProtocol = UDP;
5898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private String mProfileName;
591b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang    private String mAuthUserName;
602e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang    private int mPort = DEFAULT_PORT;
6198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private boolean mSendKeepAlive = false;
6298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private boolean mAutoRegistration = true;
638ea6eb25a01cc6429172655614ca4c560b2607d3Hung-ying Tyan    private transient int mCallingUid = 0;
6498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
6598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public static final Parcelable.Creator<SipProfile> CREATOR =
6698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            new Parcelable.Creator<SipProfile>() {
6798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                public SipProfile createFromParcel(Parcel in) {
6898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                    return new SipProfile(in);
6998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                }
7098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
7198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                public SipProfile[] newArray(int size) {
7298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                    return new SipProfile[size];
7398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                }
7498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            };
7598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
7698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
7716b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main     * Helper class for creating a {@link SipProfile}.
7898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
7998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public static class Builder {
8098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        private AddressFactory mAddressFactory;
8198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        private SipProfile mProfile = new SipProfile();
8298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        private SipURI mUri;
8398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        private String mDisplayName;
8498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        private String mProxyAddress;
8598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
8698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        {
8798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            try {
8898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                mAddressFactory =
8998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                        SipFactory.getInstance().createAddressFactory();
9098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            } catch (PeerUnavailableException e) {
9198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throw new RuntimeException(e);
9298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
9398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
9498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
9598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
965fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan         * Creates a builder based on the given profile.
975fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan         */
985fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan        public Builder(SipProfile profile) {
995fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            if (profile == null) throw new NullPointerException();
1005fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            try {
1015fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan                mProfile = (SipProfile) profile.clone();
1025fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            } catch (CloneNotSupportedException e) {
1035fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan                throw new RuntimeException("should not occur", e);
1045fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            }
1055fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            mProfile.mAddress = null;
1065fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            mUri = profile.getUri();
1075fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            mUri.setUserPassword(profile.getPassword());
1085fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            mDisplayName = profile.getDisplayName();
1095fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan            mProxyAddress = profile.getProxyAddress();
1102e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            mProfile.mPort = profile.getPort();
1115fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan        }
1125fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan
1135fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan        /**
11498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Constructor.
11598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
11698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param uriString the URI string as "sip:<user_name>@<domain>"
11798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @throws ParseException if the string is not a valid URI
11898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
11998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder(String uriString) throws ParseException {
12098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            if (uriString == null) {
12198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throw new NullPointerException("uriString cannot be null");
12298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
12398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            URI uri = mAddressFactory.createURI(fix(uriString));
12498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            if (uri instanceof SipURI) {
12598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                mUri = (SipURI) uri;
12698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            } else {
12798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throw new ParseException(uriString + " is not a SIP URI", 0);
12898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
12998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mDomain = mUri.getHost();
13098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
13198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
13298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
13398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Constructor.
13498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
13598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param username username of the SIP account
13698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param serverDomain the SIP server domain; if the network address
137901503e1cf8b6cfac1540a22c325eb5cdd879429Hung-ying Tyan         *      is different from the domain, use {@link #setOutboundProxy} to
138901503e1cf8b6cfac1540a22c325eb5cdd879429Hung-ying Tyan         *      set server address
13998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @throws ParseException if the parameters are not valid
14098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
14198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder(String username, String serverDomain)
14298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throws ParseException {
14398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            if ((username == null) || (serverDomain == null)) {
14498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throw new NullPointerException(
14598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                        "username and serverDomain cannot be null");
14698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
14798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mUri = mAddressFactory.createSipURI(username, serverDomain);
14898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mDomain = serverDomain;
14998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
15098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
15198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        private String fix(String uriString) {
15298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return (uriString.trim().toLowerCase().startsWith("sip:")
15398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                    ? uriString
15498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                    : "sip:" + uriString);
15598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
15698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
15798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
1581b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang         * Sets the username used for authentication.
1591b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang         *
1601c1df003bcf63b473d1ed90bd771963381e1be93Chung-yih Wang         * @param name authentication username of the profile
1611b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang         * @return this builder object
1621b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang         */
1631b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang        public Builder setAuthUserName(String name) {
1641b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang            mProfile.mAuthUserName = name;
1651b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang            return this;
1661b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang        }
1671b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang
1681b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang        /**
16998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the name of the profile. This name is given by user.
17098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
17198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param name name of the profile
17298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
17398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
17498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setProfileName(String name) {
17598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mProfileName = name;
17698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
17798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
17898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
17998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
18098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the password of the SIP account
18198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
18298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param password password of the SIP account
18398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
18498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
18598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setPassword(String password) {
18698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mUri.setUserPassword(password);
18798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
18898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
18998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
19098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
19198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the port number of the server. By default, it is 5060.
19298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
19398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param port port number of the server
19498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
1951ab079168ccc185408a8691c6b804021d79f7376Hung-ying Tyan         * @throws IllegalArgumentException if the port number is out of range
19698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
1971ab079168ccc185408a8691c6b804021d79f7376Hung-ying Tyan        public Builder setPort(int port) throws IllegalArgumentException {
1982e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            if ((port > 65535) || (port < 1000)) {
19990189114df094fb8170c26f8385ff956175ab58cHung-ying Tyan                throw new IllegalArgumentException("incorrect port arugment: " + port);
2001ab079168ccc185408a8691c6b804021d79f7376Hung-ying Tyan            }
2012e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            mProfile.mPort = port;
2022e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            return this;
20398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
20498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
20598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
20698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the protocol used to connect to the SIP server. Currently,
20798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * only "UDP" and "TCP" are supported.
20898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
20998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param protocol the protocol string
21098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
2111ab079168ccc185408a8691c6b804021d79f7376Hung-ying Tyan         * @throws IllegalArgumentException if the protocol is not recognized
21298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
21398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setProtocol(String protocol)
2141ab079168ccc185408a8691c6b804021d79f7376Hung-ying Tyan                throws IllegalArgumentException {
21598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            if (protocol == null) {
21698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throw new NullPointerException("protocol cannot be null");
21798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
21898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            protocol = protocol.toUpperCase();
2192e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            if (!protocol.equals(UDP) && !protocol.equals(TCP)) {
2201ab079168ccc185408a8691c6b804021d79f7376Hung-ying Tyan                throw new IllegalArgumentException(
22198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                        "unsupported protocol: " + protocol);
22298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
22398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mProtocol = protocol;
22498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
22598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
22698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
22798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
22898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the outbound proxy of the SIP server.
22998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
23098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param outboundProxy the network address of the outbound proxy
23198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
23298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
23398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setOutboundProxy(String outboundProxy) {
23498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProxyAddress = outboundProxy;
23598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
23698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
23798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
23898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
23998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the display name of the user.
24098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
24198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param displayName display name of the user
24298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
24398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
24498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setDisplayName(String displayName) {
24598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mDisplayName = displayName;
24698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
24798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
24898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
24998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
25098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the send keep-alive flag.
25198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
25298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param flag true if sending keep-alive message is required,
25398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *      false otherwise
25498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
25598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
25698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setSendKeepAlive(boolean flag) {
25798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mSendKeepAlive = flag;
25898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
25998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
26098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
26198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
26298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
26398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Sets the auto. registration flag.
26498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
26598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @param flag true if the profile will be registered automatically,
26698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *      false otherwise
26798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return this builder object
26898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
26998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public Builder setAutoRegistration(boolean flag) {
27098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mAutoRegistration = flag;
27198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return this;
27298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
27398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
27498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        /**
27598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * Builds and returns the SIP profile object.
27698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         *
27798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         * @return the profile object created
27898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang         */
27998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        public SipProfile build() {
28098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            // remove password from URI
28198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mProfile.mPassword = mUri.getUserPassword();
28298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            mUri.setUserPassword(null);
28398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            try {
28498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                if (!TextUtils.isEmpty(mProxyAddress)) {
28598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                    SipURI uri = (SipURI)
28698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                            mAddressFactory.createURI(fix(mProxyAddress));
28798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                    mProfile.mProxyAddress = uri.getHost();
2882e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                } else {
2892e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                    if (!mProfile.mProtocol.equals(UDP)) {
2902e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                        mUri.setTransportParam(mProfile.mProtocol);
2912e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                    }
2922e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                    if (mProfile.mPort != DEFAULT_PORT) {
2932e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                        mUri.setPort(mProfile.mPort);
2942e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                    }
29598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                }
2962e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                mProfile.mAddress = mAddressFactory.createAddress(
2972e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                        mDisplayName, mUri);
2982e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            } catch (InvalidArgumentException e) {
2992e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang                throw new RuntimeException(e);
30098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            } catch (ParseException e) {
30198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                // must not occur
30298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang                throw new RuntimeException(e);
30398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            }
30498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang            return mProfile;
30598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        }
30698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
30798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
30898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private SipProfile() {
30998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
31098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
31198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    private SipProfile(Parcel in) {
31298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mAddress = (Address) in.readSerializable();
31398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mProxyAddress = in.readString();
31498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mPassword = in.readString();
31598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mDomain = in.readString();
31698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mProtocol = in.readString();
31798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mProfileName = in.readString();
31898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mSendKeepAlive = (in.readInt() == 0) ? false : true;
31998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        mAutoRegistration = (in.readInt() == 0) ? false : true;
320bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang        mCallingUid = in.readInt();
3212e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        mPort = in.readInt();
3221b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang        mAuthUserName = in.readString();
32398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
32498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
3253adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    @Override
32698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public void writeToParcel(Parcel out, int flags) {
32798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeSerializable(mAddress);
32898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeString(mProxyAddress);
32998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeString(mPassword);
33098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeString(mDomain);
33198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeString(mProtocol);
33298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeString(mProfileName);
33398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeInt(mSendKeepAlive ? 1 : 0);
33498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        out.writeInt(mAutoRegistration ? 1 : 0);
335bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang        out.writeInt(mCallingUid);
3362e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        out.writeInt(mPort);
3371b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang        out.writeString(mAuthUserName);
33898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
33998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
3403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    @Override
34198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public int describeContents() {
34298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return 0;
34398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
34498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
34598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
34698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the SIP URI of this profile.
34798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
34898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the SIP URI of this profile
349901503e1cf8b6cfac1540a22c325eb5cdd879429Hung-ying Tyan     * @hide
35098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
35198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public SipURI getUri() {
35298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return (SipURI) mAddress.getURI();
35398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
35498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
35598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
35698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the SIP URI string of this profile.
35798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
35898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the SIP URI string of this profile
35998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
36098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getUriString() {
3612e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        // We need to return the sip uri domain instead of
3622e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        // the SIP URI with transport, port information if
3632e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        // the outbound proxy address exists.
3642e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        if (!TextUtils.isEmpty(mProxyAddress)) {
3652e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang            return "sip:" + getUserName() + "@" + mDomain;
3662e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        }
3672e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        return getUri().toString();
36898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
36998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
37098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
37198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the SIP address of this profile.
37298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
37398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the SIP address of this profile
374901503e1cf8b6cfac1540a22c325eb5cdd879429Hung-ying Tyan     * @hide
37598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
37698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public Address getSipAddress() {
37798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mAddress;
37898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
37998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
38098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
38198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the display name of the user.
38298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
38398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the display name of the user
38498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
38598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getDisplayName() {
38698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mAddress.getDisplayName();
38798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
38898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
38998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
39098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the username.
39198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
39298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the username
39398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
39498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getUserName() {
39598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return getUri().getUser();
39698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
39798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
39898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
3991b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang     * Gets the username for authentication. If it is null, then the username
4001c1df003bcf63b473d1ed90bd771963381e1be93Chung-yih Wang     * is used in authentication instead.
4011b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang     *
4021c1df003bcf63b473d1ed90bd771963381e1be93Chung-yih Wang     * @return the authentication username
4031c1df003bcf63b473d1ed90bd771963381e1be93Chung-yih Wang     * @see #getUserName
4041b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang     */
4051b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang    public String getAuthUserName() {
4061b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang        return mAuthUserName;
4071b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang    }
4081b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang
4091b666e24bacbe3695ca5fe2f996c177c3f10d5f0Chung-yih Wang    /**
41098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the password.
41198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
41298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the password
41398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
41498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getPassword() {
41598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mPassword;
41698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
41798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
41898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
41998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the SIP domain.
42098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
42198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the SIP domain
42298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
42398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getSipDomain() {
42498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mDomain;
42598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
42698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
42798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
42898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the port number of the SIP server.
42998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
43098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the port number of the SIP server
43198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
43298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public int getPort() {
4332e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        return mPort;
43498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
43598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
43698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
43798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the protocol used to connect to the server.
43898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
43998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the protocol
44098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
44198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getProtocol() {
44298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mProtocol;
44398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
44498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
44598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
44698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the network address of the server outbound proxy.
44798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
44898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the network address of the server outbound proxy
44998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
45098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getProxyAddress() {
45198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mProxyAddress;
45298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
45398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
45498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
45598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the (user-defined) name of the profile.
45698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
45798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return name of the profile
45898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
45998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public String getProfileName() {
46098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mProfileName;
46198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
46298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
46398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
46498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the flag of 'Sending keep-alive'.
46598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
46698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the flag of sending SIP keep-alive messages.
46798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
46898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public boolean getSendKeepAlive() {
46998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mSendKeepAlive;
47098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
47198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang
47298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    /**
47398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * Gets the flag of 'Auto Registration'.
47498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     *
47598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     * @return the flag of registering the profile automatically.
47698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang     */
47798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    public boolean getAutoRegistration() {
47898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang        return mAutoRegistration;
47998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang    }
4805fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan
4815fe3b0b82425192fc0079ccda44bc1c2747f2aecHung-ying Tyan    /**
482bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang     * Sets the calling process's Uid in the sip service.
483bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang     * @hide
484bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang     */
485bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang    public void setCallingUid(int uid) {
486bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang        mCallingUid = uid;
487bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang    }
488bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang
489bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang    /**
490bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang     * Gets the calling process's Uid in the sip settings.
491bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang     * @hide
492bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang     */
493bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang    public int getCallingUid() {
494bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang        return mCallingUid;
495bfe4c0e1cdd340ca8a3d337305742d9108d0f2a5Chung-yih Wang    }
4962e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang
4972e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang    private Object readResolve() throws ObjectStreamException {
4982e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        // For compatibility.
4992e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        if (mPort == 0) mPort = DEFAULT_PORT;
5002e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang        return this;
5012e45c0b8f84172a004df4e3a1f50dbf1235474ebChung-yih Wang    }
50298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang}
503