in nmxact/nmble/chrmgr.go [53:111]
func (cm *ChrMgr) SetServices(x *BleXport, svcs []BleSvc) error {
if err := ClearSvcsXact(x); err != nil {
return err
}
cm.Clear()
addSvcs := make([]BleAddSvc, len(svcs))
for i, svc := range svcs {
addSvcs[i] = BleSvcToAddSvc(svc)
}
if err := AddSvcsXact(x, addSvcs); err != nil {
return err
}
regSvcs, err := CommitSvcsXact(x)
if err != nil {
return err
}
// [uuid => svc]
// / \
// [uuid => chr] [uuid => chr]
svcMap := map[BleUuid]map[BleUuid]BleChr{}
for _, svc := range svcs {
m := map[BleUuid]BleChr{}
svcMap[svc.Uuid] = m
for _, chr := range svc.Chrs {
m[chr.Uuid] = chr
}
}
for _, rs := range regSvcs {
srcSvc, ok := svcMap[rs.Uuid]
if !ok {
// XXX: Log
continue
}
for _, rc := range rs.Chrs {
srcChr, ok := srcSvc[rc.Uuid]
if !ok {
// XXX: Log
continue
}
cm.add(chrMgrElem{
AttHandle: rc.ValHandle,
SvcUuid: rs.Uuid,
ChrUuid: rc.Uuid,
Cb: srcChr.AccessCb,
})
}
}
return nil
}