Home | History | Annotate | Download | only in forwarder2
      1 // Copyright (c) 2012 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 TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
      6 #define TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/containers/hash_tables.h"
     12 #include "base/memory/linked_ptr.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/memory/weak_ptr.h"
     16 #include "tools/android/forwarder2/socket.h"
     17 
     18 namespace base {
     19 class SingleThreadTaskRunner;
     20 }  // namespace base
     21 
     22 namespace forwarder2 {
     23 
     24 class DeviceListener;
     25 
     26 // There is a single DeviceController per device_forwarder process, and it is in
     27 // charge of managing all active redirections on the device side (one
     28 // DeviceListener each).
     29 class DeviceController {
     30  public:
     31   static scoped_ptr<DeviceController> Create(const std::string& adb_unix_socket,
     32                                              int exit_notifier_fd);
     33   ~DeviceController();
     34 
     35   void Start();
     36 
     37  private:
     38   typedef base::hash_map<
     39       int /* port */, linked_ptr<DeviceListener> > ListenersMap;
     40 
     41   DeviceController(scoped_ptr<Socket> host_socket, int exit_notifier_fd);
     42 
     43   void AcceptHostCommandSoon();
     44   void AcceptHostCommandInternal();
     45 
     46   // Note that this can end up being called after the DeviceController is
     47   // destroyed which is why a weak pointer is used.
     48   static void DeleteListenerOnError(
     49       const base::WeakPtr<DeviceController>& device_controller_ptr,
     50       scoped_ptr<DeviceListener> device_listener);
     51 
     52   base::WeakPtrFactory<DeviceController> weak_ptr_factory_;
     53   const scoped_ptr<Socket> host_socket_;
     54   // Used to notify the controller to exit.
     55   const int exit_notifier_fd_;
     56   // Lets ensure DeviceListener instances are deleted on the thread they were
     57   // created on.
     58   const scoped_refptr<base::SingleThreadTaskRunner> construction_task_runner_;
     59   ListenersMap listeners_;
     60 
     61   DISALLOW_COPY_AND_ASSIGN(DeviceController);
     62 };
     63 
     64 }  // namespace forwarder
     65 
     66 #endif  // TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
     67