155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan/*
2d3aba7f7b67c758b2b325276538da6e1350cce69Hung-ying Tyan * Copyright (C) 2009, The Android Open Source Project
355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan *
455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License");
555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * you may not use this file except in compliance with the License.
655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * You may obtain a copy of the License at
755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan *
855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan *     http://www.apache.org/licenses/LICENSE-2.0
955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan *
1055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * Unless required by applicable law or agreed to in writing, software
1155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS,
1255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * See the License for the specific language governing permissions and
1455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * limitations under the License.
1555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan */
1655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
1755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyanpackage android.net.vpn;
1855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
1955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyanimport android.content.Context;
2055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyanimport android.os.Parcel;
2155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyanimport android.os.Parcelable;
2255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
2355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyanimport java.io.IOException;
2455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyanimport java.io.Serializable;
2555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
2655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan/**
2755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * A VPN profile.
2855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan * {@hide}
2955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan */
30f94b6444a3d4dc6d904754f80b2f940be90e432bHung-ying Tyanpublic abstract class VpnProfile implements Parcelable, Serializable {
31f94b6444a3d4dc6d904754f80b2f940be90e432bHung-ying Tyan    private static final long serialVersionUID = 1L;
3255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    private String mName; // unique display name
3355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    private String mId; // unique identifier
344c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    private String mServerName; // VPN server name
3555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    private String mDomainSuffices; // space separated list
3655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    private String mRouteList; // space separated list
374c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    private String mSavedUsername;
3855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    private boolean mIsCustomized;
3955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    private transient VpnState mState = VpnState.IDLE;
4055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
4155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    /** Sets a user-friendly name for this profile. */
4255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public void setName(String name) {
4355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mName = name;
4455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
4555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
4655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public String getName() {
4755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return mName;
4855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
4955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
5055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    /**
5155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * Sets an ID for this profile.  The caller should make sure the
5255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * uniqueness of the ID.
5355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     */
5455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public void setId(String id) {
5555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mId = id;
5655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
5755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
5855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public String getId() {
5955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return mId;
6055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
6155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
6255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    /**
634c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan     * Sets the name of the VPN server. Used for DNS lookup.
644c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan     */
654c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    public void setServerName(String name) {
664c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        mServerName = name;
674c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    }
684c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan
694c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    public String getServerName() {
704c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        return mServerName;
714c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    }
724c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan
734c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    /**
7455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * Sets the domain suffices for DNS resolution.
7555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     *
7655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * @param entries a comma-separated list of domain suffices
7755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     */
7855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public void setDomainSuffices(String entries) {
7955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mDomainSuffices = entries;
8055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
8155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
8255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public String getDomainSuffices() {
8355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return mDomainSuffices;
8455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
8555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
8655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    /**
8755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * Sets the routing info for this VPN connection.
8855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     *
8955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * @param entries a comma-separated list of routes; each entry is in the
9055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     *      format of "(network address)/(network mask)"
9155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     */
9255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public void setRouteList(String entries) {
9355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mRouteList = entries;
9455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
9555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
9655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public String getRouteList() {
9755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return mRouteList;
9855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
9955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
1004c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    public void setSavedUsername(String name) {
1014c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        mSavedUsername = name;
1024c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    }
1034c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan
1044c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    public String getSavedUsername() {
1054c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        return mSavedUsername;
1064c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan    }
1074c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan
10855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public void setState(VpnState state) {
10955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mState = state;
11055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
11155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
11255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public VpnState getState() {
11355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return ((mState == null) ? VpnState.IDLE : mState);
11455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
11555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
11655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public boolean isIdle() {
11755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return (mState == VpnState.IDLE);
11855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
11955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
12055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    /**
12155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * Returns whether this profile is custom made (as opposed to being
12255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * created by provided user interface).
12355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     */
12455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public boolean isCustomized() {
12555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return mIsCustomized;
12655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
12755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
12855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    /**
12955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     * Returns the VPN type of the profile.
13055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan     */
13155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public abstract VpnType getType();
13255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
13355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    void setCustomized(boolean customized) {
13455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mIsCustomized = customized;
13555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
13655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
13755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    protected void readFromParcel(Parcel in) {
13855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mName = in.readString();
13955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mId = in.readString();
1404c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        mServerName = in.readString();
14155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mDomainSuffices = in.readString();
14255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        mRouteList = in.readString();
1434c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        mSavedUsername = in.readString();
14455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
14555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
14655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public static final Parcelable.Creator<VpnProfile> CREATOR =
14755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan            new Parcelable.Creator<VpnProfile>() {
14855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                public VpnProfile createFromParcel(Parcel in) {
14955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    VpnType type = Enum.valueOf(VpnType.class, in.readString());
15055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    boolean customized = in.readInt() > 0;
15155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    VpnProfile p = new VpnManager(null).createVpnProfile(type,
15255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                            customized);
15355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    if (p == null) return null;
15455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    p.readFromParcel(in);
15555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    return p;
15655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                }
15755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
15855567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                public VpnProfile[] newArray(int size) {
15955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                    return new VpnProfile[size];
16055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                }
16155567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan            };
16255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
16355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public void writeToParcel(Parcel parcel, int flags) {
16455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        parcel.writeString(getType().toString());
16555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        parcel.writeInt(mIsCustomized ? 1 : 0);
16655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        parcel.writeString(mName);
16755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        parcel.writeString(mId);
1684c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        parcel.writeString(mServerName);
16955567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        parcel.writeString(mDomainSuffices);
17055567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        parcel.writeString(mRouteList);
1714c424d61c72af64b4fa1da5e1c52eaebf60fe36eHung-ying Tyan        parcel.writeString(mSavedUsername);
17255567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
17355567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan
17455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    public int describeContents() {
17555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan        return 0;
17655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan    }
17755567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan}
178