10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.File;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileNotFoundException;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileReader;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.IOException;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport org.xmlpull.v1.XmlPullParser;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport org.xmlpull.v1.XmlPullParserException;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Environment;
29ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Xml;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.XmlUtils;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class SpnOverride {
3522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private HashMap<String, String> mCarrierSpnMap;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
38cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "SpnOverride";
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final String PARTNER_SPN_OVERRIDE_PATH ="etc/spn-conf.xml";
401aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu    static final String OEM_SPN_OVERRIDE_PATH = "telephony/spn-conf.xml";
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
428e4af4a6c1d5f697b9c548e827e047248c12d788Sanket Padawe    SpnOverride () {
4322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCarrierSpnMap = new HashMap<String, String>();
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        loadSpnOverrides();
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
478e4af4a6c1d5f697b9c548e827e047248c12d788Sanket Padawe    boolean containsCarrier(String carrier) {
4822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCarrierSpnMap.containsKey(carrier);
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
518e4af4a6c1d5f697b9c548e827e047248c12d788Sanket Padawe    String getSpn(String carrier) {
5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCarrierSpnMap.get(carrier);
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void loadSpnOverrides() {
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        FileReader spnReader;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
581aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu        File spnFile = new File(Environment.getRootDirectory(),
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                PARTNER_SPN_OVERRIDE_PATH);
601aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu        File oemSpnFile = new File(Environment.getOemDirectory(),
611aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu                OEM_SPN_OVERRIDE_PATH);
621aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu
631aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu        if (oemSpnFile.exists()) {
641aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            // OEM image exist SPN xml, get the timestamp from OEM & System image for comparison.
651aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            long oemSpnTime = oemSpnFile.lastModified();
661aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            long sysSpnTime = spnFile.lastModified();
671aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            Rlog.d(LOG_TAG, "SPN Timestamp: oemTime = " + oemSpnTime + " sysTime = " + sysSpnTime);
681aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu
691aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            // To get the newer version of SPN from OEM image
701aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            if (oemSpnTime > sysSpnTime) {
711aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu                Rlog.d(LOG_TAG, "SPN in OEM image is newer than System image");
721aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu                spnFile = oemSpnFile;
731aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            }
741aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu        } else {
751aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            // No SPN in OEM image, so load it from system image.
761aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            Rlog.d(LOG_TAG, "No SPN in OEM image = " + oemSpnFile.getPath() +
771aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu                " Load SPN from system image");
781aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu        }
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            spnReader = new FileReader(spnFile);
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (FileNotFoundException e) {
831aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu            Rlog.w(LOG_TAG, "Can not open " + spnFile.getAbsolutePath());
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            XmlPullParser parser = Xml.newPullParser();
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            parser.setInput(spnReader);
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            XmlUtils.beginDocument(parser, "spnOverrides");
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            while (true) {
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                XmlUtils.nextElement(parser);
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String name = parser.getName();
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (!"spnOverride".equals(name)) {
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String numeric = parser.getAttributeValue(null, "numeric");
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String data    = parser.getAttributeValue(null, "spn");
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCarrierSpnMap.put(numeric, data);
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            spnReader.close();
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (XmlPullParserException e) {
108ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.w(LOG_TAG, "Exception in spn-conf parser " + e);
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (IOException e) {
110ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.w(LOG_TAG, "Exception in spn-conf parser " + e);
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
115