Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: webrtc/p2p/stunprober/stunprober_dependencies.h

Issue 1173353002: Remove all glue interfaces and use existing webrtc interfaces (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/stunprober/stunprober.cc ('k') | webrtc/p2p/stunprober/stunprober_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2015 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 WEBRTC_P2P_STUNPROBER_STUNPROBER_DEPENDENCIES_H_
12 #define WEBRTC_P2P_STUNPROBER_STUNPROBER_DEPENDENCIES_H_
13
14 #include "webrtc/base/checks.h"
15 #include "webrtc/base/helpers.h"
16 #include "webrtc/base/logging.h"
17 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/base/thread.h"
19 #include "webrtc/base/timeutils.h"
20 #include "webrtc/p2p/stunprober/stunprober.h"
21
22 // Common classes used by both the command line driver and the unit tests.
23 namespace stunprober {
24
25 class Socket : public ClientSocketInterface,
26 public ServerSocketInterface,
27 public sigslot::has_slots<> {
28 public:
29 explicit Socket(rtc::AsyncSocket* socket) : socket_(socket) {
30 socket_->SignalReadEvent.connect(this, &Socket::OnReadEvent);
31 socket_->SignalWriteEvent.connect(this, &Socket::OnWriteEvent);
32 }
33
34 int Connect(const rtc::SocketAddress& addr) override {
35 return MapResult(socket_->Connect(addr));
36 }
37
38 int SendTo(const rtc::SocketAddress& addr,
39 char* buf,
40 size_t buf_len,
41 AsyncCallback callback) override {
42 write_ = NetworkWrite(addr, buf, buf_len, callback);
43 return MapResult(socket_->SendTo(buf, buf_len, addr));
44 }
45
46 int RecvFrom(char* buf,
47 size_t buf_len,
48 rtc::SocketAddress* addr,
49 AsyncCallback callback) override {
50 read_ = NetworkRead(buf, buf_len, addr, callback);
51 return MapResult(socket_->RecvFrom(buf, buf_len, addr));
52 }
53
54 int GetLocalAddress(rtc::SocketAddress* local_address) override {
55 *local_address = socket_->GetLocalAddress();
56 return 0;
57 }
58
59 void Close() override { socket_->Close(); }
60
61 virtual ~Socket() {}
62
63 protected:
64 int MapResult(int rv) {
65 if (rv >= 0) {
66 return rv;
67 }
68 int err = socket_->GetError();
69 if (err == EWOULDBLOCK || err == EAGAIN) {
70 return IO_PENDING;
71 } else {
72 return FAILED;
73 }
74 }
75
76 void OnReadEvent(rtc::AsyncSocket* socket) {
77 DCHECK(socket_ == socket);
78 NetworkRead read = read_;
79 read_ = NetworkRead();
80 if (!read.callback.empty()) {
81 read.callback(socket_->RecvFrom(read.buf, read.buf_len, read.addr));
82 }
83 }
84
85 void OnWriteEvent(rtc::AsyncSocket* socket) {
86 DCHECK(socket_ == socket);
87 NetworkWrite write = write_;
88 write_ = NetworkWrite();
89 if (!write.callback.empty()) {
90 write.callback(socket_->SendTo(write.buf, write.buf_len, write.addr));
91 }
92 }
93
94 struct NetworkWrite {
95 NetworkWrite() : buf(nullptr), buf_len(0) {}
96 NetworkWrite(const rtc::SocketAddress& addr,
97 char* buf,
98 size_t buf_len,
99 AsyncCallback callback)
100 : buf(buf), buf_len(buf_len), addr(addr), callback(callback) {}
101 char* buf;
102 size_t buf_len;
103 rtc::SocketAddress addr;
104 AsyncCallback callback;
105 };
106
107 NetworkWrite write_;
108
109 struct NetworkRead {
110 NetworkRead() : buf(nullptr), buf_len(0) {}
111 NetworkRead(char* buf,
112 size_t buf_len,
113 rtc::SocketAddress* addr,
114 AsyncCallback callback)
115 : buf(buf), buf_len(buf_len), addr(addr), callback(callback) {}
116
117 char* buf;
118 size_t buf_len;
119 rtc::SocketAddress* addr;
120 AsyncCallback callback;
121 };
122
123 NetworkRead read_;
124
125 rtc::scoped_ptr<rtc::AsyncSocket> socket_;
126 };
127
128 class SocketFactory : public SocketFactoryInterface {
129 public:
130 ClientSocketInterface* CreateClientSocket() override {
131 return new Socket(
132 rtc::Thread::Current()->socketserver()->CreateAsyncSocket(SOCK_DGRAM));
133 }
134 ServerSocketInterface* CreateServerSocket(size_t send_buffer_size,
135 size_t recv_buffer_size) override {
136 rtc::scoped_ptr<rtc::AsyncSocket> socket(
137 rtc::Thread::Current()->socketserver()->CreateAsyncSocket(SOCK_DGRAM));
138
139 if (socket) {
140 socket->SetOption(rtc::AsyncSocket::OPT_SNDBUF,
141 static_cast<int>(send_buffer_size));
142 socket->SetOption(rtc::AsyncSocket::OPT_RCVBUF,
143 static_cast<int>(recv_buffer_size));
144 return new Socket(socket.release());
145 } else {
146 return nullptr;
147 }
148 }
149 };
150
151 class TaskRunner : public TaskRunnerInterface, public rtc::MessageHandler {
152 protected:
153 class CallbackMessageData : public rtc::MessageData {
154 public:
155 explicit CallbackMessageData(rtc::Callback0<void> callback)
156 : callback_(callback) {}
157 rtc::Callback0<void> callback_;
158 };
159
160 public:
161 void PostTask(rtc::Callback0<void> callback, uint32_t delay_ms) {
162 if (delay_ms == 0) {
163 rtc::Thread::Current()->Post(this, 0, new CallbackMessageData(callback));
164 } else {
165 rtc::Thread::Current()->PostDelayed(delay_ms, this, 0,
166 new CallbackMessageData(callback));
167 }
168 }
169
170 void OnMessage(rtc::Message* msg) {
171 rtc::scoped_ptr<CallbackMessageData> callback(
172 reinterpret_cast<CallbackMessageData*>(msg->pdata));
173 callback->callback_();
174 }
175 };
176
177 } // namespace stunprober
178 #endif // WEBRTC_P2P_STUNPROBER_STUNPROBER_DEPENDENCIES_H_
OLDNEW
« no previous file with comments | « webrtc/p2p/stunprober/stunprober.cc ('k') | webrtc/p2p/stunprober/stunprober_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698