| // 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 util |
| |
| import ( |
| "fmt" |
| "mojo/public/go/bindings" |
| |
| "v.io/v23/vdl" |
| "v.io/x/mojo/transcoder" |
| ) |
| |
| // TODO(alexfandrianto): Since this function could panic, we should consider |
| // handling that if it happens. |
| func CombineVdlValueByMojomType(values []*vdl.Value, t *vdl.Type) *vdl.Value { |
| outVdlValue := vdl.ZeroValue(t) |
| for i := 0; i < t.NumField(); i++ { |
| outVdlValue.StructField(i).Assign(values[i]) |
| } |
| return outVdlValue |
| } |
| |
| // Construct []*vdl.Value from a *vdl.Value (as a struct) via its mojom type. |
| // TODO(alexfandrianto): Since this function could panic, we should consider |
| // handling that if it happens. |
| func SplitVdlValueByMojomType(value *vdl.Value, t *vdl.Type) []*vdl.Value { |
| outVdlValues := make([]*vdl.Value, t.NumField()) |
| for i := 0; i < t.NumField(); i++ { |
| outVdlValues[i] = value.StructField(i) |
| } |
| return outVdlValues |
| } |
| |
| func EncodeMessageFromVom(header bindings.MessageHeader, argptrs []interface{}, t *vdl.Type) (*bindings.Message, error) { |
| // Convert argptrs into their true form: []*vdl.Value |
| inargs := make([]*vdl.Value, len(argptrs)) |
| for i := range argptrs { |
| inargs[i] = *argptrs[i].(**vdl.Value) |
| } |
| |
| // Construct the proper *vdl.Value (as a struct) from the mojom type. |
| vdlValue := CombineVdlValueByMojomType(inargs, t) |
| |
| encoder := bindings.NewEncoder() |
| if err := header.Encode(encoder); err != nil { |
| return nil, err |
| } |
| if bytes, handles, err := encoder.Data(); err != nil { |
| return nil, err |
| } else { |
| // Encode here. |
| moreBytes, err := transcoder.VdlToMojom(vdlValue) |
| if err != nil { |
| return nil, fmt.Errorf("mojovdl.Encode failed: %v", err) |
| } |
| // Append the encoded "payload" to the end of the slice. |
| bytes = append(bytes, moreBytes...) |
| |
| return &bindings.Message{ |
| Header: header, |
| Bytes: bytes, |
| Handles: handles, |
| Payload: moreBytes, |
| }, nil |
| } |
| } |