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
3 // found in the LICENSE file.
5 #include "ppapi/proxy/resource_message_params.h"
7 #include "base/logging.h"
8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/proxy/ppapi_messages.h"
14 ResourceMessageParams::SerializedHandles::SerializedHandles()
15 : should_close_(false) {
18 ResourceMessageParams::SerializedHandles::~SerializedHandles() {
20 for (std::vector
<SerializedHandle
>::iterator iter
= data_
.begin();
21 iter
!= data_
.end(); ++iter
) {
27 ResourceMessageParams::ResourceMessageParams()
30 handles_(new SerializedHandles()) {
33 ResourceMessageParams::ResourceMessageParams(PP_Resource resource
,
35 : pp_resource_(resource
),
37 handles_(new SerializedHandles()) {
40 ResourceMessageParams::~ResourceMessageParams() {
43 void ResourceMessageParams::Serialize(IPC::Message
* msg
) const {
44 IPC::ParamTraits
<PP_Resource
>::Write(msg
, pp_resource_
);
45 IPC::ParamTraits
<int32_t>::Write(msg
, sequence_
);
46 IPC::ParamTraits
<std::vector
<SerializedHandle
> >::Write(msg
,
50 bool ResourceMessageParams::Deserialize(const IPC::Message
* msg
,
51 PickleIterator
* iter
) {
52 DCHECK(handles_
->data().empty());
53 handles_
->set_should_close(true);
54 return IPC::ParamTraits
<PP_Resource
>::Read(msg
, iter
, &pp_resource_
) &&
55 IPC::ParamTraits
<int32_t>::Read(msg
, iter
, &sequence_
) &&
56 IPC::ParamTraits
<std::vector
<SerializedHandle
> >::Read(
57 msg
, iter
, &handles_
->data());
60 SerializedHandle
ResourceMessageParams::TakeHandleOfTypeAtIndex(
62 SerializedHandle::Type type
) const {
63 SerializedHandle handle
;
64 std::vector
<SerializedHandle
>& data
= handles_
->data();
65 if (index
< data
.size() && data
[index
].type() == type
) {
67 data
[index
] = SerializedHandle();
72 bool ResourceMessageParams::TakeSharedMemoryHandleAtIndex(
74 base::SharedMemoryHandle
* handle
) const {
75 SerializedHandle serialized
= TakeHandleOfTypeAtIndex(
76 index
, SerializedHandle::SHARED_MEMORY
);
77 if (!serialized
.is_shmem())
79 *handle
= serialized
.shmem();
83 bool ResourceMessageParams::TakeSocketHandleAtIndex(
85 IPC::PlatformFileForTransit
* handle
) const {
86 SerializedHandle serialized
= TakeHandleOfTypeAtIndex(
87 index
, SerializedHandle::SOCKET
);
88 if (!serialized
.is_socket())
90 *handle
= serialized
.descriptor();
94 void ResourceMessageParams::TakeAllSharedMemoryHandles(
95 std::vector
<base::SharedMemoryHandle
>* handles
) const {
96 for (size_t i
= 0; i
< handles_
->data().size(); ++i
) {
97 base::SharedMemoryHandle handle
;
98 if (TakeSharedMemoryHandleAtIndex(i
, &handle
))
99 handles
->push_back(handle
);
103 void ResourceMessageParams::AppendHandle(const SerializedHandle
& handle
) const {
104 handles_
->data().push_back(handle
);
107 ResourceMessageCallParams::ResourceMessageCallParams()
108 : ResourceMessageParams(),
112 ResourceMessageCallParams::ResourceMessageCallParams(PP_Resource resource
,
114 : ResourceMessageParams(resource
, sequence
),
118 ResourceMessageCallParams::~ResourceMessageCallParams() {
121 void ResourceMessageCallParams::Serialize(IPC::Message
* msg
) const {
122 ResourceMessageParams::Serialize(msg
);
123 IPC::ParamTraits
<bool>::Write(msg
, has_callback_
);
126 bool ResourceMessageCallParams::Deserialize(const IPC::Message
* msg
,
127 PickleIterator
* iter
) {
128 if (!ResourceMessageParams::Deserialize(msg
, iter
))
130 return IPC::ParamTraits
<bool>::Read(msg
, iter
, &has_callback_
);
133 ResourceMessageReplyParams::ResourceMessageReplyParams()
134 : ResourceMessageParams(),
138 ResourceMessageReplyParams::ResourceMessageReplyParams(PP_Resource resource
,
140 : ResourceMessageParams(resource
, sequence
),
144 ResourceMessageReplyParams::~ResourceMessageReplyParams() {
147 void ResourceMessageReplyParams::Serialize(IPC::Message
* msg
) const {
148 ResourceMessageParams::Serialize(msg
);
149 IPC::ParamTraits
<int32_t>::Write(msg
, result_
);
152 bool ResourceMessageReplyParams::Deserialize(const IPC::Message
* msg
,
153 PickleIterator
* iter
) {
154 if (!ResourceMessageParams::Deserialize(msg
, iter
))
156 return IPC::ParamTraits
<int32_t>::Read(msg
, iter
, &result_
);