143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Protocol Buffers - Google's data interchange format 243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Copyright 2008 Google Inc. All rights reserved. 343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// http://code.google.com/p/protobuf/ 443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// 543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Redistribution and use in source and binary forms, with or without 643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// modification, are permitted provided that the following conditions are 743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// met: 843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// 943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// * Redistributions of source code must retain the above copyright 1043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// notice, this list of conditions and the following disclaimer. 1143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// * Redistributions in binary form must reproduce the above 1243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// copyright notice, this list of conditions and the following disclaimer 1343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// in the documentation and/or other materials provided with the 1443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// distribution. 1543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// * Neither the name of Google Inc. nor the names of its 1643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// contributors may be used to endorse or promote products derived from 1743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// this software without specific prior written permission. 1843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// 1943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 3143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Author: kenton@google.com (Kenton Varda) 3243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Based on original Protocol Buffers design by 3343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Sanjay Ghemawat, Jeff Dean, and others. 3443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 3543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <map> 3643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <string> 3743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 3843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/compiler/javanano/javanano_message_field.h> 3943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/compiler/javanano/javanano_helpers.h> 4043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/io/printer.h> 4143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/wire_format.h> 4243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/stubs/strutil.h> 4343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 4443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace google { 4543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace protobuf { 4643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace compiler { 4743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace javanano { 4843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 4943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazciusing internal::WireFormat; 5043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazciusing internal::WireFormatLite; 5143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 5243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace { 5343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 5443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// TODO(kenton): Factor out a "SetCommonFieldVariables()" to get rid of 5543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// repeat code between this and the other field types. 5643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid SetMessageVariables(const Params& params, 5743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci const FieldDescriptor* descriptor, map<string, string>* variables) { 5843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["name"] = 5943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci UnderscoresToCamelCase(descriptor); 6043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["capitalized_name"] = 6143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci UnderscoresToCapitalizedCamelCase(descriptor); 6243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["number"] = SimpleItoa(descriptor->number()); 6343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["type"] = ClassName(params, descriptor->message_type()); 6443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["group_or_message"] = 6543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (descriptor->type() == FieldDescriptor::TYPE_GROUP) ? 6643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "Group" : "Message"; 6743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["message_name"] = descriptor->containing_type()->name(); 6843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci //(*variables)["message_type"] = descriptor->message_type()->name(); 6943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); 7043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 7143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 7243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} // namespace 7343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 7443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// =================================================================== 7543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 7643325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciMessageFieldGenerator:: 7743325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params) 7843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci : FieldGenerator(params), descriptor_(descriptor) { 7943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci SetMessageVariables(params, descriptor, &variables_); 8043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 8143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 8243325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciMessageFieldGenerator::~MessageFieldGenerator() {} 8343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 8443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator:: 8543325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateMembers(io::Printer* printer) const { 8643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 8743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "public $type$ $name$ = null;\n"); 8843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 8943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 9043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator:: 9143325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateParsingCode(io::Printer* printer) const { 9243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 93fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "this.$name$ = new $type$();\n"); 9443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 9543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { 9643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 97fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "input.readGroup(this.$name$, $number$);\n"); 9843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci } else { 9943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 100fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "input.readMessage(this.$name$);\n"); 10143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci } 10243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 10343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 10443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator:: 10543325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializationCode(io::Printer* printer) const { 10643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 107fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "if (this.$name$ != null) {\n" 108fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci " output.write$group_or_message$($number$, this.$name$);\n" 10943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "}\n"); 11043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 11143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 11243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator:: 11343325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializedSizeCode(io::Printer* printer) const { 11443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 115fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "if (this.$name$ != null) {\n" 11643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 117fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci " .compute$group_or_message$Size($number$, this.$name$);\n" 11843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "}\n"); 11943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 12043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 12143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcistring MessageFieldGenerator::GetBoxedType() const { 12243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci return ClassName(params_, descriptor_->message_type()); 12343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 12443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 12543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// =================================================================== 12643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 12743325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciRepeatedMessageFieldGenerator:: 12843325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params) 12943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci : FieldGenerator(params), descriptor_(descriptor) { 13043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci SetMessageVariables(params, descriptor, &variables_); 13143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 13243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 13343325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} 13443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 13543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator:: 13643325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateMembers(io::Printer* printer) const { 13743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 13843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "public $type$[] $name$ = $type$.EMPTY_ARRAY;\n"); 13943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 14043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 14143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator:: 14243325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateParsingCode(io::Printer* printer) const { 14343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci // First, figure out the length of the array, then parse. 14443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 14543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n" 146fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "int i = this.$name$.length;\n" 147fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "this.$name$ = java.util.Arrays.copyOf(this.$name$, i + arrayLength);\n" 148fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "for (; i < this.$name$.length - 1; i++) {\n" 149fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci " this.$name$[i] = new $type$();\n"); 15043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 15143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { 15243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 153fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci " input.readGroup(this.$name$[i], $number$);\n"); 15443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci } else { 15543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 156fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci " input.readMessage(this.$name$[i]);\n"); 15743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci } 15843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 15943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 16043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci " input.readTag();\n" 16143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "}\n" 16243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "// Last one without readTag.\n" 163fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "this.$name$[i] = new $type$();\n"); 16443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 16543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { 16643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 167fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "input.readGroup(this.$name$[i], $number$);\n"); 16843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci } else { 16943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 170fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "input.readMessage(this.$name$[i]);\n"); 17143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci } 17243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 17343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 17443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator:: 17543325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializationCode(io::Printer* printer) const { 17643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 177fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "for ($type$ element : this.$name$) {\n" 17843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci " output.write$group_or_message$($number$, element);\n" 17943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "}\n"); 18043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 18143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 18243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator:: 18343325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializedSizeCode(io::Printer* printer) const { 18443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci printer->Print(variables_, 185fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci "for ($type$ element : this.$name$) {\n" 18643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" 18743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci " .compute$group_or_message$Size($number$, element);\n" 18843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci "}\n"); 18943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 19043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 19143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcistring RepeatedMessageFieldGenerator::GetBoxedType() const { 19243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci return ClassName(params_, descriptor_->message_type()); 19343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} 19443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci 19543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} // namespace javanano 19643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} // namespace compiler 19743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} // namespace protobuf 19843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci} // namespace google 199