33 #include <google/protobuf/compiler/plugin.h>
44 #include <google/protobuf/stubs/logging.h>
45 #include <google/protobuf/stubs/common.h>
46 #include <google/protobuf/compiler/plugin.pb.h>
47 #include <google/protobuf/compiler/code_generator.h>
48 #include <google/protobuf/io/zero_copy_stream_impl.h>
49 #include <google/protobuf/descriptor.h>
50 #include <google/protobuf/io/io_win32.h>
60 using google::protobuf::io::win32::setmode;
67 const std::vector<const FileDescriptor*>& parsed_files)
86 file->set_insertion_point(insertion_point);
92 const google::protobuf::GeneratedCodeInfo& info)
override {
95 file->set_insertion_point(insertion_point);
96 *
file->mutable_generated_code_info() = info;
118 for (
int i = 0;
i <
request.proto_file_size();
i++) {
126 std::vector<const FileDescriptor*> parsed_files;
127 for (
int i = 0;
i <
request.file_to_generate_size();
i++) {
128 parsed_files.push_back(
pool.FindFileByName(
request.file_to_generate(i)));
129 if (parsed_files.back() == NULL) {
131 "protoc asked plugin to generate a file but "
132 "did not provide a descriptor for the file: " +
143 bool succeeded = generator.GenerateAll(parsed_files,
request.parameter(),
146 response->set_supported_features(generator.GetSupportedFeatures());
148 if (!succeeded &&
error.empty()) {
150 "Code generator returned false but provided no error "
153 if (!
error.empty()) {
163 std::cerr << argv[0] <<
": Unknown option: " << argv[1] << std::endl;
168 setmode(STDIN_FILENO, _O_BINARY);
169 setmode(STDOUT_FILENO, _O_BINARY);
173 if (!
request.ParseFromFileDescriptor(STDIN_FILENO)) {
174 std::cerr << argv[0] <<
": protoc sent unparseable request to plugin."
184 if (!
response.SerializeToFileDescriptor(STDOUT_FILENO)) {
185 std::cerr << argv[0] <<
": Error writing to stdout." << std::endl;
189 if (!error_msg.empty()) {
190 std::cerr << argv[0] <<
": " << error_msg << std::endl;