package com.android.server.wifi.anqp; import java.net.ProtocolException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static com.android.server.wifi.anqp.Constants.BYTE_MASK; public class CellularNetwork implements Iterable<String> { private static final int PLMNListType = 0; private final List<String> mMccMnc; private CellularNetwork(int plmnCount, ByteBuffer payload) throws ProtocolException { mMccMnc = new ArrayList<>(plmnCount); while (plmnCount > 0) { if (payload.remaining() < 3) { throw new ProtocolException("Truncated PLMN info"); } byte[] plmn = new byte[3]; payload.get(plmn); int mcc = ((plmn[0] << 8) & 0xf00) | (plmn[0] & 0x0f0) | (plmn[1] & 0x00f); int mnc = ((plmn[2] << 4) & 0xf0) | ((plmn[2] >> 4) & 0x0f); int n2 = (plmn[1] >> 4) & 0x0f; String mccMnc = n2 != 0xf ? String.format("%03x%03x", mcc, (mnc << 4) | n2) : String.format("%03x%02x", mcc, mnc); mMccMnc.add(mccMnc); plmnCount--; } } public static CellularNetwork buildCellularNetwork(ByteBuffer payload) throws ProtocolException { int iei = payload.get() & BYTE_MASK; int plmnLen = payload.get() & 0x7f; if (iei != PLMNListType) { payload.position(payload.position() + plmnLen); return null; } int plmnCount = payload.get() & BYTE_MASK; return new CellularNetwork(plmnCount, payload); } @Override public Iterator<String> iterator() { return mMccMnc.iterator(); } @Override public String toString() { StringBuilder sb = new StringBuilder("PLMN:"); for (String mccMnc : mMccMnc) { sb.append(' ').append(mccMnc); } return sb.toString(); } }