udp_packet_pipe.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2017 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. #include "media/cast/net/udp_packet_pipe.h"
  5. #include <cstring>
  6. #include "base/bind.h"
  7. #include "base/callback.h"
  8. #include "base/logging.h"
  9. #include "base/memory/ptr_util.h"
  10. namespace media {
  11. namespace cast {
  12. // UdpPacketPipeReader
  13. UdpPacketPipeReader::UdpPacketPipeReader(
  14. mojo::ScopedDataPipeConsumerHandle consumer_handle)
  15. : data_pipe_reader_(std::move(consumer_handle)) {
  16. DCHECK(data_pipe_reader_.IsPipeValid());
  17. }
  18. UdpPacketPipeReader::~UdpPacketPipeReader() {}
  19. void UdpPacketPipeReader::Read(ReadCB cb) {
  20. DCHECK(!cb.is_null());
  21. data_pipe_reader_.Read(reinterpret_cast<uint8_t*>(&current_packet_size_),
  22. sizeof(uint16_t),
  23. base::BindOnce(&UdpPacketPipeReader::ReadPacketPayload,
  24. base::Unretained(this), std::move(cb)));
  25. }
  26. void UdpPacketPipeReader::ReadPacketPayload(ReadCB cb, bool success) {
  27. if (!success) {
  28. OnPacketRead(nullptr, std::move(cb), false);
  29. return;
  30. }
  31. auto packet = std::make_unique<Packet>(current_packet_size_);
  32. uint8_t* packet_data = packet->data();
  33. data_pipe_reader_.Read(
  34. packet_data, current_packet_size_,
  35. base::BindOnce(&UdpPacketPipeReader::OnPacketRead, base::Unretained(this),
  36. std::move(packet), std::move(cb)));
  37. }
  38. void UdpPacketPipeReader::OnPacketRead(std::unique_ptr<Packet> packet,
  39. ReadCB cb,
  40. bool success) {
  41. DCHECK(!cb.is_null());
  42. if (!success) {
  43. VLOG(1) << "Failed when reading the packet.";
  44. // The data pipe should have been closed.
  45. }
  46. std::move(cb).Run(std::move(packet));
  47. }
  48. // UdpPacketPipeWriter
  49. UdpPacketPipeWriter::UdpPacketPipeWriter(
  50. mojo::ScopedDataPipeProducerHandle producer_handle)
  51. : data_pipe_writer_(std::move(producer_handle)) {
  52. DCHECK(data_pipe_writer_.IsPipeValid());
  53. }
  54. UdpPacketPipeWriter::~UdpPacketPipeWriter() {}
  55. void UdpPacketPipeWriter::Write(PacketRef packet, base::OnceClosure done_cb) {
  56. DCHECK(done_cb);
  57. current_packet_size_ = packet->data.size();
  58. data_pipe_writer_.Write(
  59. reinterpret_cast<uint8_t*>(&current_packet_size_), sizeof(uint16_t),
  60. base::BindOnce(&UdpPacketPipeWriter::WritePacketPayload,
  61. base::Unretained(this), std::move(packet),
  62. std::move(done_cb)));
  63. }
  64. void UdpPacketPipeWriter::WritePacketPayload(PacketRef packet,
  65. base::OnceClosure done_cb,
  66. bool success) {
  67. if (!success) {
  68. OnPacketWritten(PacketRef(), std::move(done_cb), false);
  69. return;
  70. }
  71. const uint8_t* buffer = packet->data.data();
  72. const int buffer_size = packet->data.size();
  73. data_pipe_writer_.Write(
  74. buffer, buffer_size,
  75. base::BindOnce(&UdpPacketPipeWriter::OnPacketWritten,
  76. base::Unretained(this), std::move(packet),
  77. std::move(done_cb)));
  78. }
  79. void UdpPacketPipeWriter::OnPacketWritten(PacketRef packet,
  80. base::OnceClosure done_cb,
  81. bool success) {
  82. DCHECK(done_cb);
  83. if (!success) {
  84. VLOG(1) << "Failed to write the packet.";
  85. // The data pipe should have been closed.
  86. }
  87. std::move(done_cb).Run();
  88. }
  89. } // namespace cast
  90. } // namespace media