1// Protocol Buffers for Go with Gadgets 2// 3// Copyright (c) 2013, The GoGo Authors. All rights reserved. 4// http://github.com/gogo/protobuf 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: 9// 10// * Redistributions of source code must retain the above copyright 11// notice, this list of conditions and the following disclaimer. 12// * Redistributions in binary form must reproduce the above 13// copyright notice, this list of conditions and the following disclaimer 14// in the documentation and/or other materials provided with the 15// distribution. 16// 17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29package proto 30 31import ( 32 "fmt" 33 "os" 34 "reflect" 35) 36 37func (p *Properties) setCustomEncAndDec(typ reflect.Type) { 38 p.ctype = typ 39 if p.Repeated { 40 p.enc = (*Buffer).enc_custom_slice_bytes 41 p.dec = (*Buffer).dec_custom_slice_bytes 42 p.size = size_custom_slice_bytes 43 } else if typ.Kind() == reflect.Ptr { 44 p.enc = (*Buffer).enc_custom_bytes 45 p.dec = (*Buffer).dec_custom_bytes 46 p.size = size_custom_bytes 47 } else { 48 p.enc = (*Buffer).enc_custom_ref_bytes 49 p.dec = (*Buffer).dec_custom_ref_bytes 50 p.size = size_custom_ref_bytes 51 } 52} 53 54func (p *Properties) setDurationEncAndDec(typ reflect.Type) { 55 if p.Repeated { 56 if typ.Elem().Kind() == reflect.Ptr { 57 p.enc = (*Buffer).enc_slice_duration 58 p.dec = (*Buffer).dec_slice_duration 59 p.size = size_slice_duration 60 } else { 61 p.enc = (*Buffer).enc_slice_ref_duration 62 p.dec = (*Buffer).dec_slice_ref_duration 63 p.size = size_slice_ref_duration 64 } 65 } else if typ.Kind() == reflect.Ptr { 66 p.enc = (*Buffer).enc_duration 67 p.dec = (*Buffer).dec_duration 68 p.size = size_duration 69 } else { 70 p.enc = (*Buffer).enc_ref_duration 71 p.dec = (*Buffer).dec_ref_duration 72 p.size = size_ref_duration 73 } 74} 75 76func (p *Properties) setTimeEncAndDec(typ reflect.Type) { 77 if p.Repeated { 78 if typ.Elem().Kind() == reflect.Ptr { 79 p.enc = (*Buffer).enc_slice_time 80 p.dec = (*Buffer).dec_slice_time 81 p.size = size_slice_time 82 } else { 83 p.enc = (*Buffer).enc_slice_ref_time 84 p.dec = (*Buffer).dec_slice_ref_time 85 p.size = size_slice_ref_time 86 } 87 } else if typ.Kind() == reflect.Ptr { 88 p.enc = (*Buffer).enc_time 89 p.dec = (*Buffer).dec_time 90 p.size = size_time 91 } else { 92 p.enc = (*Buffer).enc_ref_time 93 p.dec = (*Buffer).dec_ref_time 94 p.size = size_ref_time 95 } 96 97} 98 99func (p *Properties) setSliceOfNonPointerStructs(typ reflect.Type) { 100 t2 := typ.Elem() 101 p.sstype = typ 102 p.stype = t2 103 p.isMarshaler = isMarshaler(t2) 104 p.isUnmarshaler = isUnmarshaler(t2) 105 p.enc = (*Buffer).enc_slice_ref_struct_message 106 p.dec = (*Buffer).dec_slice_ref_struct_message 107 p.size = size_slice_ref_struct_message 108 if p.Wire != "bytes" { 109 fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T \n", typ, t2) 110 } 111} 112