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 using Google.Protobuf; 33*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.Reflection; 34*1b3f573fSAndroid Build Coastguard Worker using System.Buffers; 35*1b3f573fSAndroid Build Coastguard Worker using pb = global::Google.Protobuf; 36*1b3f573fSAndroid Build Coastguard Worker using pbr = global::Google.Protobuf.Reflection; 37*1b3f573fSAndroid Build Coastguard Worker using NUnit.Framework; 38*1b3f573fSAndroid Build Coastguard Worker using System.IO; 39*1b3f573fSAndroid Build Coastguard Worker using System; 40*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.Buffers; 41*1b3f573fSAndroid Build Coastguard Worker 42*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf 43*1b3f573fSAndroid Build Coastguard Worker { 44*1b3f573fSAndroid Build Coastguard Worker public class LegacyGeneratedCodeTest 45*1b3f573fSAndroid Build Coastguard Worker { 46*1b3f573fSAndroid Build Coastguard Worker [Test] IntermixingOfNewAndLegacyGeneratedCodeWorksWithCodedInputStream()47*1b3f573fSAndroid Build Coastguard Worker public void IntermixingOfNewAndLegacyGeneratedCodeWorksWithCodedInputStream() 48*1b3f573fSAndroid Build Coastguard Worker { 49*1b3f573fSAndroid Build Coastguard Worker var message = new ParseContextEnabledMessageB 50*1b3f573fSAndroid Build Coastguard Worker { 51*1b3f573fSAndroid Build Coastguard Worker A = new LegacyGeneratedCodeMessageA 52*1b3f573fSAndroid Build Coastguard Worker { 53*1b3f573fSAndroid Build Coastguard Worker Bb = new ParseContextEnabledMessageB { OptionalInt32 = 12345 } 54*1b3f573fSAndroid Build Coastguard Worker }, 55*1b3f573fSAndroid Build Coastguard Worker OptionalInt32 = 6789 56*1b3f573fSAndroid Build Coastguard Worker }; 57*1b3f573fSAndroid Build Coastguard Worker var data = message.ToByteArray(); 58*1b3f573fSAndroid Build Coastguard Worker 59*1b3f573fSAndroid Build Coastguard Worker // when parsing started using CodedInputStream and a message with legacy generated code 60*1b3f573fSAndroid Build Coastguard Worker // is encountered somewhere in the parse tree, we still need to be able to use its 61*1b3f573fSAndroid Build Coastguard Worker // MergeFrom(CodedInputStream) method to parse correctly. 62*1b3f573fSAndroid Build Coastguard Worker var codedInput = new CodedInputStream(data); 63*1b3f573fSAndroid Build Coastguard Worker var parsed = new ParseContextEnabledMessageB(); 64*1b3f573fSAndroid Build Coastguard Worker codedInput.ReadRawMessage(parsed); 65*1b3f573fSAndroid Build Coastguard Worker Assert.IsTrue(codedInput.IsAtEnd); 66*1b3f573fSAndroid Build Coastguard Worker 67*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(12345, parsed.A.Bb.OptionalInt32); 68*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(6789, parsed.OptionalInt32); 69*1b3f573fSAndroid Build Coastguard Worker } 70*1b3f573fSAndroid Build Coastguard Worker 71*1b3f573fSAndroid Build Coastguard Worker [Test] LegacyGeneratedCodeThrowsWithReadOnlySequence()72*1b3f573fSAndroid Build Coastguard Worker public void LegacyGeneratedCodeThrowsWithReadOnlySequence() 73*1b3f573fSAndroid Build Coastguard Worker { 74*1b3f573fSAndroid Build Coastguard Worker var message = new ParseContextEnabledMessageB 75*1b3f573fSAndroid Build Coastguard Worker { 76*1b3f573fSAndroid Build Coastguard Worker A = new LegacyGeneratedCodeMessageA 77*1b3f573fSAndroid Build Coastguard Worker { 78*1b3f573fSAndroid Build Coastguard Worker Bb = new ParseContextEnabledMessageB { OptionalInt32 = 12345 } 79*1b3f573fSAndroid Build Coastguard Worker }, 80*1b3f573fSAndroid Build Coastguard Worker OptionalInt32 = 6789 81*1b3f573fSAndroid Build Coastguard Worker }; 82*1b3f573fSAndroid Build Coastguard Worker var data = message.ToByteArray(); 83*1b3f573fSAndroid Build Coastguard Worker 84*1b3f573fSAndroid Build Coastguard Worker // if parsing started using ReadOnlySequence and we don't have a CodedInputStream 85*1b3f573fSAndroid Build Coastguard Worker // instance at hand, we cannot fall back to the legacy MergeFrom(CodedInputStream) 86*1b3f573fSAndroid Build Coastguard Worker // method and parsing will fail. As a consequence, one can only use parsing 87*1b3f573fSAndroid Build Coastguard Worker // from ReadOnlySequence if all the messages in the parsing tree have their generated 88*1b3f573fSAndroid Build Coastguard Worker // code up to date. 89*1b3f573fSAndroid Build Coastguard Worker var exception = Assert.Throws<InvalidProtocolBufferException>(() => 90*1b3f573fSAndroid Build Coastguard Worker { 91*1b3f573fSAndroid Build Coastguard Worker ParseContext.Initialize(new ReadOnlySequence<byte>(data), out ParseContext parseCtx); 92*1b3f573fSAndroid Build Coastguard Worker var parsed = new ParseContextEnabledMessageB(); 93*1b3f573fSAndroid Build Coastguard Worker ParsingPrimitivesMessages.ReadRawMessage(ref parseCtx, parsed); 94*1b3f573fSAndroid Build Coastguard Worker }); 95*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual($"Message {typeof(LegacyGeneratedCodeMessageA).Name} doesn't provide the generated method that enables ParseContext-based parsing. You might need to regenerate the generated protobuf code.", exception.Message); 96*1b3f573fSAndroid Build Coastguard Worker } 97*1b3f573fSAndroid Build Coastguard Worker 98*1b3f573fSAndroid Build Coastguard Worker [Test] IntermixingOfNewAndLegacyGeneratedCodeWorksWithCodedOutputStream()99*1b3f573fSAndroid Build Coastguard Worker public void IntermixingOfNewAndLegacyGeneratedCodeWorksWithCodedOutputStream() 100*1b3f573fSAndroid Build Coastguard Worker { 101*1b3f573fSAndroid Build Coastguard Worker // when serialization started using CodedOutputStream and a message with legacy generated code 102*1b3f573fSAndroid Build Coastguard Worker // is encountered somewhere in the parse tree, we still need to be able to use its 103*1b3f573fSAndroid Build Coastguard Worker // WriteTo(CodedOutputStream) method to serialize correctly. 104*1b3f573fSAndroid Build Coastguard Worker var ms = new MemoryStream(); 105*1b3f573fSAndroid Build Coastguard Worker var codedOutput = new CodedOutputStream(ms); 106*1b3f573fSAndroid Build Coastguard Worker var message = new ParseContextEnabledMessageB 107*1b3f573fSAndroid Build Coastguard Worker { 108*1b3f573fSAndroid Build Coastguard Worker A = new LegacyGeneratedCodeMessageA 109*1b3f573fSAndroid Build Coastguard Worker { 110*1b3f573fSAndroid Build Coastguard Worker Bb = new ParseContextEnabledMessageB { OptionalInt32 = 12345 } 111*1b3f573fSAndroid Build Coastguard Worker }, 112*1b3f573fSAndroid Build Coastguard Worker OptionalInt32 = 6789 113*1b3f573fSAndroid Build Coastguard Worker }; 114*1b3f573fSAndroid Build Coastguard Worker message.WriteTo(codedOutput); 115*1b3f573fSAndroid Build Coastguard Worker codedOutput.Flush(); 116*1b3f573fSAndroid Build Coastguard Worker 117*1b3f573fSAndroid Build Coastguard Worker var codedInput = new CodedInputStream(ms.ToArray()); 118*1b3f573fSAndroid Build Coastguard Worker var parsed = new ParseContextEnabledMessageB(); 119*1b3f573fSAndroid Build Coastguard Worker codedInput.ReadRawMessage(parsed); 120*1b3f573fSAndroid Build Coastguard Worker Assert.IsTrue(codedInput.IsAtEnd); 121*1b3f573fSAndroid Build Coastguard Worker 122*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(12345, parsed.A.Bb.OptionalInt32); 123*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(6789, parsed.OptionalInt32); 124*1b3f573fSAndroid Build Coastguard Worker } 125*1b3f573fSAndroid Build Coastguard Worker 126*1b3f573fSAndroid Build Coastguard Worker [Test] LegacyGeneratedCodeThrowsWithIBufferWriter()127*1b3f573fSAndroid Build Coastguard Worker public void LegacyGeneratedCodeThrowsWithIBufferWriter() 128*1b3f573fSAndroid Build Coastguard Worker { 129*1b3f573fSAndroid Build Coastguard Worker // if serialization started using IBufferWriter and we don't have a CodedOutputStream 130*1b3f573fSAndroid Build Coastguard Worker // instance at hand, we cannot fall back to the legacy WriteTo(CodedOutputStream) 131*1b3f573fSAndroid Build Coastguard Worker // method and serializatin will fail. As a consequence, one can only use serialization 132*1b3f573fSAndroid Build Coastguard Worker // to IBufferWriter if all the messages in the parsing tree have their generated 133*1b3f573fSAndroid Build Coastguard Worker // code up to date. 134*1b3f573fSAndroid Build Coastguard Worker var message = new ParseContextEnabledMessageB 135*1b3f573fSAndroid Build Coastguard Worker { 136*1b3f573fSAndroid Build Coastguard Worker A = new LegacyGeneratedCodeMessageA 137*1b3f573fSAndroid Build Coastguard Worker { 138*1b3f573fSAndroid Build Coastguard Worker Bb = new ParseContextEnabledMessageB { OptionalInt32 = 12345 } 139*1b3f573fSAndroid Build Coastguard Worker }, 140*1b3f573fSAndroid Build Coastguard Worker OptionalInt32 = 6789 141*1b3f573fSAndroid Build Coastguard Worker }; 142*1b3f573fSAndroid Build Coastguard Worker var exception = Assert.Throws<InvalidProtocolBufferException>(() => 143*1b3f573fSAndroid Build Coastguard Worker { 144*1b3f573fSAndroid Build Coastguard Worker WriteContext.Initialize(new TestArrayBufferWriter<byte>(), out WriteContext writeCtx); 145*1b3f573fSAndroid Build Coastguard Worker ((IBufferMessage)message).InternalWriteTo(ref writeCtx); 146*1b3f573fSAndroid Build Coastguard Worker }); 147*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual($"Message {typeof(LegacyGeneratedCodeMessageA).Name} doesn't provide the generated method that enables WriteContext-based serialization. You might need to regenerate the generated protobuf code.", exception.Message); 148*1b3f573fSAndroid Build Coastguard Worker } 149*1b3f573fSAndroid Build Coastguard Worker 150*1b3f573fSAndroid Build Coastguard Worker // hand-modified version of a generated message that only provides the legacy 151*1b3f573fSAndroid Build Coastguard Worker // MergeFrom(CodedInputStream) method and doesn't implement IBufferMessage. 152*1b3f573fSAndroid Build Coastguard Worker private sealed partial class LegacyGeneratedCodeMessageA : pb::IMessage { 153*1b3f573fSAndroid Build Coastguard Worker private pb::UnknownFieldSet _unknownFields; 154*1b3f573fSAndroid Build Coastguard Worker 155*1b3f573fSAndroid Build Coastguard Worker pbr::MessageDescriptor pb::IMessage.Descriptor => throw new System.NotImplementedException(); 156*1b3f573fSAndroid Build Coastguard Worker 157*1b3f573fSAndroid Build Coastguard Worker /// <summary>Field number for the "bb" field.</summary> 158*1b3f573fSAndroid Build Coastguard Worker public const int BbFieldNumber = 1; 159*1b3f573fSAndroid Build Coastguard Worker private ParseContextEnabledMessageB bb_; 160*1b3f573fSAndroid Build Coastguard Worker public ParseContextEnabledMessageB Bb { 161*1b3f573fSAndroid Build Coastguard Worker get { return bb_; } 162*1b3f573fSAndroid Build Coastguard Worker set { 163*1b3f573fSAndroid Build Coastguard Worker bb_ = value; 164*1b3f573fSAndroid Build Coastguard Worker } 165*1b3f573fSAndroid Build Coastguard Worker } 166*1b3f573fSAndroid Build Coastguard Worker WriteTo(pb::CodedOutputStream output)167*1b3f573fSAndroid Build Coastguard Worker public void WriteTo(pb::CodedOutputStream output) { 168*1b3f573fSAndroid Build Coastguard Worker if (bb_ != null) { 169*1b3f573fSAndroid Build Coastguard Worker output.WriteRawTag(10); 170*1b3f573fSAndroid Build Coastguard Worker output.WriteMessage(Bb); 171*1b3f573fSAndroid Build Coastguard Worker } 172*1b3f573fSAndroid Build Coastguard Worker if (_unknownFields != null) { 173*1b3f573fSAndroid Build Coastguard Worker _unknownFields.WriteTo(output); 174*1b3f573fSAndroid Build Coastguard Worker } 175*1b3f573fSAndroid Build Coastguard Worker } 176*1b3f573fSAndroid Build Coastguard Worker CalculateSize()177*1b3f573fSAndroid Build Coastguard Worker public int CalculateSize() { 178*1b3f573fSAndroid Build Coastguard Worker int size = 0; 179*1b3f573fSAndroid Build Coastguard Worker if (bb_ != null) { 180*1b3f573fSAndroid Build Coastguard Worker size += 1 + pb::CodedOutputStream.ComputeMessageSize(Bb); 181*1b3f573fSAndroid Build Coastguard Worker } 182*1b3f573fSAndroid Build Coastguard Worker if (_unknownFields != null) { 183*1b3f573fSAndroid Build Coastguard Worker size += _unknownFields.CalculateSize(); 184*1b3f573fSAndroid Build Coastguard Worker } 185*1b3f573fSAndroid Build Coastguard Worker return size; 186*1b3f573fSAndroid Build Coastguard Worker } 187*1b3f573fSAndroid Build Coastguard Worker MergeFrom(pb::CodedInputStream input)188*1b3f573fSAndroid Build Coastguard Worker public void MergeFrom(pb::CodedInputStream input) { 189*1b3f573fSAndroid Build Coastguard Worker uint tag; 190*1b3f573fSAndroid Build Coastguard Worker while ((tag = input.ReadTag()) != 0) { 191*1b3f573fSAndroid Build Coastguard Worker switch(tag) { 192*1b3f573fSAndroid Build Coastguard Worker default: 193*1b3f573fSAndroid Build Coastguard Worker _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); 194*1b3f573fSAndroid Build Coastguard Worker break; 195*1b3f573fSAndroid Build Coastguard Worker case 10: { 196*1b3f573fSAndroid Build Coastguard Worker if (bb_ == null) { 197*1b3f573fSAndroid Build Coastguard Worker Bb = new ParseContextEnabledMessageB(); 198*1b3f573fSAndroid Build Coastguard Worker } 199*1b3f573fSAndroid Build Coastguard Worker input.ReadMessage(Bb); 200*1b3f573fSAndroid Build Coastguard Worker break; 201*1b3f573fSAndroid Build Coastguard Worker } 202*1b3f573fSAndroid Build Coastguard Worker } 203*1b3f573fSAndroid Build Coastguard Worker } 204*1b3f573fSAndroid Build Coastguard Worker } 205*1b3f573fSAndroid Build Coastguard Worker } 206*1b3f573fSAndroid Build Coastguard Worker 207*1b3f573fSAndroid Build Coastguard Worker // hand-modified version of a generated message that does provide 208*1b3f573fSAndroid Build Coastguard Worker // the new InternalMergeFrom(ref ParseContext) method. 209*1b3f573fSAndroid Build Coastguard Worker private sealed partial class ParseContextEnabledMessageB : pb::IBufferMessage { 210*1b3f573fSAndroid Build Coastguard Worker private pb::UnknownFieldSet _unknownFields; 211*1b3f573fSAndroid Build Coastguard Worker 212*1b3f573fSAndroid Build Coastguard Worker pbr::MessageDescriptor pb::IMessage.Descriptor => throw new System.NotImplementedException(); 213*1b3f573fSAndroid Build Coastguard Worker 214*1b3f573fSAndroid Build Coastguard Worker /// <summary>Field number for the "a" field.</summary> 215*1b3f573fSAndroid Build Coastguard Worker public const int AFieldNumber = 1; 216*1b3f573fSAndroid Build Coastguard Worker private LegacyGeneratedCodeMessageA a_; 217*1b3f573fSAndroid Build Coastguard Worker public LegacyGeneratedCodeMessageA A { 218*1b3f573fSAndroid Build Coastguard Worker get { return a_; } 219*1b3f573fSAndroid Build Coastguard Worker set { 220*1b3f573fSAndroid Build Coastguard Worker a_ = value; 221*1b3f573fSAndroid Build Coastguard Worker } 222*1b3f573fSAndroid Build Coastguard Worker } 223*1b3f573fSAndroid Build Coastguard Worker 224*1b3f573fSAndroid Build Coastguard Worker /// <summary>Field number for the "optional_int32" field.</summary> 225*1b3f573fSAndroid Build Coastguard Worker public const int OptionalInt32FieldNumber = 2; 226*1b3f573fSAndroid Build Coastguard Worker private int optionalInt32_; 227*1b3f573fSAndroid Build Coastguard Worker public int OptionalInt32 { 228*1b3f573fSAndroid Build Coastguard Worker get { return optionalInt32_; } 229*1b3f573fSAndroid Build Coastguard Worker set { 230*1b3f573fSAndroid Build Coastguard Worker optionalInt32_ = value; 231*1b3f573fSAndroid Build Coastguard Worker } 232*1b3f573fSAndroid Build Coastguard Worker } 233*1b3f573fSAndroid Build Coastguard Worker WriteTo(pb::CodedOutputStream output)234*1b3f573fSAndroid Build Coastguard Worker public void WriteTo(pb::CodedOutputStream output) { 235*1b3f573fSAndroid Build Coastguard Worker output.WriteRawMessage(this); 236*1b3f573fSAndroid Build Coastguard Worker } 237*1b3f573fSAndroid Build Coastguard Worker IBufferMessage.InternalWriteTo(ref pb::WriteContext output)238*1b3f573fSAndroid Build Coastguard Worker void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) 239*1b3f573fSAndroid Build Coastguard Worker { 240*1b3f573fSAndroid Build Coastguard Worker if (a_ != null) 241*1b3f573fSAndroid Build Coastguard Worker { 242*1b3f573fSAndroid Build Coastguard Worker output.WriteRawTag(10); 243*1b3f573fSAndroid Build Coastguard Worker output.WriteMessage(A); 244*1b3f573fSAndroid Build Coastguard Worker } 245*1b3f573fSAndroid Build Coastguard Worker if (OptionalInt32 != 0) 246*1b3f573fSAndroid Build Coastguard Worker { 247*1b3f573fSAndroid Build Coastguard Worker output.WriteRawTag(16); 248*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(OptionalInt32); 249*1b3f573fSAndroid Build Coastguard Worker } 250*1b3f573fSAndroid Build Coastguard Worker if (_unknownFields != null) 251*1b3f573fSAndroid Build Coastguard Worker { 252*1b3f573fSAndroid Build Coastguard Worker _unknownFields.WriteTo(ref output); 253*1b3f573fSAndroid Build Coastguard Worker } 254*1b3f573fSAndroid Build Coastguard Worker } 255*1b3f573fSAndroid Build Coastguard Worker CalculateSize()256*1b3f573fSAndroid Build Coastguard Worker public int CalculateSize() { 257*1b3f573fSAndroid Build Coastguard Worker int size = 0; 258*1b3f573fSAndroid Build Coastguard Worker if (a_ != null) { 259*1b3f573fSAndroid Build Coastguard Worker size += 1 + pb::CodedOutputStream.ComputeMessageSize(A); 260*1b3f573fSAndroid Build Coastguard Worker } 261*1b3f573fSAndroid Build Coastguard Worker if (OptionalInt32 != 0) { 262*1b3f573fSAndroid Build Coastguard Worker size += 1 + pb::CodedOutputStream.ComputeInt32Size(OptionalInt32); 263*1b3f573fSAndroid Build Coastguard Worker } 264*1b3f573fSAndroid Build Coastguard Worker if (_unknownFields != null) { 265*1b3f573fSAndroid Build Coastguard Worker size += _unknownFields.CalculateSize(); 266*1b3f573fSAndroid Build Coastguard Worker } 267*1b3f573fSAndroid Build Coastguard Worker return size; 268*1b3f573fSAndroid Build Coastguard Worker } MergeFrom(pb::CodedInputStream input)269*1b3f573fSAndroid Build Coastguard Worker public void MergeFrom(pb::CodedInputStream input) { 270*1b3f573fSAndroid Build Coastguard Worker input.ReadRawMessage(this); 271*1b3f573fSAndroid Build Coastguard Worker } 272*1b3f573fSAndroid Build Coastguard Worker IBufferMessage.InternalMergeFrom(ref pb::ParseContext input)273*1b3f573fSAndroid Build Coastguard Worker void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { 274*1b3f573fSAndroid Build Coastguard Worker uint tag; 275*1b3f573fSAndroid Build Coastguard Worker while ((tag = input.ReadTag()) != 0) { 276*1b3f573fSAndroid Build Coastguard Worker switch(tag) { 277*1b3f573fSAndroid Build Coastguard Worker default: 278*1b3f573fSAndroid Build Coastguard Worker _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); 279*1b3f573fSAndroid Build Coastguard Worker break; 280*1b3f573fSAndroid Build Coastguard Worker case 10: { 281*1b3f573fSAndroid Build Coastguard Worker if (a_ == null) { 282*1b3f573fSAndroid Build Coastguard Worker A = new LegacyGeneratedCodeMessageA(); 283*1b3f573fSAndroid Build Coastguard Worker } 284*1b3f573fSAndroid Build Coastguard Worker input.ReadMessage(A); 285*1b3f573fSAndroid Build Coastguard Worker break; 286*1b3f573fSAndroid Build Coastguard Worker } 287*1b3f573fSAndroid Build Coastguard Worker case 16: { 288*1b3f573fSAndroid Build Coastguard Worker OptionalInt32 = input.ReadInt32(); 289*1b3f573fSAndroid Build Coastguard Worker break; 290*1b3f573fSAndroid Build Coastguard Worker } 291*1b3f573fSAndroid Build Coastguard Worker } 292*1b3f573fSAndroid Build Coastguard Worker } 293*1b3f573fSAndroid Build Coastguard Worker } 294*1b3f573fSAndroid Build Coastguard Worker } 295*1b3f573fSAndroid Build Coastguard Worker } 296*1b3f573fSAndroid Build Coastguard Worker }