aboutsummaryrefslogtreecommitdiffhomepage
path: root/csharp/src/ProtocolBuffers/ICodedInputStream.cs
blob: 790274fb281627f2be208b3c65dc3b6b633714ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
#region Copyright notice and license

// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// http://github.com/jskeet/dotnet-protobufs/
// Original C++/Java/Python code:
// http://code.google.com/p/protobuf/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#endregion

using System;
using System.Collections.Generic;
using Google.ProtocolBuffers.Descriptors;

//Disable warning CS3010: CLS-compliant interfaces must have only CLS-compliant members
#pragma warning disable 3010

namespace Google.ProtocolBuffers
{
    public interface ICodedInputStream
    {
        /// <summary>
        /// Reads any message initialization data expected from the input stream
        /// </summary>
        /// <remarks>
        /// This is primarily used by text formats and unnecessary for protobuffers' own
        /// binary format.  The API for MessageStart/End was added for consistent handling
        /// of output streams regardless of the actual writer implementation.
        /// </remarks>
        void ReadMessageStart();
        /// <summary>
        /// Reads any message finalization data expected from the input stream
        /// </summary>
        /// <remarks>
        /// This is primarily used by text formats and unnecessary for protobuffers' own
        /// binary format.  The API for MessageStart/End was added for consistent handling
        /// of output streams regardless of the actual writer implementation.
        /// </remarks>
        void ReadMessageEnd();
        /// <summary>
        /// Attempt to read a field tag, returning false if we have reached the end
        /// of the input data.
        /// </summary>
        /// <remarks>
        /// <para>
        /// If fieldTag is non-zero and ReadTag returns true then the value in fieldName
        /// may or may not be populated.  However, if fieldTag is zero and ReadTag returns
        /// true, then fieldName should be populated with a non-null field name.
        /// </para><para>
        /// In other words if ReadTag returns true then either fieldTag will be non-zero OR
        /// fieldName will be non-zero.  In some cases both may be populated, however the
        /// builders will always prefer the fieldTag over fieldName.
        /// </para>
        /// </remarks>
        bool ReadTag(out uint fieldTag, out string fieldName);

        /// <summary>
        /// Read a double field from the stream.
        /// </summary>
        bool ReadDouble(ref double value);

        /// <summary>
        /// Read a float field from the stream.
        /// </summary>
        bool ReadFloat(ref float value);

        /// <summary>
        /// Read a uint64 field from the stream.
        /// </summary>
        bool ReadUInt64(ref ulong value);

        /// <summary>
        /// Read an int64 field from the stream.
        /// </summary>
        bool ReadInt64(ref long value);

        /// <summary>
        /// Read an int32 field from the stream.
        /// </summary>
        bool ReadInt32(ref int value);

        /// <summary>
        /// Read a fixed64 field from the stream.
        /// </summary>
        bool ReadFixed64(ref ulong value);

        /// <summary>
        /// Read a fixed32 field from the stream.
        /// </summary>
        bool ReadFixed32(ref uint value);

        /// <summary>
        /// Read a bool field from the stream.
        /// </summary>
        bool ReadBool(ref bool value);

        /// <summary>
        /// Reads a string field from the stream.
        /// </summary>
        bool ReadString(ref string value);

        /// <summary>
        /// Reads a group field value from the stream.
        /// </summary>    
        void ReadGroup(int fieldNumber, IBuilderLite builder,
                       ExtensionRegistry extensionRegistry);

        /// <summary>
        /// Reads a group field value from the stream and merges it into the given
        /// UnknownFieldSet.
        /// </summary>   
        [Obsolete]
        void ReadUnknownGroup(int fieldNumber, IBuilderLite builder);

        /// <summary>
        /// Reads an embedded message field value from the stream.
        /// </summary>   
        void ReadMessage(IBuilderLite builder, ExtensionRegistry extensionRegistry);

        /// <summary>
        /// Reads a bytes field value from the stream.
        /// </summary>   
        bool ReadBytes(ref ByteString value);

        /// <summary>
        /// Reads a uint32 field value from the stream.
        /// </summary>   
        bool ReadUInt32(ref uint value);

        /// <summary>
        /// Reads an enum field value from the stream. The caller is responsible
        /// for converting the numeric value to an actual enum.
        /// </summary>   
        bool ReadEnum(ref IEnumLite value, out object unknown, IEnumLiteMap mapping);

        /// <summary>
        /// Reads an enum field value from the stream. If the enum is valid for type T,
        /// then the ref value is set and it returns true.  Otherwise the unkown output
        /// value is set and this method returns false.
        /// </summary>   
        bool ReadEnum<T>(ref T value, out object unknown)
            where T : struct, IComparable, IFormattable;

        /// <summary>
        /// Reads an sfixed32 field value from the stream.
        /// </summary>   
        bool ReadSFixed32(ref int value);

        /// <summary>
        /// Reads an sfixed64 field value from the stream.
        /// </summary>   
        bool ReadSFixed64(ref long value);

        /// <summary>
        /// Reads an sint32 field value from the stream.
        /// </summary>   
        bool ReadSInt32(ref int value);

        /// <summary>
        /// Reads an sint64 field value from the stream.
        /// </summary>   
        bool ReadSInt64(ref long value);

        /// <summary>
        /// Reads an array of primitive values into the list, if the wire-type of fieldTag is length-prefixed and the 
        /// type is numeric, it will read a packed array.
        /// </summary>
        void ReadPrimitiveArray(FieldType fieldType, uint fieldTag, string fieldName, ICollection<object> list);

        /// <summary>
        /// Reads an array of primitive values into the list, if the wire-type of fieldTag is length-prefixed, it will
        /// read a packed array.
        /// </summary>
        void ReadEnumArray(uint fieldTag, string fieldName, ICollection<IEnumLite> list, out ICollection<object> unknown,
                           IEnumLiteMap mapping);

        /// <summary>
        /// Reads an array of primitive values into the list, if the wire-type of fieldTag is length-prefixed, it will
        /// read a packed array.
        /// </summary>
        void ReadEnumArray<T>(uint fieldTag, string fieldName, ICollection<T> list, out ICollection<object> unknown)
            where T : struct, IComparable, IFormattable;

        /// <summary>
        /// Reads a set of messages using the <paramref name="messageType"/> as a template.  T is not guaranteed to be 
        /// the most derived type, it is only the type specifier for the collection.
        /// </summary>
        void ReadMessageArray<T>(uint fieldTag, string fieldName, ICollection<T> list, T messageType,
                                 ExtensionRegistry registry) where T : IMessageLite;

        /// <summary>
        /// Reads a set of messages using the <paramref name="messageType"/> as a template.
        /// </summary>
        void ReadGroupArray<T>(uint fieldTag, string fieldName, ICollection<T> list, T messageType,
                               ExtensionRegistry registry) where T : IMessageLite;

        /// <summary>
        /// Reads a field of any primitive type. Enums, groups and embedded
        /// messages are not handled by this method.
        /// </summary>
        bool ReadPrimitiveField(FieldType fieldType, ref object value);

        /// <summary>
        /// Returns true if the stream has reached the end of the input. This is the
        /// case if either the end of the underlying input source has been reached or
        /// the stream has reached a limit created using PushLimit.
        /// </summary>
        bool IsAtEnd { get; }

        /// <summary>
        /// Reads and discards a single field, given its tag value.
        /// </summary>
        /// <returns>false if the tag is an end-group tag, in which case
        /// nothing is skipped. Otherwise, returns true.</returns>
        bool SkipField();

        /// <summary>
        /// Reads one or more repeated string field values from the stream.
        /// </summary>   
        void ReadStringArray(uint fieldTag, string fieldName, ICollection<string> list);

        /// <summary>
        /// Reads one or more repeated ByteString field values from the stream.
        /// </summary>   
        void ReadBytesArray(uint fieldTag, string fieldName, ICollection<ByteString> list);

        /// <summary>
        /// Reads one or more repeated boolean field values from the stream.
        /// </summary>
        void ReadBoolArray(uint fieldTag, string fieldName, ICollection<bool> list);

        /// <summary>
        /// Reads one or more repeated Int32 field values from the stream.
        /// </summary>
        void ReadInt32Array(uint fieldTag, string fieldName, ICollection<int> list);

        /// <summary>
        /// Reads one or more repeated SInt32 field values from the stream.
        /// </summary>
        void ReadSInt32Array(uint fieldTag, string fieldName, ICollection<int> list);

        /// <summary>
        /// Reads one or more repeated UInt32 field values from the stream.
        /// </summary>
        void ReadUInt32Array(uint fieldTag, string fieldName, ICollection<uint> list);

        /// <summary>
        /// Reads one or more repeated Fixed32 field values from the stream.
        /// </summary>
        void ReadFixed32Array(uint fieldTag, string fieldName, ICollection<uint> list);

        /// <summary>
        /// Reads one or more repeated SFixed32 field values from the stream.
        /// </summary>
        void ReadSFixed32Array(uint fieldTag, string fieldName, ICollection<int> list);

        /// <summary>
        /// Reads one or more repeated Int64 field values from the stream.
        /// </summary>
        void ReadInt64Array(uint fieldTag, string fieldName, ICollection<long> list);

        /// <summary>
        /// Reads one or more repeated SInt64 field values from the stream.
        /// </summary>
        void ReadSInt64Array(uint fieldTag, string fieldName, ICollection<long> list);

        /// <summary>
        /// Reads one or more repeated UInt64 field values from the stream.
        /// </summary>
        void ReadUInt64Array(uint fieldTag, string fieldName, ICollection<ulong> list);

        /// <summary>
        /// Reads one or more repeated Fixed64 field values from the stream.
        /// </summary>
        void ReadFixed64Array(uint fieldTag, string fieldName, ICollection<ulong> list);

        /// <summary>
        /// Reads one or more repeated SFixed64 field values from the stream.
        /// </summary>
        void ReadSFixed64Array(uint fieldTag, string fieldName, ICollection<long> list);

        /// <summary>
        /// Reads one or more repeated Double field values from the stream.
        /// </summary>
        void ReadDoubleArray(uint fieldTag, string fieldName, ICollection<double> list);

        /// <summary>
        /// Reads one or more repeated Float field values from the stream.
        /// </summary>
        void ReadFloatArray(uint fieldTag, string fieldName, ICollection<float> list);
    }
}