#!/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 ") print("#include ") print("#include ") print("") print("using namespace MTS::IO;") print("") print("MTS::AutoPtr 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 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('([^<]*)'*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 '' in line: tbody_start = True elif '' 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("")