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