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 const scoped_ptr<Socket> host_socket_; 53 // Used to notify the controller to exit. 54 const int exit_notifier_fd_; 55 // Lets ensure DeviceListener instances are deleted on the thread they were 56 // created on. 57 const scoped_refptr<base::SingleThreadTaskRunner> construction_task_runner_; 58 base::WeakPtrFactory<DeviceController> weak_ptr_factory_; 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