summaryrefslogtreecommitdiff
path: root/scripts/create-mcc-mnc-table.py
blob: a5af7c4179f86f5da673acb838bd3cff55af225d (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
107
108
109
110
111
112
113
114
#!/usr/bin/env python3

#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 urllib.request
import urllib.parse
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("    std::string sNormalizedMnc = sMnc;")
print('    printTrace("[MCCMNC] MCCx[%s] MNCx[%s]", sMcc.c_str(), sMnc.c_str());')
print("    if (sMnc.length() == 2) {")
print("        sNormalizedMnc += 'f';")
print("    }")
print("    if (!MTS::Text::parseHex(iMcc, sMcc)) { return Json::Value::null; }")
print("    if (!MTS::Text::parseHex(iMnc, sNormalizedMnc)) { 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_bytes = urllib.request.urlopen('http://mcc-mnc.com/').read()  # type: bytes
html = html_bytes.decode(encoding='utf-8')

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("")