diff --git a/plugins/mm/itu-e212-iso.h b/plugins/mm/itu-e212-iso.h new file mode 100644 index 0000000..545916e --- /dev/null +++ b/plugins/mm/itu-e212-iso.h @@ -0,0 +1,295 @@ +/* -*- mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*- */ +/* itu-e212-iso.h + * + * Copyright 2020 Purism SPC + * + * Mapping from E.212 MCC to Countries in ISO 3166-1 alpha-2 format + * + * Author(s): + * Mohammed Sadiq + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + + +struct mcc_list +{ + guint mcc; + char code[3]; +}; + +/* + * Extracted from: + * https://www.itu.int/dms_pub/itu-t/opb/sp/T-SP-E.212B-2018-PDF-E.pdf + */ +struct mcc_list mcc_list[] = { + {202, "GR"}, + {204, "NL"}, + {206, "BE"}, + {208, "FR"}, + {212, "MC"}, + {213, "AD"}, + {214, "ES"}, + {216, "HU"}, + {218, "BA"}, + {219, "HR"}, + {220, "RS"}, + {221, "XK"}, + {222, "IT"}, + {225, "VA"}, + {226, "RO"}, + {228, "CH"}, + {230, "CZ"}, + {231, "SK"}, + {232, "AT"}, + {234, "GB"}, + {235, "GB"}, + {238, "DK"}, + {240, "SE"}, + {242, "NO"}, + {244, "FI"}, + {246, "LT"}, + {247, "LV"}, + {248, "EE"}, + {250, "RU"}, + {255, "UA"}, + {257, "BY"}, + {259, "MD"}, + {260, "PL"}, + {262, "DE"}, + {266, "GI"}, + {268, "PT"}, + {270, "LU"}, + {272, "IE"}, + {274, "IS"}, + {276, "AL"}, + {278, "MT"}, + {280, "CY"}, + {282, "GE"}, + {283, "AM"}, + {284, "BG"}, + {286, "TR"}, + {288, "FO"}, + {290, "GL"}, + {292, "SM"}, + {293, "SI"}, + {294, "MK"}, + {295, "LI"}, + {297, "ME"}, + {302, "CA"}, + {308, "PM"}, + {310, "US"}, + {311, "US"}, + {312, "US"}, + {313, "US"}, + {314, "US"}, + {315, "US"}, + {316, "US"}, + {330, "PR"}, + {332, "VI"}, + {334, "MX"}, + {338, "JM"}, + /* Guadeloupe and Martinique are part of France */ + {340, "GP"}, + {340, "MQ"}, + {342, "BB"}, + {344, "AG"}, + {346, "KY"}, + {348, "VG"}, + {350, "BM"}, + {352, "GD"}, + {354, "MS"}, + {356, "KN"}, + {358, "LC"}, + {360, "VC"}, + {362, "CW"}, + {363, "AW"}, + {364, "BS"}, + {365, "AI"}, + {366, "DM"}, + {368, "CU"}, + {370, "DO"}, + {372, "HT"}, + {374, "TT"}, + {376, "TC"}, + {400, "AZ"}, + {401, "KZ"}, + {402, "BT"}, + {404, "IN"}, + {405, "IN"}, + {406, "IN"}, + {410, "PK"}, + {412, "AF"}, + {413, "LK"}, + {414, "MM"}, + {415, "LB"}, + {416, "JO"}, + {417, "SY"}, + {418, "IQ"}, + {419, "KW"}, + {420, "SA"}, + {421, "YE"}, + {422, "OM"}, + {424, "AE"}, + {425, "IL"}, + {426, "BH"}, + {427, "QA"}, + {428, "MN"}, + {429, "NP"}, + {430, "AE"}, + {431, "AE"}, + {432, "IR"}, + {434, "UZ"}, + {436, "TJ"}, + {437, "KG"}, + {438, "TM"}, + {440, "JP"}, + {441, "JP"}, + {450, "KP"}, + {452, "VN"}, + {454, "HK"}, + {455, "MO"}, + {456, "KH"}, + {457, "LA"}, + {460, "CN"}, + {461, "CN"}, + {466, "TW"}, + {467, "KR"}, + {470, "BD"}, + {472, "MV"}, + {502, "MY"}, + {505, "AU"}, + {510, "ID"}, + {514, "TL"}, + {515, "PH"}, + {520, "TH"}, + {525, "SG"}, + {528, "BN"}, + {530, "NZ"}, + {536, "NR"}, + {537, "PG"}, + {539, "TO"}, + {540, "SB"}, + {541, "VU"}, + {542, "FJ"}, + {543, "WF"}, + {544, "AS"}, + {545, "KI"}, + {546, "NC"}, + {547, "PF"}, + {548, "CK"}, + {549, "AS"}, + {550, "FM"}, + {551, "MH"}, + {552, "PW"}, + {553, "TV"}, + {554, "TK"}, + {555, "NU"}, + {602, "EG"}, + {603, "DZ"}, + {604, "MA"}, + {605, "TN"}, + {606, "LY"}, + {607, "GM"}, + {608, "SN"}, + {609, "MR"}, + {610, "ML"}, + {611, "GN"}, + {612, "CI"}, + {613, "BF"}, + {614, "NE"}, + {615, "TG"}, + {616, "BJ"}, + {617, "MU"}, + {618, "LR"}, + {619, "SL"}, + {620, "GH"}, + {621, "NG"}, + {622, "TD"}, + {623, "CF"}, + {624, "CM"}, + {625, "CV"}, + {626, "ST"}, + {627, "GQ"}, + {628, "GA"}, + {629, "CG"}, + {630, "CD"}, + {631, "AO"}, + {632, "GW"}, + {633, "SC"}, + {634, "SD"}, + {635, "RW"}, + {636, "ET"}, + {637, "SO"}, + {638, "DJ"}, + {639, "KE"}, + {640, "TZ"}, + {641, "UG"}, + {642, "BI"}, + {643, "MZ"}, + {645, "ZM"}, + {646, "MG"}, + {647, "RE"}, + {648, "ZW"}, + {649, "NA"}, + {650, "MW"}, + {651, "LS"}, + {652, "BW"}, + {653, "SZ"}, + {654, "KM"}, + {655, "ZA"}, + {657, "ER"}, + {658, "SH"}, + {659, "SS"}, + {702, "BZ"}, + {704, "GT"}, + {706, "SV"}, + {708, "HN"}, + {710, "NI"}, + {712, "CR"}, + {714, "PA"}, + {716, "PE"}, + {722, "AR"}, + {724, "BR"}, + {730, "CL"}, + {732, "CO"}, + {734, "VE"}, + {736, "BO"}, + {738, "GY"}, + {740, "EC"}, + {742, "GF"}, + {744, "PY"}, + {746, "SR"}, + {748, "UY"}, + {750, "FK"}, +}; + +/* + * @mcc_str should have MCC as prefix, + * It doesn't matter if any thing else is followed. + * So it's okay to pass an IMSI. + */ +static inline const char * +get_country_iso_for_mcc (const char *mcc_str) +{ + g_autofree char *str = NULL; + guint64 mcc; + + if (!mcc_str || strlen (mcc_str) < 3) + return NULL; + + str = g_strndup (mcc_str, 3); + mcc = g_ascii_strtoull (str, NULL, 10); + + for (guint i = 0; i < G_N_ELEMENTS (mcc_list); i++) + if (mcc_list[i].mcc == mcc) + return mcc_list[i].code; + + g_warning ("invalid MCC code: %" G_GUINT64_FORMAT, mcc); + + return NULL; +}