OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/resource_message_params.h" | 5 #include "ppapi/proxy/resource_message_params.h" |
6 | 6 |
| 7 #include "base/logging.h" |
7 #include "ppapi/c/pp_errors.h" | 8 #include "ppapi/c/pp_errors.h" |
8 #include "ppapi/proxy/ppapi_messages.h" | 9 #include "ppapi/proxy/ppapi_messages.h" |
9 | 10 |
10 namespace ppapi { | 11 namespace ppapi { |
11 namespace proxy { | 12 namespace proxy { |
12 | 13 |
| 14 ResourceMessageParams::SerializedHandles::SerializedHandles() |
| 15 : should_close_(false) { |
| 16 } |
| 17 |
| 18 ResourceMessageParams::SerializedHandles::~SerializedHandles() { |
| 19 if (should_close_) { |
| 20 for (std::vector<SerializedHandle>::iterator iter = data_.begin(); |
| 21 iter != data_.end(); ++iter) { |
| 22 iter->Close(); |
| 23 } |
| 24 } |
| 25 } |
| 26 |
13 ResourceMessageParams::ResourceMessageParams() | 27 ResourceMessageParams::ResourceMessageParams() |
14 : pp_resource_(0), | 28 : pp_resource_(0), |
15 sequence_(0) { | 29 sequence_(0), |
| 30 handles_(new SerializedHandles()) { |
16 } | 31 } |
17 | 32 |
18 ResourceMessageParams::ResourceMessageParams(PP_Resource resource, | 33 ResourceMessageParams::ResourceMessageParams(PP_Resource resource, |
19 int32_t sequence) | 34 int32_t sequence) |
20 : pp_resource_(resource), | 35 : pp_resource_(resource), |
21 sequence_(sequence) { | 36 sequence_(sequence), |
| 37 handles_(new SerializedHandles()) { |
22 } | 38 } |
23 | 39 |
24 ResourceMessageParams::~ResourceMessageParams() { | 40 ResourceMessageParams::~ResourceMessageParams() { |
25 } | 41 } |
26 | 42 |
27 void ResourceMessageParams::Serialize(IPC::Message* msg) const { | 43 void ResourceMessageParams::Serialize(IPC::Message* msg) const { |
28 IPC::ParamTraits<PP_Resource>::Write(msg, pp_resource_); | 44 IPC::ParamTraits<PP_Resource>::Write(msg, pp_resource_); |
29 IPC::ParamTraits<int32_t>::Write(msg, sequence_); | 45 IPC::ParamTraits<int32_t>::Write(msg, sequence_); |
30 IPC::ParamTraits<std::vector<SerializedHandle> >::Write(msg, handles_); | 46 IPC::ParamTraits<std::vector<SerializedHandle> >::Write(msg, |
| 47 handles_->data()); |
31 } | 48 } |
32 | 49 |
33 bool ResourceMessageParams::Deserialize(const IPC::Message* msg, | 50 bool ResourceMessageParams::Deserialize(const IPC::Message* msg, |
34 PickleIterator* iter) { | 51 PickleIterator* iter) { |
| 52 DCHECK(handles_->data().empty()); |
| 53 handles_->set_should_close(true); |
35 return IPC::ParamTraits<PP_Resource>::Read(msg, iter, &pp_resource_) && | 54 return IPC::ParamTraits<PP_Resource>::Read(msg, iter, &pp_resource_) && |
36 IPC::ParamTraits<int32_t>::Read(msg, iter, &sequence_) && | 55 IPC::ParamTraits<int32_t>::Read(msg, iter, &sequence_) && |
37 IPC::ParamTraits<std::vector<SerializedHandle> >::Read( | 56 IPC::ParamTraits<std::vector<SerializedHandle> >::Read( |
38 msg, iter, &handles_); | 57 msg, iter, &handles_->data()); |
39 } | 58 } |
40 | 59 |
41 const SerializedHandle* ResourceMessageParams::GetHandleOfTypeAtIndex( | 60 SerializedHandle ResourceMessageParams::TakeHandleOfTypeAtIndex( |
42 size_t index, | 61 size_t index, |
43 SerializedHandle::Type type) const { | 62 SerializedHandle::Type type) const { |
44 if (handles_.size() <= index) | 63 SerializedHandle handle; |
45 return NULL; | 64 std::vector<SerializedHandle>& data = handles_->data(); |
46 if (handles_[index].type() != type) | 65 if (index < data.size() && data[index].type() == type) { |
47 return NULL; | 66 handle = data[index]; |
48 return &handles_[index]; | 67 data[index] = SerializedHandle(); |
| 68 } |
| 69 return handle; |
49 } | 70 } |
50 | 71 |
51 bool ResourceMessageParams::GetSharedMemoryHandleAtIndex( | 72 bool ResourceMessageParams::TakeSharedMemoryHandleAtIndex( |
52 size_t index, | 73 size_t index, |
53 base::SharedMemoryHandle* handle) const { | 74 base::SharedMemoryHandle* handle) const { |
54 const SerializedHandle* serialized = GetHandleOfTypeAtIndex( | 75 SerializedHandle serialized = TakeHandleOfTypeAtIndex( |
55 index, SerializedHandle::SHARED_MEMORY); | 76 index, SerializedHandle::SHARED_MEMORY); |
56 if (!serialized) | 77 if (!serialized.is_shmem()) |
57 return false; | 78 return false; |
58 *handle = serialized->shmem(); | 79 *handle = serialized.shmem(); |
59 return true; | 80 return true; |
60 } | 81 } |
61 | 82 |
62 bool ResourceMessageParams::GetSocketHandleAtIndex( | 83 bool ResourceMessageParams::TakeSocketHandleAtIndex( |
63 size_t index, | 84 size_t index, |
64 IPC::PlatformFileForTransit* handle) const { | 85 IPC::PlatformFileForTransit* handle) const { |
65 const SerializedHandle* serialized = GetHandleOfTypeAtIndex( | 86 SerializedHandle serialized = TakeHandleOfTypeAtIndex( |
66 index, SerializedHandle::SOCKET); | 87 index, SerializedHandle::SOCKET); |
67 if (!serialized) | 88 if (!serialized.is_socket()) |
68 return false; | 89 return false; |
69 *handle = serialized->descriptor(); | 90 *handle = serialized.descriptor(); |
70 return true; | 91 return true; |
71 } | 92 } |
72 | 93 |
73 void ResourceMessageParams::AppendHandle(const SerializedHandle& handle) { | 94 void ResourceMessageParams::AppendHandle(const SerializedHandle& handle) const { |
74 handles_.push_back(handle); | 95 handles_->data().push_back(handle); |
75 } | 96 } |
76 | 97 |
77 ResourceMessageCallParams::ResourceMessageCallParams() | 98 ResourceMessageCallParams::ResourceMessageCallParams() |
78 : ResourceMessageParams(), | 99 : ResourceMessageParams(), |
79 has_callback_(0) { | 100 has_callback_(0) { |
80 } | 101 } |
81 | 102 |
82 ResourceMessageCallParams::ResourceMessageCallParams(PP_Resource resource, | 103 ResourceMessageCallParams::ResourceMessageCallParams(PP_Resource resource, |
83 int32_t sequence) | 104 int32_t sequence) |
84 : ResourceMessageParams(resource, sequence), | 105 : ResourceMessageParams(resource, sequence), |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 142 |
122 bool ResourceMessageReplyParams::Deserialize(const IPC::Message* msg, | 143 bool ResourceMessageReplyParams::Deserialize(const IPC::Message* msg, |
123 PickleIterator* iter) { | 144 PickleIterator* iter) { |
124 if (!ResourceMessageParams::Deserialize(msg, iter)) | 145 if (!ResourceMessageParams::Deserialize(msg, iter)) |
125 return false; | 146 return false; |
126 return IPC::ParamTraits<int32_t>::Read(msg, iter, &result_); | 147 return IPC::ParamTraits<int32_t>::Read(msg, iter, &result_); |
127 } | 148 } |
128 | 149 |
129 } // namespace proxy | 150 } // namespace proxy |
130 } // namespace ppapi | 151 } // namespace ppapi |
OLD | NEW |