// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // 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. // Author: [email protected] (Kenton Varda) // Author: [email protected] (Jon Perlow) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include <google/protobuf/compiler/java/string_field_lite.h> #include <cstdint> #include <map> #include <string> #include <google/protobuf/stubs/logging.h> #include <google/protobuf/stubs/common.h> #include <google/protobuf/io/printer.h> #include <google/protobuf/wire_format.h> #include <google/protobuf/stubs/strutil.h> #include <google/protobuf/compiler/java/context.h> #include <google/protobuf/compiler/java/doc_comment.h> #include <google/protobuf/compiler/java/helpers.h> #include <google/protobuf/compiler/java/name_resolver.h> namespace google { namespace protobuf { namespace compiler { namespace java { WireFormat; WireFormatLite; namespace { void SetPrimitiveVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map<std::string, std::string>* variables) { … } } // namespace // =================================================================== ImmutableStringFieldLiteGenerator::ImmutableStringFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, Context* context) : … { … } ImmutableStringFieldLiteGenerator::~ImmutableStringFieldLiteGenerator() { … } int ImmutableStringFieldLiteGenerator::GetNumBitsForMessage() const { … } // A note about how strings are handled. In the SPEED and CODE_SIZE runtimes, // strings are not stored as java.lang.String in the Message because of two // issues: // // 1. It wouldn't roundtrip byte arrays that were not valid UTF-8 encoded // strings, but rather fields that were raw bytes incorrectly marked // as strings in the proto file. This is common because in the proto1 // syntax, string was the way to indicate bytes and C++ engineers can // easily make this mistake without affecting the C++ API. By converting to // strings immediately, some java code might corrupt these byte arrays as // it passes through a java server even if the field was never accessed by // application code. // // 2. There's a performance hit to converting between bytes and strings and // it many cases, the field is never even read by the application code. This // avoids unnecessary conversions in the common use cases. // // In the LITE_RUNTIME, we store strings as java.lang.String because we assume // that the users of this runtime are not subject to proto1 constraints and are // running code on devices that are user facing. That is, the developers are // properly incentivized to only fetch the data they need to read and wish to // reduce the number of allocations incurred when running on a user's device. // TODO(dweis): Consider dropping all of the *Bytes() methods. They really // shouldn't be necessary or used on devices. void ImmutableStringFieldLiteGenerator::GenerateInterfaceMembers( io::Printer* printer) const { … } void ImmutableStringFieldLiteGenerator::GenerateMembers( io::Printer* printer) const { … } void ImmutableStringFieldLiteGenerator::GenerateBuilderMembers( io::Printer* printer) const { … } void ImmutableStringFieldLiteGenerator::GenerateKotlinDslMembers( io::Printer* printer) const { … } void ImmutableStringFieldLiteGenerator::GenerateFieldInfo( io::Printer* printer, std::vector<uint16_t>* output) const { … } void ImmutableStringFieldLiteGenerator::GenerateInitializationCode( io::Printer* printer) const { … } std::string ImmutableStringFieldLiteGenerator::GetBoxedType() const { … } // =================================================================== ImmutableStringOneofFieldLiteGenerator::ImmutableStringOneofFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, Context* context) : … { … } ImmutableStringOneofFieldLiteGenerator:: ~ImmutableStringOneofFieldLiteGenerator() { … } void ImmutableStringOneofFieldLiteGenerator::GenerateMembers( io::Printer* printer) const { … } void ImmutableStringOneofFieldLiteGenerator::GenerateFieldInfo( io::Printer* printer, std::vector<uint16_t>* output) const { … } void ImmutableStringOneofFieldLiteGenerator::GenerateBuilderMembers( io::Printer* printer) const { … } // =================================================================== RepeatedImmutableStringFieldLiteGenerator:: RepeatedImmutableStringFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, Context* context) : … { … } RepeatedImmutableStringFieldLiteGenerator:: ~RepeatedImmutableStringFieldLiteGenerator() { … } int RepeatedImmutableStringFieldLiteGenerator::GetNumBitsForMessage() const { … } void RepeatedImmutableStringFieldLiteGenerator::GenerateInterfaceMembers( io::Printer* printer) const { … } void RepeatedImmutableStringFieldLiteGenerator::GenerateMembers( io::Printer* printer) const { … } void RepeatedImmutableStringFieldLiteGenerator::GenerateBuilderMembers( io::Printer* printer) const { … } void RepeatedImmutableStringFieldLiteGenerator::GenerateKotlinDslMembers( io::Printer* printer) const { … } void RepeatedImmutableStringFieldLiteGenerator::GenerateFieldInfo( io::Printer* printer, std::vector<uint16_t>* output) const { … } void RepeatedImmutableStringFieldLiteGenerator::GenerateInitializationCode( io::Printer* printer) const { … } std::string RepeatedImmutableStringFieldLiteGenerator::GetBoxedType() const { … } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google