Index: blimp/net/message_port_util.cc |
diff --git a/blimp/net/message_port_util.cc b/blimp/net/message_port_util.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..45cfcc37ac95bf520f17a727d871c187f447b9c6 |
--- /dev/null |
+++ b/blimp/net/message_port_util.cc |
@@ -0,0 +1,53 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "blimp/net/message_port_util.h" |
+ |
+#include <utility> |
+ |
+#include "base/memory/ptr_util.h" |
+#include "blimp/net/compressed_packet_reader.h" |
+#include "blimp/net/compressed_packet_writer.h" |
+#include "blimp/net/message_port.h" |
+#include "blimp/net/stream_packet_reader.h" |
+#include "blimp/net/stream_packet_writer.h" |
+#include "net/socket/stream_socket.h" |
+ |
+namespace blimp { |
+namespace { |
+ |
+const char kMessagePortUtilAttachment[] = "message_port_util_attachment"; |
+ |
+// Used to bind a Socket lifetime to an object which extends |
+// base::SupportsUserData. |
+class StreamSocketUserData : public base::SupportsUserData::Data { |
+ public: |
+ explicit StreamSocketUserData(std::unique_ptr<net::StreamSocket> socket) |
+ : socket_(std::move(socket)) {} |
+ ~StreamSocketUserData() override = default; |
+ |
+ private: |
+ std::unique_ptr<net::StreamSocket> socket_; |
+ DISALLOW_COPY_AND_ASSIGN(StreamSocketUserData); |
+}; |
+ |
+} // namespace |
+ |
+std::unique_ptr<MessagePort> CreateMessagePortForStreamSocket( |
+ std::unique_ptr<net::StreamSocket> socket) { |
+ // Use compressed packet readers and writers. |
+ std::unique_ptr<MessagePort> output( |
+ new MessagePort(base::MakeUnique<CompressedPacketReader>( |
+ base::MakeUnique<StreamPacketReader>(socket.get())), |
+ base::MakeUnique<CompressedPacketWriter>( |
+ base::MakeUnique<StreamPacketWriter>(socket.get())))); |
+ |
+ // Bind |socket|'s lifetime to the MessagePort, so that ownership doesn't need |
+ // to be coordinated with the reader or the writer objects. |
+ output->SetUserData(kMessagePortUtilAttachment, |
+ new StreamSocketUserData(std::move(socket))); |
+ return output; |
+} |
+ |
+} // namespace blimp |