diff options
Diffstat (limited to 'chromium/ppapi/proxy/plugin_array_buffer_var.cc')
-rw-r--r-- | chromium/ppapi/proxy/plugin_array_buffer_var.cc | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/chromium/ppapi/proxy/plugin_array_buffer_var.cc b/chromium/ppapi/proxy/plugin_array_buffer_var.cc new file mode 100644 index 00000000000..7dd64d17b13 --- /dev/null +++ b/chromium/ppapi/proxy/plugin_array_buffer_var.cc @@ -0,0 +1,110 @@ +// 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 "ppapi/proxy/plugin_array_buffer_var.h" + +#include <stdlib.h> + +#include <limits> + +#include "base/memory/shared_memory.h" +#include "ppapi/c/dev/ppb_buffer_dev.h" +#include "ppapi/proxy/plugin_dispatcher.h" +#include "ppapi/proxy/plugin_globals.h" +#include "ppapi/proxy/ppapi_messages.h" +#include "ppapi/proxy/serialized_structs.h" +#include "ppapi/shared_impl/host_resource.h" +#include "ppapi/shared_impl/resource.h" +#include "ppapi/thunk/enter.h" +#include "ppapi/thunk/ppb_buffer_api.h" + +using base::SharedMemory; +using base::SharedMemoryHandle; +using ppapi::proxy::PluginGlobals; +using ppapi::proxy::PluginResourceTracker; + +namespace ppapi { + +PluginArrayBufferVar::PluginArrayBufferVar(uint32 size_in_bytes) + : buffer_(size_in_bytes), + plugin_handle_(base::SharedMemory::NULLHandle()), + size_in_bytes_(size_in_bytes) { +} + +PluginArrayBufferVar::PluginArrayBufferVar(uint32 size_in_bytes, + SharedMemoryHandle plugin_handle) + : plugin_handle_(plugin_handle), + size_in_bytes_(size_in_bytes) { +} + +PluginArrayBufferVar::~PluginArrayBufferVar() { + Unmap(); + + if (shmem_.get() == NULL) { + // The SharedMemory destuctor can't close the handle for us. + if (SharedMemory::IsHandleValid(plugin_handle_)) + SharedMemory::CloseHandle(plugin_handle_); + } else { + // Delete SharedMemory, if we have one. + shmem_.reset(); + } +} + +void* PluginArrayBufferVar::Map() { + if (shmem_.get()) + return shmem_->memory(); + if (SharedMemory::IsHandleValid(plugin_handle_)) { + shmem_.reset(new SharedMemory(plugin_handle_, false)); + if (!shmem_->Map(size_in_bytes_)) { + shmem_.reset(); + return NULL; + } + return shmem_->memory(); + } + if (buffer_.empty()) + return NULL; + return &(buffer_[0]); +} + +void PluginArrayBufferVar::Unmap() { + if (shmem_.get()) + shmem_->Unmap(); +} + +uint32 PluginArrayBufferVar::ByteLength() { + return size_in_bytes_; +} + +bool PluginArrayBufferVar::CopyToNewShmem( + PP_Instance instance, + int* host_handle_id, + SharedMemoryHandle* plugin_out_handle) { + ppapi::proxy::PluginDispatcher* dispatcher = + ppapi::proxy::PluginDispatcher::GetForInstance(instance); + if (!dispatcher) + return false; + + ppapi::proxy::SerializedHandle plugin_handle; + dispatcher->Send(new PpapiHostMsg_SharedMemory_CreateSharedMemory( + instance, ByteLength(), host_handle_id, &plugin_handle)); + if (!plugin_handle.IsHandleValid() || !plugin_handle.is_shmem() || + *host_handle_id == -1) + return false; + + base::SharedMemoryHandle tmp_handle = plugin_handle.shmem(); + SharedMemory s(tmp_handle, false); + if (!s.Map(ByteLength())) + return false; + memcpy(s.memory(), Map(), ByteLength()); + s.Unmap(); + + // We don't need to keep the shared memory around on the plugin side; + // we've already copied all our data into it. We'll make it invalid + // just to be safe. + *plugin_out_handle = base::SharedMemory::NULLHandle(); + + return true; +} + +} // namespace ppapi |