blob: 484cb9b65df315caa42b2ad161253094435c5cfa [file] [log] [blame]
[email protected]339fbcff2012-02-29 16:10:321// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]c2932f5e2010-11-03 03:22:332// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/ppapi_param_traits.h"
6
7#include <string.h> // For memcpy
8
[email protected]ea505a9d2011-07-07 18:34:409#include "ppapi/c/pp_file_info.h"
[email protected]799d1ab2010-11-09 17:16:2810#include "ppapi/c/pp_resource.h"
[email protected]373a95a2011-07-01 16:58:1411#include "ppapi/c/private/ppb_flash_tcp_socket.h"
[email protected]799d1ab2010-11-09 17:16:2812#include "ppapi/proxy/ppapi_messages.h"
[email protected]c2932f5e2010-11-03 03:22:3313#include "ppapi/proxy/serialized_var.h"
[email protected]7358d572011-02-15 18:44:4014#include "ppapi/proxy/serialized_flash_menu.h"
[email protected]be0a84b2011-08-13 04:18:4415#include "ppapi/shared_impl/host_resource.h"
[email protected]c2932f5e2010-11-03 03:22:3316
17namespace IPC {
18
[email protected]1162a6a2011-04-21 17:28:1619namespace {
20
21// Deserializes a vector from IPC. This special version must be used instead
22// of the default IPC version when the vector contains a SerializedVar, either
23// directly or indirectly (i.e. a vector of objects that have a SerializedVar
24// inside them).
25//
26// The default vector deserializer does resize and then we deserialize into
27// those allocated slots. However, the implementation of vector (at least in
28// GCC's implementation), creates a new empty object using the default
29// constructor, and then sets the rest of the items to that empty one using the
30// copy constructor.
31//
32// Since we allocate the inner class when you call the default constructor and
33// transfer the inner class when you do operator=, the entire vector will end
34// up referring to the same inner class. Deserializing into this will just end
35// up overwriting the same item over and over, since all the SerializedVars
36// will refer to the same thing.
37//
38// The solution is to make a new object for each deserialized item, and then
39// add it to the vector one at a time.
40template<typename T>
41bool ReadVectorWithoutCopy(const Message* m,
42 void** iter,
43 std::vector<T>* output) {
44 // This part is just a copy of the the default ParamTraits vector Read().
45 int size;
46 // ReadLength() checks for < 0 itself.
47 if (!m->ReadLength(iter, &size))
48 return false;
49 // Resizing beforehand is not safe, see BUG 1006367 for details.
50 if (INT_MAX / sizeof(T) <= static_cast<size_t>(size))
51 return false;
52
53 output->reserve(size);
54 for (int i = 0; i < size; i++) {
55 T cur;
56 if (!ReadParam(m, iter, &cur))
57 return false;
58 output->push_back(cur);
59 }
60 return true;
61}
62
63// This serializes the vector of items to the IPC message in exactly the same
64// way as the "regular" IPC vector serializer does. But having the code here
65// saves us from having to copy this code into all ParamTraits that use the
66// ReadVectorWithoutCopy function for deserializing.
67template<typename T>
68void WriteVectorWithoutCopy(Message* m, const std::vector<T>& p) {
69 WriteParam(m, static_cast<int>(p.size()));
70 for (size_t i = 0; i < p.size(); i++)
71 WriteParam(m, p[i]);
72}
73
74} // namespace
75
[email protected]799d1ab2010-11-09 17:16:2876// PP_Bool ---------------------------------------------------------------------
77
78// static
79void ParamTraits<PP_Bool>::Write(Message* m, const param_type& p) {
[email protected]8a855a02011-07-08 05:22:4580 ParamTraits<bool>::Write(m, PP_ToBool(p));
[email protected]799d1ab2010-11-09 17:16:2881}
82
83// static
84bool ParamTraits<PP_Bool>::Read(const Message* m, void** iter, param_type* r) {
85 // We specifically want to be strict here about what types of input we accept,
86 // which ParamTraits<bool> does for us. We don't want to deserialize "2" into
87 // a PP_Bool, for example.
88 bool result = false;
89 if (!ParamTraits<bool>::Read(m, iter, &result))
90 return false;
[email protected]8a855a02011-07-08 05:22:4591 *r = PP_FromBool(result);
[email protected]799d1ab2010-11-09 17:16:2892 return true;
93}
94
95// static
96void ParamTraits<PP_Bool>::Log(const param_type& p, std::string* l) {
97}
98
[email protected]ea505a9d2011-07-07 18:34:4099// PP_FileInfo -------------------------------------------------------------
[email protected]43a40202010-11-12 16:25:01100
101// static
[email protected]ea505a9d2011-07-07 18:34:40102void ParamTraits<PP_FileInfo>::Write(Message* m, const param_type& p) {
[email protected]43a40202010-11-12 16:25:01103 ParamTraits<int64_t>::Write(m, p.size);
104 ParamTraits<int>::Write(m, static_cast<int>(p.type));
105 ParamTraits<int>::Write(m, static_cast<int>(p.system_type));
106 ParamTraits<double>::Write(m, p.creation_time);
107 ParamTraits<double>::Write(m, p.last_access_time);
108 ParamTraits<double>::Write(m, p.last_modified_time);
109}
110
111// static
[email protected]ea505a9d2011-07-07 18:34:40112bool ParamTraits<PP_FileInfo>::Read(const Message* m, void** iter,
[email protected]43a40202010-11-12 16:25:01113 param_type* r) {
114 int type, system_type;
115 if (!ParamTraits<int64_t>::Read(m, iter, &r->size) ||
116 !ParamTraits<int>::Read(m, iter, &type) ||
117 !ParamTraits<int>::Read(m, iter, &system_type) ||
118 !ParamTraits<double>::Read(m, iter, &r->creation_time) ||
119 !ParamTraits<double>::Read(m, iter, &r->last_access_time) ||
120 !ParamTraits<double>::Read(m, iter, &r->last_modified_time))
121 return false;
122 if (type != PP_FILETYPE_REGULAR &&
123 type != PP_FILETYPE_DIRECTORY &&
124 type != PP_FILETYPE_OTHER)
125 return false;
[email protected]ea505a9d2011-07-07 18:34:40126 r->type = static_cast<PP_FileType>(type);
[email protected]cc6db922011-12-10 16:54:22127 if (system_type != PP_FILESYSTEMTYPE_INVALID &&
128 system_type != PP_FILESYSTEMTYPE_EXTERNAL &&
[email protected]43a40202010-11-12 16:25:01129 system_type != PP_FILESYSTEMTYPE_LOCALPERSISTENT &&
130 system_type != PP_FILESYSTEMTYPE_LOCALTEMPORARY)
131 return false;
[email protected]ea505a9d2011-07-07 18:34:40132 r->system_type = static_cast<PP_FileSystemType>(system_type);
[email protected]43a40202010-11-12 16:25:01133 return true;
134}
135
136// static
[email protected]ea505a9d2011-07-07 18:34:40137void ParamTraits<PP_FileInfo>::Log(const param_type& p, std::string* l) {
[email protected]43a40202010-11-12 16:25:01138}
139
[email protected]5a2b68f2011-11-10 00:00:49140// PP_NetAddress_Private -------------------------------------------------------
[email protected]373a95a2011-07-01 16:58:14141
142// static
[email protected]5a2b68f2011-11-10 00:00:49143void ParamTraits<PP_NetAddress_Private>::Write(Message* m,
144 const param_type& p) {
[email protected]373a95a2011-07-01 16:58:14145 WriteParam(m, p.size);
146 m->WriteBytes(p.data, static_cast<int>(p.size));
147}
148
149// static
[email protected]5a2b68f2011-11-10 00:00:49150bool ParamTraits<PP_NetAddress_Private>::Read(const Message* m,
151 void** iter,
152 param_type* p) {
[email protected]373a95a2011-07-01 16:58:14153 uint16 size;
154 if (!ReadParam(m, iter, &size))
155 return false;
156 if (size > sizeof(p->data))
157 return false;
158 p->size = size;
159
160 const char* data;
161 if (!m->ReadBytes(iter, &data, size))
162 return false;
163 memcpy(p->data, data, size);
164 return true;
165}
166
167// static
[email protected]5a2b68f2011-11-10 00:00:49168void ParamTraits<PP_NetAddress_Private>::Log(const param_type& p,
169 std::string* l) {
170 l->append("<PP_NetAddress_Private (");
[email protected]373a95a2011-07-01 16:58:14171 LogParam(p.size, l);
172 l->append(" bytes)>");
173}
174
[email protected]c2932f5e2010-11-03 03:22:33175// PP_ObjectProperty -----------------------------------------------------------
176
177// static
178void ParamTraits<PP_ObjectProperty>::Write(Message* m, const param_type& p) {
179 // FIXME(brettw);
180}
181
182// static
183bool ParamTraits<PP_ObjectProperty>::Read(const Message* m,
184 void** iter,
185 param_type* r) {
186 // FIXME(brettw);
187 return true;
188}
189
190// static
191void ParamTraits<PP_ObjectProperty>::Log(const param_type& p, std::string* l) {
192}
193
[email protected]43a40202010-11-12 16:25:01194// PPBFlash_DrawGlyphs_Params --------------------------------------------------
[email protected]339fbcff2012-02-29 16:10:32195#if !defined(OS_NACL)
[email protected]43a40202010-11-12 16:25:01196// static
[email protected]4d2efd22011-08-18 21:58:02197void ParamTraits<ppapi::proxy::PPBFlash_DrawGlyphs_Params>::Write(
[email protected]43a40202010-11-12 16:25:01198 Message* m,
199 const param_type& p) {
[email protected]859a7f32011-01-15 03:44:13200 ParamTraits<PP_Instance>::Write(m, p.instance);
[email protected]be0a84b2011-08-13 04:18:44201 ParamTraits<ppapi::HostResource>::Write(m, p.image_data);
[email protected]4d2efd22011-08-18 21:58:02202 ParamTraits<ppapi::proxy::SerializedFontDescription>::Write(m, p.font_desc);
[email protected]43a40202010-11-12 16:25:01203 ParamTraits<uint32_t>::Write(m, p.color);
204 ParamTraits<PP_Point>::Write(m, p.position);
205 ParamTraits<PP_Rect>::Write(m, p.clip);
206 ParamTraits<float>::Write(m, p.transformation[0][0]);
207 ParamTraits<float>::Write(m, p.transformation[0][1]);
208 ParamTraits<float>::Write(m, p.transformation[0][2]);
209 ParamTraits<float>::Write(m, p.transformation[1][0]);
210 ParamTraits<float>::Write(m, p.transformation[1][1]);
211 ParamTraits<float>::Write(m, p.transformation[1][2]);
212 ParamTraits<float>::Write(m, p.transformation[2][0]);
213 ParamTraits<float>::Write(m, p.transformation[2][1]);
214 ParamTraits<float>::Write(m, p.transformation[2][2]);
[email protected]2e4361ae2011-12-15 00:03:35215 ParamTraits<PP_Bool>::Write(m, p.allow_subpixel_aa);
[email protected]43a40202010-11-12 16:25:01216 ParamTraits<std::vector<uint16_t> >::Write(m, p.glyph_indices);
217 ParamTraits<std::vector<PP_Point> >::Write(m, p.glyph_advances);
218}
219
220// static
[email protected]4d2efd22011-08-18 21:58:02221bool ParamTraits<ppapi::proxy::PPBFlash_DrawGlyphs_Params>::Read(
[email protected]43a40202010-11-12 16:25:01222 const Message* m,
223 void** iter,
224 param_type* r) {
225 return
[email protected]859a7f32011-01-15 03:44:13226 ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
[email protected]be0a84b2011-08-13 04:18:44227 ParamTraits<ppapi::HostResource>::Read(m, iter, &r->image_data) &&
[email protected]4d2efd22011-08-18 21:58:02228 ParamTraits<ppapi::proxy::SerializedFontDescription>::Read(m, iter,
[email protected]43a40202010-11-12 16:25:01229 &r->font_desc) &&
230 ParamTraits<uint32_t>::Read(m, iter, &r->color) &&
231 ParamTraits<PP_Point>::Read(m, iter, &r->position) &&
232 ParamTraits<PP_Rect>::Read(m, iter, &r->clip) &&
233 ParamTraits<float>::Read(m, iter, &r->transformation[0][0]) &&
234 ParamTraits<float>::Read(m, iter, &r->transformation[0][1]) &&
235 ParamTraits<float>::Read(m, iter, &r->transformation[0][2]) &&
236 ParamTraits<float>::Read(m, iter, &r->transformation[1][0]) &&
237 ParamTraits<float>::Read(m, iter, &r->transformation[1][1]) &&
238 ParamTraits<float>::Read(m, iter, &r->transformation[1][2]) &&
239 ParamTraits<float>::Read(m, iter, &r->transformation[2][0]) &&
240 ParamTraits<float>::Read(m, iter, &r->transformation[2][1]) &&
241 ParamTraits<float>::Read(m, iter, &r->transformation[2][2]) &&
[email protected]2e4361ae2011-12-15 00:03:35242 ParamTraits<PP_Bool>::Read(m, iter, &r->allow_subpixel_aa) &&
[email protected]43a40202010-11-12 16:25:01243 ParamTraits<std::vector<uint16_t> >::Read(m, iter, &r->glyph_indices) &&
244 ParamTraits<std::vector<PP_Point> >::Read(m, iter, &r->glyph_advances) &&
245 r->glyph_indices.size() == r->glyph_advances.size();
246}
[email protected]339fbcff2012-02-29 16:10:32247#endif // !defined(OS_NACL)
[email protected]43a40202010-11-12 16:25:01248
249// static
[email protected]4d2efd22011-08-18 21:58:02250void ParamTraits<ppapi::proxy::PPBFlash_DrawGlyphs_Params>::Log(
[email protected]43a40202010-11-12 16:25:01251 const param_type& p,
252 std::string* l) {
253}
254
[email protected]6f75c952011-08-26 04:51:07255// PPB_FileRef_CreateInfo ------------------------------------------------------
[email protected]4deeb432011-02-17 23:59:39256
257// static
[email protected]6f75c952011-08-26 04:51:07258void ParamTraits<ppapi::PPB_FileRef_CreateInfo>::Write(Message* m,
259 const param_type& p) {
[email protected]be0a84b2011-08-13 04:18:44260 ParamTraits<ppapi::HostResource>::Write(m, p.resource);
[email protected]4deeb432011-02-17 23:59:39261 ParamTraits<int>::Write(m, p.file_system_type);
[email protected]6f75c952011-08-26 04:51:07262 ParamTraits<std::string>::Write(m, p.path);
263 ParamTraits<std::string>::Write(m, p.name);
[email protected]4deeb432011-02-17 23:59:39264}
265
266// static
[email protected]6f75c952011-08-26 04:51:07267bool ParamTraits<ppapi::PPB_FileRef_CreateInfo>::Read(const Message* m,
268 void** iter,
269 param_type* r) {
[email protected]4deeb432011-02-17 23:59:39270 return
[email protected]be0a84b2011-08-13 04:18:44271 ParamTraits<ppapi::HostResource>::Read(m, iter, &r->resource) &&
[email protected]4deeb432011-02-17 23:59:39272 ParamTraits<int>::Read(m, iter, &r->file_system_type) &&
[email protected]6f75c952011-08-26 04:51:07273 ParamTraits<std::string>::Read(m, iter, &r->path) &&
274 ParamTraits<std::string>::Read(m, iter, &r->name);
[email protected]4deeb432011-02-17 23:59:39275}
276
277// static
[email protected]6f75c952011-08-26 04:51:07278void ParamTraits<ppapi::PPB_FileRef_CreateInfo>::Log(const param_type& p,
279 std::string* l) {
[email protected]4deeb432011-02-17 23:59:39280}
281
[email protected]f24448db2011-01-27 20:40:39282// PPBURLLoader_UpdateProgress_Params ------------------------------------------
283
284// static
[email protected]4d2efd22011-08-18 21:58:02285void ParamTraits<ppapi::proxy::PPBURLLoader_UpdateProgress_Params>::Write(
[email protected]f24448db2011-01-27 20:40:39286 Message* m,
287 const param_type& p) {
288 ParamTraits<PP_Instance>::Write(m, p.instance);
[email protected]be0a84b2011-08-13 04:18:44289 ParamTraits<ppapi::HostResource>::Write(m, p.resource);
[email protected]f24448db2011-01-27 20:40:39290 ParamTraits<int64_t>::Write(m, p.bytes_sent);
291 ParamTraits<int64_t>::Write(m, p.total_bytes_to_be_sent);
292 ParamTraits<int64_t>::Write(m, p.bytes_received);
293 ParamTraits<int64_t>::Write(m, p.total_bytes_to_be_received);
294}
295
296// static
[email protected]4d2efd22011-08-18 21:58:02297bool ParamTraits<ppapi::proxy::PPBURLLoader_UpdateProgress_Params>::Read(
[email protected]f24448db2011-01-27 20:40:39298 const Message* m,
299 void** iter,
300 param_type* r) {
301 return
302 ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
[email protected]be0a84b2011-08-13 04:18:44303 ParamTraits<ppapi::HostResource>::Read(m, iter, &r->resource) &&
[email protected]f24448db2011-01-27 20:40:39304 ParamTraits<int64_t>::Read(m, iter, &r->bytes_sent) &&
305 ParamTraits<int64_t>::Read(m, iter, &r->total_bytes_to_be_sent) &&
306 ParamTraits<int64_t>::Read(m, iter, &r->bytes_received) &&
307 ParamTraits<int64_t>::Read(m, iter, &r->total_bytes_to_be_received);
308}
309
310// static
[email protected]4d2efd22011-08-18 21:58:02311void ParamTraits<ppapi::proxy::PPBURLLoader_UpdateProgress_Params>::Log(
[email protected]f24448db2011-01-27 20:40:39312 const param_type& p,
313 std::string* l) {
314}
315
[email protected]43a40202010-11-12 16:25:01316// SerializedDirEntry ----------------------------------------------------------
317
318// static
[email protected]4d2efd22011-08-18 21:58:02319void ParamTraits<ppapi::proxy::SerializedDirEntry>::Write(Message* m,
320 const param_type& p) {
[email protected]43a40202010-11-12 16:25:01321 ParamTraits<std::string>::Write(m, p.name);
322 ParamTraits<bool>::Write(m, p.is_dir);
323}
324
325// static
[email protected]4d2efd22011-08-18 21:58:02326bool ParamTraits<ppapi::proxy::SerializedDirEntry>::Read(const Message* m,
327 void** iter,
328 param_type* r) {
[email protected]43a40202010-11-12 16:25:01329 return ParamTraits<std::string>::Read(m, iter, &r->name) &&
330 ParamTraits<bool>::Read(m, iter, &r->is_dir);
331}
332
333// static
[email protected]4d2efd22011-08-18 21:58:02334void ParamTraits<ppapi::proxy::SerializedDirEntry>::Log(const param_type& p,
335 std::string* l) {
[email protected]43a40202010-11-12 16:25:01336}
337
[email protected]4d2efd22011-08-18 21:58:02338// ppapi::proxy::SerializedFontDescription -------------------------------------
[email protected]799d1ab2010-11-09 17:16:28339
340// static
[email protected]4d2efd22011-08-18 21:58:02341void ParamTraits<ppapi::proxy::SerializedFontDescription>::Write(
[email protected]799d1ab2010-11-09 17:16:28342 Message* m,
343 const param_type& p) {
[email protected]4d2efd22011-08-18 21:58:02344 ParamTraits<ppapi::proxy::SerializedVar>::Write(m, p.face);
[email protected]799d1ab2010-11-09 17:16:28345 ParamTraits<int32_t>::Write(m, p.family);
346 ParamTraits<uint32_t>::Write(m, p.size);
347 ParamTraits<int32_t>::Write(m, p.weight);
348 ParamTraits<PP_Bool>::Write(m, p.italic);
349 ParamTraits<PP_Bool>::Write(m, p.small_caps);
350 ParamTraits<int32_t>::Write(m, p.letter_spacing);
351 ParamTraits<int32_t>::Write(m, p.word_spacing);
352}
353
354// static
[email protected]4d2efd22011-08-18 21:58:02355bool ParamTraits<ppapi::proxy::SerializedFontDescription>::Read(
[email protected]799d1ab2010-11-09 17:16:28356 const Message* m,
357 void** iter,
358 param_type* r) {
359 return
[email protected]4d2efd22011-08-18 21:58:02360 ParamTraits<ppapi::proxy::SerializedVar>::Read(m, iter, &r->face) &&
[email protected]799d1ab2010-11-09 17:16:28361 ParamTraits<int32_t>::Read(m, iter, &r->family) &&
362 ParamTraits<uint32_t>::Read(m, iter, &r->size) &&
363 ParamTraits<int32_t>::Read(m, iter, &r->weight) &&
364 ParamTraits<PP_Bool>::Read(m, iter, &r->italic) &&
365 ParamTraits<PP_Bool>::Read(m, iter, &r->small_caps) &&
366 ParamTraits<int32_t>::Read(m, iter, &r->letter_spacing) &&
367 ParamTraits<int32_t>::Read(m, iter, &r->word_spacing);
368}
369
370// static
[email protected]4d2efd22011-08-18 21:58:02371void ParamTraits<ppapi::proxy::SerializedFontDescription>::Log(
[email protected]799d1ab2010-11-09 17:16:28372 const param_type& p,
373 std::string* l) {
374}
375
[email protected]be0a84b2011-08-13 04:18:44376// HostResource ----------------------------------------------------------------
[email protected]f24448db2011-01-27 20:40:39377
378// static
[email protected]be0a84b2011-08-13 04:18:44379void ParamTraits<ppapi::HostResource>::Write(Message* m,
[email protected]7f8b26b2011-08-18 15:41:01380 const param_type& p) {
[email protected]f24448db2011-01-27 20:40:39381 ParamTraits<PP_Instance>::Write(m, p.instance());
382 ParamTraits<PP_Resource>::Write(m, p.host_resource());
383}
384
385// static
[email protected]be0a84b2011-08-13 04:18:44386bool ParamTraits<ppapi::HostResource>::Read(const Message* m,
[email protected]7f8b26b2011-08-18 15:41:01387 void** iter,
388 param_type* r) {
[email protected]f24448db2011-01-27 20:40:39389 PP_Instance instance;
390 PP_Resource resource;
391 if (!ParamTraits<PP_Instance>::Read(m, iter, &instance) ||
392 !ParamTraits<PP_Resource>::Read(m, iter, &resource))
393 return false;
394 r->SetHostResource(instance, resource);
395 return true;
396}
397
398// static
[email protected]be0a84b2011-08-13 04:18:44399void ParamTraits<ppapi::HostResource>::Log(const param_type& p,
400 std::string* l) {
[email protected]f24448db2011-01-27 20:40:39401}
402
403// SerializedVar ---------------------------------------------------------------
404
405// static
[email protected]4d2efd22011-08-18 21:58:02406void ParamTraits<ppapi::proxy::SerializedVar>::Write(Message* m,
407 const param_type& p) {
[email protected]f24448db2011-01-27 20:40:39408 p.WriteToMessage(m);
409}
410
411// static
[email protected]4d2efd22011-08-18 21:58:02412bool ParamTraits<ppapi::proxy::SerializedVar>::Read(const Message* m,
413 void** iter,
414 param_type* r) {
[email protected]f24448db2011-01-27 20:40:39415 return r->ReadFromMessage(m, iter);
416}
417
418// static
[email protected]4d2efd22011-08-18 21:58:02419void ParamTraits<ppapi::proxy::SerializedVar>::Log(const param_type& p,
420 std::string* l) {
[email protected]f24448db2011-01-27 20:40:39421}
422
[email protected]c2932f5e2010-11-03 03:22:33423// std::vector<SerializedVar> --------------------------------------------------
424
[email protected]4d2efd22011-08-18 21:58:02425void ParamTraits< std::vector<ppapi::proxy::SerializedVar> >::Write(
[email protected]c2932f5e2010-11-03 03:22:33426 Message* m,
427 const param_type& p) {
[email protected]1162a6a2011-04-21 17:28:16428 WriteVectorWithoutCopy(m, p);
[email protected]c2932f5e2010-11-03 03:22:33429}
430
431// static
[email protected]4d2efd22011-08-18 21:58:02432bool ParamTraits< std::vector<ppapi::proxy::SerializedVar> >::Read(
[email protected]c2932f5e2010-11-03 03:22:33433 const Message* m,
434 void** iter,
435 param_type* r) {
[email protected]1162a6a2011-04-21 17:28:16436 return ReadVectorWithoutCopy(m, iter, r);
[email protected]c2932f5e2010-11-03 03:22:33437}
438
439// static
[email protected]4d2efd22011-08-18 21:58:02440void ParamTraits< std::vector<ppapi::proxy::SerializedVar> >::Log(
[email protected]c2932f5e2010-11-03 03:22:33441 const param_type& p,
442 std::string* l) {
443}
444
[email protected]6f75c952011-08-26 04:51:07445// std::vector<PPB_FileRef_CreateInfo> -----------------------------------------
[email protected]1162a6a2011-04-21 17:28:16446
[email protected]6f75c952011-08-26 04:51:07447void ParamTraits< std::vector<ppapi::PPB_FileRef_CreateInfo> >::Write(
[email protected]1162a6a2011-04-21 17:28:16448 Message* m,
449 const param_type& p) {
450 WriteVectorWithoutCopy(m, p);
451}
452
453// static
[email protected]6f75c952011-08-26 04:51:07454bool ParamTraits< std::vector<ppapi::PPB_FileRef_CreateInfo> >::Read(
[email protected]1162a6a2011-04-21 17:28:16455 const Message* m,
456 void** iter,
457 param_type* r) {
458 return ReadVectorWithoutCopy(m, iter, r);
459}
460
461// static
[email protected]6f75c952011-08-26 04:51:07462void ParamTraits< std::vector<ppapi::PPB_FileRef_CreateInfo> >::Log(
[email protected]1162a6a2011-04-21 17:28:16463 const param_type& p,
464 std::string* l) {
465}
466
[email protected]7358d572011-02-15 18:44:40467// SerializedFlashMenu ---------------------------------------------------------
468
469// static
[email protected]4d2efd22011-08-18 21:58:02470void ParamTraits<ppapi::proxy::SerializedFlashMenu>::Write(
471 Message* m,
472 const param_type& p) {
[email protected]7358d572011-02-15 18:44:40473 p.WriteToMessage(m);
474}
475
476// static
[email protected]4d2efd22011-08-18 21:58:02477bool ParamTraits<ppapi::proxy::SerializedFlashMenu>::Read(const Message* m,
478 void** iter,
479 param_type* r) {
[email protected]7358d572011-02-15 18:44:40480 return r->ReadFromMessage(m, iter);
481}
482
483// static
[email protected]4d2efd22011-08-18 21:58:02484void ParamTraits<ppapi::proxy::SerializedFlashMenu>::Log(const param_type& p,
485 std::string* l) {
[email protected]7358d572011-02-15 18:44:40486}
487
[email protected]c2932f5e2010-11-03 03:22:33488} // namespace IPC