1package com.android.hotspot2;
2
3import java.io.IOException;
4
5public class IMSIParameter {
6    private final String mImsi;
7    private final boolean mPrefix;
8
9    public IMSIParameter(String imsi, boolean prefix) {
10        mImsi = imsi;
11        mPrefix = prefix;
12    }
13
14    public IMSIParameter(String imsi) throws IOException {
15        if (imsi == null || imsi.length() == 0) {
16            throw new IOException("Bad IMSI: '" + imsi + "'");
17        }
18
19        int nonDigit;
20        char stopChar = '\0';
21        for (nonDigit = 0; nonDigit < imsi.length(); nonDigit++) {
22            stopChar = imsi.charAt(nonDigit);
23            if (stopChar < '0' || stopChar > '9') {
24                break;
25            }
26        }
27
28        if (nonDigit == imsi.length()) {
29            mImsi = imsi;
30            mPrefix = false;
31        } else if (nonDigit == imsi.length() - 1 && stopChar == '*') {
32            mImsi = imsi.substring(0, nonDigit);
33            mPrefix = true;
34        } else {
35            throw new IOException("Bad IMSI: '" + imsi + "'");
36        }
37    }
38
39    public boolean matches(String fullIMSI) {
40        if (mPrefix) {
41            return mImsi.regionMatches(false, 0, fullIMSI, 0, mImsi.length());
42        } else {
43            return mImsi.equals(fullIMSI);
44        }
45    }
46
47    public boolean matchesMccMnc(String mccMnc) {
48        if (mPrefix) {
49            // For a prefix match, the entire prefix must match the mcc+mnc
50            return mImsi.regionMatches(false, 0, mccMnc, 0, mImsi.length());
51        } else {
52            // For regular match, the entire length of mcc+mnc must match this IMSI
53            return mImsi.regionMatches(false, 0, mccMnc, 0, mccMnc.length());
54        }
55    }
56
57    public boolean isPrefix() {
58        return mPrefix;
59    }
60
61    public String getImsi() {
62        return mImsi;
63    }
64
65    public int prefixLength() {
66        return mImsi.length();
67    }
68
69    @Override
70    public boolean equals(Object thatObject) {
71        if (this == thatObject) {
72            return true;
73        } else if (thatObject == null || getClass() != thatObject.getClass()) {
74            return false;
75        }
76
77        IMSIParameter that = (IMSIParameter) thatObject;
78        return mPrefix == that.mPrefix && mImsi.equals(that.mImsi);
79    }
80
81    @Override
82    public int hashCode() {
83        int result = mImsi != null ? mImsi.hashCode() : 0;
84        result = 31 * result + (mPrefix ? 1 : 0);
85        return result;
86    }
87
88    @Override
89    public String toString() {
90        if (mPrefix) {
91            return mImsi + '*';
92        } else {
93            return mImsi;
94        }
95    }
96}
97