blob: f5a26ca89dbf4a14df62f8b0d4b802ea16d796f2 [file] [log] [blame]
// Copyright 2016 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.
#include "base/bind.h"
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/c/main.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/connector.h"
#include "services/service_manager/public/cpp/interface_factory.h"
#include "services/service_manager/public/cpp/service.h"
#include "services/service_manager/public/cpp/service_context.h"
#include "services/service_manager/public/cpp/service_context_ref.h"
#include "services/service_manager/public/cpp/service_runner.h"
#include "services/service_manager/public/interfaces/connector.mojom.h"
#include "services/service_manager/tests/connect/connect_test.mojom.h"
namespace service_manager {
using GetTitleCallback = test::mojom::ConnectTestService::GetTitleCallback;
class ConnectTestClassApp
: public Service,
public InterfaceFactory<test::mojom::ConnectTestService>,
public InterfaceFactory<test::mojom::ClassInterface>,
public test::mojom::ConnectTestService,
public test::mojom::ClassInterface {
public:
ConnectTestClassApp()
: ref_factory_(base::Bind(&ConnectTestClassApp::HandleQuit,
base::Unretained(this))) {
bindings_.set_connection_error_handler(base::Bind(
&ConnectTestClassApp::HandleInterfaceClose, base::Unretained(this)));
class_interface_bindings_.set_connection_error_handler(base::Bind(
&ConnectTestClassApp::HandleInterfaceClose, base::Unretained(this)));
registry_.AddInterface<test::mojom::ConnectTestService>(this);
registry_.AddInterface<test::mojom::ClassInterface>(this);
}
~ConnectTestClassApp() override {}
private:
// service_manager::Service:
void OnBindInterface(const ServiceInfo& source_info,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override {
registry_.BindInterface(source_info.identity, interface_name,
std::move(interface_pipe));
}
// InterfaceFactory<test::mojom::ConnectTestService>:
void Create(const Identity& remote_identity,
test::mojom::ConnectTestServiceRequest request) override {
refs_.push_back(ref_factory_.CreateRef());
bindings_.AddBinding(this, std::move(request));
}
// InterfaceFactory<test::mojom::ClassInterface>:
void Create(const Identity& remote_identity,
test::mojom::ClassInterfaceRequest request) override {
refs_.push_back(ref_factory_.CreateRef());
class_interface_bindings_.AddBinding(this, std::move(request));
}
// test::mojom::ConnectTestService:
void GetTitle(const GetTitleCallback& callback) override {
callback.Run("CLASS APP");
}
void GetInstance(const GetInstanceCallback& callback) override {
callback.Run(context()->identity().instance());
}
// test::mojom::ClassInterface:
void Ping(const PingCallback& callback) override {
callback.Run("PONG");
}
void HandleQuit() { context()->QuitNow(); }
void HandleInterfaceClose() { refs_.pop_back(); }
BinderRegistry registry_;
mojo::BindingSet<test::mojom::ConnectTestService> bindings_;
mojo::BindingSet<test::mojom::ClassInterface> class_interface_bindings_;
ServiceContextRefFactory ref_factory_;
std::vector<std::unique_ptr<ServiceContextRef>> refs_;
DISALLOW_COPY_AND_ASSIGN(ConnectTestClassApp);
};
} // namespace service_manager
MojoResult ServiceMain(MojoHandle service_request_handle) {
service_manager::ServiceRunner runner(
new service_manager::ConnectTestClassApp);
return runner.Run(service_request_handle);
}