| // Copyright 2018 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. |
| |
| #include "src/sys/appmgr/scheme_map.h" |
| |
| #include <string> |
| #include <vector> |
| |
| #include "rapidjson/document.h" |
| #include "src/lib/files/file.h" |
| #include "src/lib/fxl/strings/concatenate.h" |
| #include "src/lib/fxl/strings/join_strings.h" |
| #include "src/lib/fxl/strings/string_printf.h" |
| |
| namespace component { |
| |
| const char SchemeMap::kConfigDirPath[] = "scheme_map/"; |
| |
| bool SchemeMap::ParseFromDirectory(const std::string& path) { |
| internal_map_.clear(); |
| auto cb = [this](rapidjson::Document document) { ParseDocument(std::move(document)); }; |
| json_parser_.ParseFromDirectory(path, cb); |
| return !json_parser_.HasError(); |
| } |
| |
| bool SchemeMap::ParseFromDirectoryAt(fbl::unique_fd& dir, const std::string& path) { |
| internal_map_.clear(); |
| auto cb = [this](rapidjson::Document document) { ParseDocument(std::move(document)); }; |
| json_parser_.ParseFromDirectoryAt(dir.get(), path, cb); |
| return !json_parser_.HasError(); |
| } |
| |
| void SchemeMap::ParseDocument(rapidjson::Document document) { |
| if (!document.IsObject()) { |
| json_parser_.ReportError("Document is not a valid object."); |
| return; |
| } |
| auto launchers = document.FindMember("launchers"); |
| if (launchers == document.MemberEnd()) { |
| json_parser_.ReportError("Missing 'launchers'."); |
| return; |
| } |
| if (!launchers->value.IsObject()) { |
| json_parser_.ReportError("'launchers' is not a valid object."); |
| return; |
| } |
| |
| for (auto it = launchers->value.MemberBegin(); it != launchers->value.MemberEnd(); ++it) { |
| const std::string& launcher = it->name.GetString(); |
| if (!it->value.IsArray()) { |
| json_parser_.ReportError( |
| fxl::StringPrintf("Schemes for '%s' are not a list.", launcher.c_str())); |
| return; |
| } |
| for (const auto& scheme : it->value.GetArray()) { |
| if (!scheme.IsString()) { |
| json_parser_.ReportError( |
| fxl::StringPrintf("Scheme for '%s' is not a string.", launcher.c_str())); |
| } else { |
| if (internal_map_.count(scheme.GetString()) > 0) { |
| json_parser_.ReportError( |
| fxl::StringPrintf("Scheme '%s' is assigned to two launchers.", scheme.GetString())); |
| } |
| internal_map_[scheme.GetString()] = launcher; |
| } |
| } |
| } |
| } |
| |
| std::string SchemeMap::LookUp(const std::string& scheme) const { |
| if (internal_map_.count(scheme) == 0) { |
| return ""; |
| } |
| return internal_map_.find(scheme)->second; |
| } |
| |
| } // namespace component |