blob: 02165be27ce7052384138058204aa23477a45e28 [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_CONTROLLER_H_
#define PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_CONTROLLER_H_
#include <map>
#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/fidl/cpp/string.h>
#include <lib/fxl/macros.h>
namespace modular {
class EntityProviderRunner;
// This class runs and manages the lifetime of an EntityProvider service.
//
// When the entity provider is an agent the controller keeps the agent
// connection alive.
class EntityProviderController {
public:
// Creates an controller for a given entity provider.
//
// |entity_provider| The provider which is managed by this controller.
// |agent_controller| If the entity provider is backed by an agent, this is
// the associated agent controller. If no such controller exists, nullptr is
// acceptable.
// |done| The callback which is called when the entity provider managed by
// this controller has finished running.
EntityProviderController(
fuchsia::modular::EntityProviderPtr entity_provider,
fuchsia::modular::AgentControllerPtr agent_controller,
std::function<void()> done);
~EntityProviderController();
// Called by |EntityProviderRunner| when an |fuchsia::modular::Entity| needs
// to be provided, usually when an entity reference is being resolved to an
// |fuchsia::modular::Entity|.
void ProvideEntity(const std::string& cookie,
const std::string& entity_reference,
fidl::InterfaceRequest<fuchsia::modular::Entity> request);
private:
// This class manages the lifetime of all |fuchsia::modular::Entity|s for a
// given cookie.
class EntityImpl;
// Called when there are no more outstanding |fuchsia::modular::Entity|
// interfaces we need to provide for. At this point, we can tear down the
// |EntityImpl| providing for this cookie.
void OnEmptyEntityImpls(const std::string cookie);
// cookie -> EntityImpl
std::map<std::string, std::unique_ptr<EntityImpl>> entity_impls_;
// The managed entity provider connection.
fuchsia::modular::EntityProviderPtr entity_provider_;
// The agent controller connection for entity providers which are agents.
fuchsia::modular::AgentControllerPtr agent_controller_;
// The callback which is called when the entity provider finishes running.
std::function<void()> done_;
FXL_DISALLOW_COPY_AND_ASSIGN(EntityProviderController);
};
} // namespace modular
#endif // PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_CONTROLLER_H_