summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy/ppb_buffer_proxy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/proxy/ppb_buffer_proxy.cc')
-rw-r--r--ppapi/proxy/ppb_buffer_proxy.cc71
1 files changed, 50 insertions, 21 deletions
diff --git a/ppapi/proxy/ppb_buffer_proxy.cc b/ppapi/proxy/ppb_buffer_proxy.cc
index 5c2fd8a..a358de7 100644
--- a/ppapi/proxy/ppb_buffer_proxy.cc
+++ b/ppapi/proxy/ppb_buffer_proxy.cc
@@ -9,12 +9,16 @@
#include "base/logging.h"
#include "build/build_config.h"
#include "ppapi/c/pp_completion_callback.h"
+#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/dev/ppb_buffer_dev.h"
+#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppb_buffer_api.h"
+#include "ppapi/thunk/ppb_buffer_trusted_api.h"
#include "ppapi/thunk/thunk.h"
namespace pp {
@@ -33,7 +37,7 @@ class Buffer : public ppapi::thunk::PPB_Buffer_API,
public PluginResource {
public:
Buffer(const HostResource& resource,
- int memory_handle,
+ const base::SharedMemoryHandle& shm_handle,
uint32_t size);
virtual ~Buffer();
@@ -50,19 +54,18 @@ class Buffer : public ppapi::thunk::PPB_Buffer_API,
virtual void Unmap() OVERRIDE;
private:
- int memory_handle_;
+ base::SharedMemory shm_;
uint32_t size_;
-
void* mapped_data_;
DISALLOW_COPY_AND_ASSIGN(Buffer);
};
Buffer::Buffer(const HostResource& resource,
- int memory_handle,
+ const base::SharedMemoryHandle& shm_handle,
uint32_t size)
: PluginResource(resource),
- memory_handle_(memory_handle),
+ shm_(shm_handle, false),
size_(size),
mapped_data_(NULL) {
}
@@ -89,12 +92,13 @@ PP_Bool Buffer::IsMapped() {
}
void* Buffer::Map() {
- // TODO(brettw) implement this.
- return mapped_data_;
+ if (!shm_.memory())
+ shm_.Map(size_);
+ return shm_.memory();
}
void Buffer::Unmap() {
- // TODO(brettw) implement this.
+ shm_.Unmap();
}
PPB_Buffer_Proxy::PPB_Buffer_Proxy(Dispatcher* dispatcher,
@@ -125,15 +129,14 @@ PP_Resource PPB_Buffer_Proxy::CreateProxyResource(PP_Instance instance,
return 0;
HostResource result;
- int32_t shm_handle = -1;
+ base::SharedMemoryHandle shm_handle = base::SharedMemory::NULLHandle();
dispatcher->Send(new PpapiHostMsg_PPBBuffer_Create(
INTERFACE_ID_PPB_BUFFER, instance, size,
&result, &shm_handle));
- if (result.is_null())
+ if (result.is_null() || !base::SharedMemory::IsHandleValid(shm_handle))
return 0;
- linked_ptr<Buffer> object(new Buffer(result,
- static_cast<int>(shm_handle), size));
+ linked_ptr<Buffer> object(new Buffer(result, shm_handle, size));
return PluginResourceTracker::GetInstance()->AddResource(object);
}
@@ -147,15 +150,41 @@ bool PPB_Buffer_Proxy::OnMessageReceived(const IPC::Message& msg) {
return handled;
}
-void PPB_Buffer_Proxy::OnMsgCreate(PP_Instance instance,
- uint32_t size,
- HostResource* result_resource,
- int* result_shm_handle) {
- result_resource->SetHostResource(
- instance,
- ppb_buffer_target()->Create(instance, size));
- // TODO(brettw) set the shm handle from a trusted interface.
- *result_shm_handle = 0;
+void PPB_Buffer_Proxy::OnMsgCreate(
+ PP_Instance instance,
+ uint32_t size,
+ HostResource* result_resource,
+ base::SharedMemoryHandle* result_shm_handle) {
+ // Overwritten below on success.
+ *result_shm_handle = base::SharedMemory::NULLHandle();
+ HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return;
+ PP_Resource local_buffer_resource =
+ ppb_buffer_target()->Create(instance, size);
+ if (local_buffer_resource == 0)
+ return;
+ ::ppapi::thunk::EnterResourceNoLock< ::ppapi::thunk::PPB_BufferTrusted_API>
+ trusted_buffer(local_buffer_resource, false);
+ if (trusted_buffer.failed())
+ return;
+ int local_fd;
+ if (trusted_buffer.object()->GetSharedMemory(&local_fd) != PP_OK)
+ return;
+
+ result_resource->SetHostResource(instance, local_buffer_resource);
+
+ // TODO(piman/brettw): Change trusted interface to return a PP_FileHandle,
+ // those casts are ugly.
+ base::PlatformFile platform_file =
+#if defined(OS_WIN)
+ reinterpret_cast<HANDLE>(static_cast<intptr_t>(local_fd));
+#elif defined(OS_POSIX)
+ local_fd;
+#else
+ #error Not implemented.
+#endif
+ *result_shm_handle = dispatcher->ShareHandleWithRemote(platform_file, false);
}
} // namespace proxy