/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // independent from idl_parser, since this code is not needed for most clients #include "idl_gen_binary.h" #include #include #include #include #include "flatbuffers/base.h" #include "flatbuffers/code_generators.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatc.h" #include "flatbuffers/idl.h" #include "flatbuffers/util.h" namespace flatbuffers { namespace { static std::string BinaryFileName(const Parser &parser, const std::string &path, const std::string &file_name) { auto ext = parser.file_extension_.length() ? parser.file_extension_ : "bin"; return path + file_name + "." + ext; } static bool GenerateBinary(const Parser &parser, const std::string &path, const std::string &file_name) { if (parser.opts.use_flexbuffers) { auto data_vec = parser.flex_builder_.GetBuffer(); auto data_ptr = reinterpret_cast(data(data_vec)); return !parser.flex_builder_.GetSize() || flatbuffers::SaveFile( BinaryFileName(parser, path, file_name).c_str(), data_ptr, parser.flex_builder_.GetSize(), true); } return !parser.builder_.GetSize() || flatbuffers::SaveFile( BinaryFileName(parser, path, file_name).c_str(), reinterpret_cast(parser.builder_.GetBufferPointer()), parser.builder_.GetSize(), true); } static std::string BinaryMakeRule(const Parser &parser, const std::string &path, const std::string &file_name) { if (!parser.builder_.GetSize()) return ""; std::string filebase = flatbuffers::StripPath(flatbuffers::StripExtension(file_name)); std::string make_rule = BinaryFileName(parser, path, filebase) + ": " + file_name; auto included_files = parser.GetIncludedFilesRecursive(parser.root_struct_def_->file); for (auto it = included_files.begin(); it != included_files.end(); ++it) { make_rule += " " + *it; } return make_rule; } class BinaryCodeGenerator : public CodeGenerator { public: Status GenerateCode(const Parser &parser, const std::string &path, const std::string &filename) override { if (!GenerateBinary(parser, path, filename)) { return Status::ERROR; } return Status::OK; } // Generate code from the provided `buffer` of given `length`. The buffer is a // serialized reflection.fbs. Status GenerateCode(const uint8_t *, int64_t, const CodeGenOptions &) override { return Status::NOT_IMPLEMENTED; } Status GenerateMakeRule(const Parser &parser, const std::string &path, const std::string &filename, std::string &output) override { output = BinaryMakeRule(parser, path, filename); return Status::OK; } Status GenerateGrpcCode(const Parser &parser, const std::string &path, const std::string &filename) override { (void)parser; (void)path; (void)filename; return Status::NOT_IMPLEMENTED; } Status GenerateRootFile(const Parser &parser, const std::string &path) override { (void)parser; (void)path; return Status::NOT_IMPLEMENTED; } bool IsSchemaOnly() const override { return false; } bool SupportsBfbsGeneration() const override { return false; } bool SupportsRootFileGeneration() const override { return false; } IDLOptions::Language Language() const override { return IDLOptions::kBinary; } std::string LanguageName() const override { return "binary"; } }; } // namespace std::unique_ptr NewBinaryCodeGenerator() { return std::unique_ptr(new BinaryCodeGenerator()); } } // namespace flatbuffers