9 #include "flutter/fml/paths.h"
15 std::vector<IncludeDir> include_dirs,
16 std::function<
void(std::string)> on_file_included)
17 : working_directory_(
std::move(working_directory)),
18 include_dirs_(
std::move(include_dirs)),
19 on_file_included_(
std::move(on_file_included)) {}
24 std::unique_ptr<fml::FileMapping> Includer::TryOpenMapping(
26 const char* requested_source) {
27 if (!dir.
dir || !dir.
dir->is_valid()) {
31 if (requested_source ==
nullptr) {
35 std::string source(requested_source);
40 auto mapping = fml::FileMapping::CreateReadOnly(*dir.
dir, requested_source);
41 if (!mapping || !mapping->IsValid()) {
45 on_file_included_(fml::paths::JoinPaths({dir.
name, requested_source}));
50 std::unique_ptr<fml::FileMapping> Includer::FindFirstMapping(
51 const char* requested_source) {
57 dir.dir = working_directory_;
58 if (
auto mapping = TryOpenMapping(dir, requested_source)) {
63 for (
const auto& include_dir : include_dirs_) {
64 if (
auto mapping = TryOpenMapping(include_dir, requested_source)) {
72 shaderc_include_type
type,
73 const char* requesting_source,
74 size_t include_depth) {
75 auto result = std::make_unique<shaderc_include_result>();
78 result->source_name =
"";
79 result->source_name_length = 0;
81 constexpr
const char* kFileNotFoundMessage =
"Included file not found.";
82 result->content = kFileNotFoundMessage;
83 result->content_length = ::strlen(kFileNotFoundMessage);
84 result->user_data =
nullptr;
86 if (!working_directory_ || !working_directory_->is_valid()) {
87 return result.release();
90 if (requested_source ==
nullptr) {
91 return result.release();
94 auto file = FindFirstMapping(requested_source);
96 if (!file || file->GetMapping() ==
nullptr) {
97 return result.release();
101 std::make_unique<IncluderData>(requested_source, std::move(file));
103 result->source_name = includer_data->file_name.c_str();
104 result->source_name_length = includer_data->file_name.length();
105 result->content =
reinterpret_cast<decltype(result-
>content)>(
106 includer_data->mapping->GetMapping());
107 result->content_length = includer_data->mapping->GetSize();
108 result->user_data = includer_data.release();
110 return result.release();
Includer(std::shared_ptr< fml::UniqueFD > working_directory, std::vector< IncludeDir > include_dirs, std::function< void(std::string)> on_file_included)
void ReleaseInclude(shaderc_include_result *data) override
shaderc_include_result * GetInclude(const char *requested_source, shaderc_include_type type, const char *requesting_source, size_t include_depth) override
std::shared_ptr< fml::UniqueFD > dir
std::shared_ptr< const fml::Mapping > data