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