| // Copyright 2023 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_RUNNER_H_ |
| #define SRC_DEVICES_BIN_DRIVER_MANAGER_RUNNER_H_ |
| |
| #include <fidl/fuchsia.component.decl/cpp/fidl.h> |
| #include <fidl/fuchsia.component.runner/cpp/fidl.h> |
| #include <fidl/fuchsia.component/cpp/fidl.h> |
| #include <fidl/fuchsia.driver.index/cpp/fidl.h> |
| #include <fidl/fuchsia.process/cpp/wire.h> |
| #include <lib/component/outgoing/cpp/outgoing_directory.h> |
| |
| namespace driver_manager { |
| |
| // This class serves as a runner for "driver" components. It also provides an API |
| // to allow driver components to be created in the current realm. |
| class Runner : public fidl::WireServer<fuchsia_component_runner::ComponentRunner> { |
| public: |
| // The started component from the perspective of the Component Framework. |
| struct StartedComponent { |
| fuchsia_component_runner::ComponentStartInfo info; |
| fidl::ServerEnd<fuchsia_component_runner::ComponentController> controller; |
| }; |
| using StartCallback = fit::callback<void(zx::result<StartedComponent>)>; |
| |
| Runner(async_dispatcher_t* dispatcher, fidl::WireClient<fuchsia_component::Realm> realm) |
| : dispatcher_(dispatcher), realm_(std::move(realm)) {} |
| |
| zx::result<> Publish(component::OutgoingDirectory& outgoing); |
| |
| void StartDriverComponent(std::string_view moniker, std::string_view url, |
| std::string_view collection_name, |
| fidl::VectorView<fuchsia_component_decl::wire::Offer> offers, |
| StartCallback callback); |
| |
| const fidl::WireClient<fuchsia_component::Realm>& realm() const { return realm_; } |
| |
| private: |
| // fidl::WireServer<fuchsia_component_runner::ComponentRunner> |
| void Start(StartRequestView request, StartCompleter::Sync& completer) override; |
| |
| zx::result<> CallCallback(zx_koid_t koid, zx::result<StartedComponent> component); |
| |
| std::unordered_map<zx_koid_t, StartCallback> start_requests_; |
| async_dispatcher_t* dispatcher_; |
| fidl::WireClient<fuchsia_component::Realm> realm_; |
| fidl::ServerBindingGroup<fuchsia_component_runner::ComponentRunner> bindings_; |
| }; |
| } // namespace driver_manager |
| |
| #endif // SRC_DEVICES_BIN_DRIVER_MANAGER_RUNNER_H_ |