Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / devtools / device / port_forwarding_controller.h
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
15 class PrefService;
16 class Profile;
17
18 class 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_