LinkProperties.java revision 37e65ebb7eb932e1a144b1cab262e11ca5fd109b
147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt/*
247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * Copyright (C) 2008 The Android Open Source Project
347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt *
447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * you may not use this file except in compliance with the License.
647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * You may obtain a copy of the License at
747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt *
847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt *      http://www.apache.org/licenses/LICENSE-2.0
947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt *
1047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
1147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
1247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * See the License for the specific language governing permissions and
1447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * limitations under the License.
1547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt */
1647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
1747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltpackage android.net;
1847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
1937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwaltimport android.net.ProxyProperties;
2047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport android.os.Parcelable;
2147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport android.os.Parcel;
2247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport android.util.Log;
2347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
2447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport java.net.InetAddress;
2547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport java.net.NetworkInterface;
2647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport java.net.SocketException;
2747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport java.net.UnknownHostException;
2847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport java.util.ArrayList;
2947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwaltimport java.util.Collection;
3037e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwaltimport java.util.Collections;
3147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
3247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt/**
3337e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt * Describes the properties of a network link.
3447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * TODO - consider adding optional fields like Apn and ApnType
3547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt * @hide
3647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt */
3737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwaltpublic class LinkProperties implements Parcelable {
3847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
3947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    private NetworkInterface mIface;
4047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    private Collection<InetAddress> mAddresses;
4147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    private Collection<InetAddress> mDnses;
4247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    private InetAddress mGateway;
4347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    private ProxyProperties mHttpProxy;
4447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
4537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public LinkProperties() {
4647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        clear();
4747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
4847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
4937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    // copy constructor instead of clone
5037e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public LinkProperties(LinkProperties source) {
5137e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        mIface = source.getInterface();
5237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        mAddresses = source.getAddresses();
5337e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        mDnses = source.getDnses();
5437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        mGateway = source.getGateway();
5537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        mHttpProxy = new ProxyProperties(source.getHttpProxy());
5637e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    }
5737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt
5837e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void setInterface(NetworkInterface iface) {
5947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mIface = iface;
6047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
6137e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public NetworkInterface getInterface() {
6247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        return mIface;
6347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
6437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public String getInterfaceName() {
6547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        return (mIface == null ? null : mIface.getName());
6647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
6747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
6837e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void addAddress(InetAddress address) {
6947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mAddresses.add(address);
7047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
7137e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public Collection<InetAddress> getAddresses() {
7237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        return Collections.unmodifiableCollection(mAddresses);
7347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
7447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
7537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void addDns(InetAddress dns) {
7647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mDnses.add(dns);
7747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
7837e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public Collection<InetAddress> getDnses() {
7937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        return Collections.unmodifiableCollection(mDnses);
8047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
8147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
8237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void setGateway(InetAddress gateway) {
8347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mGateway = gateway;
8447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
8537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public InetAddress getGateway() {
8647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        return mGateway;
8747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
8847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
8937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void setHttpProxy(ProxyProperties proxy) {
9047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mHttpProxy = proxy;
9147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
9237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public ProxyProperties getHttpProxy() {
9347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        return mHttpProxy;
9447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
9547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
9637e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void clear() {
9747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mIface = null;
9847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mAddresses = new ArrayList<InetAddress>();
9947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mDnses = new ArrayList<InetAddress>();
10047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mGateway = null;
10147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        mHttpProxy = null;
10247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
10347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
10447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    /**
10547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     * Implement the Parcelable interface
10647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     * @hide
10747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     */
10847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    public int describeContents() {
10947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        return 0;
11047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
11147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
1121f6408a96c757b3001c553f8f34ef0bda00a224dWink Saville    @Override
11337e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public String toString() {
11447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        String ifaceName = (mIface == null ? "" : "InterfaceName: " + mIface.getName() + " ");
11547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
11647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        String ip = "IpAddresses: [";
1171f6408a96c757b3001c553f8f34ef0bda00a224dWink Saville        for (InetAddress addr : mAddresses) ip +=  addr.getHostAddress() + ",";
11847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        ip += "] ";
11947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
12047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        String dns = "DnsAddresses: [";
1211f6408a96c757b3001c553f8f34ef0bda00a224dWink Saville        for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ",";
12247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        dns += "] ";
12347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
12447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " ");
1251f6408a96c757b3001c553f8f34ef0bda00a224dWink Saville        String gateway = (mGateway == null ? "" : "Gateway: " + mGateway.getHostAddress() + " ");
12647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
12747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        return ifaceName + ip + gateway + dns + proxy;
12847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
12947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
13047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    /**
13147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     * Implement the Parcelable interface.
13247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     * @hide
13347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     */
13437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public void writeToParcel(Parcel dest, int flags) {
13547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        dest.writeString(getInterfaceName());
13647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        dest.writeInt(mAddresses.size());
1371cf56ab9c68334d9124c52bcede06aaa0b17c730Irfan Sheriff        //TODO: explore an easy alternative to preserve hostname
1381cf56ab9c68334d9124c52bcede06aaa0b17c730Irfan Sheriff        // without doing a lookup
13947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        for(InetAddress a : mAddresses) {
14047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByteArray(a.getAddress());
14147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        }
14247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        dest.writeInt(mDnses.size());
14347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        for(InetAddress d : mDnses) {
14447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByteArray(d.getAddress());
14547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        }
14647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        if (mGateway != null) {
14747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByte((byte)1);
14847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByteArray(mGateway.getAddress());
14947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        } else {
15047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByte((byte)0);
15147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        }
15247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        if (mHttpProxy != null) {
15347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByte((byte)1);
15447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeParcelable(mHttpProxy, flags);
15547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        } else {
15647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            dest.writeByte((byte)0);
15747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        }
15847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    }
15947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
16047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt    /**
16147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     * Implement the Parcelable interface.
16247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     * @hide
16347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt     */
16437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public static final Creator<LinkProperties> CREATOR =
16537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt        new Creator<LinkProperties>() {
16637e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt            public LinkProperties createFromParcel(Parcel in) {
16737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt                LinkProperties netProp = new LinkProperties();
16847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                String iface = in.readString();
16947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                if (iface != null) {
17047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    try {
17147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                        netProp.setInterface(NetworkInterface.getByName(iface));
17247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    } catch (Exception e) {
17347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                        return null;
17447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    }
17547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                }
17647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                int addressCount = in.readInt();
17747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                for (int i=0; i<addressCount; i++) {
17847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    try {
1791cf56ab9c68334d9124c52bcede06aaa0b17c730Irfan Sheriff                        netProp.addAddress(InetAddress.getByAddress(in.createByteArray()));
18047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    } catch (UnknownHostException e) { }
18147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                }
18247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                addressCount = in.readInt();
18347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                for (int i=0; i<addressCount; i++) {
18447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    try {
1851cf56ab9c68334d9124c52bcede06aaa0b17c730Irfan Sheriff                        netProp.addDns(InetAddress.getByAddress(in.createByteArray()));
18647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    } catch (UnknownHostException e) { }
18747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                }
18847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                if (in.readByte() == 1) {
18947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    try {
1901cf56ab9c68334d9124c52bcede06aaa0b17c730Irfan Sheriff                        netProp.setGateway(InetAddress.getByAddress(in.createByteArray()));
19147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    } catch (UnknownHostException e) {}
19247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                }
19347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                if (in.readByte() == 1) {
19447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                    netProp.setHttpProxy((ProxyProperties)in.readParcelable(null));
19547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                }
19647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt                return netProp;
19747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            }
19847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
19937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt            public LinkProperties[] newArray(int size) {
20037e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt                return new LinkProperties[size];
20147f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt            }
20247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt        };
20347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt}
204