1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android.anqp;
2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
3ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.io.IOException;
4ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.net.ProtocolException;
5ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.nio.ByteBuffer;
6ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.nio.charset.StandardCharsets;
7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Locale;
8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.anqp.Constants.BYTE_MASK;
10ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist/**
12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist * A generic Internationalized name used in ANQP elements as specified in 802.11-2012 and
13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist * "Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00"
14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist */
15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class I18Name {
16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final String mLanguage;
17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final Locale mLocale;
18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final String mText;
19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public I18Name(ByteBuffer payload) throws ProtocolException {
21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (payload.remaining() < Constants.LANG_CODE_LENGTH + 1) {
22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            throw new ProtocolException("Truncated I18Name: " + payload.remaining());
23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        int nameLength = payload.get() & BYTE_MASK;
25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (nameLength < Constants.LANG_CODE_LENGTH) {
26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            throw new ProtocolException("Runt I18Name: " + nameLength);
27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mLanguage = Constants.getTrimmedString(payload,
29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                Constants.LANG_CODE_LENGTH, StandardCharsets.US_ASCII);
30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mLocale = Locale.forLanguageTag(mLanguage);
31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mText = Constants.getString(payload, nameLength -
32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                Constants.LANG_CODE_LENGTH, StandardCharsets.UTF_8);
33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public I18Name(String compoundString) throws IOException {
36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (compoundString.length() < Constants.LANG_CODE_LENGTH) {
37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            throw new IOException("I18String too short: '" + compoundString + "'");
38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mLanguage = compoundString.substring(0, Constants.LANG_CODE_LENGTH);
40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mText = compoundString.substring(Constants.LANG_CODE_LENGTH);
41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mLocale = Locale.forLanguageTag(mLanguage);
42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String getLanguage() {
45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mLanguage;
46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public Locale getLocale() {
49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mLocale;
50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String getText() {
53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mText;
54ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
55ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
56ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    @Override
57ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public boolean equals(Object thatObject) {
58ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (this == thatObject) {
59ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return true;
60ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
61ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (thatObject == null || getClass() != thatObject.getClass()) {
62ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return false;
63ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
64ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
65ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        I18Name that = (I18Name) thatObject;
66ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mLanguage.equals(that.mLanguage) && mText.equals(that.mText);
67ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
68ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
69ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    @Override
70ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public int hashCode() {
71ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        int result = mLanguage.hashCode();
72ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        result = 31 * result + mText.hashCode();
73ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return result;
74ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
75ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
76ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    @Override
77ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String toString() {
78ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mText + ':' + mLocale.getLanguage();
79ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
80ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist}
81