#ifndef SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_H_
#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_H_
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/service_manager/public/cpp/export.h"
#include "services/service_manager/public/mojom/interface_provider.mojom.h"
namespace service_manager {
class SERVICE_MANAGER_PUBLIC_CPP_EXPORT InterfaceProvider {
public:
class TestApi {
public:
explicit TestApi(InterfaceProvider* provider) : provider_(provider) {}
TestApi(const TestApi&) = delete;
TestApi& operator=(const TestApi&) = delete;
~TestApi() {}
void SetBinderForName(
const std::string& name,
base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)> binder) {
provider_->SetBinderForName(name, std::move(binder));
}
bool HasBinderForName(const std::string& name) {
return provider_->HasBinderForName(name);
}
void ClearBinderForName(const std::string& name) {
provider_->ClearBinderForName(name);
}
void ClearBinders() {
provider_->ClearBinders();
}
private:
raw_ptr<InterfaceProvider, DanglingUntriaged> provider_;
};
explicit InterfaceProvider(
scoped_refptr<base::SequencedTaskRunner> task_runner);
InterfaceProvider(
mojo::PendingRemote<mojom::InterfaceProvider> interface_provider,
scoped_refptr<base::SequencedTaskRunner> task_runner);
InterfaceProvider(const InterfaceProvider&) = delete;
InterfaceProvider& operator=(const InterfaceProvider&) = delete;
~InterfaceProvider();
void Close();
void Bind(mojo::PendingRemote<mojom::InterfaceProvider> interface_provider);
void SetConnectionLostClosure(base::OnceClosure connection_lost_closure);
base::WeakPtr<InterfaceProvider> GetWeakPtr();
template <typename Interface>
void GetInterface(mojo::PendingReceiver<Interface> receiver) {
GetInterfaceByName(Interface::Name_, receiver.PassPipe());
}
void GetInterfaceByName(const std::string& name,
mojo::ScopedMessagePipeHandle request_handle);
private:
void SetBinderForName(
const std::string& name,
base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)> binder) {
binders_[name] = std::move(binder);
}
bool HasBinderForName(const std::string& name) const;
void ClearBinderForName(const std::string& name);
void ClearBinders();
using BinderMap =
std::map<std::string,
base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)>>;
BinderMap binders_;
mojo::Remote<mojom::InterfaceProvider> interface_provider_;
mojo::PendingReceiver<mojom::InterfaceProvider> pending_receiver_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
base::WeakPtrFactory<InterfaceProvider> weak_factory_{this};
};
}
#endif