blob: 60d49fdbea0b46e1dd41bc0dfb7f71567109c853 [file] [log] [blame]
// Get the size of the VMO
uint64_t content_size_prop = 0;
zx_status_t status = config_vmo.get_prop_content_size(&content_size_prop);
ZX_ASSERT_MSG(status == ZX_OK, "Could not get content size of config VMO");
size_t vmo_content_size = static_cast<size_t>(content_size_prop);
// Checksum length must be correct
uint16_t checksum_length = 0;
status = config_vmo.read(&checksum_length, 0, 2);
ZX_ASSERT_MSG(status == ZX_OK, "Could not read checksum length from config VMO");
// Verify Checksum
std::vector<uint8_t> checksum(checksum_length);
status = config_vmo.read(checksum.data(), 2, checksum_length);
ZX_ASSERT_MSG(status == ZX_OK, "Could not read checksum from config VMO");
std::vector<uint8_t> expected_checksum {
{{#each expected_checksum}}
{{(hex_byte this)}}{{#unless @last}},{{/unless}}
{{/each}}
};
ZX_ASSERT_MSG(checksum == expected_checksum, "Invalid checksum for config VMO");
// Read the FIDL struct into memory
// Skip the checksum length + checksum + FIDL persistent header
// Align the struct pointer to 8 bytes (as required by FIDL)
size_t header = 2 + checksum_length + 8;
size_t fidl_struct_size = vmo_content_size - header;
std::unique_ptr<uint8_t[]> fidl_struct(new uint8_t[fidl_struct_size]);
status = config_vmo.read(fidl_struct.get(), header, fidl_struct_size);
ZX_ASSERT_MSG(status == ZX_OK, "Could not read FIDL struct from config VMO");
// TODO(https://fxbug.dev/100147) use fidl::Unpersist(header_and_struct_bytes) instead
// Decode the FIDL struct
fidl::unstable::DecodedMessage<::{{fidl_cpp_namespace}}::wire::Config> decoded(
fidl::internal::WireFormatVersion::kV2, fidl_struct.get(), static_cast<uint32_t>(fidl_struct_size));
ZX_ASSERT_MSG(decoded.ok(), "Could not decode Config FIDL structure");
::{{fidl_cpp_namespace}}::wire::Config* fidl_config = decoded.PrimaryObject();
// Convert the configuration into a new struct
Config c\{{
{{#each fields}}
{{#if (is_string_vector type_)}}
.{{ident}} = from_vector_string_view(fidl_config->{{ident}})
{{else}}
{{#if (is_vector type_)}}
.{{ident}} = from_vector_view(fidl_config->{{ident}})
{{else}}
{{#if (is_string type_)}}
.{{ident}} = std::string(fidl_config->{{ident}}.get())
{{else}}
.{{ident}} = fidl_config->{{ident}}
{{/if}}
{{/if}}
{{/if}}
{{~#unless @last}},{{/unless}}
{{~/each~}}
}};
return c;