1d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/* 2d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 3d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 4d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * you may not use this file except in compliance with the License. 6d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * You may obtain a copy of the License at 7d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 8d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 10d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 11d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * See the License for the specific language governing permissions and 14d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * limitations under the License. 15d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 16d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 17d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeypackage com.android.server.net; 18d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 191b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkIdentity; 201b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 21d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport java.io.DataInputStream; 22d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport java.io.DataOutputStream; 23d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport java.io.IOException; 24d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport java.util.HashSet; 25d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 26d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/** 27d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Identity of a {@code iface}, defined by the set of {@link NetworkIdentity} 28d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * active on that interface. 29d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * 30d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * @hide 31d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 321b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeypublic class NetworkIdentitySet extends HashSet<NetworkIdentity> { 331b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey private static final int VERSION_INIT = 1; 345dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey private static final int VERSION_ADD_ROAMING = 2; 358fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey private static final int VERSION_ADD_NETWORK_ID = 3; 36d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public NetworkIdentitySet() { 38d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 39d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 401b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public NetworkIdentitySet(DataInputStream in) throws IOException { 41d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey final int version = in.readInt(); 428fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final int size = in.readInt(); 438fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey for (int i = 0; i < size; i++) { 448fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey if (version <= VERSION_INIT) { 458fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final int ignored = in.readInt(); 465dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey } 478fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final int type = in.readInt(); 488fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final int subType = in.readInt(); 498fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final String subscriberId = readOptionalString(in); 508fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final String networkId; 518fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey if (version >= VERSION_ADD_NETWORK_ID) { 528fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey networkId = readOptionalString(in); 538fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } else { 548fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey networkId = null; 55d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 568fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final boolean roaming; 578fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey if (version >= VERSION_ADD_ROAMING) { 588fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey roaming = in.readBoolean(); 598fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } else { 608fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey roaming = false; 61d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 628fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 638fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey add(new NetworkIdentity(type, subType, subscriberId, networkId, false)); 64d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 65d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 66d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 67d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey public void writeToStream(DataOutputStream out) throws IOException { 688fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey out.writeInt(VERSION_ADD_NETWORK_ID); 69d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey out.writeInt(size()); 70d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey for (NetworkIdentity ident : this) { 711b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey out.writeInt(ident.getType()); 721b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey out.writeInt(ident.getSubType()); 731b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey writeOptionalString(out, ident.getSubscriberId()); 748fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey writeOptionalString(out, ident.getNetworkId()); 755dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey out.writeBoolean(ident.getRoaming()); 76d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 77d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 78d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 791b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey private static void writeOptionalString(DataOutputStream out, String value) throws IOException { 801b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (value != null) { 811b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey out.writeByte(1); 821b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey out.writeUTF(value); 831b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } else { 841b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey out.writeByte(0); 851b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 861b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 871b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 881b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey private static String readOptionalString(DataInputStream in) throws IOException { 891b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (in.readByte() != 0) { 901b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return in.readUTF(); 911b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } else { 921b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return null; 93d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 94d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 95d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey} 96