Index: content/gpu/chrome_gpu_memory_buffer_service_ipc_transport.cc |
diff --git a/content/gpu/chrome_gpu_memory_buffer_service_ipc_transport.cc b/content/gpu/chrome_gpu_memory_buffer_service_ipc_transport.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..66659c479a714f9661c0ccecd4ff3033c656a91f |
--- /dev/null |
+++ b/content/gpu/chrome_gpu_memory_buffer_service_ipc_transport.cc |
@@ -0,0 +1,111 @@ |
+// Copyright 2015 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 "content/gpu/chrome_gpu_memory_buffer_service_ipc_transport.h" |
+ |
+#include "content/common/gpu/gpu_messages.h" |
+#include "ipc/ipc_sender.h" |
+ |
+namespace content { |
+ |
+namespace { |
+ |
+class GpuMemoryBufferServiceMessageFilter : public IPC::MessageFilter { |
+ public: |
+ explicit GpuMemoryBufferServiceMessageFilter( |
+ const base::WeakPtr<ChromeGpuMemoryBufferServiceIPCTransport>& transport) |
+ : transport_(transport) {} |
+ |
+ private: |
+ ~GpuMemoryBufferServiceMessageFilter() override {} |
+ |
+ // Overridden from IPC::MessageFilter: |
+ void OnFilterAdded(IPC::Sender* sender) override { |
+ if (transport_) { |
+ DCHECK(!transport_->sender_); |
+ transport_->sender_ = sender; |
+ } |
+ } |
+ |
+ void OnFilterRemoved() override { |
+ if (transport_) { |
+ DCHECK(transport_->sender_); |
+ transport_->sender_ = nullptr; |
+ transport_->CloseConnection(); |
+ } |
+ } |
+ |
+ bool OnMessageReceived(const IPC::Message& message) override { |
+ if (transport_) |
+ return transport_->OnMessageReceived(message); |
+ return false; |
+ } |
+ |
+ base::WeakPtr<ChromeGpuMemoryBufferServiceIPCTransport> transport_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferServiceMessageFilter); |
+}; |
+ |
+} // namespace |
+ |
+// static |
+scoped_ptr<GpuMemoryBufferServiceIPCTransport> |
+ChromeGpuMemoryBufferServiceIPCTransport::Create() { |
+ return make_scoped_ptr<GpuMemoryBufferServiceIPCTransport>( |
+ new ChromeGpuMemoryBufferServiceIPCTransport()); |
+} |
+ |
+ChromeGpuMemoryBufferServiceIPCTransport:: |
+ ~ChromeGpuMemoryBufferServiceIPCTransport() {} |
+ |
+ChromeGpuMemoryBufferServiceIPCTransport:: |
+ ChromeGpuMemoryBufferServiceIPCTransport() |
+ : client_(nullptr), sender_(nullptr), factory_(this) { |
+ message_filter_ = |
+ new GpuMemoryBufferServiceMessageFilter(factory_.GetWeakPtr()); |
+} |
+ |
+void ChromeGpuMemoryBufferServiceIPCTransport::CloseConnection() { |
+ if (client_) |
+ client_->OnConnectionClosed(); |
+} |
+ |
+bool ChromeGpuMemoryBufferServiceIPCTransport::GpuMemoryBufferCreated( |
+ const gfx::GpuMemoryBufferHandle& handle) { |
+ DCHECK(sender_); |
+ return sender_->Send(new GpuHostMsg_GpuMemoryBufferCreated(handle)); |
+} |
+ |
+void ChromeGpuMemoryBufferServiceIPCTransport::SetClient( |
+ GpuMemoryBufferServiceIPCTransport::Client* client) { |
+ client_ = client; |
+} |
+ |
+bool ChromeGpuMemoryBufferServiceIPCTransport::OnMessageReceived( |
+ const IPC::Message& message) { |
+ DCHECK(sender_); |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(ChromeGpuMemoryBufferServiceIPCTransport, message) |
+ IPC_MESSAGE_HANDLER(GpuMsg_CreateGpuMemoryBuffer, OnCreateGpuMemoryBuffer) |
+ IPC_MESSAGE_HANDLER(GpuMsg_CreateGpuMemoryBufferFromHandle, |
+ OnCreateGpuMemoryBufferFromHandle) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+void ChromeGpuMemoryBufferServiceIPCTransport::OnCreateGpuMemoryBuffer( |
+ const CreateGpuMemoryBufferParams& params) { |
+ if (client_) |
+ client_->OnCreateGpuMemoryBuffer(params); |
+} |
+ |
+void ChromeGpuMemoryBufferServiceIPCTransport:: |
+ OnCreateGpuMemoryBufferFromHandle( |
+ const CreateGpuMemoryBufferFromHandleParams& params) { |
+ if (client_) |
+ client_->OnCreateGpuMemoryBufferFromHandle(params); |
+} |
+ |
+} // namespace content |