blob: 50de7f9b2eb21b622bb5de97fe3381634f92029d [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package ble
import (
"fmt"
"strings"
"github.com/pborman/uuid"
vdiscovery "v.io/v23/discovery"
"v.io/x/ref/lib/discovery"
)
type bleAdv struct {
serviceUUID uuid.UUID
instanceID []byte
attrs map[string][]byte
}
func newAdvertisment(adv discovery.Advertisement) bleAdv {
attrs := map[string][]byte{
InstanceUUID: adv.Service.InstanceUuid,
InterfaceNameUUID: []byte(adv.Service.InterfaceName),
}
if len(adv.Service.InstanceName) > 0 {
attrs[InstanceNameUUID] = []byte(adv.Service.InstanceName)
}
if len(adv.Service.Addrs) > 0 {
attrs[AddrsUUID] = discovery.PackAddresses(adv.Service.Addrs)
}
if adv.EncryptionAlgorithm != discovery.NoEncryption {
attrs[EncryptionUUID] = discovery.PackEncryptionKeys(adv.EncryptionAlgorithm, adv.EncryptionKeys)
}
for k, v := range adv.Service.Attrs {
hexUUID := discovery.NewAttributeUUID(k).String()
attrs[hexUUID] = []byte(k + "=" + v)
}
return bleAdv{
instanceID: adv.Service.InstanceUuid,
serviceUUID: uuid.UUID(adv.ServiceUuid),
attrs: attrs,
}
}
func (a *bleAdv) toDiscoveryAdvertisement() (*discovery.Advertisement, error) {
adv := &discovery.Advertisement{
Service: vdiscovery.Service{
InstanceUuid: a.instanceID,
Attrs: make(vdiscovery.Attributes),
},
ServiceUuid: discovery.Uuid(a.serviceUUID),
}
var err error
for k, v := range a.attrs {
switch k {
case InstanceUUID:
adv.Service.InstanceUuid = v
case InstanceNameUUID:
adv.Service.InstanceName = string(v)
case InterfaceNameUUID:
adv.Service.InterfaceName = string(v)
case AddrsUUID:
if adv.Service.Addrs, err = discovery.UnpackAddresses(v); err != nil {
return nil, err
}
case EncryptionUUID:
if adv.EncryptionAlgorithm, adv.EncryptionKeys, err = discovery.UnpackEncryptionKeys(v); err != nil {
return nil, err
}
default:
parts := strings.SplitN(string(v), "=", 2)
if len(parts) != 2 {
return nil, fmt.Errorf("incorrectly formatted value, %s", v)
}
adv.Service.Attrs[parts[0]] = parts[1]
}
}
return adv, nil
}