| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cast/net/udp_transport.h" | 5 #include "media/cast/net/udp_transport.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread()); | 109 DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread()); |
| 110 | 110 |
| 111 // Loop while UdpSocket is delivering data synchronously. When it responds | 111 // Loop while UdpSocket is delivering data synchronously. When it responds |
| 112 // with a "pending" status, break and expect this method to be called back in | 112 // with a "pending" status, break and expect this method to be called back in |
| 113 // the future when a packet is ready. | 113 // the future when a packet is ready. |
| 114 while (true) { | 114 while (true) { |
| 115 if (length_or_status == net::ERR_IO_PENDING) { | 115 if (length_or_status == net::ERR_IO_PENDING) { |
| 116 next_packet_.reset(new Packet(kMaxPacketSize)); | 116 next_packet_.reset(new Packet(kMaxPacketSize)); |
| 117 recv_buf_ = new net::WrappedIOBuffer( | 117 recv_buf_ = new net::WrappedIOBuffer( |
| 118 reinterpret_cast<char*>(&next_packet_->front())); | 118 reinterpret_cast<char*>(&next_packet_->front())); |
| 119 length_or_status = udp_socket_->RecvFrom( | 119 length_or_status = |
| 120 recv_buf_, | 120 udp_socket_->RecvFrom(recv_buf_.get(), |
| 121 kMaxPacketSize, | 121 kMaxPacketSize, |
| 122 &recv_addr_, | 122 &recv_addr_, |
| 123 base::Bind(&UdpTransport::ReceiveNextPacket, | 123 base::Bind(&UdpTransport::ReceiveNextPacket, |
| 124 weak_factory_.GetWeakPtr())); | 124 weak_factory_.GetWeakPtr())); |
| 125 if (length_or_status == net::ERR_IO_PENDING) { | 125 if (length_or_status == net::ERR_IO_PENDING) { |
| 126 receive_pending_ = true; | 126 receive_pending_ = true; |
| 127 return; | 127 return; |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 // Note: At this point, either a packet is ready or an error has occurred. | 131 // Note: At this point, either a packet is ready or an error has occurred. |
| 132 if (length_or_status < 0) { | 132 if (length_or_status < 0) { |
| 133 VLOG(1) << "Failed to receive packet: Status code is " | 133 VLOG(1) << "Failed to receive packet: Status code is " |
| 134 << length_or_status; | 134 << length_or_status; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 int result; | 189 int result; |
| 190 base::Callback<void(int)> callback = base::Bind(&UdpTransport::OnSent, | 190 base::Callback<void(int)> callback = base::Bind(&UdpTransport::OnSent, |
| 191 weak_factory_.GetWeakPtr(), | 191 weak_factory_.GetWeakPtr(), |
| 192 buf, | 192 buf, |
| 193 packet, | 193 packet, |
| 194 cb); | 194 cb); |
| 195 if (client_connected_) { | 195 if (client_connected_) { |
| 196 // If we called Connect() before we must call Write() instead of | 196 // If we called Connect() before we must call Write() instead of |
| 197 // SendTo(). Otherwise on some platforms we might get | 197 // SendTo(). Otherwise on some platforms we might get |
| 198 // ERR_SOCKET_IS_CONNECTED. | 198 // ERR_SOCKET_IS_CONNECTED. |
| 199 result = udp_socket_->Write(buf, | 199 result = udp_socket_->Write( |
| 200 static_cast<int>(packet->data.size()), | 200 buf.get(), static_cast<int>(packet->data.size()), callback); |
| 201 callback); | |
| 202 } else if (!IsEmpty(remote_addr_)) { | 201 } else if (!IsEmpty(remote_addr_)) { |
| 203 result = udp_socket_->SendTo(buf, | 202 result = udp_socket_->SendTo(buf.get(), |
| 204 static_cast<int>(packet->data.size()), | 203 static_cast<int>(packet->data.size()), |
| 205 remote_addr_, | 204 remote_addr_, |
| 206 callback); | 205 callback); |
| 207 } else { | 206 } else { |
| 208 VLOG(1) << "Failed to send packet; socket is neither bound nor " | 207 VLOG(1) << "Failed to send packet; socket is neither bound nor " |
| 209 << "connected."; | 208 << "connected."; |
| 210 return true; | 209 return true; |
| 211 } | 210 } |
| 212 | 211 |
| 213 if (result == net::ERR_IO_PENDING) { | 212 if (result == net::ERR_IO_PENDING) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 234 } | 233 } |
| 235 ScheduleReceiveNextPacket(); | 234 ScheduleReceiveNextPacket(); |
| 236 | 235 |
| 237 if (!cb.is_null()) { | 236 if (!cb.is_null()) { |
| 238 cb.Run(); | 237 cb.Run(); |
| 239 } | 238 } |
| 240 } | 239 } |
| 241 | 240 |
| 242 } // namespace cast | 241 } // namespace cast |
| 243 } // namespace media | 242 } // namespace media |
| OLD | NEW |