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