xref: /aosp_15_r20/external/openscreen/osp/go/messages.go (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard// Copyright 2018 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard// Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard// found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglardpackage osp
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard// TODO(jophba):
8*3f982cf4SFabien Sanglard// - Read and write size prefixes
9*3f982cf4SFabien Sanglard
10*3f982cf4SFabien Sanglardimport (
11*3f982cf4SFabien Sanglard	"fmt"
12*3f982cf4SFabien Sanglard	"github.com/ugorji/go/codec"
13*3f982cf4SFabien Sanglard	"io"
14*3f982cf4SFabien Sanglard)
15*3f982cf4SFabien Sanglard
16*3f982cf4SFabien Sanglardconst PresentationStartRequestTypeKey = 104
17*3f982cf4SFabien Sanglard
18*3f982cf4SFabien Sanglard// AKA presentation-start-request
19*3f982cf4SFabien Sanglardtype PresentationStartRequest struct {
20*3f982cf4SFabien Sanglard	// Must be public to allow (de)serialization
21*3f982cf4SFabien Sanglard	RequestID      uint64 `codec:"0"`
22*3f982cf4SFabien Sanglard	PresentationID string `codec:"1"`
23*3f982cf4SFabien Sanglard	URL            string `codec:"2"`
24*3f982cf4SFabien Sanglard}
25*3f982cf4SFabien Sanglard
26*3f982cf4SFabien Sanglard// Read with type/size prefix
27*3f982cf4SFabien Sanglardfunc ReadMessage(r io.Reader) (interface{}, error) {
28*3f982cf4SFabien Sanglard	typeKey, err := ReadVaruint(r)
29*3f982cf4SFabien Sanglard	if err != nil {
30*3f982cf4SFabien Sanglard		return nil, err
31*3f982cf4SFabien Sanglard	}
32*3f982cf4SFabien Sanglard
33*3f982cf4SFabien Sanglard	switch typeKey {
34*3f982cf4SFabien Sanglard	case PresentationStartRequestTypeKey:
35*3f982cf4SFabien Sanglard		var msg PresentationStartRequest
36*3f982cf4SFabien Sanglard		h := &codec.CborHandle{}
37*3f982cf4SFabien Sanglard		dec := codec.NewDecoder(r, h)
38*3f982cf4SFabien Sanglard		err = dec.Decode(&msg)
39*3f982cf4SFabien Sanglard		if err != nil {
40*3f982cf4SFabien Sanglard			return nil, err
41*3f982cf4SFabien Sanglard		}
42*3f982cf4SFabien Sanglard		return msg, nil
43*3f982cf4SFabien Sanglard	default:
44*3f982cf4SFabien Sanglard		return nil, fmt.Errorf("Unknown type key: %d", typeKey)
45*3f982cf4SFabien Sanglard	}
46*3f982cf4SFabien Sanglard}
47*3f982cf4SFabien Sanglard
48*3f982cf4SFabien Sanglard// Write with type/size prefix
49*3f982cf4SFabien Sanglardfunc WriteMessage(msg interface{}, w io.Writer) error {
50*3f982cf4SFabien Sanglard	var typeKey uint64
51*3f982cf4SFabien Sanglard	switch msg.(type) {
52*3f982cf4SFabien Sanglard	case PresentationStartRequest:
53*3f982cf4SFabien Sanglard		typeKey = uint64(PresentationStartRequestTypeKey)
54*3f982cf4SFabien Sanglard	default:
55*3f982cf4SFabien Sanglard		return fmt.Errorf("Unknown message type: %v", msg)
56*3f982cf4SFabien Sanglard	}
57*3f982cf4SFabien Sanglard
58*3f982cf4SFabien Sanglard	err := WriteVaruint(typeKey, w)
59*3f982cf4SFabien Sanglard	if err != nil {
60*3f982cf4SFabien Sanglard		return err
61*3f982cf4SFabien Sanglard	}
62*3f982cf4SFabien Sanglard
63*3f982cf4SFabien Sanglard	h := &codec.CborHandle{}
64*3f982cf4SFabien Sanglard	enc := codec.NewEncoder(w, h)
65*3f982cf4SFabien Sanglard	return enc.Encode(msg)
66*3f982cf4SFabien Sanglard}
67