summaryrefslogtreecommitdiff
path: root/scripts/create-mcc-mnc-table.py
blob: 761454cabb568110a23df086222fc8b5ca217dd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#Generates MTS_IO_MccMncTable.cpp file by pulling latest MCC/MNC values
#from http://mcc-mnc.com

#Original Source Idea: https://github.com/musalbas/mcc-mnc-table


import re
import urllib2
import datetime

print "/*!"
print " \\file MTS_IO_MccMncTable.cpp"
print " \\brief Auto-Generated MCC-MNC Lookup Table"
print " \\date " + str(datetime.date.today())
print " \\author sgodinez"
print ""
print " An Auto-Generated MCC-MNC Lookup Table"
print "*/"
print ""
print "#include <mts/MTS_IO_MccMncTable.h>"
print "#include <mts/MTS_Logger.h>"
print "#include <mts/MTS_Text.h>"
print ""
print "using namespace MTS::IO;"
print ""
print "MTS::AutoPtr<MTS::Lock> MccMncTable::m_apLock(new MTS::Lock());"
print "MccMncTable* MccMncTable::m_pInstance = NULL;"
print ""
print "MccMncTable* MccMncTable::getInstance() {"
print "    if(m_pInstance == NULL) {"
print "        m_apLock->lock();"
print "        if (m_pInstance == NULL) {"
print "            m_pInstance = new MccMncTable();"
print "        }"
print "        m_apLock->unlock();"
print "    }"
print "    return m_pInstance;"
print "}"
print ""
print "MccMncTable::MccMncTable() {"
print "    createTable();"
print "}"
print ""
print "Json::Value MccMncTable::lookup(const std::string& sMcc, const std::string& sMnc) {"
print "    uint32_t iMcc, iMnc;"
print '    printTrace("[MCCMNC] MCCx[%s] MNCx[%s]", sMcc.c_str(), sMnc.c_str());'
print "    if(!MTS::Text::parseHex(iMcc, sMcc)) { return Json::Value::null; }"
print "    if(!MTS::Text::parseHex(iMnc, sMnc)) { return Json::Value::null; }"
print '    printTrace("[MCCMNC] MCC0X[%d] MNC0X[%d]", iMcc, iMnc);'
print "    if (m_mTable.count(iMcc)) {"
print "        if(m_mTable[iMcc].count(iMnc)) {"
print "            std::vector<std::string> vJson = MTS::Text::split(m_mTable[iMcc][iMnc], ',');"
print "            Json::Value j;"
print '            j["iso"] = vJson[0];'
print '            j["country"] = vJson[1];'
print '            j["code"] = vJson[2];'
print '            j["carrier"] = vJson[3];'
print "            return j;"
print "        }"
print "    }"
print ""
print "    return Json::Value::null;"
print "}"
print ""
print "void MccMncTable::createTable() {"
print "    std::string sData;"

td_re = re.compile('<td>([^<]*)</td>'*6)

html = urllib2.urlopen('http://mcc-mnc.com/').read()

tbody_start = False
for line in html.split('\n'):
    if '<tbody>' in line:
        tbody_start = True
    elif '</tbody>' in line:
        break
    elif tbody_start:
        td_search = td_re.search(line)
        mcc = td_search.group(1).strip().replace(',','')
        mnc = td_search.group(2).strip().replace(',','')
        iso = td_search.group(3).strip().replace(',','')
        countryCode = td_search.group(4).strip().replace(',','')
        country = td_search.group(5).strip().replace(',','')
        carrier = td_search.group(6).strip().replace(',','')

        if mnc != "n/a":
            mcc_int = int(mcc, 16)
            if len(mnc) == 2:
                mnc_int = int(mnc + 'f', 16)
            else:
                mnc_int = int(mnc, 16)
            print '    m_mTable[' + str(mcc_int) + '][' + str(mnc_int) + '] = "' + \
                  iso + ',' + countryCode + ',' + country + ',' + carrier + '";'
        else:           
            print "    //MCC(" + mcc + ') MNC(N/A) ISO(' + iso + ') Country Code(' + countryCode + ') Country(' + country + ') Carrier(' + carrier + ')'



print "}"
print ""