package com.android.server.wifi;
import java.io.IOException;
public class IMSIParameter {
private final String mImsi;
private final boolean mPrefix;
public IMSIParameter(String imsi, boolean prefix) {
mImsi = imsi;
mPrefix = prefix;
}
public IMSIParameter(String imsi) throws IOException {
if (imsi == null || imsi.length() == 0) {
throw new IOException("Bad IMSI: '" + imsi + "'");
}
int nonDigit;
char stopChar = '\0';
for (nonDigit = 0; nonDigit < imsi.length(); nonDigit++) {
stopChar = imsi.charAt(nonDigit);
if (stopChar < '0' || stopChar > '9') {
break;
}
}
if (nonDigit == imsi.length()) {
mImsi = imsi;
mPrefix = false;
}
else if (nonDigit == imsi.length()-1 && stopChar == '*') {
mImsi = imsi.substring(0, nonDigit);
mPrefix = true;
}
else {
throw new IOException("Bad IMSI: '" + imsi + "'");
}
}
public boolean matches(String fullIMSI) {
if (mPrefix) {
return mImsi.regionMatches(false, 0, fullIMSI, 0, mImsi.length());
}
else {
return mImsi.equals(fullIMSI);
}
}
public boolean matchesMccMnc(String mccMnc) {
if (mPrefix) {
// For a prefix match, the entire prefix must match the mcc+mnc
return mImsi.regionMatches(false, 0, mccMnc, 0, mImsi.length());
}
else {
// For regular match, the entire length of mcc+mnc must match this IMSI
return mImsi.regionMatches(false, 0, mccMnc, 0, mccMnc.length());
}
}
public boolean isPrefix() {
return mPrefix;
}
public String getImsi() {
return mImsi;
}
public int prefixLength() {
return mImsi.length();
}
@Override
public boolean equals(Object thatObject) {
if (this == thatObject) {
return true;
}
else if (thatObject == null || getClass() != thatObject.getClass()) {
return false;
}
IMSIParameter that = (IMSIParameter) thatObject;
return mPrefix == that.mPrefix && mImsi.equals(that.mImsi);
}
@Override
public int hashCode() {
int result = mImsi != null ? mImsi.hashCode() : 0;
result = 31 * result + (mPrefix ? 1 : 0);
return result;
}
@Override
public String toString() {
if (mPrefix) {
return mImsi + '*';
}
else {
return mImsi;
}
}
}