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_LISTENER_H_
6 #define TOOLS_ANDROID_FORWARDER2_DEVICE_LISTENER_H_
8 #include "base/basictypes.h"
9 #include "base/callback.h"
10 #include "base/compiler_specific.h"
11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/threading/thread.h"
15 #include "tools/android/forwarder2/pipe_notifier.h"
16 #include "tools/android/forwarder2/socket.h"
19 class SingleThreadTaskRunner;
22 namespace forwarder2 {
26 // A DeviceListener instance is used in the device_forwarder program to bind to
27 // a specific device-side |port| and wait for client connections. When a
28 // connection happens, it informs the corresponding HostController instance
29 // running on the host, through |host_socket|. Then the class expects a call to
30 // its SetAdbDataSocket() method (performed by the device controller) once the
31 // host opened a new connection to the device. When this happens, a new internal
32 // Forwarder instance is started.
33 // Note that instances of this class are owned by the device controller which
34 // creates and destroys them on the same thread. In case an internal error
35 // happens on the DeviceListener's internal thread, the DeviceListener
36 // can also self-delete by executing the user-provided callback on the thread
37 // the DeviceListener was created on.
38 // Note that the DeviceListener's destructor joins its internal thread (i.e.
39 // waits for its completion) which means that the internal thread is guaranteed
40 // not to be running anymore once the object is deleted.
41 class DeviceListener {
43 // Callback that is used for self-deletion as a way to let the device
44 // controller perform some additional cleanup work (e.g. removing the device
45 // listener instance from its internal map before deleting it).
46 typedef base::Callback<void (int /* listener port */)> DeleteCallback;
48 static scoped_ptr<DeviceListener> Create(
49 scoped_ptr<Socket> host_socket,
51 const DeleteCallback& delete_callback);
57 void SetAdbDataSocket(scoped_ptr<Socket> adb_data_socket);
59 int listener_port() const { return listener_port_; }
62 DeviceListener(scoped_ptr<PipeNotifier> pipe_notifier,
63 scoped_ptr<Socket> listener_socket,
64 scoped_ptr<Socket> host_socket,
66 const DeleteCallback& delete_callback);
68 // Pushes an AcceptClientOnInternalThread() task to the internal thread's
69 // message queue in order to wait for a new client soon.
70 void AcceptNextClientSoon();
72 void AcceptClientOnInternalThread();
74 void OnAdbDataSocketReceivedOnInternalThread(
75 scoped_ptr<Socket> adb_data_socket);
79 // Note that this can be called after the DeviceListener instance gets deleted
80 // which is why this method is static.
81 static void SelfDeleteOnDeletionTaskRunner(
82 const DeleteCallback& delete_callback,
85 // Used for the listener thread to be notified on destruction. We have one
86 // notifier per Listener thread since each Listener thread may be requested to
87 // exit for different reasons independently from each other and independent
88 // from the main program, ex. when the host requests to forward/listen the
89 // same port again. Both the |host_socket_| and |listener_socket_|
90 // must share the same receiver file descriptor from |exit_notifier_| and it
91 // is set in the constructor.
92 const scoped_ptr<PipeNotifier> exit_notifier_;
93 // The local device listener socket for accepting connections from the local
94 // port (listener_port_).
95 const scoped_ptr<Socket> listener_socket_;
96 // The listener socket for sending control commands.
97 const scoped_ptr<Socket> host_socket_;
98 scoped_ptr<Socket> device_data_socket_;
99 // This is the adb connection to transport the actual data, used for creating
100 // the forwarder. Ownership transferred to the Forwarder.
101 scoped_ptr<Socket> adb_data_socket_;
102 const int listener_port_;
103 const DeleteCallback delete_callback_;
104 // Task runner used for deletion set at construction time (i.e. the object is
105 // deleted on the same thread it is created on).
106 scoped_refptr<base::SingleThreadTaskRunner> deletion_task_runner_;
107 base::Thread thread_;
109 DISALLOW_COPY_AND_ASSIGN(DeviceListener);
112 } // namespace forwarder
114 #endif // TOOLS_ANDROID_FORWARDER2_DEVICE_LISTENER_H_