blob: e38e9bf12c6619ade1c0946498590351dba52c5c [file] [log] [blame]
[email protected]f24448db2011-01-27 20:40:391// Copyright (c) 2011 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]43a40202010-11-12 16:25:019#include "ppapi/c/dev/pp_file_info_dev.h"
[email protected]799d1ab2010-11-09 17:16:2810#include "ppapi/c/pp_resource.h"
[email protected]f24448db2011-01-27 20:40:3911#include "ppapi/proxy/host_resource.h"
[email protected]799d1ab2010-11-09 17:16:2812#include "ppapi/proxy/interface_proxy.h"
13#include "ppapi/proxy/ppapi_messages.h"
[email protected]c2932f5e2010-11-03 03:22:3314#include "ppapi/proxy/serialized_var.h"
15
16namespace IPC {
17
[email protected]799d1ab2010-11-09 17:16:2818// PP_Bool ---------------------------------------------------------------------
19
20// static
21void ParamTraits<PP_Bool>::Write(Message* m, const param_type& p) {
22 ParamTraits<bool>::Write(m, pp::proxy::PPBoolToBool(p));
23}
24
25// static
26bool ParamTraits<PP_Bool>::Read(const Message* m, void** iter, param_type* r) {
27 // We specifically want to be strict here about what types of input we accept,
28 // which ParamTraits<bool> does for us. We don't want to deserialize "2" into
29 // a PP_Bool, for example.
30 bool result = false;
31 if (!ParamTraits<bool>::Read(m, iter, &result))
32 return false;
33 *r = pp::proxy::BoolToPPBool(result);
34 return true;
35}
36
37// static
38void ParamTraits<PP_Bool>::Log(const param_type& p, std::string* l) {
39}
40
[email protected]43a40202010-11-12 16:25:0141// PP_FileInfo_Dev -------------------------------------------------------------
42
43// static
44void ParamTraits<PP_FileInfo_Dev>::Write(Message* m, const param_type& p) {
45 ParamTraits<int64_t>::Write(m, p.size);
46 ParamTraits<int>::Write(m, static_cast<int>(p.type));
47 ParamTraits<int>::Write(m, static_cast<int>(p.system_type));
48 ParamTraits<double>::Write(m, p.creation_time);
49 ParamTraits<double>::Write(m, p.last_access_time);
50 ParamTraits<double>::Write(m, p.last_modified_time);
51}
52
53// static
54bool ParamTraits<PP_FileInfo_Dev>::Read(const Message* m, void** iter,
55 param_type* r) {
56 int type, system_type;
57 if (!ParamTraits<int64_t>::Read(m, iter, &r->size) ||
58 !ParamTraits<int>::Read(m, iter, &type) ||
59 !ParamTraits<int>::Read(m, iter, &system_type) ||
60 !ParamTraits<double>::Read(m, iter, &r->creation_time) ||
61 !ParamTraits<double>::Read(m, iter, &r->last_access_time) ||
62 !ParamTraits<double>::Read(m, iter, &r->last_modified_time))
63 return false;
64 if (type != PP_FILETYPE_REGULAR &&
65 type != PP_FILETYPE_DIRECTORY &&
66 type != PP_FILETYPE_OTHER)
67 return false;
68 r->type = static_cast<PP_FileType_Dev>(type);
69 if (system_type != PP_FILESYSTEMTYPE_EXTERNAL &&
70 system_type != PP_FILESYSTEMTYPE_LOCALPERSISTENT &&
71 system_type != PP_FILESYSTEMTYPE_LOCALTEMPORARY)
72 return false;
73 r->system_type = static_cast<PP_FileSystemType_Dev>(system_type);
74 return true;
75}
76
77// static
78void ParamTraits<PP_FileInfo_Dev>::Log(const param_type& p, std::string* l) {
79}
80
[email protected]799d1ab2010-11-09 17:16:2881// PP_InputEvent ---------------------------------------------------------------
82
[email protected]c2932f5e2010-11-03 03:22:3383// static
84void ParamTraits<PP_InputEvent>::Write(Message* m, const param_type& p) {
85 // PP_InputEvent is just POD so we can just memcpy it.
86 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(PP_InputEvent));
87}
88
89// static
90bool ParamTraits<PP_InputEvent>::Read(const Message* m,
91 void** iter,
92 param_type* r) {
93 const char* data;
94 int data_size;
95 if (!m->ReadData(iter, &data, &data_size))
96 return false;
97 memcpy(r, data, sizeof(PP_InputEvent));
98 return true;
99}
100
101// static
102void ParamTraits<PP_InputEvent>::Log(const param_type& p, std::string* l) {
103}
104
105// PP_ObjectProperty -----------------------------------------------------------
106
107// static
108void ParamTraits<PP_ObjectProperty>::Write(Message* m, const param_type& p) {
109 // FIXME(brettw);
110}
111
112// static
113bool ParamTraits<PP_ObjectProperty>::Read(const Message* m,
114 void** iter,
115 param_type* r) {
116 // FIXME(brettw);
117 return true;
118}
119
120// static
121void ParamTraits<PP_ObjectProperty>::Log(const param_type& p, std::string* l) {
122}
123
124// PP_Point --------------------------------------------------------------------
125
126// static
127void ParamTraits<PP_Point>::Write(Message* m, const param_type& p) {
128 m->WriteInt(p.x);
129 m->WriteInt(p.y);
130}
131
132// static
133bool ParamTraits<PP_Point>::Read(const Message* m, void** iter, param_type* r) {
[email protected]9ca952d2010-11-11 20:43:50134 return m->ReadInt(iter, &r->x) && m->ReadInt(iter, &r->y);
[email protected]c2932f5e2010-11-03 03:22:33135}
136
137// static
138void ParamTraits<PP_Point>::Log(const param_type& p, std::string* l) {
139}
140
141// PP_Rect ---------------------------------------------------------------------
142
143// static
144void ParamTraits<PP_Rect>::Write(Message* m, const param_type& p) {
145 m->WriteInt(p.point.x);
146 m->WriteInt(p.point.y);
147 m->WriteInt(p.size.width);
148 m->WriteInt(p.size.height);
149}
150
151// static
152bool ParamTraits<PP_Rect>::Read(const Message* m,
153 void** iter,
154 param_type* r) {
155 if (!m->ReadInt(iter, &r->point.x) ||
156 !m->ReadInt(iter, &r->point.y) ||
157 !m->ReadInt(iter, &r->size.width) ||
158 !m->ReadInt(iter, &r->size.height))
159 return false;
160 return true;
161}
162
163// static
164void ParamTraits<PP_Rect>::Log(const param_type& p, std::string* l) {
165}
166
167// PP_Size ---------------------------------------------------------------------
168
169// static
170void ParamTraits<PP_Size>::Write(Message* m, const param_type& p) {
171 m->WriteInt(p.width);
172 m->WriteInt(p.height);
173}
174
175// static
176bool ParamTraits<PP_Size>::Read(const Message* m, void** iter, param_type* r) {
177 return m->ReadInt(iter, &r->width) && m->ReadInt(iter, &r->height);
178}
179
180// static
181void ParamTraits<PP_Size>::Log(const param_type& p, std::string* l) {
182}
183
[email protected]f24448db2011-01-27 20:40:39184// PPBAudio_NotifyAudioStreamCreated_Params ------------------------------------
185
186// static
187void ParamTraits<pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params>::Write(
188 Message* m,
189 const param_type& p) {
190 ParamTraits<pp::proxy::HostResource>::Write(m, p.audio_id);
191 ParamTraits<int32_t>::Write(m, p.result_code);
192 ParamTraits<PlatformFileForTransit>::Write(m, p.socket_handle);
193 ParamTraits<int32_t>::Write(m, p.length);
194}
195
196// static
197bool ParamTraits<pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params>::Read(
198 const Message* m,
199 void** iter,
200 param_type* r) {
201 return
202 ParamTraits<pp::proxy::HostResource>::Read(m, iter, &r->audio_id) &&
203 ParamTraits<int32_t>::Read(m, iter, &r->result_code) &&
204 ParamTraits<PlatformFileForTransit>::Read(m, iter, &r->socket_handle) &&
205 ParamTraits<int32_t>::Read(m, iter, &r->length);
206}
207
208// static
209void ParamTraits<pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params>::Log(
210 const param_type& p,
211 std::string* l) {
212}
213
[email protected]43a40202010-11-12 16:25:01214// PPBFlash_DrawGlyphs_Params --------------------------------------------------
215
216// static
217void ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Write(
218 Message* m,
219 const param_type& p) {
[email protected]859a7f32011-01-15 03:44:13220 ParamTraits<PP_Instance>::Write(m, p.instance);
[email protected]f24448db2011-01-27 20:40:39221 ParamTraits<pp::proxy::HostResource>::Write(m, p.image_data);
[email protected]43a40202010-11-12 16:25:01222 ParamTraits<pp::proxy::SerializedFontDescription>::Write(m, p.font_desc);
223 ParamTraits<uint32_t>::Write(m, p.color);
224 ParamTraits<PP_Point>::Write(m, p.position);
225 ParamTraits<PP_Rect>::Write(m, p.clip);
226 ParamTraits<float>::Write(m, p.transformation[0][0]);
227 ParamTraits<float>::Write(m, p.transformation[0][1]);
228 ParamTraits<float>::Write(m, p.transformation[0][2]);
229 ParamTraits<float>::Write(m, p.transformation[1][0]);
230 ParamTraits<float>::Write(m, p.transformation[1][1]);
231 ParamTraits<float>::Write(m, p.transformation[1][2]);
232 ParamTraits<float>::Write(m, p.transformation[2][0]);
233 ParamTraits<float>::Write(m, p.transformation[2][1]);
234 ParamTraits<float>::Write(m, p.transformation[2][2]);
235 ParamTraits<std::vector<uint16_t> >::Write(m, p.glyph_indices);
236 ParamTraits<std::vector<PP_Point> >::Write(m, p.glyph_advances);
237}
238
239// static
240bool ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Read(
241 const Message* m,
242 void** iter,
243 param_type* r) {
244 return
[email protected]859a7f32011-01-15 03:44:13245 ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
[email protected]f24448db2011-01-27 20:40:39246 ParamTraits<pp::proxy::HostResource>::Read(m, iter,
247 &r->image_data) &&
[email protected]43a40202010-11-12 16:25:01248 ParamTraits<pp::proxy::SerializedFontDescription>::Read(m, iter,
249 &r->font_desc) &&
250 ParamTraits<uint32_t>::Read(m, iter, &r->color) &&
251 ParamTraits<PP_Point>::Read(m, iter, &r->position) &&
252 ParamTraits<PP_Rect>::Read(m, iter, &r->clip) &&
253 ParamTraits<float>::Read(m, iter, &r->transformation[0][0]) &&
254 ParamTraits<float>::Read(m, iter, &r->transformation[0][1]) &&
255 ParamTraits<float>::Read(m, iter, &r->transformation[0][2]) &&
256 ParamTraits<float>::Read(m, iter, &r->transformation[1][0]) &&
257 ParamTraits<float>::Read(m, iter, &r->transformation[1][1]) &&
258 ParamTraits<float>::Read(m, iter, &r->transformation[1][2]) &&
259 ParamTraits<float>::Read(m, iter, &r->transformation[2][0]) &&
260 ParamTraits<float>::Read(m, iter, &r->transformation[2][1]) &&
261 ParamTraits<float>::Read(m, iter, &r->transformation[2][2]) &&
262 ParamTraits<std::vector<uint16_t> >::Read(m, iter, &r->glyph_indices) &&
263 ParamTraits<std::vector<PP_Point> >::Read(m, iter, &r->glyph_advances) &&
264 r->glyph_indices.size() == r->glyph_advances.size();
265}
266
267// static
268void ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Log(
269 const param_type& p,
270 std::string* l) {
271}
272
[email protected]799d1ab2010-11-09 17:16:28273// PPBFont_DrawTextAt_Params ---------------------------------------------------
274
275// static
276void ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Write(
277 Message* m,
278 const param_type& p) {
[email protected]f24448db2011-01-27 20:40:39279 ParamTraits<pp::proxy::HostResource>::Write(m, p.font);
280 ParamTraits<pp::proxy::HostResource>::Write(m, p.image_data);
[email protected]799d1ab2010-11-09 17:16:28281 ParamTraits<PP_Bool>::Write(m, p.text_is_rtl);
282 ParamTraits<PP_Bool>::Write(m, p.override_direction);
283 ParamTraits<PP_Point>::Write(m, p.position);
284 ParamTraits<uint32_t>::Write(m, p.color);
285 ParamTraits<PP_Rect>::Write(m, p.clip);
286 ParamTraits<bool>::Write(m, p.clip_is_null);
287 ParamTraits<PP_Bool>::Write(m, p.image_data_is_opaque);
288}
289
290// static
291bool ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Read(
292 const Message* m,
293 void** iter,
294 param_type* r) {
295 return
[email protected]f24448db2011-01-27 20:40:39296 ParamTraits<pp::proxy::HostResource>::Read(m, iter, &r->font) &&
297 ParamTraits<pp::proxy::HostResource>::Read(m, iter,
298 &r->image_data) &&
[email protected]799d1ab2010-11-09 17:16:28299 ParamTraits<PP_Bool>::Read(m, iter, &r->text_is_rtl) &&
300 ParamTraits<PP_Bool>::Read(m, iter, &r->override_direction) &&
301 ParamTraits<PP_Point>::Read(m, iter, &r->position) &&
302 ParamTraits<uint32_t>::Read(m, iter, &r->color) &&
303 ParamTraits<PP_Rect>::Read(m, iter, &r->clip) &&
304 ParamTraits<bool>::Read(m, iter, &r->clip_is_null) &&
305 ParamTraits<PP_Bool>::Read(m, iter, &r->image_data_is_opaque);
306}
307
308// static
309void ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Log(
310 const param_type& p,
311 std::string* l) {
312}
313
[email protected]f24448db2011-01-27 20:40:39314// PPBURLLoader_UpdateProgress_Params ------------------------------------------
315
316// static
317void ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params>::Write(
318 Message* m,
319 const param_type& p) {
320 ParamTraits<PP_Instance>::Write(m, p.instance);
321 ParamTraits<pp::proxy::HostResource>::Write(m, p.resource);
322 ParamTraits<int64_t>::Write(m, p.bytes_sent);
323 ParamTraits<int64_t>::Write(m, p.total_bytes_to_be_sent);
324 ParamTraits<int64_t>::Write(m, p.bytes_received);
325 ParamTraits<int64_t>::Write(m, p.total_bytes_to_be_received);
326}
327
328// static
329bool ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params>::Read(
330 const Message* m,
331 void** iter,
332 param_type* r) {
333 return
334 ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
335 ParamTraits<pp::proxy::HostResource>::Read(m, iter, &r->resource) &&
336 ParamTraits<int64_t>::Read(m, iter, &r->bytes_sent) &&
337 ParamTraits<int64_t>::Read(m, iter, &r->total_bytes_to_be_sent) &&
338 ParamTraits<int64_t>::Read(m, iter, &r->bytes_received) &&
339 ParamTraits<int64_t>::Read(m, iter, &r->total_bytes_to_be_received);
340}
341
342// static
343void ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params>::Log(
344 const param_type& p,
345 std::string* l) {
346}
347
[email protected]43a40202010-11-12 16:25:01348// SerializedDirEntry ----------------------------------------------------------
349
350// static
351void ParamTraits<pp::proxy::SerializedDirEntry>::Write(Message* m,
352 const param_type& p) {
353 ParamTraits<std::string>::Write(m, p.name);
354 ParamTraits<bool>::Write(m, p.is_dir);
355}
356
357// static
358bool ParamTraits<pp::proxy::SerializedDirEntry>::Read(const Message* m,
359 void** iter,
360 param_type* r) {
361 return ParamTraits<std::string>::Read(m, iter, &r->name) &&
362 ParamTraits<bool>::Read(m, iter, &r->is_dir);
363}
364
365// static
366void ParamTraits<pp::proxy::SerializedDirEntry>::Log(const param_type& p,
367 std::string* l) {
368}
369
[email protected]799d1ab2010-11-09 17:16:28370// pp::proxy::SerializedFontDescription ----------------------------------------
371
372// static
373void ParamTraits<pp::proxy::SerializedFontDescription>::Write(
374 Message* m,
375 const param_type& p) {
376 ParamTraits<pp::proxy::SerializedVar>::Write(m, p.face);
377 ParamTraits<int32_t>::Write(m, p.family);
378 ParamTraits<uint32_t>::Write(m, p.size);
379 ParamTraits<int32_t>::Write(m, p.weight);
380 ParamTraits<PP_Bool>::Write(m, p.italic);
381 ParamTraits<PP_Bool>::Write(m, p.small_caps);
382 ParamTraits<int32_t>::Write(m, p.letter_spacing);
383 ParamTraits<int32_t>::Write(m, p.word_spacing);
384}
385
386// static
387bool ParamTraits<pp::proxy::SerializedFontDescription>::Read(
388 const Message* m,
389 void** iter,
390 param_type* r) {
391 return
392 ParamTraits<pp::proxy::SerializedVar>::Read(m, iter, &r->face) &&
393 ParamTraits<int32_t>::Read(m, iter, &r->family) &&
394 ParamTraits<uint32_t>::Read(m, iter, &r->size) &&
395 ParamTraits<int32_t>::Read(m, iter, &r->weight) &&
396 ParamTraits<PP_Bool>::Read(m, iter, &r->italic) &&
397 ParamTraits<PP_Bool>::Read(m, iter, &r->small_caps) &&
398 ParamTraits<int32_t>::Read(m, iter, &r->letter_spacing) &&
399 ParamTraits<int32_t>::Read(m, iter, &r->word_spacing);
400}
401
402// static
403void ParamTraits<pp::proxy::SerializedFontDescription>::Log(
404 const param_type& p,
405 std::string* l) {
406}
407
[email protected]f24448db2011-01-27 20:40:39408// HostResource ----------------------------------------------------------
409
410// static
411void ParamTraits<pp::proxy::HostResource>::Write(Message* m,
412 const param_type& p) {
413 ParamTraits<PP_Instance>::Write(m, p.instance());
414 ParamTraits<PP_Resource>::Write(m, p.host_resource());
415}
416
417// static
418bool ParamTraits<pp::proxy::HostResource>::Read(const Message* m,
419 void** iter,
420 param_type* r) {
421 PP_Instance instance;
422 PP_Resource resource;
423 if (!ParamTraits<PP_Instance>::Read(m, iter, &instance) ||
424 !ParamTraits<PP_Resource>::Read(m, iter, &resource))
425 return false;
426 r->SetHostResource(instance, resource);
427 return true;
428}
429
430// static
431void ParamTraits<pp::proxy::HostResource>::Log(const param_type& p,
432 std::string* l) {
433}
434
435// SerializedVar ---------------------------------------------------------------
436
437// static
438void ParamTraits<pp::proxy::SerializedVar>::Write(Message* m,
439 const param_type& p) {
440 p.WriteToMessage(m);
441}
442
443// static
444bool ParamTraits<pp::proxy::SerializedVar>::Read(const Message* m,
445 void** iter,
446 param_type* r) {
447 return r->ReadFromMessage(m, iter);
448}
449
450// static
451void ParamTraits<pp::proxy::SerializedVar>::Log(const param_type& p,
452 std::string* l) {
453}
454
[email protected]c2932f5e2010-11-03 03:22:33455// std::vector<SerializedVar> --------------------------------------------------
456
457void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Write(
458 Message* m,
459 const param_type& p) {
460 WriteParam(m, static_cast<int>(p.size()));
461 for (size_t i = 0; i < p.size(); i++)
462 WriteParam(m, p[i]);
463}
464
465// static
466bool ParamTraits< std::vector<pp::proxy::SerializedVar> >::Read(
467 const Message* m,
468 void** iter,
469 param_type* r) {
470 // This part is just a copy of the the default ParamTraits vector Read().
471 int size;
472 // ReadLength() checks for < 0 itself.
473 if (!m->ReadLength(iter, &size))
474 return false;
475 // Resizing beforehand is not safe, see BUG 1006367 for details.
476 if (INT_MAX / sizeof(pp::proxy::SerializedVar) <= static_cast<size_t>(size))
477 return false;
478
479 // The default vector deserializer does resize here and then we deserialize
480 // into those allocated slots. However, the implementation of vector (at
481 // least in GCC's implementation), creates a new empty object using the
482 // default constructor, and then sets the rest of the items to that empty
483 // one using the copy constructor.
484 //
485 // Since we allocate the inner class when you call the default constructor
486 // and transfer the inner class when you do operator=, the entire vector
487 // will end up referring to the same inner class. Deserializing into this
488 // will just end up overwriting the same item over and over, since all the
489 // SerializedVars will refer to the same thing.
490 //
491 // The solution is to make a new SerializedVar for each deserialized item,
492 // and then add it to the vector one at a time. Our copies are efficient so
493 // this is no big deal.
494 r->reserve(size);
495 for (int i = 0; i < size; i++) {
496 pp::proxy::SerializedVar var;
497 if (!ReadParam(m, iter, &var))
498 return false;
499 r->push_back(var);
500 }
501 return true;
502}
503
504// static
505void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Log(
506 const param_type& p,
507 std::string* l) {
508}
509
[email protected]c2932f5e2010-11-03 03:22:33510} // namespace IPC