| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromeos/ash/components/mojo_service_manager/utility_process_bridge.h" |
| |
| #include "base/no_destructor.h" |
| #include "chromeos/ash/components/mojo_service_manager/connection.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver_set.h" |
| |
| namespace ash::mojo_service_manager { |
| |
| namespace mojom = chromeos::mojo_service_manager::mojom; |
| |
| namespace { |
| |
| class UtilityProcessBridge |
| : chromeos::mojo_service_manager::mojom::ServiceManager { |
| public: |
| UtilityProcessBridge(const UtilityProcessBridge&) = delete; |
| UtilityProcessBridge& operator=(const UtilityProcessBridge&) = delete; |
| |
| void Register(const std::string& service_name, |
| mojo::PendingRemote< |
| chromeos::mojo_service_manager::mojom::ServiceProvider> |
| service_provider) override { |
| GetServiceManagerProxy()->Register(service_name, |
| std::move(service_provider)); |
| } |
| |
| void Request(const std::string& service_name, |
| std::optional<base::TimeDelta> timeout, |
| mojo::ScopedMessagePipeHandle receiver) override { |
| GetServiceManagerProxy()->Request(service_name, std::move(timeout), |
| std::move(receiver)); |
| } |
| |
| using QueryCallback = |
| chromeos::mojo_service_manager::mojom::ServiceManager::QueryCallback; |
| |
| void Query(const std::string& service_name, QueryCallback callback) override { |
| GetServiceManagerProxy()->Query(service_name, std::move(callback)); |
| } |
| |
| void AddServiceObserver( |
| mojo::PendingRemote< |
| chromeos::mojo_service_manager::mojom::ServiceObserver> observer) |
| override { |
| GetServiceManagerProxy()->AddServiceObserver(std::move(observer)); |
| } |
| |
| void BindReceiver(mojo::PendingReceiver< |
| chromeos::mojo_service_manager::mojom::ServiceManager> |
| pending_receiver) { |
| receivers_.Add(this, std::move(pending_receiver)); |
| } |
| |
| static UtilityProcessBridge* GetInstance() { |
| static base::NoDestructor<UtilityProcessBridge> instance; |
| return instance.get(); |
| } |
| |
| private: |
| friend base::NoDestructor<UtilityProcessBridge>; |
| |
| UtilityProcessBridge() = default; |
| ~UtilityProcessBridge() override = default; |
| |
| mojo::ReceiverSet<chromeos::mojo_service_manager::mojom::ServiceManager> |
| receivers_; |
| }; |
| |
| } // namespace |
| |
| void EstablishUtilityProcessBridge( |
| mojo::PendingReceiver<mojom::ServiceManager> pending_receiver) { |
| UtilityProcessBridge::GetInstance()->BindReceiver( |
| std::move(pending_receiver)); |
| } |
| |
| } // namespace ash::mojo_service_manager |