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