| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_LIB_FIDL_CODEC_ENCODER_H_ |
| #define SRC_LIB_FIDL_CODEC_ENCODER_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include <optional> |
| #include <vector> |
| |
| #include "src/lib/fidl_codec/visitor.h" |
| |
| namespace fidl_codec { |
| |
| class Encoder : public Visitor { |
| public: |
| struct Result { |
| std::vector<uint8_t> bytes; |
| std::vector<zx_handle_info_t> handles; |
| }; |
| |
| static Result EncodeMessage(uint32_t tx_id, uint64_t ordinal, const uint8_t flags[3], |
| uint8_t magic, const StructValue& object); |
| |
| // Write a literal value into our buffer. |
| template <typename T> |
| void WriteValue(T value) { |
| WriteData(reinterpret_cast<uint8_t*>(&value), sizeof(T)); |
| } |
| |
| private: |
| Encoder() = default; |
| |
| // Reserve space in the buffer for one object. |
| size_t AllocateObject(size_t object_size); |
| |
| // Write data into our buffer. |
| void WriteData(const uint8_t* data, size_t size); |
| void WriteData(const std::vector<uint8_t>& data) { WriteData(data.data(), data.size()); } |
| |
| // Encode a value in an envelope. |
| void EncodeEnvelope(const Value* value, const Type* for_type); |
| |
| // Visit an object which is known to be non-null and which we want encoded immediately at the |
| // current position. If existing_size is specified, it indicates some number of bytes which have |
| // already been written that should be considered part of the object for the purpose of |
| // calculating member offsets. |
| void VisitStructValueBody(size_t offset, const StructValue* node); |
| |
| // Visitor overrides. |
| void VisitInvalidValue(const InvalidValue* node, const Type* for_type) override; |
| void VisitNullValue(const NullValue* node, const Type* for_type) override; |
| void VisitRawValue(const RawValue* node, const Type* for_type) override; |
| void VisitBoolValue(const BoolValue* node, const Type* for_type) override; |
| void VisitIntegerValue(const IntegerValue* node, const Type* for_type) override; |
| void VisitDoubleValue(const DoubleValue* node, const Type* for_type) override; |
| void VisitStringValue(const StringValue* node, const Type* for_type) override; |
| void VisitHandleValue(const HandleValue* node, const Type* for_type) override; |
| void VisitUnionValue(const UnionValue* node, const Type* for_type) override; |
| void VisitStructValue(const StructValue* node, const Type* for_type) override; |
| void VisitVectorValue(const VectorValue* node, const Type* for_type) override; |
| void VisitTableValue(const TableValue* node, const Type* for_type) override; |
| |
| std::vector<uint8_t> bytes_; |
| std::vector<zx_handle_info_t> handles_; |
| // Offset we are currently using to write into the buffer. |
| size_t current_offset_ = 0; |
| }; |
| |
| } // namespace fidl_codec |
| |
| #endif // SRC_LIB_FIDL_CODEC_ENCODER_H_ |