package com.android.server.wifi.anqp; import java.net.ProtocolException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; import java.util.List; import java.util.Map; /** * The Venue Name ANQP Element, IEEE802.11-2012 section 8.4.4.4 */ public class VenueNameElement extends ANQPElement { private final VenueGroup mGroup; private final VenueType mType; private final List<I18Name> mNames; private static final Map<VenueGroup, Integer> sGroupBases = new EnumMap<VenueGroup, Integer>(VenueGroup.class); public VenueNameElement(Constants.ANQPElementType infoID, ByteBuffer payload) throws ProtocolException { super(infoID); if (payload.remaining() < 2) throw new ProtocolException("Runt Venue Name"); int group = payload.get() & Constants.BYTE_MASK; int type = payload.get() & Constants.BYTE_MASK; if (group >= VenueGroup.values().length) { mGroup = VenueGroup.Reserved; mType = VenueType.Reserved; } else { mGroup = VenueGroup.values()[group]; type += sGroupBases.get(mGroup); if (type >= VenueType.values().length) { mType = VenueType.Reserved; } else { mType = VenueType.values()[type]; } } mNames = new ArrayList<I18Name>(); while (payload.hasRemaining()) { mNames.add(new I18Name(payload)); } } public VenueGroup getGroup() { return mGroup; } public VenueType getType() { return mType; } public List<I18Name> getNames() { return Collections.unmodifiableList(mNames); } @Override public String toString() { return "VenueName{" + "m_group=" + mGroup + ", m_type=" + mType + ", m_names=" + mNames + '}'; } public enum VenueGroup { Unspecified, Assembly, Business, Educational, FactoryIndustrial, Institutional, Mercantile, Residential, Storage, UtilityMiscellaneous, Vehicular, Outdoor, Reserved } public enum VenueType { Unspecified, UnspecifiedAssembly, Arena, Stadium, PassengerTerminal, Amphitheater, AmusementPark, PlaceOfWorship, ConventionCenter, Library, Museum, Restaurant, Theater, Bar, CoffeeShop, ZooOrAquarium, EmergencyCoordinationCenter, UnspecifiedBusiness, DoctorDentistoffice, Bank, FireStation, PoliceStation, PostOffice, ProfessionalOffice, ResearchDevelopmentFacility, AttorneyOffice, UnspecifiedEducational, SchoolPrimary, SchoolSecondary, UniversityCollege, UnspecifiedFactoryIndustrial, Factory, UnspecifiedInstitutional, Hospital, LongTermCareFacility, AlcoholAndDrugRehabilitationCenter, GroupHome, PrisonJail, UnspecifiedMercantile, RetailStore, GroceryMarket, AutomotiveServiceStation, ShoppingMall, GasStation, UnspecifiedResidential, PrivateResidence, HotelMotel, Dormitory, BoardingHouse, UnspecifiedStorage, UnspecifiedUtilityMiscellaneous, UnspecifiedVehicular, AutomobileOrTruck, Airplane, Bus, Ferry, ShipOrBoat, Train, MotorBike, UnspecifiedOutdoor, MuniMeshNetwork, CityPark, RestArea, TrafficControl, BusStop, Kiosk, Reserved } private static final VenueType[] PerGroup = { VenueType.Unspecified, VenueType.UnspecifiedAssembly, VenueType.UnspecifiedBusiness, VenueType.UnspecifiedEducational, VenueType.UnspecifiedFactoryIndustrial, VenueType.UnspecifiedInstitutional, VenueType.UnspecifiedMercantile, VenueType.UnspecifiedResidential, VenueType.UnspecifiedStorage, VenueType.UnspecifiedUtilityMiscellaneous, VenueType.UnspecifiedVehicular, VenueType.UnspecifiedOutdoor }; static { int index = 0; for (VenueType venue : PerGroup) { sGroupBases.put(VenueGroup.values()[index++], venue.ordinal()); } } }