blob: e03b7875571628254cac07139e2168ea5d925291 [file] [log] [blame]
// Copyright 2017 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.
#ifndef GARNET_BIN_SYSMGR_DELEGATING_LOADER_H_
#define GARNET_BIN_SYSMGR_DELEGATING_LOADER_H_
#include <memory>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <fuchsia/pkg/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include "garnet/bin/sysmgr/config.h"
#include "garnet/bin/sysmgr/package_updating_loader.h"
#include "lib/fxl/macros.h"
namespace sysmgr {
// TODO(rosswang): Ideally this would be reusable from scopes other than
// sysmgr, but it's tricky to wire in a fallback loader. If the need arises,
// perhaps we might move this to modular/lib/fidl.
// This loader executes in the sysmgr environment, reads a config file, and
// can delegate mapped URI schemes to app loaders capable of handling them,
// falling back on the root app loader for unmapped schemes.
class DelegatingLoader : public fuchsia::sys::Loader {
public:
static std::unique_ptr<DelegatingLoader> MakeWithParentFallback(
Config::ServiceMap delegates, fuchsia::sys::Launcher* delegate_launcher,
fuchsia::sys::LoaderPtr fallback);
static std::unique_ptr<DelegatingLoader> MakeWithPackageUpdatingFallback(
Config::ServiceMap delegates, fuchsia::sys::Launcher* delegate_launcher,
std::unordered_set<std::string> update_dependency_urls,
fuchsia::sys::ServiceProviderPtr env_services);
~DelegatingLoader() override;
// |Loader|:
void LoadUrl(std::string url, LoadUrlCallback callback) override;
private:
// |fallback| xor |resolver| is set.
DelegatingLoader(Config::ServiceMap delegates,
fuchsia::sys::Launcher* delegate_launcher,
fuchsia::sys::LoaderPtr fallback,
std::unordered_set<std::string> update_dependency_urls,
fuchsia::sys::ServiceProviderPtr env_services);
struct LoaderRecord {
fuchsia::sys::LaunchInfoPtr launch_info;
fuchsia::sys::LoaderPtr loader;
fuchsia::sys::ComponentControllerPtr controller;
};
void StartDelegate(LoaderRecord* record);
// indexed by URL. This ignores differentiation by args but is on par with the
// sysmgr app implementation.
std::unordered_map<std::string, LoaderRecord> delegate_instances_;
fuchsia::sys::Launcher* delegate_launcher_;
std::unique_ptr<PackageUpdatingLoader> package_updating_fallback_;
fuchsia::sys::LoaderPtr parent_fallback_;
// indexed by scheme. LoaderRecord instances are owned by
// delegate_instances_.
std::unordered_map<std::string, LoaderRecord*> delegates_by_scheme_;
FXL_DISALLOW_COPY_AND_ASSIGN(DelegatingLoader);
};
} // namespace sysmgr
#endif // GARNET_BIN_SYSMGR_DELEGATING_LOADER_H_