| // Copyright 2019 The Chromium 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 CHROMECAST_EXTERNAL_MOJO_EXTERNAL_SERVICE_SUPPORT_CHROMIUM_SERVICE_H_ |
| #define CHROMECAST_EXTERNAL_MOJO_EXTERNAL_SERVICE_SUPPORT_CHROMIUM_SERVICE_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/macros.h" |
| #include "chromecast/external_mojo/public/mojom/connector.mojom.h" |
| #include "mojo/public/cpp/bindings/binding.h" |
| #include "mojo/public/cpp/system/message_pipe.h" |
| #include "services/service_manager/public/cpp/identity.h" |
| #include "services/service_manager/public/cpp/service.h" |
| #include "services/service_manager/public/mojom/service.mojom.h" |
| |
| namespace service_manager { |
| class Connector; |
| class Service; |
| } // namespace service_manager |
| |
| namespace chromecast { |
| namespace external_service_support { |
| class ExternalConnector; |
| |
| // Provides a wrapper for a Chromium ServiceManager-based service to run in |
| // an external (non-Chromium) process. |
| class ChromiumServiceWrapper : public external_mojo::mojom::ExternalService { |
| public: |
| ChromiumServiceWrapper( |
| ExternalConnector* connector, |
| service_manager::mojom::ServicePtr service_ptr, |
| std::unique_ptr<service_manager::Service> chromium_service, |
| const std::string& service_name); |
| ~ChromiumServiceWrapper() override; |
| |
| private: |
| // external_mojo::mojom::ExternalService implementation: |
| void OnBindInterface(const std::string& interface_name, |
| mojo::ScopedMessagePipeHandle interface_pipe) override; |
| |
| const service_manager::mojom::ServicePtr service_ptr_; |
| const std::unique_ptr<service_manager::Service> chromium_service_; |
| |
| mojo::Binding<external_mojo::mojom::ExternalService> service_binding_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ChromiumServiceWrapper); |
| }; |
| |
| // Creates a ServiceRequest (analogous to one created by Chromium |
| // ServiceManager) for use in creating Chromium Mojo services in an external |
| // process. |service_ptr| will be filled in with a pointer for the service, |
| // which should be bassed to ChromiumServiceWrapper's constructor. |identity| is |
| // the desired identity of the service to be created (ie, what will be returned |
| // from ServiceBinding::identity() once the service binding is created). If you |
| // don't care about the identity, just use the default. |
| service_manager::mojom::ServiceRequest CreateChromiumServiceRequest( |
| ExternalConnector* connector, |
| service_manager::mojom::ServicePtr* service_ptr, |
| service_manager::Identity identity = service_manager::Identity()); |
| |
| // Creates a service_manager::Connector instance from an external service |
| // ExternalConnector. |
| std::unique_ptr<service_manager::Connector> CreateChromiumConnector( |
| ExternalConnector* connector); |
| |
| // Convenience helper for services that only take a ServiceRequest param in the |
| // constructor. The |name| is the desired service name. |
| template <typename T> |
| std::unique_ptr<ChromiumServiceWrapper> CreateChromiumService( |
| ExternalConnector* connector, |
| const std::string& name) { |
| service_manager::mojom::ServicePtr service_ptr; |
| auto request = CreateChromiumServiceRequest(connector, &service_ptr); |
| return std::make_unique<ChromiumServiceWrapper>( |
| connector, std::move(service_ptr), |
| std::make_unique<T>(std::move(request)), name); |
| } |
| |
| } // namespace external_service_support |
| } // namespace chromecast |
| |
| #endif // CHROMECAST_EXTERNAL_MOJO_EXTERNAL_SERVICE_SUPPORT_CHROMIUM_SERVICE_H_ |