summaryrefslogtreecommitdiffstats
path: root/content/renderer/pepper/host_array_buffer_var.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/renderer/pepper/host_array_buffer_var.cc')
-rw-r--r--content/renderer/pepper/host_array_buffer_var.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/content/renderer/pepper/host_array_buffer_var.cc b/content/renderer/pepper/host_array_buffer_var.cc
new file mode 100644
index 0000000..565db42
--- /dev/null
+++ b/content/renderer/pepper/host_array_buffer_var.cc
@@ -0,0 +1,103 @@
+// Copyright (c) 2012 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/renderer/pepper/host_array_buffer_var.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/process_util.h"
+#include "content/renderer/pepper/host_globals.h"
+#include "content/renderer/pepper/plugin_module.h"
+#include "content/renderer/pepper/ppapi_plugin_instance_impl.h"
+#include "ppapi/c/pp_instance.h"
+
+using ppapi::ArrayBufferVar;
+using WebKit::WebArrayBuffer;
+
+namespace webkit {
+namespace ppapi {
+
+HostArrayBufferVar::HostArrayBufferVar(uint32 size_in_bytes)
+ : buffer_(WebArrayBuffer::create(size_in_bytes, 1 /* element_size */)),
+ valid_(true) {
+}
+
+HostArrayBufferVar::HostArrayBufferVar(const WebArrayBuffer& buffer)
+ : buffer_(buffer),
+ valid_(true) {
+}
+
+HostArrayBufferVar::HostArrayBufferVar(uint32 size_in_bytes,
+ base::SharedMemoryHandle handle)
+ : buffer_(WebArrayBuffer::create(size_in_bytes, 1 /* element_size */)) {
+ base::SharedMemory s(handle, true);
+ valid_ = s.Map(size_in_bytes);
+ if (valid_) {
+ memcpy(buffer_.data(), s.memory(), size_in_bytes);
+ s.Unmap();
+ }
+}
+
+HostArrayBufferVar::~HostArrayBufferVar() {
+}
+
+void* HostArrayBufferVar::Map() {
+ if (!valid_)
+ return NULL;
+ return buffer_.data();
+}
+
+void HostArrayBufferVar::Unmap() {
+ // We do not used shared memory on the host side. Nothing to do.
+}
+
+uint32 HostArrayBufferVar::ByteLength() {
+ return buffer_.byteLength();
+}
+
+bool HostArrayBufferVar::CopyToNewShmem(
+ PP_Instance instance,
+ int* host_shm_handle_id,
+ base::SharedMemoryHandle* plugin_shm_handle) {
+ webkit::ppapi::PluginInstanceImpl* i =
+ webkit::ppapi::HostGlobals::Get()->GetInstance(instance);
+ scoped_ptr<base::SharedMemory> shm(i->delegate()->CreateAnonymousSharedMemory(
+ ByteLength()));
+ if (!shm)
+ return false;
+
+ shm->Map(ByteLength());
+ memcpy(shm->memory(), Map(), ByteLength());
+ shm->Unmap();
+
+ // Duplicate the handle here; the SharedMemory destructor closes
+ // its handle on us.
+ HostGlobals* hg = HostGlobals::Get();
+ PluginModule* pm = hg->GetModule(hg->GetModuleForInstance(instance));
+ base::ProcessId p = pm->GetPeerProcessId();
+ if (p == base::kNullProcessId) {
+ // In-process, clone for ourselves.
+ p = base::GetCurrentProcId();
+ }
+
+ base::PlatformFile platform_file =
+#if defined(OS_WIN)
+ shm->handle();
+#elif defined(OS_POSIX)
+ shm->handle().fd;
+#else
+#error Not implemented.
+#endif
+
+ *plugin_shm_handle =
+ i->delegate()->ShareHandleWithRemote(platform_file, p, false);
+ *host_shm_handle_id = -1;
+ return true;
+}
+
+} // namespace ppapi
+} // namespace webkit