1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android.anqp; 2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 30701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvistimport android.os.Parcel; 40701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist 50701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvistimport com.android.hotspot2.Utils; 60701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist 7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.net.ProtocolException; 8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.nio.ByteBuffer; 9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.nio.charset.StandardCharsets; 100ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvistimport java.util.Arrays; 11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.anqp.Constants.BYTE_MASK; 13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.anqp.Constants.SHORT_MASK; 14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist/** 16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist * The Icon Binary File vendor specific ANQP Element, 17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, 18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist * section 4.11 19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist */ 20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class HSIconFileElement extends ANQPElement { 21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public enum StatusCode {Success, FileNotFound, Unspecified} 23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final StatusCode mStatusCode; 25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final String mType; 26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final byte[] mIconData; 27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public HSIconFileElement(Constants.ANQPElementType infoID, ByteBuffer payload) 29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throws ProtocolException { 30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super(infoID); 31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (payload.remaining() < 4) { 33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new ProtocolException("Truncated icon file: " + payload.remaining()); 34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int statusID = payload.get() & BYTE_MASK; 37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mStatusCode = statusID < StatusCode.values().length ? StatusCode.values()[statusID] : null; 38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mType = Constants.getPrefixedString(payload, 1, StandardCharsets.US_ASCII); 39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int dataLength = payload.getShort() & SHORT_MASK; 41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mIconData = new byte[dataLength]; 42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist payload.get(mIconData); 43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public StatusCode getStatusCode() { 46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mStatusCode; 47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public String getType() { 50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mType; 51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public byte[] getIconData() { 54ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mIconData; 55ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 56ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 57ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 580ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist public boolean equals(Object thatObject) { 590ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist if (thatObject == this) { 600ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist return true; 610ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist } else if (thatObject.getClass() != HSIconFileElement.class) { 620ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist return false; 630ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist } 640ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist HSIconFileElement that = (HSIconFileElement) thatObject; 650ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist if (getStatusCode() != that.getStatusCode() || getStatusCode() != StatusCode.Success) { 660ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist return false; 670ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist } 680ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist return getType().equals(that.getType()) && Arrays.equals(getIconData(), that.getIconData()); 690ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist } 700ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist 710ff7a0a25679b1a4d483c6f750973c57b25b6826Jan Nordqvist @Override 72ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public String toString() { 73ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return "HSIconFile{" + 74ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "statusCode=" + mStatusCode + 75ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", type='" + mType + '\'' + 76ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", iconData=" + mIconData.length + " bytes }"; 77ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 780701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist 790701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist public HSIconFileElement(Parcel in) { 800701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist super(Constants.ANQPElementType.HSIconFile); 810701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist mStatusCode = Utils.mapEnum(in.readInt(), StatusCode.class); 820701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist mType = in.readString(); 830701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist mIconData = in.readBlob(); 840701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist } 850701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist 860701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist public void writeParcel(Parcel out) { 870701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist out.writeInt(mStatusCode.ordinal()); 880701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist out.writeString(mType); 890701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist out.writeBlob(mIconData); 900701952aaa17dcef461d3a538048243d9fe690f1Jan Nordqvist } 91ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist} 92