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