blob: 28c597a5d47a56fc16be934d44eb8f674eb70b08 [file] [log] [blame]
package com.android.anqp;
import android.os.Parcel;
import com.android.hotspot2.Utils;
import java.net.ProtocolException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import static com.android.anqp.Constants.BYTE_MASK;
import static com.android.anqp.Constants.SHORT_MASK;
/**
* The Icon Binary File vendor specific ANQP Element,
* Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00,
* section 4.11
*/
public class HSIconFileElement extends ANQPElement {
public enum StatusCode {Success, FileNotFound, Unspecified}
private final StatusCode mStatusCode;
private final String mType;
private final byte[] mIconData;
public HSIconFileElement(Constants.ANQPElementType infoID, ByteBuffer payload)
throws ProtocolException {
super(infoID);
if (payload.remaining() < 4) {
throw new ProtocolException("Truncated icon file: " + payload.remaining());
}
int statusID = payload.get() & BYTE_MASK;
mStatusCode = statusID < StatusCode.values().length ? StatusCode.values()[statusID] : null;
mType = Constants.getPrefixedString(payload, 1, StandardCharsets.US_ASCII);
int dataLength = payload.getShort() & SHORT_MASK;
mIconData = new byte[dataLength];
payload.get(mIconData);
}
public StatusCode getStatusCode() {
return mStatusCode;
}
public String getType() {
return mType;
}
public byte[] getIconData() {
return mIconData;
}
@Override
public boolean equals(Object thatObject) {
if (thatObject == this) {
return true;
} else if (thatObject.getClass() != HSIconFileElement.class) {
return false;
}
HSIconFileElement that = (HSIconFileElement) thatObject;
if (getStatusCode() != that.getStatusCode() || getStatusCode() != StatusCode.Success) {
return false;
}
return getType().equals(that.getType()) && Arrays.equals(getIconData(), that.getIconData());
}
@Override
public String toString() {
return "HSIconFile{" +
"statusCode=" + mStatusCode +
", type='" + mType + '\'' +
", iconData=" + mIconData.length + " bytes }";
}
public HSIconFileElement(Parcel in) {
super(Constants.ANQPElementType.HSIconFile);
mStatusCode = Utils.mapEnum(in.readInt(), StatusCode.class);
mType = in.readString();
mIconData = in.readBlob();
}
public void writeParcel(Parcel out) {
out.writeInt(mStatusCode.ordinal());
out.writeString(mType);
out.writeBlob(mIconData);
}
}