1*1b3f573fSAndroid Build Coastguard Worker #region Copyright notice and license 2*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format 3*1b3f573fSAndroid Build Coastguard Worker // Copyright 2008 Google Inc. All rights reserved. 4*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/ 5*1b3f573fSAndroid Build Coastguard Worker // 6*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without 7*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are 8*1b3f573fSAndroid Build Coastguard Worker // met: 9*1b3f573fSAndroid Build Coastguard Worker // 10*1b3f573fSAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright 11*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer. 12*1b3f573fSAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above 13*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer 14*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the 15*1b3f573fSAndroid Build Coastguard Worker // distribution. 16*1b3f573fSAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its 17*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from 18*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission. 19*1b3f573fSAndroid Build Coastguard Worker // 20*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*1b3f573fSAndroid Build Coastguard Worker #endregion 32*1b3f573fSAndroid Build Coastguard Worker 33*1b3f573fSAndroid Build Coastguard Worker using System; 34*1b3f573fSAndroid Build Coastguard Worker using System.Buffers; 35*1b3f573fSAndroid Build Coastguard Worker using System.Buffers.Binary; 36*1b3f573fSAndroid Build Coastguard Worker using System.Collections.Generic; 37*1b3f573fSAndroid Build Coastguard Worker using System.IO; 38*1b3f573fSAndroid Build Coastguard Worker using System.Runtime.CompilerServices; 39*1b3f573fSAndroid Build Coastguard Worker using System.Runtime.InteropServices; 40*1b3f573fSAndroid Build Coastguard Worker using System.Security; 41*1b3f573fSAndroid Build Coastguard Worker using System.Text; 42*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.Collections; 43*1b3f573fSAndroid Build Coastguard Worker 44*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf 45*1b3f573fSAndroid Build Coastguard Worker { 46*1b3f573fSAndroid Build Coastguard Worker /// <summary> 47*1b3f573fSAndroid Build Coastguard Worker /// An opaque struct that represents the current parsing state and is passed along 48*1b3f573fSAndroid Build Coastguard Worker /// as the parsing proceeds. 49*1b3f573fSAndroid Build Coastguard Worker /// All the public methods are intended to be invoked only by the generated code, 50*1b3f573fSAndroid Build Coastguard Worker /// users should never invoke them directly. 51*1b3f573fSAndroid Build Coastguard Worker /// </summary> 52*1b3f573fSAndroid Build Coastguard Worker [SecuritySafeCritical] 53*1b3f573fSAndroid Build Coastguard Worker public ref struct ParseContext 54*1b3f573fSAndroid Build Coastguard Worker { 55*1b3f573fSAndroid Build Coastguard Worker internal const int DefaultRecursionLimit = 100; 56*1b3f573fSAndroid Build Coastguard Worker internal const int DefaultSizeLimit = Int32.MaxValue; 57*1b3f573fSAndroid Build Coastguard Worker 58*1b3f573fSAndroid Build Coastguard Worker internal ReadOnlySpan<byte> buffer; 59*1b3f573fSAndroid Build Coastguard Worker internal ParserInternalState state; 60*1b3f573fSAndroid Build Coastguard Worker 61*1b3f573fSAndroid Build Coastguard Worker /// <summary> 62*1b3f573fSAndroid Build Coastguard Worker /// Initialize a <see cref="ParseContext"/>, building all <see cref="ParserInternalState"/> from defaults and 63*1b3f573fSAndroid Build Coastguard Worker /// the given <paramref name="buffer"/>. 64*1b3f573fSAndroid Build Coastguard Worker /// </summary> 65*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] InitializeGoogle.Protobuf.ParseContext66*1b3f573fSAndroid Build Coastguard Worker internal static void Initialize(ReadOnlySpan<byte> buffer, out ParseContext ctx) 67*1b3f573fSAndroid Build Coastguard Worker { 68*1b3f573fSAndroid Build Coastguard Worker ParserInternalState state = default; 69*1b3f573fSAndroid Build Coastguard Worker state.sizeLimit = DefaultSizeLimit; 70*1b3f573fSAndroid Build Coastguard Worker state.recursionLimit = DefaultRecursionLimit; 71*1b3f573fSAndroid Build Coastguard Worker state.currentLimit = int.MaxValue; 72*1b3f573fSAndroid Build Coastguard Worker state.bufferSize = buffer.Length; 73*1b3f573fSAndroid Build Coastguard Worker 74*1b3f573fSAndroid Build Coastguard Worker Initialize(buffer, ref state, out ctx); 75*1b3f573fSAndroid Build Coastguard Worker } 76*1b3f573fSAndroid Build Coastguard Worker 77*1b3f573fSAndroid Build Coastguard Worker /// <summary> 78*1b3f573fSAndroid Build Coastguard Worker /// Initialize a <see cref="ParseContext"/> using existing <see cref="ParserInternalState"/>, e.g. from <see cref="CodedInputStream"/>. 79*1b3f573fSAndroid Build Coastguard Worker /// </summary> 80*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] InitializeGoogle.Protobuf.ParseContext81*1b3f573fSAndroid Build Coastguard Worker internal static void Initialize(ReadOnlySpan<byte> buffer, ref ParserInternalState state, out ParseContext ctx) 82*1b3f573fSAndroid Build Coastguard Worker { 83*1b3f573fSAndroid Build Coastguard Worker ctx.buffer = buffer; 84*1b3f573fSAndroid Build Coastguard Worker ctx.state = state; 85*1b3f573fSAndroid Build Coastguard Worker } 86*1b3f573fSAndroid Build Coastguard Worker 87*1b3f573fSAndroid Build Coastguard Worker /// <summary> 88*1b3f573fSAndroid Build Coastguard Worker /// Creates a ParseContext instance from CodedInputStream. 89*1b3f573fSAndroid Build Coastguard Worker /// WARNING: internally this copies the CodedInputStream's state, so after done with the ParseContext, 90*1b3f573fSAndroid Build Coastguard Worker /// the CodedInputStream's state needs to be updated. 91*1b3f573fSAndroid Build Coastguard Worker /// </summary> 92*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] InitializeGoogle.Protobuf.ParseContext93*1b3f573fSAndroid Build Coastguard Worker internal static void Initialize(CodedInputStream input, out ParseContext ctx) 94*1b3f573fSAndroid Build Coastguard Worker { 95*1b3f573fSAndroid Build Coastguard Worker ctx.buffer = new ReadOnlySpan<byte>(input.InternalBuffer); 96*1b3f573fSAndroid Build Coastguard Worker // ideally we would use a reference to the original state, but that doesn't seem possible 97*1b3f573fSAndroid Build Coastguard Worker // so we just copy the struct that holds the state. We will need to later store the state back 98*1b3f573fSAndroid Build Coastguard Worker // into CodedInputStream if we want to keep it usable. 99*1b3f573fSAndroid Build Coastguard Worker ctx.state = input.InternalState; 100*1b3f573fSAndroid Build Coastguard Worker } 101*1b3f573fSAndroid Build Coastguard Worker 102*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] InitializeGoogle.Protobuf.ParseContext103*1b3f573fSAndroid Build Coastguard Worker internal static void Initialize(ReadOnlySequence<byte> input, out ParseContext ctx) 104*1b3f573fSAndroid Build Coastguard Worker { 105*1b3f573fSAndroid Build Coastguard Worker Initialize(input, DefaultRecursionLimit, out ctx); 106*1b3f573fSAndroid Build Coastguard Worker } 107*1b3f573fSAndroid Build Coastguard Worker 108*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] InitializeGoogle.Protobuf.ParseContext109*1b3f573fSAndroid Build Coastguard Worker internal static void Initialize(ReadOnlySequence<byte> input, int recursionLimit, out ParseContext ctx) 110*1b3f573fSAndroid Build Coastguard Worker { 111*1b3f573fSAndroid Build Coastguard Worker ctx.buffer = default; 112*1b3f573fSAndroid Build Coastguard Worker ctx.state = default; 113*1b3f573fSAndroid Build Coastguard Worker ctx.state.lastTag = 0; 114*1b3f573fSAndroid Build Coastguard Worker ctx.state.recursionDepth = 0; 115*1b3f573fSAndroid Build Coastguard Worker ctx.state.sizeLimit = DefaultSizeLimit; 116*1b3f573fSAndroid Build Coastguard Worker ctx.state.recursionLimit = recursionLimit; 117*1b3f573fSAndroid Build Coastguard Worker ctx.state.currentLimit = int.MaxValue; 118*1b3f573fSAndroid Build Coastguard Worker SegmentedBufferHelper.Initialize(input, out ctx.state.segmentedBufferHelper, out ctx.buffer); 119*1b3f573fSAndroid Build Coastguard Worker ctx.state.bufferPos = 0; 120*1b3f573fSAndroid Build Coastguard Worker ctx.state.bufferSize = ctx.buffer.Length; 121*1b3f573fSAndroid Build Coastguard Worker 122*1b3f573fSAndroid Build Coastguard Worker ctx.state.DiscardUnknownFields = false; 123*1b3f573fSAndroid Build Coastguard Worker ctx.state.ExtensionRegistry = null; 124*1b3f573fSAndroid Build Coastguard Worker } 125*1b3f573fSAndroid Build Coastguard Worker 126*1b3f573fSAndroid Build Coastguard Worker /// <summary> 127*1b3f573fSAndroid Build Coastguard Worker /// Returns the last tag read, or 0 if no tags have been read or we've read beyond 128*1b3f573fSAndroid Build Coastguard Worker /// the end of the input. 129*1b3f573fSAndroid Build Coastguard Worker /// </summary> 130*1b3f573fSAndroid Build Coastguard Worker internal uint LastTag { get { return state.lastTag; } } 131*1b3f573fSAndroid Build Coastguard Worker 132*1b3f573fSAndroid Build Coastguard Worker /// <summary> 133*1b3f573fSAndroid Build Coastguard Worker /// Internal-only property; when set to true, unknown fields will be discarded while parsing. 134*1b3f573fSAndroid Build Coastguard Worker /// </summary> 135*1b3f573fSAndroid Build Coastguard Worker internal bool DiscardUnknownFields { 136*1b3f573fSAndroid Build Coastguard Worker get { return state.DiscardUnknownFields; } 137*1b3f573fSAndroid Build Coastguard Worker set { state.DiscardUnknownFields = value; } 138*1b3f573fSAndroid Build Coastguard Worker } 139*1b3f573fSAndroid Build Coastguard Worker 140*1b3f573fSAndroid Build Coastguard Worker /// <summary> 141*1b3f573fSAndroid Build Coastguard Worker /// Internal-only property; provides extension identifiers to compatible messages while parsing. 142*1b3f573fSAndroid Build Coastguard Worker /// </summary> 143*1b3f573fSAndroid Build Coastguard Worker internal ExtensionRegistry ExtensionRegistry 144*1b3f573fSAndroid Build Coastguard Worker { 145*1b3f573fSAndroid Build Coastguard Worker get { return state.ExtensionRegistry; } 146*1b3f573fSAndroid Build Coastguard Worker set { state.ExtensionRegistry = value; } 147*1b3f573fSAndroid Build Coastguard Worker } 148*1b3f573fSAndroid Build Coastguard Worker 149*1b3f573fSAndroid Build Coastguard Worker /// <summary> 150*1b3f573fSAndroid Build Coastguard Worker /// Reads a field tag, returning the tag of 0 for "end of input". 151*1b3f573fSAndroid Build Coastguard Worker /// </summary> 152*1b3f573fSAndroid Build Coastguard Worker /// <remarks> 153*1b3f573fSAndroid Build Coastguard Worker /// If this method returns 0, it doesn't necessarily mean the end of all 154*1b3f573fSAndroid Build Coastguard Worker /// the data in this CodedInputReader; it may be the end of the logical input 155*1b3f573fSAndroid Build Coastguard Worker /// for an embedded message, for example. 156*1b3f573fSAndroid Build Coastguard Worker /// </remarks> 157*1b3f573fSAndroid Build Coastguard Worker /// <returns>The next field tag, or 0 for end of input. (0 is never a valid tag.)</returns> 158*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadTagGoogle.Protobuf.ParseContext159*1b3f573fSAndroid Build Coastguard Worker public uint ReadTag() 160*1b3f573fSAndroid Build Coastguard Worker { 161*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseTag(ref buffer, ref state); 162*1b3f573fSAndroid Build Coastguard Worker } 163*1b3f573fSAndroid Build Coastguard Worker 164*1b3f573fSAndroid Build Coastguard Worker /// <summary> 165*1b3f573fSAndroid Build Coastguard Worker /// Reads a double field from the input. 166*1b3f573fSAndroid Build Coastguard Worker /// </summary> 167*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadDoubleGoogle.Protobuf.ParseContext168*1b3f573fSAndroid Build Coastguard Worker public double ReadDouble() 169*1b3f573fSAndroid Build Coastguard Worker { 170*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseDouble(ref buffer, ref state); 171*1b3f573fSAndroid Build Coastguard Worker } 172*1b3f573fSAndroid Build Coastguard Worker 173*1b3f573fSAndroid Build Coastguard Worker /// <summary> 174*1b3f573fSAndroid Build Coastguard Worker /// Reads a float field from the input. 175*1b3f573fSAndroid Build Coastguard Worker /// </summary> 176*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadFloatGoogle.Protobuf.ParseContext177*1b3f573fSAndroid Build Coastguard Worker public float ReadFloat() 178*1b3f573fSAndroid Build Coastguard Worker { 179*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseFloat(ref buffer, ref state); 180*1b3f573fSAndroid Build Coastguard Worker } 181*1b3f573fSAndroid Build Coastguard Worker 182*1b3f573fSAndroid Build Coastguard Worker /// <summary> 183*1b3f573fSAndroid Build Coastguard Worker /// Reads a uint64 field from the input. 184*1b3f573fSAndroid Build Coastguard Worker /// </summary> 185*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadUInt64Google.Protobuf.ParseContext186*1b3f573fSAndroid Build Coastguard Worker public ulong ReadUInt64() 187*1b3f573fSAndroid Build Coastguard Worker { 188*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseRawVarint64(ref buffer, ref state); 189*1b3f573fSAndroid Build Coastguard Worker } 190*1b3f573fSAndroid Build Coastguard Worker 191*1b3f573fSAndroid Build Coastguard Worker /// <summary> 192*1b3f573fSAndroid Build Coastguard Worker /// Reads an int64 field from the input. 193*1b3f573fSAndroid Build Coastguard Worker /// </summary> 194*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadInt64Google.Protobuf.ParseContext195*1b3f573fSAndroid Build Coastguard Worker public long ReadInt64() 196*1b3f573fSAndroid Build Coastguard Worker { 197*1b3f573fSAndroid Build Coastguard Worker return (long)ParsingPrimitives.ParseRawVarint64(ref buffer, ref state); 198*1b3f573fSAndroid Build Coastguard Worker } 199*1b3f573fSAndroid Build Coastguard Worker 200*1b3f573fSAndroid Build Coastguard Worker /// <summary> 201*1b3f573fSAndroid Build Coastguard Worker /// Reads an int32 field from the input. 202*1b3f573fSAndroid Build Coastguard Worker /// </summary> 203*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadInt32Google.Protobuf.ParseContext204*1b3f573fSAndroid Build Coastguard Worker public int ReadInt32() 205*1b3f573fSAndroid Build Coastguard Worker { 206*1b3f573fSAndroid Build Coastguard Worker return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state); 207*1b3f573fSAndroid Build Coastguard Worker } 208*1b3f573fSAndroid Build Coastguard Worker 209*1b3f573fSAndroid Build Coastguard Worker /// <summary> 210*1b3f573fSAndroid Build Coastguard Worker /// Reads a fixed64 field from the input. 211*1b3f573fSAndroid Build Coastguard Worker /// </summary> 212*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadFixed64Google.Protobuf.ParseContext213*1b3f573fSAndroid Build Coastguard Worker public ulong ReadFixed64() 214*1b3f573fSAndroid Build Coastguard Worker { 215*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state); 216*1b3f573fSAndroid Build Coastguard Worker } 217*1b3f573fSAndroid Build Coastguard Worker 218*1b3f573fSAndroid Build Coastguard Worker /// <summary> 219*1b3f573fSAndroid Build Coastguard Worker /// Reads a fixed32 field from the input. 220*1b3f573fSAndroid Build Coastguard Worker /// </summary> 221*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadFixed32Google.Protobuf.ParseContext222*1b3f573fSAndroid Build Coastguard Worker public uint ReadFixed32() 223*1b3f573fSAndroid Build Coastguard Worker { 224*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state); 225*1b3f573fSAndroid Build Coastguard Worker } 226*1b3f573fSAndroid Build Coastguard Worker 227*1b3f573fSAndroid Build Coastguard Worker /// <summary> 228*1b3f573fSAndroid Build Coastguard Worker /// Reads a bool field from the input. 229*1b3f573fSAndroid Build Coastguard Worker /// </summary> 230*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadBoolGoogle.Protobuf.ParseContext231*1b3f573fSAndroid Build Coastguard Worker public bool ReadBool() 232*1b3f573fSAndroid Build Coastguard Worker { 233*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseRawVarint64(ref buffer, ref state) != 0; 234*1b3f573fSAndroid Build Coastguard Worker } 235*1b3f573fSAndroid Build Coastguard Worker /// <summary> 236*1b3f573fSAndroid Build Coastguard Worker /// Reads a string field from the input. 237*1b3f573fSAndroid Build Coastguard Worker /// </summary> 238*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadStringGoogle.Protobuf.ParseContext239*1b3f573fSAndroid Build Coastguard Worker public string ReadString() 240*1b3f573fSAndroid Build Coastguard Worker { 241*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ReadString(ref buffer, ref state); 242*1b3f573fSAndroid Build Coastguard Worker } 243*1b3f573fSAndroid Build Coastguard Worker 244*1b3f573fSAndroid Build Coastguard Worker /// <summary> 245*1b3f573fSAndroid Build Coastguard Worker /// Reads an embedded message field value from the input. 246*1b3f573fSAndroid Build Coastguard Worker /// </summary> 247*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadMessageGoogle.Protobuf.ParseContext248*1b3f573fSAndroid Build Coastguard Worker public void ReadMessage(IMessage message) 249*1b3f573fSAndroid Build Coastguard Worker { 250*1b3f573fSAndroid Build Coastguard Worker ParsingPrimitivesMessages.ReadMessage(ref this, message); 251*1b3f573fSAndroid Build Coastguard Worker } 252*1b3f573fSAndroid Build Coastguard Worker 253*1b3f573fSAndroid Build Coastguard Worker /// <summary> 254*1b3f573fSAndroid Build Coastguard Worker /// Reads an embedded group field from the input. 255*1b3f573fSAndroid Build Coastguard Worker /// </summary> 256*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadGroupGoogle.Protobuf.ParseContext257*1b3f573fSAndroid Build Coastguard Worker public void ReadGroup(IMessage message) 258*1b3f573fSAndroid Build Coastguard Worker { 259*1b3f573fSAndroid Build Coastguard Worker ParsingPrimitivesMessages.ReadGroup(ref this, message); 260*1b3f573fSAndroid Build Coastguard Worker } 261*1b3f573fSAndroid Build Coastguard Worker 262*1b3f573fSAndroid Build Coastguard Worker /// <summary> 263*1b3f573fSAndroid Build Coastguard Worker /// Reads a bytes field value from the input. 264*1b3f573fSAndroid Build Coastguard Worker /// </summary> 265*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadBytesGoogle.Protobuf.ParseContext266*1b3f573fSAndroid Build Coastguard Worker public ByteString ReadBytes() 267*1b3f573fSAndroid Build Coastguard Worker { 268*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ReadBytes(ref buffer, ref state); 269*1b3f573fSAndroid Build Coastguard Worker } 270*1b3f573fSAndroid Build Coastguard Worker /// <summary> 271*1b3f573fSAndroid Build Coastguard Worker /// Reads a uint32 field value from the input. 272*1b3f573fSAndroid Build Coastguard Worker /// </summary> 273*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadUInt32Google.Protobuf.ParseContext274*1b3f573fSAndroid Build Coastguard Worker public uint ReadUInt32() 275*1b3f573fSAndroid Build Coastguard Worker { 276*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.ParseRawVarint32(ref buffer, ref state); 277*1b3f573fSAndroid Build Coastguard Worker } 278*1b3f573fSAndroid Build Coastguard Worker 279*1b3f573fSAndroid Build Coastguard Worker /// <summary> 280*1b3f573fSAndroid Build Coastguard Worker /// Reads an enum field value from the input. 281*1b3f573fSAndroid Build Coastguard Worker /// </summary> 282*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadEnumGoogle.Protobuf.ParseContext283*1b3f573fSAndroid Build Coastguard Worker public int ReadEnum() 284*1b3f573fSAndroid Build Coastguard Worker { 285*1b3f573fSAndroid Build Coastguard Worker // Currently just a pass-through, but it's nice to separate it logically from WriteInt32. 286*1b3f573fSAndroid Build Coastguard Worker return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state); 287*1b3f573fSAndroid Build Coastguard Worker } 288*1b3f573fSAndroid Build Coastguard Worker 289*1b3f573fSAndroid Build Coastguard Worker /// <summary> 290*1b3f573fSAndroid Build Coastguard Worker /// Reads an sfixed32 field value from the input. 291*1b3f573fSAndroid Build Coastguard Worker /// </summary> 292*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadSFixed32Google.Protobuf.ParseContext293*1b3f573fSAndroid Build Coastguard Worker public int ReadSFixed32() 294*1b3f573fSAndroid Build Coastguard Worker { 295*1b3f573fSAndroid Build Coastguard Worker return (int)ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state); 296*1b3f573fSAndroid Build Coastguard Worker } 297*1b3f573fSAndroid Build Coastguard Worker 298*1b3f573fSAndroid Build Coastguard Worker /// <summary> 299*1b3f573fSAndroid Build Coastguard Worker /// Reads an sfixed64 field value from the input. 300*1b3f573fSAndroid Build Coastguard Worker /// </summary> 301*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadSFixed64Google.Protobuf.ParseContext302*1b3f573fSAndroid Build Coastguard Worker public long ReadSFixed64() 303*1b3f573fSAndroid Build Coastguard Worker { 304*1b3f573fSAndroid Build Coastguard Worker return (long)ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state); 305*1b3f573fSAndroid Build Coastguard Worker } 306*1b3f573fSAndroid Build Coastguard Worker 307*1b3f573fSAndroid Build Coastguard Worker /// <summary> 308*1b3f573fSAndroid Build Coastguard Worker /// Reads an sint32 field value from the input. 309*1b3f573fSAndroid Build Coastguard Worker /// </summary> 310*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadSInt32Google.Protobuf.ParseContext311*1b3f573fSAndroid Build Coastguard Worker public int ReadSInt32() 312*1b3f573fSAndroid Build Coastguard Worker { 313*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.DecodeZigZag32(ParsingPrimitives.ParseRawVarint32(ref buffer, ref state)); 314*1b3f573fSAndroid Build Coastguard Worker } 315*1b3f573fSAndroid Build Coastguard Worker 316*1b3f573fSAndroid Build Coastguard Worker /// <summary> 317*1b3f573fSAndroid Build Coastguard Worker /// Reads an sint64 field value from the input. 318*1b3f573fSAndroid Build Coastguard Worker /// </summary> 319*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadSInt64Google.Protobuf.ParseContext320*1b3f573fSAndroid Build Coastguard Worker public long ReadSInt64() 321*1b3f573fSAndroid Build Coastguard Worker { 322*1b3f573fSAndroid Build Coastguard Worker return ParsingPrimitives.DecodeZigZag64(ParsingPrimitives.ParseRawVarint64(ref buffer, ref state)); 323*1b3f573fSAndroid Build Coastguard Worker } 324*1b3f573fSAndroid Build Coastguard Worker 325*1b3f573fSAndroid Build Coastguard Worker /// <summary> 326*1b3f573fSAndroid Build Coastguard Worker /// Reads a length for length-delimited data. 327*1b3f573fSAndroid Build Coastguard Worker /// </summary> 328*1b3f573fSAndroid Build Coastguard Worker /// <remarks> 329*1b3f573fSAndroid Build Coastguard Worker /// This is internally just reading a varint, but this method exists 330*1b3f573fSAndroid Build Coastguard Worker /// to make the calling code clearer. 331*1b3f573fSAndroid Build Coastguard Worker /// </remarks> 332*1b3f573fSAndroid Build Coastguard Worker [MethodImpl(MethodImplOptions.AggressiveInlining)] ReadLengthGoogle.Protobuf.ParseContext333*1b3f573fSAndroid Build Coastguard Worker public int ReadLength() 334*1b3f573fSAndroid Build Coastguard Worker { 335*1b3f573fSAndroid Build Coastguard Worker return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state); 336*1b3f573fSAndroid Build Coastguard Worker } 337*1b3f573fSAndroid Build Coastguard Worker CopyStateToGoogle.Protobuf.ParseContext338*1b3f573fSAndroid Build Coastguard Worker internal void CopyStateTo(CodedInputStream input) 339*1b3f573fSAndroid Build Coastguard Worker { 340*1b3f573fSAndroid Build Coastguard Worker input.InternalState = state; 341*1b3f573fSAndroid Build Coastguard Worker } 342*1b3f573fSAndroid Build Coastguard Worker LoadStateFromGoogle.Protobuf.ParseContext343*1b3f573fSAndroid Build Coastguard Worker internal void LoadStateFrom(CodedInputStream input) 344*1b3f573fSAndroid Build Coastguard Worker { 345*1b3f573fSAndroid Build Coastguard Worker state = input.InternalState; 346*1b3f573fSAndroid Build Coastguard Worker } 347*1b3f573fSAndroid Build Coastguard Worker } 348*1b3f573fSAndroid Build Coastguard Worker }