1d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu/*
2d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Copyright (C) 2016 The Android Open Source Project
3d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *
4d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
5d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * you may not use this file except in compliance with the License.
6d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * You may obtain a copy of the License at
7d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *
8d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
9d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *
10d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Unless required by applicable law or agreed to in writing, software
11d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
12d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * See the License for the specific language governing permissions and
14d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * limitations under the License.
15d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */
16d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu
178ca4ac971a9b862fbd69c57af3a3c0029a6b9f4dPeter Qiupackage com.android.server.wifi.hotspot2.anqp;
186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
19d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport com.android.internal.annotations.VisibleForTesting;
20d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport com.android.server.wifi.ByteBufferReader;
21866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist
226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.net.ProtocolException;
23d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.nio.BufferUnderflowException;
246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.nio.ByteBuffer;
25d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.nio.ByteOrder;
266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.ArrayList;
276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Collections;
286a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.List;
296a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
306a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist/**
32d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * The NAI (Network Access Identifier) Realm ANQP Element, IEEE802.11-2012 section 8.4.4.10.
33d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *
34d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Format:
35d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * | NAI Realm Count (optional) | NAI Realm Data #1 (optional) | ....
36d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *             2                         variable
376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist */
386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class NAIRealmElement extends ANQPElement {
39d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    private final List<NAIRealmData> mRealmDataList;
406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
41d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    @VisibleForTesting
42d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public NAIRealmElement(List<NAIRealmData> realmDataList) {
43d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        super(Constants.ANQPElementType.ANQPNAIRealm);
44d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        mRealmDataList = realmDataList;
45d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    }
466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
47d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    /**
48d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * Parse a NAIRealmElement from the given buffer.
49d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     *
50d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @param payload The byte buffer to read from
51d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @return {@link NAIRealmElement}
52d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @throws BufferUnderflowException
53d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     */
54d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static NAIRealmElement parse(ByteBuffer payload)
55d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            throws ProtocolException {
56d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        List<NAIRealmData> realmDataList = new ArrayList<>();
57d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        if (payload.hasRemaining()) {
58d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            int count = (int) ByteBufferReader.readInteger(payload, ByteOrder.LITTLE_ENDIAN, 2)
59d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu                    & 0xFFFF;
60d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            while (count > 0) {
61d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu                realmDataList.add(NAIRealmData.parse(payload));
62d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu                count--;
63d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            }
646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
65d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return new NAIRealmElement(realmDataList);
666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
68d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public List<NAIRealmData> getRealmDataList() {
69d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return Collections.unmodifiableList(mRealmDataList);
706a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
716a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
72d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    @Override
73d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public boolean equals(Object thatObject) {
74d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        if (this == thatObject) {
75d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            return true;
76d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        }
77d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        if (!(thatObject instanceof NAIRealmElement)) {
78d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            return false;
79866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        }
80d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        NAIRealmElement that = (NAIRealmElement) thatObject;
81d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return mRealmDataList.equals(that.mRealmDataList);
82d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    }
83d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu
84d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    @Override
85d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public int hashCode() {
86d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return mRealmDataList.hashCode();
87866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist    }
88866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist
896a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    @Override
906a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public String toString() {
91d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return "NAIRealmElement{mRealmDataList=" + mRealmDataList + "}";
926a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
936a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist}
94