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>
403aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
413aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
423aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
433aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using SIP, read the
443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/network/sip.html">Session Initiation Protocol</a>
453aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * developer guide.</p>
463aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
47363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang */
48cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyanpublic class SipProfile implements Parcelable, Serializable, Cloneable {
49363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private static final long serialVersionUID = 1L;
50363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private static final int DEFAULT_PORT = 5060;
51f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private static final String TCP = "TCP";
52f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private static final String UDP = "UDP";
53363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private Address mAddress;
54363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mProxyAddress;
55363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mPassword;
56363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mDomain;
57f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private String mProtocol = UDP;
58363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private String mProfileName;
590f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    private String mAuthUserName;
60f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private int mPort = DEFAULT_PORT;
61363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private boolean mSendKeepAlive = false;
62363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private boolean mAutoRegistration = true;
6360264b306453a3043442719b970f2edb3f46f51bHung-ying Tyan    private transient int mCallingUid = 0;
64363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
65363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public static final Parcelable.Creator<SipProfile> CREATOR =
66363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            new Parcelable.Creator<SipProfile>() {
67363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                public SipProfile createFromParcel(Parcel in) {
68363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    return new SipProfile(in);
69363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                }
70363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
71363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                public SipProfile[] newArray(int size) {
72363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    return new SipProfile[size];
73363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                }
74363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            };
75363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
76363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
7702b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main     * Helper class for creating a {@link SipProfile}.
78363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
79363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public static class Builder {
80363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private AddressFactory mAddressFactory;
81363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private SipProfile mProfile = new SipProfile();
82363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private SipURI mUri;
83363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private String mDisplayName;
84363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private String mProxyAddress;
85363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
86363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        {
87363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            try {
88363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                mAddressFactory =
89363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                        SipFactory.getInstance().createAddressFactory();
90363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            } catch (PeerUnavailableException e) {
91363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new RuntimeException(e);
92363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
93363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
94363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
95363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
96cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan         * Creates a builder based on the given profile.
97cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan         */
98cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan        public Builder(SipProfile profile) {
99cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            if (profile == null) throw new NullPointerException();
100cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            try {
101cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan                mProfile = (SipProfile) profile.clone();
102cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            } catch (CloneNotSupportedException e) {
103cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan                throw new RuntimeException("should not occur", e);
104cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            }
105cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mProfile.mAddress = null;
106cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mUri = profile.getUri();
107cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mUri.setUserPassword(profile.getPassword());
108cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mDisplayName = profile.getDisplayName();
109cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan            mProxyAddress = profile.getProxyAddress();
110f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            mProfile.mPort = profile.getPort();
111cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan        }
112cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan
113cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan        /**
114363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Constructor.
115363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
116363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param uriString the URI string as "sip:<user_name>@<domain>"
117363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @throws ParseException if the string is not a valid URI
118363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
119363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder(String uriString) throws ParseException {
120363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if (uriString == null) {
121363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new NullPointerException("uriString cannot be null");
122363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
123363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            URI uri = mAddressFactory.createURI(fix(uriString));
124363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if (uri instanceof SipURI) {
125363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                mUri = (SipURI) uri;
126363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            } else {
127363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new ParseException(uriString + " is not a SIP URI", 0);
128363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
129363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mDomain = mUri.getHost();
130363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
131363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
132363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
133363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Constructor.
134363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
135363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param username username of the SIP account
136363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param serverDomain the SIP server domain; if the network address
137286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan         *      is different from the domain, use {@link #setOutboundProxy} to
138286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan         *      set server address
139363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @throws ParseException if the parameters are not valid
140363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
141363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder(String username, String serverDomain)
142363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throws ParseException {
143363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if ((username == null) || (serverDomain == null)) {
144363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new NullPointerException(
145363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                        "username and serverDomain cannot be null");
146363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
147363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mUri = mAddressFactory.createSipURI(username, serverDomain);
148363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mDomain = serverDomain;
149363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
150363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
151363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        private String fix(String uriString) {
152363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return (uriString.trim().toLowerCase().startsWith("sip:")
153363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    ? uriString
154363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    : "sip:" + uriString);
155363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
156363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
157363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
1580f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         * Sets the username used for authentication.
1590f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         *
1609e25df44631e3c7881a6816cf26f34ea24055c72Chung-yih Wang         * @param name authentication username of the profile
1610f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         * @return this builder object
1620f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang         */
1630f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        public Builder setAuthUserName(String name) {
1640f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang            mProfile.mAuthUserName = name;
1650f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang            return this;
1660f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        }
1670f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang
1680f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        /**
169363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the name of the profile. This name is given by user.
170363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
171363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param name name of the profile
172363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
173363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
174363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setProfileName(String name) {
175363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mProfileName = name;
176363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
177363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
178363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
179363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
180363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the password of the SIP account
181363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
182363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param password password of the SIP account
183363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
184363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
185363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setPassword(String password) {
186363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mUri.setUserPassword(password);
187363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
188363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
189363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
190363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
191363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the port number of the server. By default, it is 5060.
192363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
193363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param port port number of the server
194363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
19599bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan         * @throws IllegalArgumentException if the port number is out of range
196363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
19799bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan        public Builder setPort(int port) throws IllegalArgumentException {
198f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            if ((port > 65535) || (port < 1000)) {
199eecf4a6f11129461088d620afadb6014edab3086Hung-ying Tyan                throw new IllegalArgumentException("incorrect port arugment: " + port);
20099bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan            }
201f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            mProfile.mPort = port;
202f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            return this;
203363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
204363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
205363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
206363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the protocol used to connect to the SIP server. Currently,
207363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * only "UDP" and "TCP" are supported.
208363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
209363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param protocol the protocol string
210363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
21199bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan         * @throws IllegalArgumentException if the protocol is not recognized
212363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
213363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setProtocol(String protocol)
21499bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan                throws IllegalArgumentException {
215363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            if (protocol == null) {
216363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new NullPointerException("protocol cannot be null");
217363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
218363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            protocol = protocol.toUpperCase();
219f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            if (!protocol.equals(UDP) && !protocol.equals(TCP)) {
22099bf4e45c4566172189735b34b368b76660ca57aHung-ying Tyan                throw new IllegalArgumentException(
221363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                        "unsupported protocol: " + protocol);
222363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
223363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mProtocol = protocol;
224363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
225363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
226363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
227363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
228363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the outbound proxy of the SIP server.
229363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
230363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param outboundProxy the network address of the outbound proxy
231363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
232363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
233363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setOutboundProxy(String outboundProxy) {
234363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProxyAddress = outboundProxy;
235363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
236363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
237363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
238363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
239363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the display name of the user.
240363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
241363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param displayName display name of the user
242363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
243363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
244363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setDisplayName(String displayName) {
245363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mDisplayName = displayName;
246363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
247363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
248363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
249363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
250363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the send keep-alive flag.
251363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
252363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param flag true if sending keep-alive message is required,
253363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *      false otherwise
254363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
255363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
256363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setSendKeepAlive(boolean flag) {
257363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mSendKeepAlive = flag;
258363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
259363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
260363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
261363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
262363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
263363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Sets the auto. registration flag.
264363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
265363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @param flag true if the profile will be registered automatically,
266363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *      false otherwise
267363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return this builder object
268363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
269363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public Builder setAutoRegistration(boolean flag) {
270363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mAutoRegistration = flag;
271363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return this;
272363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
273363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
274363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        /**
275363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * Builds and returns the SIP profile object.
276363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         *
277363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         * @return the profile object created
278363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang         */
279363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        public SipProfile build() {
280363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            // remove password from URI
281363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mProfile.mPassword = mUri.getUserPassword();
282363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            mUri.setUserPassword(null);
283363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            try {
284363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                if (!TextUtils.isEmpty(mProxyAddress)) {
285363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    SipURI uri = (SipURI)
286363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                            mAddressFactory.createURI(fix(mProxyAddress));
287363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                    mProfile.mProxyAddress = uri.getHost();
288f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                } else {
289f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    if (!mProfile.mProtocol.equals(UDP)) {
290f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                        mUri.setTransportParam(mProfile.mProtocol);
291f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    }
292f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    if (mProfile.mPort != DEFAULT_PORT) {
293f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                        mUri.setPort(mProfile.mPort);
294f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                    }
295363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                }
296f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                mProfile.mAddress = mAddressFactory.createAddress(
297f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                        mDisplayName, mUri);
298f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            } catch (InvalidArgumentException e) {
299f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang                throw new RuntimeException(e);
300363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            } catch (ParseException e) {
301363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                // must not occur
302363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang                throw new RuntimeException(e);
303363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            }
304363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang            return mProfile;
305363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        }
306363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
307363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
308363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private SipProfile() {
309363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
310363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
311363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    private SipProfile(Parcel in) {
312363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mAddress = (Address) in.readSerializable();
313363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mProxyAddress = in.readString();
314363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mPassword = in.readString();
315363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mDomain = in.readString();
316363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mProtocol = in.readString();
317363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mProfileName = in.readString();
318363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mSendKeepAlive = (in.readInt() == 0) ? false : true;
319363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        mAutoRegistration = (in.readInt() == 0) ? false : true;
3205424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        mCallingUid = in.readInt();
321f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        mPort = in.readInt();
3220f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        mAuthUserName = in.readString();
323363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
324363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
32584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan    @Override
326363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public void writeToParcel(Parcel out, int flags) {
327363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeSerializable(mAddress);
328363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mProxyAddress);
329363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mPassword);
330363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mDomain);
331363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mProtocol);
332363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeString(mProfileName);
333363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeInt(mSendKeepAlive ? 1 : 0);
334363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        out.writeInt(mAutoRegistration ? 1 : 0);
3355424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        out.writeInt(mCallingUid);
336f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        out.writeInt(mPort);
3370f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        out.writeString(mAuthUserName);
338363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
339363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
34084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan    @Override
341363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public int describeContents() {
342363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return 0;
343363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
344363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
345363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
346363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP URI of this profile.
347363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
348363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP URI of this profile
349286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan     * @hide
350363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
351363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public SipURI getUri() {
352363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return (SipURI) mAddress.getURI();
353363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
354363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
355363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
356363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP URI string of this profile.
357363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
358363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP URI string of this profile
359363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
360363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getUriString() {
361f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // We need to return the sip uri domain instead of
362f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // the SIP URI with transport, port information if
363f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // the outbound proxy address exists.
364f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        if (!TextUtils.isEmpty(mProxyAddress)) {
365f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang            return "sip:" + getUserName() + "@" + mDomain;
366f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        }
367f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        return getUri().toString();
368363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
369363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
370363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
371363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP address of this profile.
372363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
373363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP address of this profile
374286bb5a00bdb9f0cb0815aef441ec72f231c84eaHung-ying Tyan     * @hide
375363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
376363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public Address getSipAddress() {
377363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mAddress;
378363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
379363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
380363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
381363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the display name of the user.
382363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
383363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the display name of the user
384363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
385363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getDisplayName() {
386363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mAddress.getDisplayName();
387363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
388363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
389363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
390363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the username.
391363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
392363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the username
393363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
394363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getUserName() {
395363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return getUri().getUser();
396363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
397363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
398363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
3990f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     * Gets the username for authentication. If it is null, then the username
4009e25df44631e3c7881a6816cf26f34ea24055c72Chung-yih Wang     * is used in authentication instead.
4010f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     *
4029e25df44631e3c7881a6816cf26f34ea24055c72Chung-yih Wang     * @return the authentication username
4039e25df44631e3c7881a6816cf26f34ea24055c72Chung-yih Wang     * @see #getUserName
4040f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang     */
4050f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    public String getAuthUserName() {
4060f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang        return mAuthUserName;
4070f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    }
4080f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang
4090f7de88cb9eef781117fa2f2b69ba2698237637eChung-yih Wang    /**
410363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the password.
411363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
412363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the password
413363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
414363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getPassword() {
415363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mPassword;
416363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
417363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
418363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
419363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the SIP domain.
420363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
421363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the SIP domain
422363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
423363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getSipDomain() {
424363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mDomain;
425363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
426363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
427363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
428363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the port number of the SIP server.
429363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
430363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the port number of the SIP server
431363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
432363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public int getPort() {
433f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        return mPort;
434363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
435363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
436363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
437363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the protocol used to connect to the server.
438363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
439363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the protocol
440363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
441363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getProtocol() {
442363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mProtocol;
443363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
444363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
445363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
446363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the network address of the server outbound proxy.
447363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
448363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the network address of the server outbound proxy
449363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
450363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getProxyAddress() {
451363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mProxyAddress;
452363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
453363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
454363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
455363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the (user-defined) name of the profile.
456363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
457363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return name of the profile
458363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
459363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public String getProfileName() {
460363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mProfileName;
461363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
462363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
463363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
464363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the flag of 'Sending keep-alive'.
465363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
466363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the flag of sending SIP keep-alive messages.
467363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
468363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public boolean getSendKeepAlive() {
469363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mSendKeepAlive;
470363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
471363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang
472363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    /**
473363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * Gets the flag of 'Auto Registration'.
474363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     *
475363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     * @return the flag of registering the profile automatically.
476363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang     */
477363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    public boolean getAutoRegistration() {
478363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang        return mAutoRegistration;
479363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang    }
480cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan
481cf95f5d26363d4cd3815d31f5798f932a7720c17Hung-ying Tyan    /**
4825424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * Sets the calling process's Uid in the sip service.
4835424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * @hide
4845424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     */
4855424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    public void setCallingUid(int uid) {
4865424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        mCallingUid = uid;
4875424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    }
4885424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang
4895424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    /**
4905424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * Gets the calling process's Uid in the sip settings.
4915424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     * @hide
4925424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang     */
4935424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    public int getCallingUid() {
4945424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang        return mCallingUid;
4955424c8dcacf1c227fe7deb0185510614122ab447Chung-yih Wang    }
496f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang
497f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    private Object readResolve() throws ObjectStreamException {
498f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        // For compatibility.
499f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        if (mPort == 0) mPort = DEFAULT_PORT;
500f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang        return this;
501f053292d7a46c30abbe6f12ca04dbc03ec964d80Chung-yih Wang    }
502363c2ab82cca4f095e9e0c8465e28f6d27a24bf8Chung-yih Wang}
503