1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_PORT_FORWARDING_CONTROLLER_H_
6#define CHROME_BROWSER_DEVTOOLS_DEVICE_PORT_FORWARDING_CONTROLLER_H_
7
8#include <map>
9
10#include "base/prefs/pref_change_registrar.h"
11#include "chrome/browser/devtools/device/devtools_android_bridge.h"
12#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
13#include "components/keyed_service/core/keyed_service.h"
14
15class PrefService;
16class Profile;
17
18class PortForwardingController
19    : private KeyedService,
20      private DevToolsAndroidBridge::DeviceListListener {
21 public:
22  explicit PortForwardingController(Profile* profile);
23
24  virtual ~PortForwardingController();
25
26  // KeyedService implementation.
27  virtual void Shutdown() OVERRIDE;
28
29  class Factory : public BrowserContextKeyedServiceFactory {
30   public:
31    // Returns singleton instance of Factory.
32    static Factory* GetInstance();
33
34    // Returns PortForwardingController associated with |profile|.
35    static PortForwardingController* GetForProfile(Profile* profile);
36
37   private:
38    friend struct DefaultSingletonTraits<Factory>;
39
40    Factory();
41    virtual ~Factory();
42
43    // BrowserContextKeyedServiceFactory overrides:
44    virtual KeyedService* BuildServiceInstanceFor(
45        content::BrowserContext* context) const OVERRIDE;
46    DISALLOW_COPY_AND_ASSIGN(Factory);
47  };
48
49  typedef int PortStatus;
50  typedef std::map<int, PortStatus> PortStatusMap;
51  typedef std::map<std::string, PortStatusMap> DevicesStatus;
52
53  class Listener {
54   public:
55    typedef PortForwardingController::PortStatusMap PortStatusMap;
56    typedef PortForwardingController::DevicesStatus DevicesStatus;
57
58    virtual void PortStatusChanged(const DevicesStatus&) = 0;
59   protected:
60    virtual ~Listener() {}
61  };
62
63  void AddListener(Listener* listener);
64  void RemoveListener(Listener* listener);
65
66 private:
67  class Connection;
68  typedef std::map<std::string, Connection*> Registry;
69
70  // DevToolsAndroidBridge::Listener implementation.
71  virtual void DeviceListChanged(
72      const DevToolsAndroidBridge::RemoteDevices& devices) OVERRIDE;
73
74  void OnPrefsChange();
75
76  void StartListening();
77  void StopListening();
78
79  void UpdateConnections();
80  void ShutdownConnections();
81
82  void NotifyListeners(const DevicesStatus& status) const;
83
84  Profile* profile_;
85  PrefService* pref_service_;
86  PrefChangeRegistrar pref_change_registrar_;
87  Registry registry_;
88
89  typedef std::vector<Listener*> Listeners;
90  Listeners listeners_;
91  bool listening_;
92
93  typedef std::map<int, std::string> ForwardingMap;
94  ForwardingMap forwarding_map_;
95
96  DISALLOW_COPY_AND_ASSIGN(PortForwardingController);
97};
98
99#endif  // CHROME_BROWSER_DEVTOOLS_DEVICE_PORT_FORWARDING_CONTROLLER_H_
100