• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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