1 package com.android.server.wifi.hotspot2.anqp; 2 3 import com.android.internal.annotations.VisibleForTesting; 4 import com.android.server.wifi.ByteBufferReader; 5 import com.android.server.wifi.hotspot2.Utils; 6 7 import java.net.ProtocolException; 8 import java.nio.BufferUnderflowException; 9 import java.nio.ByteBuffer; 10 import java.nio.ByteOrder; 11 import java.util.ArrayList; 12 import java.util.Collections; 13 import java.util.List; 14 15 /** 16 * The Roaming Consortium ANQP Element, IEEE802.11-2012 section 8.4.4.7 17 * 18 ** Format: 19 * 20 * | OI Duple #1 (optional) | ... 21 * variable 22 * 23 * | OI Length | OI | 24 * 1 variable 25 * 26 */ 27 public class RoamingConsortiumElement extends ANQPElement { 28 @VisibleForTesting 29 public static final int MINIMUM_OI_LENGTH = Byte.BYTES; 30 31 @VisibleForTesting 32 public static final int MAXIMUM_OI_LENGTH = Long.BYTES; 33 34 private final List<Long> mOIs; 35 36 @VisibleForTesting RoamingConsortiumElement(List<Long> ois)37 public RoamingConsortiumElement(List<Long> ois) { 38 super(Constants.ANQPElementType.ANQPRoamingConsortium); 39 mOIs = ois; 40 } 41 42 /** 43 * Parse a VenueNameElement from the given payload. 44 * 45 * @param payload The byte buffer to read from 46 * @return {@link RoamingConsortiumElement} 47 * @throws BufferUnderflowException 48 * @throws ProtocolException 49 */ parse(ByteBuffer payload)50 public static RoamingConsortiumElement parse(ByteBuffer payload) 51 throws ProtocolException { 52 List<Long> OIs = new ArrayList<Long>(); 53 while (payload.hasRemaining()) { 54 int length = payload.get() & 0xFF; 55 if (length < MINIMUM_OI_LENGTH || length > MAXIMUM_OI_LENGTH) { 56 throw new ProtocolException("Bad OI length: " + length); 57 } 58 OIs.add(ByteBufferReader.readInteger(payload, ByteOrder.BIG_ENDIAN, length)); 59 } 60 return new RoamingConsortiumElement(OIs); 61 } 62 getOIs()63 public List<Long> getOIs() { 64 return Collections.unmodifiableList(mOIs); 65 } 66 67 @Override equals(Object thatObject)68 public boolean equals(Object thatObject) { 69 if (this == thatObject) { 70 return true; 71 } 72 if (!(thatObject instanceof RoamingConsortiumElement)) { 73 return false; 74 } 75 RoamingConsortiumElement that = (RoamingConsortiumElement) thatObject; 76 return mOIs.equals(that.mOIs); 77 } 78 79 @Override hashCode()80 public int hashCode() { 81 return mOIs.hashCode(); 82 } 83 84 @Override toString()85 public String toString() { 86 return "RoamingConsortium{mOis=[" + Utils.roamingConsortiumsToString(mOIs) + "]}"; 87 } 88 } 89