| // Copyright 2020 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 SRC_DEVICES_BIN_DRIVER_MANAGER_PACKAGE_RESOLVER_H_ |
| #define SRC_DEVICES_BIN_DRIVER_MANAGER_PACKAGE_RESOLVER_H_ |
| |
| #include <fidl/fuchsia.io/cpp/wire.h> |
| #include <fidl/fuchsia.pkg/cpp/wire.h> |
| #include <lib/zx/status.h> |
| #include <lib/zx/vmo.h> |
| #include <zircon/types.h> |
| |
| #include "src/devices/bin/driver_manager/driver.h" |
| #include "src/lib/pkg_url/fuchsia_pkg_url.h" |
| |
| namespace internal { |
| |
| class PackageResolverInterface { |
| public: |
| virtual ~PackageResolverInterface() = default; |
| |
| virtual zx::status<std::unique_ptr<Driver>> FetchDriver(const std::string& package_url) = 0; |
| }; |
| |
| class PackageResolver : public PackageResolverInterface { |
| public: |
| // Takes in an unowned connection to boot arguments. boot_args must outlive PackageResolver. |
| explicit PackageResolver(fidl::WireSyncClient<fuchsia_boot::Arguments>* boot_args) |
| : boot_args_(boot_args) {} |
| |
| // PackageResolverInterface implementation. |
| // |
| // This takes a URL which should be a path to a driver shared library. This |
| // will resolve the package, load the driver shared library, |
| // and return the resulting Driver object. |
| // |
| // E.g of a URL: fuchsia-pkg://fuchsia.com/my-package#driver/my-driver.so |
| zx::status<std::unique_ptr<Driver>> FetchDriver(const std::string& package_url) override; |
| |
| private: |
| // Connects to the package resolver service if not already connected. |
| zx_status_t ConnectToResolverService(); |
| |
| // Creates the directory client for |package_url|. |
| zx::status<fidl::WireSyncClient<fuchsia_io::Directory>> Resolve( |
| const component::FuchsiaPkgUrl& package_url); |
| |
| zx::status<zx::vmo> LoadDriver(const fidl::WireSyncClient<fuchsia_io::Directory>& package_dir, |
| const component::FuchsiaPkgUrl& package_url); |
| |
| fidl::WireSyncClient<fuchsia_boot::Arguments>* boot_args_; |
| fidl::WireSyncClient<fuchsia_pkg::PackageResolver> resolver_client_; |
| }; |
| |
| } // namespace internal |
| |
| #endif // SRC_DEVICES_BIN_DRIVER_MANAGER_PACKAGE_RESOLVER_H_ |