| // 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 global |
| |
| import ( |
| "strconv" |
| "strings" |
| |
| "v.io/v23/discovery" |
| "v.io/v23/naming" |
| "v.io/v23/vom" |
| ) |
| |
| // encodeAdToSuffix encodes the ad.Id and the ad.Attributes into the suffix at |
| // which we mount the advertisement. |
| // The format of the generated suffix is id/interfaceName/timestamp/attributes. |
| // |
| // TODO(suharshs): Currently Attachments are not encoded in global discovery. |
| func encodeAdToSuffix(ad *discovery.Advertisement, timestampNs int64) (string, error) { |
| b, err := vom.Encode(ad.Attributes) |
| if err != nil { |
| return "", err |
| } |
| // Escape suffixDelim to use it as our delimeter between the id and the attrs. |
| id := ad.Id.String() |
| // InterfaceName can never be empty as per validate.go. |
| interfaceName := naming.EncodeAsNameElement(ad.InterfaceName) |
| timestamp := strconv.FormatInt(timestampNs, 10) |
| attr := naming.EncodeAsNameElement(string(b)) |
| return naming.Join(id, interfaceName, timestamp, attr), nil |
| } |
| |
| // decodeAdFromSuffix decodes in into an advertisement. |
| // The format of the input suffix is id/interfaceName/timestamp/attributes. |
| func decodeAdFromSuffix(in string) (*discovery.Advertisement, int64, error) { |
| parts := strings.SplitN(in, "/", 4) |
| if len(parts) != 4 { |
| return nil, 0, NewErrAdInvalidEncoding(nil, in) |
| } |
| var err error |
| var ok bool |
| ad := &discovery.Advertisement{} |
| if ad.Id, err = discovery.ParseAdId(parts[0]); err != nil { |
| return nil, 0, err |
| } |
| if ad.InterfaceName, ok = naming.DecodeFromNameElement(parts[1]); !ok { |
| return nil, 0, NewErrAdInvalidEncoding(nil, in) |
| } |
| timestampNs, err := strconv.ParseInt(parts[2], 10, 64) |
| if err != nil { |
| return nil, 0, err |
| } |
| attrs, ok := naming.DecodeFromNameElement(parts[3]) |
| if !ok { |
| return nil, 0, NewErrAdInvalidEncoding(nil, in) |
| } |
| if err = vom.Decode([]byte(attrs), &ad.Attributes); err != nil { |
| return nil, 0, err |
| } |
| return ad, timestampNs, nil |
| } |