16c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include "Errors.h"
26c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
36c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include "string_utils.h"
46c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
56c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include "google/protobuf/compiler/plugin.pb.h"
66c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include "google/protobuf/io/zero_copy_stream_impl.h"
76c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include "google/protobuf/text_format.h"
86c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
96c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include <stdio.h>
106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include <iomanip>
116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include <iostream>
126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include <sstream>
136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato#include <map>
146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratousing namespace android::javastream_proto;
166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratousing namespace google::protobuf;
176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratousing namespace google::protobuf::compiler;
186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratousing namespace google::protobuf::io;
196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratousing namespace std;
206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst int FIELD_TYPE_SHIFT = 32;
226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_DOUBLE = 1L << FIELD_TYPE_SHIFT;
236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_FLOAT = 2L << FIELD_TYPE_SHIFT;
246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_INT32 = 3L << FIELD_TYPE_SHIFT;
256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_INT64 = 4L << FIELD_TYPE_SHIFT;
266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_UINT32 = 5L << FIELD_TYPE_SHIFT;
276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_UINT64 = 6L << FIELD_TYPE_SHIFT;
286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_SINT32 = 7L << FIELD_TYPE_SHIFT;
296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_SINT64 = 8L << FIELD_TYPE_SHIFT;
306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_FIXED32 = 9L << FIELD_TYPE_SHIFT;
316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_FIXED64 = 10L << FIELD_TYPE_SHIFT;
326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_SFIXED32 = 11L << FIELD_TYPE_SHIFT;
336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_SFIXED64 = 12L << FIELD_TYPE_SHIFT;
346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_BOOL = 13L << FIELD_TYPE_SHIFT;
356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_STRING = 14L << FIELD_TYPE_SHIFT;
366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_BYTES = 15L << FIELD_TYPE_SHIFT;
376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_ENUM = 16L << FIELD_TYPE_SHIFT;
386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_TYPE_OBJECT = 17L << FIELD_TYPE_SHIFT;
396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst int FIELD_COUNT_SHIFT = 40;
416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_COUNT_SINGLE = 1L << FIELD_COUNT_SHIFT;
426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_COUNT_REPEATED = 2L << FIELD_COUNT_SHIFT;
436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoconst uint64_t FIELD_COUNT_PACKED = 5L << FIELD_COUNT_SHIFT;
446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * See if this is the file for this request, and not one of the imported ones.
486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic bool
506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoshould_generate_for_file(const CodeGeneratorRequest& request, const string& file)
516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    const int N = request.file_to_generate_size();
536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (request.file_to_generate(i) == file) {
556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return true;
566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    return false;
596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * If the descriptor gives us a class name, use that. Otherwise make one up from
636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the filename of the .proto file.
646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic string
666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratomake_outer_class_name(const FileDescriptorProto& file_descriptor)
676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string name = file_descriptor.options().java_outer_classname();
696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    if (name.size() == 0) {
706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        name = to_camel_case(file_base_name(file_descriptor.name()));
716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (name.size() == 0) {
726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            ERRORS.Add(UNKNOWN_FILE, UNKNOWN_LINE,
736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    "Unable to make an outer class name for file: %s",
746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    file_descriptor.name().c_str());
756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            name = "Unknown";
766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    return name;
796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Figure out the package name that we are generating.
836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic string
856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratomake_java_package(const FileDescriptorProto& file_descriptor) {
866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    if (file_descriptor.options().has_java_package()) {
876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return file_descriptor.options().java_package();
886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    } else {
896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return file_descriptor.package();
906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Figure out the name of the file we are generating.
956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic string
97b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onoratomake_file_name(const FileDescriptorProto& file_descriptor, const string& class_name)
986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string const package = make_java_package(file_descriptor);
1006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string result;
1016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    if (package.size() > 0) {
1026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        result = replace_string(package, '.', '/');
1036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        result += '/';
1046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
1056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
106b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    result += class_name;
1076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    result += ".java";
1086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    return result;
1106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
1116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic string
1136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoindent_more(const string& indent)
1146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
1156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    return indent + "    ";
1166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
1176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
1196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write the constants for an enum.
1206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
1216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic void
1226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratowrite_enum(stringstream& text, const EnumDescriptorProto& enu, const string& indent)
1236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
1246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    const int N = enu.value_size();
1256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << indent << "// enum " << enu.name() << endl;
1266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
1276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        const EnumValueDescriptorProto& value = enu.value(i);
1286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        text << indent << "public static final int "
1296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                << make_constant_name(value.name())
1306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                << " = " << value.number() << ";" << endl;
1316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
1326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << endl;
1336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
1346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
1366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the string name for a field.
1376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
1386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic string
1396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoget_proto_type(const FieldDescriptorProto& field)
1406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
1416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    switch (field.type()) {
1426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_DOUBLE:
1436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "double";
1446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_FLOAT:
1456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "float";
1466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_INT64:
1476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "int64";
1486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_UINT64:
1496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "uint64";
1506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_INT32:
1516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "int32";
1526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_FIXED64:
1536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "fixed64";
1546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_FIXED32:
1556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "fixed32";
1566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_BOOL:
1576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "bool";
1586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_STRING:
1596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "string";
1606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_GROUP:
1616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "group<unsupported!>";
1626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_MESSAGE:
1636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return field.type_name();
1646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_BYTES:
1656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "bytes";
1666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_UINT32:
1676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "uint32";
1686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_ENUM:
1696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return field.type_name();
1706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SFIXED32:
1716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "sfixed32";
1726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SFIXED64:
1736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "sfixed64";
1746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SINT32:
1756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "sint32";
1766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SINT64:
1776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "sint64";
1786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        default:
1796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // won't happen
1806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "void";
1816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
1826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
1836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic uint64_t
1856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoget_field_id(const FieldDescriptorProto& field)
1866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
1876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Number
1886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    uint64_t result = (uint32_t)field.number();
1896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Type
1916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    switch (field.type()) {
1926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_DOUBLE:
1936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_DOUBLE;
1943a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
1956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_FLOAT:
1966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_FLOAT;
1973a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
1986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_INT64:
1996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_INT64;
2003a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_UINT64:
2026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_UINT64;
2033a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_INT32:
2056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_INT32;
2063a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_FIXED64:
2086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_FIXED64;
2093a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_FIXED32:
2116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_FIXED32;
2123a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_BOOL:
2146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_BOOL;
2153a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_STRING:
2176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_STRING;
2183a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_MESSAGE:
2206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_OBJECT;
2213a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_BYTES:
2236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_BYTES;
2243a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_UINT32:
2266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_UINT32;
2273a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_ENUM:
2296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_ENUM;
2303a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SFIXED32:
2326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_SFIXED32;
2333a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SFIXED64:
2356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_SFIXED64;
2363a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SINT32:
2386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_SINT32;
2393a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        case FieldDescriptorProto::TYPE_SINT64:
2416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            result |= FIELD_TYPE_SINT64;
2423a5eb297205b4c468d35912e3df5cdf014f6e188Joe Onorato            break;
2436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        default:
2446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            ;
2456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
2466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Count
2486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    if (field.options().packed()) {
2496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        result |= FIELD_COUNT_PACKED;
2506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    } else if (field.label() == FieldDescriptorProto::LABEL_REPEATED) {
2516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        result |= FIELD_COUNT_REPEATED;
2526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    } else {
2536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        result |= FIELD_COUNT_SINGLE;
2546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
2556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    return result;
2576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
2586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
2606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a field.
2616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
2626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic void
2636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratowrite_field(stringstream& text, const FieldDescriptorProto& field, const string& indent)
2646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
2656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string optional_comment = field.label() == FieldDescriptorProto::LABEL_OPTIONAL
2666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            ? "optional " : "";
2676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string repeated_comment = field.label() == FieldDescriptorProto::LABEL_REPEATED
2686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            ? "repeated " : "";
2696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string proto_type = get_proto_type(field);
2706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string packed_comment = field.options().packed()
2716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            ? " [packed=true]" : "";
2726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << indent << "// " << optional_comment << repeated_comment << proto_type << ' '
2736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            << field.name() << " = " << field.number() << packed_comment << ';' << endl;
2746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << indent << "public static final long " << make_constant_name(field.name()) << " = 0x";
2766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    ios::fmtflags fmt(text.flags());
2786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << setfill('0') << setw(16) << hex << get_field_id(field);
2796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text.flags(fmt);
2806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << "L;" << endl;
2826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << endl;
2846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
2856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
2876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a Message constants class.
2886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
2896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic void
2906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratowrite_message(stringstream& text, const DescriptorProto& message, const string& indent)
2916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
2926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    int N;
2936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    const string indented = indent_more(indent);
2946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << indent << "// message " << message.name() << endl;
2966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << indent << "public final class " << message.name() << " {" << endl;
2976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << endl;
2986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Enums
3006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    N = message.enum_type_size();
3016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
3026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        write_enum(text, message.enum_type(i), indented);
3036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
3046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Nested classes
3066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    N = message.nested_type_size();
3076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
3086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        write_message(text, message.nested_type(i), indented);
3096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
3106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Fields
3126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    N = message.field_size();
3136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
3146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        write_field(text, message.field(i), indented);
3156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
3166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << indent << "}" << endl;
3186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << endl;
3196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
3206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
3226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write the contents of a file.
323b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato *
324b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato * If there are enums and generate_outer is false, invalid java code will be generated.
3256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
3266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratostatic void
327b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onoratowrite_file(CodeGeneratorResponse* response, const FileDescriptorProto& file_descriptor,
328b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        const string& filename, bool generate_outer,
329b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        const vector<EnumDescriptorProto>& enums, const vector<DescriptorProto>& messages)
3306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
331b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    stringstream text;
332b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
3336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string const package_name = make_java_package(file_descriptor);
3346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    string const outer_class_name = make_outer_class_name(file_descriptor);
3356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << "// Generated by protoc-gen-javastream. DO NOT MODIFY." << endl;
3376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << "// source: " << file_descriptor.name() << endl << endl;
3386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    if (package_name.size() > 0) {
3406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (package_name.size() > 0) {
3416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            text << "package " << package_name << ";" << endl;
3426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            text << endl;
3436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
3446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
3456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
3466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // This bit of policy is android api rules specific: Raw proto classes
347b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    // must never be in the API
3486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    text << "/** @hide */" << endl;
349b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato//    text << "@android.annotation.TestApi" << endl;
3506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
351b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    if (generate_outer) {
352b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        text << "public final class " << outer_class_name << " {" << endl;
353b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        text << endl;
354b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    }
3556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
356b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    size_t N;
357b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    const string indented = generate_outer ? indent_more("") : string();
3586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
359b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    N = enums.size();
360b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    for (size_t i=0; i<N; i++) {
361b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        write_enum(text, enums[i], indented);
362b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    }
363b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
364b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    N = messages.size();
365b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    for (size_t i=0; i<N; i++) {
366b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        write_message(text, messages[i], indented);
367b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    }
368b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
369b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    if (generate_outer) {
370b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        text << "}" << endl;
371b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    }
372b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
373b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    CodeGeneratorResponse::File* file_response = response->add_file();
374b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    file_response->set_name(filename);
375b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    file_response->set_content(text.str());
376b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato}
377b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
378b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato/**
379b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato * Write one file per class.  Put all of the enums into the "outer" class.
380b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato */
381b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onoratostatic void
382b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onoratowrite_multiple_files(CodeGeneratorResponse* response, const FileDescriptorProto& file_descriptor)
383b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato{
384b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    // If there is anything to put in the outer class file, create one
385b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    if (file_descriptor.enum_type_size() > 0) {
386b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        vector<EnumDescriptorProto> enums;
387b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        int N = file_descriptor.enum_type_size();
388b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        for (int i=0; i<N; i++) {
389b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato            enums.push_back(file_descriptor.enum_type(i));
390b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        }
391b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
392b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        vector<DescriptorProto> messages;
393b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
394b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        write_file(response, file_descriptor,
395b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato                make_file_name(file_descriptor, make_outer_class_name(file_descriptor)),
396b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato                true, enums, messages);
397b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    }
398b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
399b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    // For each of the message types, make a file
400b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    int N = file_descriptor.message_type_size();
401b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    for (int i=0; i<N; i++) {
402b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        vector<EnumDescriptorProto> enums;
403b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
404b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        vector<DescriptorProto> messages;
405b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        messages.push_back(file_descriptor.message_type(i));
406b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
407b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        write_file(response, file_descriptor,
408b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato                make_file_name(file_descriptor, file_descriptor.message_type(i).name()),
409b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato                false, enums, messages);
410b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    }
411b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato}
412b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
413b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onoratostatic void
414b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onoratowrite_single_file(CodeGeneratorResponse* response, const FileDescriptorProto& file_descriptor)
415b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato{
416b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    int N;
417b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato
418b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    vector<EnumDescriptorProto> enums;
4196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    N = file_descriptor.enum_type_size();
4206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
421b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        enums.push_back(file_descriptor.enum_type(i));
4226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
4236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
424b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    vector<DescriptorProto> messages;
4256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    N = file_descriptor.message_type_size();
4266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
427b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato        messages.push_back(file_descriptor.message_type(i));
4286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
4296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
430b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato    write_file(response, file_descriptor,
431b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato            make_file_name(file_descriptor, make_outer_class_name(file_descriptor)),
432b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato            true, enums, messages);
4336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
4346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
4366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Main.
4376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
4386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoint
4396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratomain(int argc, char const*const* argv)
4406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato{
4416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    (void)argc;
4426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    (void)argv;
4436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    GOOGLE_PROTOBUF_VERIFY_VERSION;
4456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    CodeGeneratorRequest request;
4476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    CodeGeneratorResponse response;
4486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Read the request
4506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    request.ParseFromIstream(&cin);
4516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Build the files we need.
4536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    const int N = request.proto_file_size();
4546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    for (int i=0; i<N; i++) {
4556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        const FileDescriptorProto& file_descriptor = request.proto_file(i);
4566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (should_generate_for_file(request, file_descriptor.name())) {
457b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato            if (file_descriptor.options().java_multiple_files()) {
458b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato                write_multiple_files(&response, file_descriptor);
459b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato            } else {
460b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato                write_single_file(&response, file_descriptor);
461b38ac0b15dfa8d28d47e5d5a18ed6d1cf26b3a96Joe Onorato            }
4626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
4636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
4646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // If we had errors, don't write the response. Print the errors and exit.
4666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    if (ERRORS.HasErrors()) {
4676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        ERRORS.Print();
4686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return 1;
4696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
4706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
4716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // If we didn't have errors, write the response and exit happily.
4726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    response.SerializeToOstream(&cout);
4736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    return 0;
4746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
475