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