SipProfile.java revision 0f7de88cb9eef781117fa2f2b69ba2698237637e
1363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang/*
2363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * Copyright (C) 2010 The Android Open Source Project
3363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang *
4363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License");
5363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * you may not use this file except in compliance with the License.
6363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * You may obtain a copy of the License at
7363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang *
8363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang *      http://www.apache.org/licenses/LICENSE-2.0
9363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang *
10363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * Unless required by applicable law or agreed to in writing, software
11363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS,
12363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * See the License for the specific language governing permissions and
14363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang * limitations under the License.
15363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang */
16363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
17363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangpackage android.net.sip;
18363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
19363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport android.os.Parcel;
20363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport android.os.Parcelable;
21363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport android.text.TextUtils;
22363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
23f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wangimport java.io.ObjectStreamException;
24363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport java.io.Serializable;
25363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport java.text.ParseException;
26363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.InvalidArgumentException;
27363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.ListeningPoint;
28363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.PeerUnavailableException;
29363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.SipFactory;
30363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.address.Address;
31363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.address.AddressFactory;
32363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.address.SipURI;
33363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wangimport javax.sip.address.URI;
34363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
35363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang/**
3602b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * Defines a SIP profile, including a SIP account, domain and server information.
3702b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * <p>You can create a {@link SipProfile} using {@link
3802b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * SipProfile.Builder}. You can also retrieve one from a {@link SipSession}, using {@link
3902b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * SipSession#getLocalProfile} and {@link SipSession#getPeerProfile}.</p>
40363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang */
41cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyanpublic class SipProfile implements Parcelable, Serializable, Cloneable {
42363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private static final long serialVersionUID = 1L;
43363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private static final int DEFAULT_PORT = 5060;
44f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private static final String TCP = "TCP";
45f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private static final String UDP = "UDP";
46363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private Address mAddress;
47363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mProxyAddress;
48363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mPassword;
49363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mDomain;
50f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private String mProtocol = UDP;
51363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mProfileName;
520f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    private String mAuthUserName;
53f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private int mPort = DEFAULT_PORT;
54363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private boolean mSendKeepAlive = false;
55363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private boolean mAutoRegistration = true;
5660264b306453a3043442719b970f2edb3f46f51bHung-ying Tyan    private transient int mCallingUid = 0;
57363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
58363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public static final Parcelable.Creator<SipProfile> CREATOR =
59363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            new Parcelable.Creator<SipProfile>() {
60363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                public SipProfile createFromParcel(Parcel in) {
61363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    return new SipProfile(in);
62363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                }
63363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
64363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                public SipProfile[] newArray(int size) {
65363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    return new SipProfile[size];
66363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                }
67363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            };
68363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
69363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
7002b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main     * Helper class for creating a {@link SipProfile}.
71363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
72363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public static class Builder {
73363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private AddressFactory mAddressFactory;
74363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private SipProfile mProfile = new SipProfile();
75363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private SipURI mUri;
76363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private String mDisplayName;
77363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private String mProxyAddress;
78363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
79363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        {
80363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            try {
81363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                mAddressFactory =
82363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                        SipFactory.getInstance().createAddressFactory();
83363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            } catch (PeerUnavailableException e) {
84363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new RuntimeException(e);
85363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
86363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
87363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
88363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
89cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan         * Creates a builder based on the given profile.
90cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan         */
91cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan        public Builder(SipProfile profile) {
92cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            if (profile == null) throw new NullPointerException();
93cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            try {
94cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan                mProfile = (SipProfile) profile.clone();
95cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            } catch (CloneNotSupportedException e) {
96cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan                throw new RuntimeException("should not occur", e);
97cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            }
98cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mProfile.mAddress = null;
99cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mUri = profile.getUri();
100cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mUri.setUserPassword(profile.getPassword());
101cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mDisplayName = profile.getDisplayName();
102cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mProxyAddress = profile.getProxyAddress();
103f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            mProfile.mPort = profile.getPort();
104cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan        }
105cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan
106cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan        /**
107363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Constructor.
108363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
109363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param uriString the URI string as "sip:<user_name>@<domain>"
110363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @throws ParseException if the string is not a valid URI
111363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
112363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder(String uriString) throws ParseException {
113363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if (uriString == null) {
114363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new NullPointerException("uriString cannot be null");
115363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
116363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            URI uri = mAddressFactory.createURI(fix(uriString));
117363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if (uri instanceof SipURI) {
118363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                mUri = (SipURI) uri;
119363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            } else {
120363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new ParseException(uriString + " is not a SIP URI", 0);
121363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
122363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mDomain = mUri.getHost();
123363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
124363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
125363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
126363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Constructor.
127363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
128363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param username username of the SIP account
129363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param serverDomain the SIP server domain; if the network address
130286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan         *      is different from the domain, use {@link #setOutboundProxy} to
131286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan         *      set server address
132363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @throws ParseException if the parameters are not valid
133363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
134363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder(String username, String serverDomain)
135363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throws ParseException {
136363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if ((username == null) || (serverDomain == null)) {
137363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new NullPointerException(
138363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                        "username and serverDomain cannot be null");
139363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
140363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mUri = mAddressFactory.createSipURI(username, serverDomain);
141363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mDomain = serverDomain;
142363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
143363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
144363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private String fix(String uriString) {
145363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return (uriString.trim().toLowerCase().startsWith("sip:")
146363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    ? uriString
147363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    : "sip:" + uriString);
148363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
149363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
150363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
1510f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         * Sets the username used for authentication.
1520f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         *
1530f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         * @param name auth. name of the profile
1540f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         * @return this builder object
1550f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         * @hide // TODO: remove when we make it public
1560f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         */
1570f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        public Builder setAuthUserName(String name) {
1580f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang            mProfile.mAuthUserName = name;
1590f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang            return this;
1600f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        }
1610f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang
1620f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        /**
163363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the name of the profile. This name is given by user.
164363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
165363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param name name of the profile
166363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
167363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
168363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setProfileName(String name) {
169363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mProfileName = name;
170363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
171363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
172363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
173363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
174363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the password of the SIP account
175363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
176363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param password password of the SIP account
177363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
178363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
179363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setPassword(String password) {
180363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mUri.setUserPassword(password);
181363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
182363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
183363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
184363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
185363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the port number of the server. By default, it is 5060.
186363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
187363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param port port number of the server
188363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
18999bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan         * @throws IllegalArgumentException if the port number is out of range
190363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
19199bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan        public Builder setPort(int port) throws IllegalArgumentException {
192f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            if ((port > 65535) || (port < 1000)) {
193eecf4a6f11129461088d620afadb6014edab3086Hung-ying Tyan                throw new IllegalArgumentException("incorrect port arugment: " + port);
19499bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan            }
195f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            mProfile.mPort = port;
196f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            return this;
197363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
198363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
199363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
200363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the protocol used to connect to the SIP server. Currently,
201363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * only "UDP" and "TCP" are supported.
202363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
203363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param protocol the protocol string
204363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
20599bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan         * @throws IllegalArgumentException if the protocol is not recognized
206363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
207363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setProtocol(String protocol)
20899bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan                throws IllegalArgumentException {
209363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if (protocol == null) {
210363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new NullPointerException("protocol cannot be null");
211363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
212363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            protocol = protocol.toUpperCase();
213f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            if (!protocol.equals(UDP) && !protocol.equals(TCP)) {
21499bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan                throw new IllegalArgumentException(
215363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                        "unsupported protocol: " + protocol);
216363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
217363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mProtocol = protocol;
218363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
219363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
220363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
221363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
222363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the outbound proxy of the SIP server.
223363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
224363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param outboundProxy the network address of the outbound proxy
225363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
226363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
227363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setOutboundProxy(String outboundProxy) {
228363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProxyAddress = outboundProxy;
229363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
230363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
231363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
232363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
233363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the display name of the user.
234363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
235363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param displayName display name of the user
236363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
237363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
238363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setDisplayName(String displayName) {
239363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mDisplayName = displayName;
240363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
241363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
242363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
243363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
244363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the send keep-alive flag.
245363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
246363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param flag true if sending keep-alive message is required,
247363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *      false otherwise
248363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
249363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
250363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setSendKeepAlive(boolean flag) {
251363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mSendKeepAlive = flag;
252363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
253363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
254363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
255363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
256363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
257363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the auto. registration flag.
258363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
259363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param flag true if the profile will be registered automatically,
260363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *      false otherwise
261363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
262363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
263363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setAutoRegistration(boolean flag) {
264363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mAutoRegistration = flag;
265363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
266363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
267363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
268363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
269363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Builds and returns the SIP profile object.
270363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
271363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return the profile object created
272363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
273363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public SipProfile build() {
274363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            // remove password from URI
275363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mPassword = mUri.getUserPassword();
276363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mUri.setUserPassword(null);
277363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            try {
278363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                if (!TextUtils.isEmpty(mProxyAddress)) {
279363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    SipURI uri = (SipURI)
280363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                            mAddressFactory.createURI(fix(mProxyAddress));
281363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    mProfile.mProxyAddress = uri.getHost();
282f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                } else {
283f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    if (!mProfile.mProtocol.equals(UDP)) {
284f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                        mUri.setTransportParam(mProfile.mProtocol);
285f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    }
286f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    if (mProfile.mPort != DEFAULT_PORT) {
287f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                        mUri.setPort(mProfile.mPort);
288f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    }
289363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                }
290f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                mProfile.mAddress = mAddressFactory.createAddress(
291f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                        mDisplayName, mUri);
292f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            } catch (InvalidArgumentException e) {
293f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                throw new RuntimeException(e);
294363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            } catch (ParseException e) {
295363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                // must not occur
296363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new RuntimeException(e);
297363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
298363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return mProfile;
299363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
300363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
301363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
302363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private SipProfile() {
303363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
304363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
305363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private SipProfile(Parcel in) {
306363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mAddress = (Address) in.readSerializable();
307363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mProxyAddress = in.readString();
308363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mPassword = in.readString();
309363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mDomain = in.readString();
310363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mProtocol = in.readString();
311363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mProfileName = in.readString();
312363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mSendKeepAlive = (in.readInt() == 0) ? false : true;
313363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mAutoRegistration = (in.readInt() == 0) ? false : true;
3145424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        mCallingUid = in.readInt();
315f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        mPort = in.readInt();
3160f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        mAuthUserName = in.readString();
317363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
318363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
31984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan    @Override
320363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public void writeToParcel(Parcel out, int flags) {
321363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeSerializable(mAddress);
322363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mProxyAddress);
323363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mPassword);
324363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mDomain);
325363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mProtocol);
326363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mProfileName);
327363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeInt(mSendKeepAlive ? 1 : 0);
328363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeInt(mAutoRegistration ? 1 : 0);
3295424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        out.writeInt(mCallingUid);
330f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        out.writeInt(mPort);
3310f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        out.writeString(mAuthUserName);
332363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
333363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
33484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan    @Override
335363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public int describeContents() {
336363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return 0;
337363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
338363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
339363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
340363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP URI of this profile.
341363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
342363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP URI of this profile
343286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan     * @hide
344363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
345363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public SipURI getUri() {
346363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return (SipURI) mAddress.getURI();
347363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
348363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
349363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
350363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP URI string of this profile.
351363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
352363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP URI string of this profile
353363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
354363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getUriString() {
355f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // We need to return the sip uri domain instead of
356f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // the SIP URI with transport, port information if
357f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // the outbound proxy address exists.
358f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        if (!TextUtils.isEmpty(mProxyAddress)) {
359f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            return "sip:" + getUserName() + "@" + mDomain;
360f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        }
361f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        return getUri().toString();
362363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
363363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
364363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
365363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP address of this profile.
366363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
367363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP address of this profile
368286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan     * @hide
369363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
370363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public Address getSipAddress() {
371363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mAddress;
372363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
373363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
374363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
375363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the display name of the user.
376363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
377363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the display name of the user
378363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
379363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getDisplayName() {
380363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mAddress.getDisplayName();
381363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
382363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
383363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
384363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the username.
385363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
386363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the username
387363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
388363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getUserName() {
389363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return getUri().getUser();
390363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
391363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
392363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
3930f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     * Gets the username for authentication. If it is null, then the username
3940f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     * should be used in authentication instead.
3950f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     *
3960f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     * @return the auth. username
3970f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     * @hide // TODO: remove when we make it public
3980f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     */
3990f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    public String getAuthUserName() {
4000f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        return mAuthUserName;
4010f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    }
4020f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang
4030f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    /**
404363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the password.
405363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
406363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the password
407363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
408363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getPassword() {
409363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mPassword;
410363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
411363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
412363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
413363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP domain.
414363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
415363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP domain
416363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
417363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getSipDomain() {
418363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mDomain;
419363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
420363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
421363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
422363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the port number of the SIP server.
423363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
424363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the port number of the SIP server
425363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
426363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public int getPort() {
427f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        return mPort;
428363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
429363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
430363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
431363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the protocol used to connect to the server.
432363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
433363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the protocol
434363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
435363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getProtocol() {
436363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mProtocol;
437363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
438363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
439363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
440363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the network address of the server outbound proxy.
441363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
442363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the network address of the server outbound proxy
443363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
444363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getProxyAddress() {
445363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mProxyAddress;
446363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
447363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
448363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
449363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the (user-defined) name of the profile.
450363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
451363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return name of the profile
452363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
453363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getProfileName() {
454363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mProfileName;
455363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
456363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
457363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
458363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the flag of 'Sending keep-alive'.
459363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
460363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the flag of sending SIP keep-alive messages.
461363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
462363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public boolean getSendKeepAlive() {
463363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mSendKeepAlive;
464363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
465363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
466363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
467363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the flag of 'Auto Registration'.
468363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
469363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the flag of registering the profile automatically.
470363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
471363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public boolean getAutoRegistration() {
472363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mAutoRegistration;
473363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
474cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan
475cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan    /**
4765424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * Sets the calling process's Uid in the sip service.
4775424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * @hide
4785424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     */
4795424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    public void setCallingUid(int uid) {
4805424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        mCallingUid = uid;
4815424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    }
4825424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang
4835424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    /**
4845424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * Gets the calling process's Uid in the sip settings.
4855424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * @hide
4865424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     */
4875424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    public int getCallingUid() {
4885424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        return mCallingUid;
4895424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    }
490f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang
491f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private Object readResolve() throws ObjectStreamException {
492f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // For compatibility.
493f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        if (mPort == 0) mPort = DEFAULT_PORT;
494f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        return this;
495f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    }
496363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang}
497