Home | History | Annotate | Download | only in device
      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_
    100