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.
5 #ifndef TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
6 #define TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
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"
19 class SingleThreadTaskRunner
;
22 namespace forwarder2
{
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
{
31 static scoped_ptr
<DeviceController
> Create(const std::string
& adb_unix_socket
,
32 int exit_notifier_fd
);
38 typedef base::hash_map
<
39 int /* port */, linked_ptr
<DeviceListener
> > ListenersMap
;
41 DeviceController(scoped_ptr
<Socket
> host_socket
, int exit_notifier_fd
);
43 void AcceptHostCommandSoon();
44 void AcceptHostCommandInternal();
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
);
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
57 const scoped_refptr
<base::SingleThreadTaskRunner
> construction_task_runner_
;
58 ListenersMap listeners_
;
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_
;
66 DISALLOW_COPY_AND_ASSIGN(DeviceController
);
69 } // namespace forwarder
71 #endif // TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_