Index: ppapi/proxy/resource_message_params.cc |
diff --git a/ppapi/proxy/resource_message_params.cc b/ppapi/proxy/resource_message_params.cc |
index 6d3fa02f465236e903b54445ca1c8700cce15aa2..9228d7ea07c6819471dcd9427e8d30e7b84b6d8d 100644 |
--- a/ppapi/proxy/resource_message_params.cc |
+++ b/ppapi/proxy/resource_message_params.cc |
@@ -4,21 +4,37 @@ |
#include "ppapi/proxy/resource_message_params.h" |
+#include "base/logging.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/proxy/ppapi_messages.h" |
namespace ppapi { |
namespace proxy { |
+ResourceMessageParams::SerializedHandles::SerializedHandles() |
+ : should_close_(false) { |
+} |
+ |
+ResourceMessageParams::SerializedHandles::~SerializedHandles() { |
+ if (should_close_) { |
+ for (std::vector<SerializedHandle>::iterator iter = data_.begin(); |
+ iter != data_.end(); ++iter) { |
+ iter->Close(); |
+ } |
+ } |
+} |
+ |
ResourceMessageParams::ResourceMessageParams() |
: pp_resource_(0), |
- sequence_(0) { |
+ sequence_(0), |
+ handles_(new SerializedHandles()) { |
} |
ResourceMessageParams::ResourceMessageParams(PP_Resource resource, |
int32_t sequence) |
: pp_resource_(resource), |
- sequence_(sequence) { |
+ sequence_(sequence), |
+ handles_(new SerializedHandles()) { |
} |
ResourceMessageParams::~ResourceMessageParams() { |
@@ -27,51 +43,56 @@ ResourceMessageParams::~ResourceMessageParams() { |
void ResourceMessageParams::Serialize(IPC::Message* msg) const { |
IPC::ParamTraits<PP_Resource>::Write(msg, pp_resource_); |
IPC::ParamTraits<int32_t>::Write(msg, sequence_); |
- IPC::ParamTraits<std::vector<SerializedHandle> >::Write(msg, handles_); |
+ IPC::ParamTraits<std::vector<SerializedHandle> >::Write(msg, |
+ handles_->data()); |
} |
bool ResourceMessageParams::Deserialize(const IPC::Message* msg, |
PickleIterator* iter) { |
+ DCHECK(handles_->data().empty()); |
+ handles_->set_should_close(true); |
return IPC::ParamTraits<PP_Resource>::Read(msg, iter, &pp_resource_) && |
IPC::ParamTraits<int32_t>::Read(msg, iter, &sequence_) && |
IPC::ParamTraits<std::vector<SerializedHandle> >::Read( |
- msg, iter, &handles_); |
+ msg, iter, &handles_->data()); |
} |
-const SerializedHandle* ResourceMessageParams::GetHandleOfTypeAtIndex( |
+SerializedHandle ResourceMessageParams::TakeHandleOfTypeAtIndex( |
size_t index, |
SerializedHandle::Type type) const { |
- if (handles_.size() <= index) |
- return NULL; |
- if (handles_[index].type() != type) |
- return NULL; |
- return &handles_[index]; |
+ SerializedHandle handle; |
+ std::vector<SerializedHandle>& data = handles_->data(); |
+ if (index < data.size() && data[index].type() == type) { |
+ handle = data[index]; |
+ data[index] = SerializedHandle(); |
+ } |
+ return handle; |
} |
-bool ResourceMessageParams::GetSharedMemoryHandleAtIndex( |
+bool ResourceMessageParams::TakeSharedMemoryHandleAtIndex( |
size_t index, |
base::SharedMemoryHandle* handle) const { |
- const SerializedHandle* serialized = GetHandleOfTypeAtIndex( |
+ SerializedHandle serialized = TakeHandleOfTypeAtIndex( |
index, SerializedHandle::SHARED_MEMORY); |
- if (!serialized) |
+ if (!serialized.is_shmem()) |
return false; |
- *handle = serialized->shmem(); |
+ *handle = serialized.shmem(); |
return true; |
} |
-bool ResourceMessageParams::GetSocketHandleAtIndex( |
+bool ResourceMessageParams::TakeSocketHandleAtIndex( |
size_t index, |
IPC::PlatformFileForTransit* handle) const { |
- const SerializedHandle* serialized = GetHandleOfTypeAtIndex( |
+ SerializedHandle serialized = TakeHandleOfTypeAtIndex( |
index, SerializedHandle::SOCKET); |
- if (!serialized) |
+ if (!serialized.is_socket()) |
return false; |
- *handle = serialized->descriptor(); |
+ *handle = serialized.descriptor(); |
return true; |
} |
-void ResourceMessageParams::AppendHandle(const SerializedHandle& handle) { |
- handles_.push_back(handle); |
+void ResourceMessageParams::AppendHandle(const SerializedHandle& handle) const { |
+ handles_->data().push_back(handle); |
} |
ResourceMessageCallParams::ResourceMessageCallParams() |