package device import ( _ "embed" "encoding/json" "strings" ) // The offline table is generated by scripts/update-carriers.py from Android's // versioned carrier ID database, with the previous global table retained as a // fallback for PLMNs that Android does not yet catalogue. // //go:embed mccmnc.json var carrierDatabaseJSON []byte type carrierDatabase struct { Carriers map[string][]string `json:"c"` } var globalCarrierDatabase = func() carrierDatabase { var database carrierDatabase if err := json.Unmarshal(carrierDatabaseJSON, &database); err != nil { panic("device: invalid embedded MCC/MNC database: " + err.Error()) } return database }() // CarrierForPLMN returns the offline carrier display name and ISO alpha-2 // country/territory code for a numeric five- or six-digit PLMN. func CarrierForPLMN(plmn string) (name, countryCode string, ok bool) { plmn = strings.TrimSpace(plmn) if !decimalDigits(plmn, 5, 6) { return "", "", false } entry, ok := globalCarrierDatabase.Carriers[plmn] if !ok || len(entry) == 0 || strings.TrimSpace(entry[0]) == "" { return "", "", false } name = strings.TrimSpace(entry[0]) if len(entry) > 1 { countryCode = strings.ToUpper(strings.TrimSpace(entry[1])) } return name, countryCode, true }