xref: /aosp_15_r20/external/cronet/base/fuchsia/startup_context.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/startup_context.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <tuple>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <fuchsia/io/cpp/fidl.h>
11*6777b538SAndroid Build Coastguard Worker #include <lib/sys/cpp/outgoing_directory.h>
12*6777b538SAndroid Build Coastguard Worker #include <lib/sys/cpp/service_directory.h>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/file_utils.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_logging.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace base {
21*6777b538SAndroid Build Coastguard Worker 
StartupContext(fuchsia::component::runner::ComponentStartInfo start_info)22*6777b538SAndroid Build Coastguard Worker StartupContext::StartupContext(
23*6777b538SAndroid Build Coastguard Worker     fuchsia::component::runner::ComponentStartInfo start_info) {
24*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<sys::ServiceDirectory> incoming_services;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker   // Component manager generates |flat_namespace|, so things are horribly broken
27*6777b538SAndroid Build Coastguard Worker   // if |flat_namespace| is malformed.
28*6777b538SAndroid Build Coastguard Worker   CHECK(start_info.has_ns());
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker   // Find the /svc directory and wrap it into a sys::ServiceDirectory.
31*6777b538SAndroid Build Coastguard Worker   auto& namespace_entries = *start_info.mutable_ns();
32*6777b538SAndroid Build Coastguard Worker   for (auto& entry : namespace_entries) {
33*6777b538SAndroid Build Coastguard Worker     CHECK(entry.has_path() && entry.has_directory());
34*6777b538SAndroid Build Coastguard Worker     if (entry.path() == kServiceDirectoryPath) {
35*6777b538SAndroid Build Coastguard Worker       incoming_services = std::make_unique<sys::ServiceDirectory>(
36*6777b538SAndroid Build Coastguard Worker           std::move(*entry.mutable_directory()));
37*6777b538SAndroid Build Coastguard Worker       break;
38*6777b538SAndroid Build Coastguard Worker     }
39*6777b538SAndroid Build Coastguard Worker   }
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   // If there is no service-directory in the namespace then `incoming_services`
42*6777b538SAndroid Build Coastguard Worker   // may be null, in which case `svc()` will be null.
43*6777b538SAndroid Build Coastguard Worker   component_context_ =
44*6777b538SAndroid Build Coastguard Worker       std::make_unique<sys::ComponentContext>(std::move(incoming_services));
45*6777b538SAndroid Build Coastguard Worker   if (start_info.has_outgoing_dir()) {
46*6777b538SAndroid Build Coastguard Worker     outgoing_directory_request_ = std::move(*start_info.mutable_outgoing_dir());
47*6777b538SAndroid Build Coastguard Worker   }
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker StartupContext::~StartupContext() = default;
51*6777b538SAndroid Build Coastguard Worker 
ServeOutgoingDirectory()52*6777b538SAndroid Build Coastguard Worker void StartupContext::ServeOutgoingDirectory() {
53*6777b538SAndroid Build Coastguard Worker   DCHECK(outgoing_directory_request_);
54*6777b538SAndroid Build Coastguard Worker   component_context_->outgoing()->Serve(std::move(outgoing_directory_request_));
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker }  // namespace base
58