blob: e6b84491abd633282ffd0aef3edd8a0e78984401 [file]
// Copyright 2026 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_RESOURCE_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_RESOURCE_H_
#include <fidl/fuchsia.driver.framework/cpp/fidl.h>
#include <lib/fidl/cpp/wire/server.h>
#include <lib/fit/function.h>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "src/devices/bin/driver_manager/node_types.h"
namespace driver_manager {
class Node;
// Represents a resource provided by a Node.
class Resource : public fidl::WireServer<fuchsia_driver_framework::ResourceController>,
public std::enable_shared_from_this<Resource> {
public:
Resource(ResourceId id, std::weak_ptr<Node> owner, std::string name,
std::vector<fuchsia_driver_framework::NodeProperty2> properties,
std::vector<NodeOffer> node_offers,
std::optional<fuchsia_driver_framework::BusInfo> bus_info,
async_dispatcher_t* dispatcher);
~Resource() override = default;
void set_is_self_resource(bool is_self_resource) { is_self_resource_ = is_self_resource; }
void Bind(fidl::ServerEnd<fuchsia_driver_framework::ResourceController> server_end);
// Removes this resource by notifying all dependent nodes that this resource
// is gone and unregistering this resource from its owning node if it's a provided node.
void Remove();
void AddDependent(std::weak_ptr<Node> dependent) { dependents_.push_back(std::move(dependent)); }
void RemoveDependent(const std::shared_ptr<Node>& dependent);
std::weak_ptr<Node> owner() const { return owner_; }
const std::optional<fuchsia_driver_framework::BusInfo>& bus_info() const { return bus_info_; }
const std::vector<NodeOffer>& offers() const { return offers_; }
const std::vector<fuchsia_driver_framework::NodeProperty2>& properties() const {
return properties_;
}
ResourceId id() const { return id_; }
bool is_self_resource() const { return is_self_resource_; }
const std::vector<std::weak_ptr<Node>>& dependents() const { return dependents_; }
// Exposed for testing.
const std::string& name() const { return name_; }
private:
// fidl::WireServer<fuchsia_driver_framework::ResourceController>
void Remove(RemoveCompleter::Sync& completer) override;
void handle_unknown_method(
fidl::UnknownMethodMetadata<fuchsia_driver_framework::ResourceController> metadata,
fidl::UnknownMethodCompleter::Sync& completer) override;
ResourceId id_;
std::string name_;
std::vector<fuchsia_driver_framework::NodeProperty2> properties_;
std::vector<NodeOffer> offers_;
std::optional<fuchsia_driver_framework::BusInfo> bus_info_;
// The Nodes that depend on this resource.
std::vector<std::weak_ptr<Node>> dependents_;
// The Node that owns and provides this resource.
std::weak_ptr<Node> owner_;
async_dispatcher_t* dispatcher_;
std::optional<fidl::ServerBinding<fuchsia_driver_framework::ResourceController>> binding_;
bool is_self_resource_ = false;
};
} // namespace driver_manager
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_RESOURCE_H_