blob: 87ceaad20b34334c846edb5ddaef5932e1130cb0 [file] [log] [blame]
Jens Geyer0e87c462013-06-18 22:25:07 +02001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20package thrift
21
22const (
23 VERSION_MASK = 0xffff0000
24 VERSION_1 = 0x80010000
25)
26
27type TProtocol interface {
28 WriteMessageBegin(name string, typeId TMessageType, seqid int32) error
29 WriteMessageEnd() error
30 WriteStructBegin(name string) error
31 WriteStructEnd() error
32 WriteFieldBegin(name string, typeId TType, id int16) error
33 WriteFieldEnd() error
34 WriteFieldStop() error
35 WriteMapBegin(keyType TType, valueType TType, size int) error
36 WriteMapEnd() error
37 WriteListBegin(elemType TType, size int) error
38 WriteListEnd() error
39 WriteSetBegin(elemType TType, size int) error
40 WriteSetEnd() error
41 WriteBool(value bool) error
42 WriteByte(value byte) error
43 WriteI16(value int16) error
44 WriteI32(value int32) error
45 WriteI64(value int64) error
46 WriteDouble(value float64) error
47 WriteString(value string) error
48 WriteBinary(value []byte) error
49
50 ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error)
51 ReadMessageEnd() error
52 ReadStructBegin() (name string, err error)
53 ReadStructEnd() error
54 ReadFieldBegin() (name string, typeId TType, id int16, err error)
55 ReadFieldEnd() error
56 ReadMapBegin() (keyType TType, valueType TType, size int, err error)
57 ReadMapEnd() error
58 ReadListBegin() (elemType TType, size int, err error)
59 ReadListEnd() error
60 ReadSetBegin() (elemType TType, size int, err error)
61 ReadSetEnd() error
62 ReadBool() (value bool, err error)
63 ReadByte() (value byte, err error)
64 ReadI16() (value int16, err error)
65 ReadI32() (value int32, err error)
66 ReadI64() (value int64, err error)
67 ReadDouble() (value float64, err error)
68 ReadString() (value string, err error)
69 ReadBinary() (value []byte, err error)
70
71 Skip(fieldType TType) (err error)
72 Flush() (err error)
73
74 Transport() TTransport
75}
76
77// The maximum recursive depth the skip() function will traverse
78var MaxSkipDepth = 1<<31 - 1
79
80// Skips over the next data element from the provided input TProtocol object.
81func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) {
82 return Skip(prot, typeId, MaxSkipDepth)
83}
84
85// Skips over the next data element from the provided input TProtocol object.
86func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) {
87 switch fieldType {
88 case STOP:
89 return
90 case BOOL:
91 _, err = self.ReadBool()
92 return
93 case BYTE:
94 _, err = self.ReadByte()
95 return
96 case I16:
97 _, err = self.ReadI16()
98 return
99 case I32:
100 _, err = self.ReadI32()
101 return
102 case I64:
103 _, err = self.ReadI64()
104 return
105 case DOUBLE:
106 _, err = self.ReadDouble()
107 return
108 case STRING:
109 _, err = self.ReadString()
110 return
111 case STRUCT:
112 if _, err = self.ReadStructBegin(); err != nil {
113 return err
114 }
115 for {
116 _, typeId, _, _ := self.ReadFieldBegin()
117 if typeId == STOP {
118 break
119 }
120 Skip(self, typeId, maxDepth-1)
121 self.ReadFieldEnd()
122 }
123 return self.ReadStructEnd()
124 case MAP:
125 keyType, valueType, size, err := self.ReadMapBegin()
126 if err != nil {
127 return err
128 }
129 for i := 0; i < size; i++ {
130 Skip(self, keyType, maxDepth-1)
131 self.Skip(valueType)
132 }
133 return self.ReadMapEnd()
134 case SET:
135 elemType, size, err := self.ReadSetBegin()
136 if err != nil {
137 return err
138 }
139 for i := 0; i < size; i++ {
140 Skip(self, elemType, maxDepth-1)
141 }
142 return self.ReadSetEnd()
143 case LIST:
144 elemType, size, err := self.ReadListBegin()
145 if err != nil {
146 return err
147 }
148 for i := 0; i < size; i++ {
149 Skip(self, elemType, maxDepth-1)
150 }
151 return self.ReadListEnd()
152 }
153 return nil
154}