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