mirror of
https://github.com/MengMengCode/VoCat.git
synced 2026-08-13 03:13:43 +08:00
81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package device
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
type platformRegistration struct {
|
|
Status int
|
|
PLMN string
|
|
Name string
|
|
PSAttached bool
|
|
}
|
|
|
|
var qmiQuotedFieldPattern = regexp.MustCompile(`(?i)^\s*([^:]+):\s*'([^']*)'\s*$`)
|
|
|
|
func parseQMIRegistration(output string) (platformRegistration, bool) {
|
|
result := platformRegistration{}
|
|
registrationState := ""
|
|
roaming := false
|
|
mcc := ""
|
|
mnc := ""
|
|
pcsDigit := false
|
|
for _, rawLine := range strings.Split(output, "\n") {
|
|
match := qmiQuotedFieldPattern.FindStringSubmatch(strings.TrimSpace(rawLine))
|
|
if len(match) != 3 {
|
|
continue
|
|
}
|
|
key := strings.ToLower(strings.TrimSpace(match[1]))
|
|
value := strings.TrimSpace(match[2])
|
|
switch key {
|
|
case "registration state":
|
|
registrationState = strings.ToLower(value)
|
|
case "roaming status":
|
|
roaming = strings.EqualFold(value, "on")
|
|
case "ps":
|
|
result.PSAttached = strings.EqualFold(value, "attached")
|
|
case "mcc":
|
|
if mcc == "" {
|
|
mcc = value
|
|
}
|
|
case "mnc":
|
|
if mnc == "" {
|
|
mnc = value
|
|
}
|
|
case "description":
|
|
if result.Name == "" {
|
|
result.Name = value
|
|
}
|
|
case "mnc with pcs digit":
|
|
pcsDigit = strings.EqualFold(value, "yes")
|
|
}
|
|
}
|
|
switch registrationState {
|
|
case "registered":
|
|
result.Status = 1
|
|
if roaming {
|
|
result.Status = 5
|
|
}
|
|
case "not-registered-searching", "searching":
|
|
result.Status = 2
|
|
case "registration-denied", "denied":
|
|
result.Status = 3
|
|
case "not-registered":
|
|
result.Status = 0
|
|
default:
|
|
return platformRegistration{}, false
|
|
}
|
|
if decimalDigits(mcc, 3, 3) && decimalDigits(mnc, 1, 3) {
|
|
width := 2
|
|
if pcsDigit {
|
|
width = 3
|
|
}
|
|
for len(mnc) < width {
|
|
mnc = "0" + mnc
|
|
}
|
|
result.PLMN = mcc + mnc
|
|
}
|
|
return result, true
|
|
}
|