mirror of
https://github.com/MengMengCode/VoCat.git
synced 2026-08-13 03:13:43 +08:00
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
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
|
|
}
|