func()

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
}