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 18namespace base { 19class SingleThreadTaskRunner; 20} // namespace base 21 22namespace forwarder2 { 23 24class 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). 29class 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 ListenersMap listeners_; 59 60 //WeakPtrFactory's documentation says: 61 // Member variables should appear before the WeakPtrFactory, to ensure 62 // that any WeakPtrs to Controller are invalidated before its members 63 // variable's destructors are executed, rendering them invalid. 64 base::WeakPtrFactory<DeviceController> weak_ptr_factory_; 65 66 DISALLOW_COPY_AND_ASSIGN(DeviceController); 67}; 68 69} // namespace forwarder 70 71#endif // TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_ 72