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_FORWARDER_H_
6#define TOOLS_ANDROID_FORWARDER2_FORWARDER_H_
7
8#include <sys/select.h>
9
10#include "base/memory/scoped_ptr.h"
11#include "base/threading/thread_checker.h"
12
13namespace forwarder2 {
14
15class Socket;
16
17// Internal class that forwards traffic between |socket1| and |socket2|. Note
18// that this class is not thread-safe.
19class Forwarder {
20 public:
21  Forwarder(scoped_ptr<Socket> socket1, scoped_ptr<Socket> socket2);
22
23  ~Forwarder();
24
25  void RegisterFDs(fd_set* read_fds, fd_set* write_fds, int* max_fd);
26
27  void ProcessEvents(const fd_set& read_fds, const fd_set& write_fds);
28
29  bool IsClosed() const;
30
31  void Shutdown();
32
33 private:
34  class BufferedCopier;
35
36  base::ThreadChecker thread_checker_;
37  const scoped_ptr<Socket> socket1_;
38  const scoped_ptr<Socket> socket2_;
39  // Copies data from socket1 to socket2.
40  const scoped_ptr<BufferedCopier> buffer1_;
41  // Copies data from socket2 to socket1.
42  const scoped_ptr<BufferedCopier> buffer2_;
43};
44
45}  // namespace forwarder2
46
47#endif  // TOOLS_ANDROID_FORWARDER2_FORWARDER_H_
48