blob: afdf7ad86f54907cc18816f7034068cc67ba3d17 [file] [log] [blame] [edit]
// 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