| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "assets/native_assets.h" | |
| #include "flutter/fml/build_config.h" | |
| #include "rapidjson/document.h" | |
| namespace flutter { | |
| #if defined(FML_ARCH_CPU_ARMEL) | |
| #define kTargetArchitectureName "arm" | |
| #elif defined(FML_ARCH_CPU_ARM64) | |
| #define kTargetArchitectureName "arm64" | |
| #elif defined(FML_ARCH_CPU_X86) | |
| #define kTargetArchitectureName "ia32" | |
| #elif defined(FML_ARCH_CPU_X86_64) | |
| #define kTargetArchitectureName "x64" | |
| #else | |
| #error Target architecture detection failed. | |
| #endif | |
| #if defined(FML_OS_ANDROID) | |
| #define kTargetOperatingSystemName "android" | |
| #elif defined(OS_FUCHSIA) | |
| #define kTargetOperatingSystemName "fuchsia" | |
| #elif defined(FML_OS_LINUX) | |
| #define kTargetOperatingSystemName "linux" | |
| #elif defined(FML_OS_IOS) || defined(FML_OS_IOS_SIMULATOR) | |
| #define kTargetOperatingSystemName "ios" | |
| #elif defined(FML_OS_MACOSX) | |
| #define kTargetOperatingSystemName "macos" | |
| #elif defined(FML_OS_WIN) | |
| #define kTargetOperatingSystemName "windows" | |
| #else | |
| #error Target operating system detection failed. | |
| #endif | |
| #define kTarget kTargetOperatingSystemName "_" kTargetArchitectureName | |
| void NativeAssetsManager::RegisterNativeAssets(const uint8_t* manifest, | |
| size_t manifest_size) { | |
| parsed_mapping_.clear(); | |
| rapidjson::Document document; | |
| static_assert(sizeof(decltype(document)::Ch) == sizeof(uint8_t), ""); | |
| document.Parse(reinterpret_cast<const decltype(document)::Ch*>(manifest), | |
| manifest_size); | |
| if (document.HasParseError()) { | |
| FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed."; | |
| return; | |
| } | |
| if (!document.IsObject()) { | |
| FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed."; | |
| return; | |
| } | |
| auto native_assets = document.FindMember("native-assets"); | |
| if (native_assets == document.MemberEnd() || | |
| !native_assets->value.IsObject()) { | |
| FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed."; | |
| return; | |
| } | |
| auto mapping = native_assets->value.FindMember(kTarget); | |
| if (mapping == native_assets->value.MemberEnd() || | |
| !mapping->value.IsObject()) { | |
| FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed."; | |
| return; | |
| } | |
| for (auto entry = mapping->value.MemberBegin(); | |
| entry != mapping->value.MemberEnd(); entry++) { | |
| std::vector<std::string> parsed_path; | |
| entry->name.GetString(); | |
| auto& value = entry->value; | |
| if (!value.IsArray()) { | |
| FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed."; | |
| continue; | |
| } | |
| for (const auto& element : value.GetArray()) { | |
| if (!element.IsString()) { | |
| FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed."; | |
| continue; | |
| } | |
| parsed_path.push_back(element.GetString()); | |
| } | |
| parsed_mapping_[entry->name.GetString()] = std::move(parsed_path); | |
| } | |
| } | |
| void NativeAssetsManager::RegisterNativeAssets( | |
| const std::shared_ptr<AssetManager>& asset_manager) { | |
| std::unique_ptr<fml::Mapping> manifest_mapping = | |
| asset_manager->GetAsMapping("NativeAssetsManifest.json"); | |
| if (manifest_mapping == nullptr) { | |
| FML_DLOG(WARNING) | |
| << "Could not find NativeAssetsManifest.json in the asset store."; | |
| return; | |
| } | |
| RegisterNativeAssets(manifest_mapping->GetMapping(), | |
| manifest_mapping->GetSize()); | |
| } | |
| std::vector<std::string> NativeAssetsManager::LookupNativeAsset( | |
| std::string_view asset_id) { | |
| // Cpp17 does not support unordered_map lookup with std::string_view on a | |
| // std::string key. | |
| std::string as_string = std::string(asset_id); | |
| if (parsed_mapping_.find(as_string) == parsed_mapping_.end()) { | |
| return std::vector<std::string>(); | |
| } | |
| return parsed_mapping_[as_string]; | |
| } | |
| std::string NativeAssetsManager::AvailableNativeAssets() { | |
| if (parsed_mapping_.empty()) { | |
| return std::string("No available native assets."); | |
| } | |
| std::string result; | |
| result.append("Available native assets: "); | |
| bool first = true; | |
| for (const auto& n : parsed_mapping_) { | |
| if (first) { | |
| first = false; | |
| } else { | |
| result.append(", "); | |
| } | |
| result.append(n.first); | |
| } | |
| result.append("."); | |
| return result; | |
| } | |
| } // namespace flutter |