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

Side by Side Diff: media/cast/net/transport/transport.cc

Issue 100823015: Cast: move net->transport (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updating transport callback Created 6 years, 12 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 | Annotate | Revision Log
« no previous file with comments | « media/cast/net/transport/transport.h ('k') | media/cast/net/transport/transport.gyp » ('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 // Copyright 2013 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 #include "media/cast/net/transport/transport.h"
6
7 #include <string>
8
9 #include "base/bind.h"
10 #include "base/logging.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop/message_loop.h"
14 #include "base/rand_util.h"
15 #include "net/base/io_buffer.h"
16 #include "net/base/rand_callback.h"
17 #include "net/base/test_completion_callback.h"
18
19 namespace media {
20 namespace cast {
21
22 const int kMaxPacketSize = 1500;
23
24 class LocalUdpTransportData;
25
26 void CreateUDPAddress(std::string ip_str, int port, net::IPEndPoint* address) {
27 net::IPAddressNumber ip_number;
28 bool rv = net::ParseIPLiteralToNumber(ip_str, &ip_number);
29 if (!rv)
30 return;
31 *address = net::IPEndPoint(ip_number, port);
32 }
33
34 class LocalUdpTransportData
35 : public base::RefCountedThreadSafe<LocalUdpTransportData> {
36 public:
37 LocalUdpTransportData(net::UDPServerSocket* udp_socket,
38 scoped_refptr<base::TaskRunner> io_thread_proxy)
39 : udp_socket_(udp_socket),
40 buffer_(new net::IOBufferWithSize(kMaxPacketSize)),
41 io_thread_proxy_(io_thread_proxy) {
42 }
43
44 void ListenTo(net::IPEndPoint bind_address) {
45 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
46
47 bind_address_ = bind_address;
48 io_thread_proxy_->PostTask(FROM_HERE,
49 base::Bind(&LocalUdpTransportData::RecvFromSocketLoop, this));
50 }
51
52 void DeletePacket(uint8* data) {
53 // Should be called from the receiver (not on the transport thread).
54 DCHECK(!(io_thread_proxy_->RunsTasksOnCurrentThread()));
55 delete [] data;
56 }
57
58 void PacketReceived(int size) {
59 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
60 // Got a packet with length result.
61 uint8* data = new uint8[size];
62 memcpy(data, buffer_->data(), size);
63 packet_receiver_->ReceivedPacket(data, size,
64 base::Bind(&LocalUdpTransportData::DeletePacket, this, data));
65 RecvFromSocketLoop();
66
67 }
68
69 void RecvFromSocketLoop() {
70 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
71 // Callback should always trigger with a packet.
72 int res = udp_socket_->RecvFrom(buffer_.get(), kMaxPacketSize,
73 &bind_address_, base::Bind(&LocalUdpTransportData::PacketReceived,
74 this));
75 DCHECK(res >= net::ERR_IO_PENDING);
76 if (res > 0) {
77 PacketReceived(res);
78 }
79 }
80
81 void set_packet_receiver(PacketReceiver* packet_receiver) {
82 packet_receiver_ = packet_receiver;
83 }
84
85 void Close() {
86 udp_socket_->Close();
87 }
88
89 protected:
90 virtual ~LocalUdpTransportData() {}
91
92 private:
93 friend class base::RefCountedThreadSafe<LocalUdpTransportData>;
94
95 net::UDPServerSocket* udp_socket_;
96 net::IPEndPoint bind_address_;
97 PacketReceiver* packet_receiver_;
98 scoped_refptr<net::IOBufferWithSize> buffer_;
99 scoped_refptr<base::TaskRunner> io_thread_proxy_;
100
101 DISALLOW_COPY_AND_ASSIGN(LocalUdpTransportData);
102 };
103
104 class LocalPacketSender : public PacketSender,
105 public base::RefCountedThreadSafe<LocalPacketSender> {
106 public:
107 LocalPacketSender(net::UDPServerSocket* udp_socket,
108 scoped_refptr<base::TaskRunner> io_thread_proxy)
109 : udp_socket_(udp_socket),
110 send_address_(),
111 io_thread_proxy_(io_thread_proxy) {}
112
113 virtual bool SendPacket(const Packet& packet) OVERRIDE {
114 io_thread_proxy_->PostTask(FROM_HERE,
115 base::Bind(&LocalPacketSender::SendPacketToNetwork, this, packet));
116 return true;
117 }
118
119 virtual void SendPacketToNetwork(const Packet& packet) {
120 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
121 const uint8* data = packet.data();
122 net::TestCompletionCallback callback;
123 scoped_refptr<net::WrappedIOBuffer> buffer(
124 new net::WrappedIOBuffer(reinterpret_cast<const char*>(data)));
125 udp_socket_->SendTo(buffer.get(), static_cast<int>(packet.size()),
126 send_address_, callback.callback());
127 }
128
129 virtual bool SendPackets(const PacketList& packets) OVERRIDE {
130 bool out_val = true;
131 for (size_t i = 0; i < packets.size(); ++i) {
132 const Packet& packet = packets[i];
133 out_val |= SendPacket(packet);
134 }
135 return out_val;
136 }
137
138 void SetSendAddress(const net::IPEndPoint& send_address) {
139 send_address_ = send_address;
140 }
141
142 protected:
143 virtual ~LocalPacketSender() {}
144
145 private:
146 friend class base::RefCountedThreadSafe<LocalPacketSender>;
147
148 net::UDPServerSocket* udp_socket_; // Not owned by this class.
149 net::IPEndPoint send_address_;
150 scoped_refptr<base::TaskRunner> io_thread_proxy_;
151 };
152
153 Transport::Transport(
154 scoped_refptr<base::TaskRunner> io_thread_proxy)
155 : udp_socket_(new net::UDPServerSocket(NULL, net::NetLog::Source())),
156 local_udp_transport_data_(new LocalUdpTransportData(udp_socket_.get(),
157 io_thread_proxy)),
158 packet_sender_(new LocalPacketSender(udp_socket_.get(), io_thread_proxy)),
159 io_thread_proxy_(io_thread_proxy) {}
160
161 Transport::~Transport() {}
162
163 PacketSender* Transport::packet_sender() {
164 return static_cast<PacketSender*>(packet_sender_.get());
165 }
166
167 void Transport::StopReceiving() {
168 local_udp_transport_data_->Close();
169 }
170
171 void Transport::SetLocalReceiver(PacketReceiver* packet_receiver,
172 std::string ip_address,
173 std::string local_ip_address,
174 int port) {
175 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
176 net::IPEndPoint bind_address, local_bind_address;
177 CreateUDPAddress(ip_address, port, &bind_address);
178 CreateUDPAddress(local_ip_address, port, &local_bind_address);
179 local_udp_transport_data_->set_packet_receiver(packet_receiver);
180 udp_socket_->AllowAddressReuse();
181 udp_socket_->SetMulticastLoopbackMode(true);
182 udp_socket_->Listen(local_bind_address);
183
184 // Start listening once receiver has been set.
185 local_udp_transport_data_->ListenTo(bind_address);
186 }
187
188 void Transport::SetSendDestination(std::string ip_address, int port) {
189 net::IPEndPoint send_address;
190 CreateUDPAddress(ip_address, port, &send_address);
191 packet_sender_->SetSendAddress(send_address);
192 }
193
194 } // namespace cast
195 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/net/transport/transport.h ('k') | media/cast/net/transport/transport.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698