blob: 6d2400bc6b636cbef4b9b466d781cedefbc60f4c [file] [log] [blame] [edit]
// 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.
#if __Fuchsia_API_level__ >= 13
#include <lib/driver/component/cpp/driver_base.h>
namespace fdf {
__WEAK bool logger_wait_for_initial_interest = true;
DriverBase::DriverBase(std::string_view name, DriverStartArgs start_args,
fdf::UnownedSynchronizedDispatcher driver_dispatcher)
: name_(name),
start_args_(std::move(start_args)),
driver_dispatcher_(std::move(driver_dispatcher)),
dispatcher_(driver_dispatcher_->async_dispatcher()) {
Namespace incoming = [ns = std::move(start_args_.incoming())]() mutable {
ZX_ASSERT(ns.has_value());
zx::result incoming = Namespace::Create(ns.value());
ZX_ASSERT_MSG(incoming.is_ok(), "%s", incoming.status_string());
return std::move(incoming.value());
}();
logger_ = [&incoming, this]() {
zx::result logger = Logger::Create(incoming, dispatcher_, name_, FUCHSIA_LOG_INFO,
logger_wait_for_initial_interest);
ZX_ASSERT_MSG(logger.is_ok(), "%s", logger.status_string());
return std::move(logger.value());
}();
Logger::SetGlobalInstance(logger_.get());
std::optional outgoing_request = std::move(start_args_.outgoing_dir());
ZX_ASSERT(outgoing_request.has_value());
InitializeAndServe(std::move(incoming), std::move(outgoing_request.value()));
}
void DriverBase::InitializeAndServe(
Namespace incoming, fidl::ServerEnd<fuchsia_io::Directory> outgoing_directory_request) {
incoming_ = std::make_shared<Namespace>(std::move(incoming));
outgoing_ =
std::make_shared<OutgoingDirectory>(OutgoingDirectory::Create(driver_dispatcher_->get()));
ZX_ASSERT(outgoing_->Serve(std::move(outgoing_directory_request)).is_ok());
}
DriverBase::~DriverBase() { Logger::SetGlobalInstance(nullptr); }
} // namespace fdf
#endif