1 /*
2  *  Copyright 2005 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef RTC_BASE_SOCKET_STREAM_H_
12 #define RTC_BASE_SOCKET_STREAM_H_
13 
14 #include <stddef.h>
15 
16 #include "rtc_base/async_socket.h"
17 #include "rtc_base/constructor_magic.h"
18 #include "rtc_base/stream.h"
19 #include "rtc_base/third_party/sigslot/sigslot.h"
20 
21 namespace rtc {
22 
23 ///////////////////////////////////////////////////////////////////////////////
24 
25 class SocketStream : public StreamInterface, public sigslot::has_slots<> {
26  public:
27   explicit SocketStream(AsyncSocket* socket);
28   ~SocketStream() override;
29 
30   void Attach(AsyncSocket* socket);
31   AsyncSocket* Detach();
32 
GetSocket()33   AsyncSocket* GetSocket() { return socket_; }
34 
35   StreamState GetState() const override;
36 
37   StreamResult Read(void* buffer,
38                     size_t buffer_len,
39                     size_t* read,
40                     int* error) override;
41 
42   StreamResult Write(const void* data,
43                      size_t data_len,
44                      size_t* written,
45                      int* error) override;
46 
47   void Close() override;
48 
49  private:
50   void OnConnectEvent(AsyncSocket* socket);
51   void OnReadEvent(AsyncSocket* socket);
52   void OnWriteEvent(AsyncSocket* socket);
53   void OnCloseEvent(AsyncSocket* socket, int err);
54 
55   AsyncSocket* socket_;
56 
57   RTC_DISALLOW_COPY_AND_ASSIGN(SocketStream);
58 };
59 
60 ///////////////////////////////////////////////////////////////////////////////
61 
62 }  // namespace rtc
63 
64 #endif  // RTC_BASE_SOCKET_STREAM_H_
65