summaryrefslogtreecommitdiff
path: root/chromium/fuchsia/base/agent_manager.h
blob: 17fd60c254c9053f0b496d393daa95053c2ae068 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 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 FUCHSIA_BASE_AGENT_MANAGER_H_
#define FUCHSIA_BASE_AGENT_MANAGER_H_

#include <fuchsia/modular/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/sys/cpp/component_context.h>

#include "base/containers/flat_map.h"
#include "base/macros.h"
#include "base/strings/string_piece.h"

namespace cr_fuchsia {

// Connects to the ComponentContext service from the supplied ServiceDirectory,
// and uses it to connect-to and manage one or more Agents used by the caller.
class AgentManager {
 public:
  explicit AgentManager(const sys::ServiceDirectory* incoming);
  ~AgentManager();

  // Connects to |agent| so satisfying the specified |request|.
  // |agent| will be kept alive until this AgentManager is destroyed.
  template <typename Interface>
  void ConnectToAgentService(base::StringPiece agent,
                             fidl::InterfaceRequest<Interface> request) {
    ConnectToAgentServiceUnsafe(agent, Interface::Name_, request.TakeChannel());
  }

  template <typename Interface>
  fidl::InterfacePtr<Interface> ConnectToAgentService(base::StringPiece agent) {
    fidl::InterfacePtr<Interface> ptr;
    ConnectToAgentService(agent, ptr.NewRequest());
    return ptr;
  }

 private:
  // Holds a pointer to Agent-provided services, and keeps the Agent alive.
  struct AgentConnection {
    AgentConnection();
    AgentConnection(AgentConnection&& other);
    ~AgentConnection();

    AgentConnection& operator=(AgentConnection&& other);

    fuchsia::sys::ServiceProviderPtr services;
    fuchsia::modular::AgentControllerPtr controller;
  };

  void ConnectToAgentServiceUnsafe(base::StringPiece agent,
                                   base::StringPiece interface,
                                   zx::channel request);

  const fuchsia::modular::ComponentContextPtr component_context_;

  // Cache of resources for Agents which we're actively using. All |agents_|
  // are kept alive until the AgentManager is torn down, for now.
  base::flat_map<std::string, AgentConnection> agents_;

  DISALLOW_COPY_AND_ASSIGN(AgentManager);
};

}  // namespace cr_fuchsia

#endif  // FUCHSIA_BASE_AGENT_MANAGER_H_