blob: dbbc643256fd37974e0de9349510b67ba5ac4dc7 [file] [log] [blame]
[email protected]c2932f5e2010-11-03 03:22:331// Copyright (c) 2010 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.
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"
11#include "ppapi/proxy/interface_proxy.h"
12#include "ppapi/proxy/ppapi_messages.h"
[email protected]c2932f5e2010-11-03 03:22:3313#include "ppapi/proxy/serialized_var.h"
14
15namespace IPC {
16
[email protected]799d1ab2010-11-09 17:16:2817// PP_Bool ---------------------------------------------------------------------
18
19// static
20void ParamTraits<PP_Bool>::Write(Message* m, const param_type& p) {
21 ParamTraits<bool>::Write(m, pp::proxy::PPBoolToBool(p));
22}
23
24// static
25bool ParamTraits<PP_Bool>::Read(const Message* m, void** iter, param_type* r) {
26 // We specifically want to be strict here about what types of input we accept,
27 // which ParamTraits<bool> does for us. We don't want to deserialize "2" into
28 // a PP_Bool, for example.
29 bool result = false;
30 if (!ParamTraits<bool>::Read(m, iter, &result))
31 return false;
32 *r = pp::proxy::BoolToPPBool(result);
33 return true;
34}
35
36// static
37void ParamTraits<PP_Bool>::Log(const param_type& p, std::string* l) {
38}
39
[email protected]43a40202010-11-12 16:25:0140// PP_FileInfo_Dev -------------------------------------------------------------
41
42// static
43void ParamTraits<PP_FileInfo_Dev>::Write(Message* m, const param_type& p) {
44 ParamTraits<int64_t>::Write(m, p.size);
45 ParamTraits<int>::Write(m, static_cast<int>(p.type));
46 ParamTraits<int>::Write(m, static_cast<int>(p.system_type));
47 ParamTraits<double>::Write(m, p.creation_time);
48 ParamTraits<double>::Write(m, p.last_access_time);
49 ParamTraits<double>::Write(m, p.last_modified_time);
50}
51
52// static
53bool ParamTraits<PP_FileInfo_Dev>::Read(const Message* m, void** iter,
54 param_type* r) {
55 int type, system_type;
56 if (!ParamTraits<int64_t>::Read(m, iter, &r->size) ||
57 !ParamTraits<int>::Read(m, iter, &type) ||
58 !ParamTraits<int>::Read(m, iter, &system_type) ||
59 !ParamTraits<double>::Read(m, iter, &r->creation_time) ||
60 !ParamTraits<double>::Read(m, iter, &r->last_access_time) ||
61 !ParamTraits<double>::Read(m, iter, &r->last_modified_time))
62 return false;
63 if (type != PP_FILETYPE_REGULAR &&
64 type != PP_FILETYPE_DIRECTORY &&
65 type != PP_FILETYPE_OTHER)
66 return false;
67 r->type = static_cast<PP_FileType_Dev>(type);
68 if (system_type != PP_FILESYSTEMTYPE_EXTERNAL &&
69 system_type != PP_FILESYSTEMTYPE_LOCALPERSISTENT &&
70 system_type != PP_FILESYSTEMTYPE_LOCALTEMPORARY)
71 return false;
72 r->system_type = static_cast<PP_FileSystemType_Dev>(system_type);
73 return true;
74}
75
76// static
77void ParamTraits<PP_FileInfo_Dev>::Log(const param_type& p, std::string* l) {
78}
79
[email protected]799d1ab2010-11-09 17:16:2880// PP_InputEvent ---------------------------------------------------------------
81
[email protected]c2932f5e2010-11-03 03:22:3382// static
83void ParamTraits<PP_InputEvent>::Write(Message* m, const param_type& p) {
84 // PP_InputEvent is just POD so we can just memcpy it.
85 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(PP_InputEvent));
86}
87
88// static
89bool ParamTraits<PP_InputEvent>::Read(const Message* m,
90 void** iter,
91 param_type* r) {
92 const char* data;
93 int data_size;
94 if (!m->ReadData(iter, &data, &data_size))
95 return false;
96 memcpy(r, data, sizeof(PP_InputEvent));
97 return true;
98}
99
100// static
101void ParamTraits<PP_InputEvent>::Log(const param_type& p, std::string* l) {
102}
103
104// PP_ObjectProperty -----------------------------------------------------------
105
106// static
107void ParamTraits<PP_ObjectProperty>::Write(Message* m, const param_type& p) {
108 // FIXME(brettw);
109}
110
111// static
112bool ParamTraits<PP_ObjectProperty>::Read(const Message* m,
113 void** iter,
114 param_type* r) {
115 // FIXME(brettw);
116 return true;
117}
118
119// static
120void ParamTraits<PP_ObjectProperty>::Log(const param_type& p, std::string* l) {
121}
122
123// PP_Point --------------------------------------------------------------------
124
125// static
126void ParamTraits<PP_Point>::Write(Message* m, const param_type& p) {
127 m->WriteInt(p.x);
128 m->WriteInt(p.y);
129}
130
131// static
132bool ParamTraits<PP_Point>::Read(const Message* m, void** iter, param_type* r) {
[email protected]9ca952d2010-11-11 20:43:50133 return m->ReadInt(iter, &r->x) && m->ReadInt(iter, &r->y);
[email protected]c2932f5e2010-11-03 03:22:33134}
135
136// static
137void ParamTraits<PP_Point>::Log(const param_type& p, std::string* l) {
138}
139
140// PP_Rect ---------------------------------------------------------------------
141
142// static
143void ParamTraits<PP_Rect>::Write(Message* m, const param_type& p) {
144 m->WriteInt(p.point.x);
145 m->WriteInt(p.point.y);
146 m->WriteInt(p.size.width);
147 m->WriteInt(p.size.height);
148}
149
150// static
151bool ParamTraits<PP_Rect>::Read(const Message* m,
152 void** iter,
153 param_type* r) {
154 if (!m->ReadInt(iter, &r->point.x) ||
155 !m->ReadInt(iter, &r->point.y) ||
156 !m->ReadInt(iter, &r->size.width) ||
157 !m->ReadInt(iter, &r->size.height))
158 return false;
159 return true;
160}
161
162// static
163void ParamTraits<PP_Rect>::Log(const param_type& p, std::string* l) {
164}
165
166// PP_Size ---------------------------------------------------------------------
167
168// static
169void ParamTraits<PP_Size>::Write(Message* m, const param_type& p) {
170 m->WriteInt(p.width);
171 m->WriteInt(p.height);
172}
173
174// static
175bool ParamTraits<PP_Size>::Read(const Message* m, void** iter, param_type* r) {
176 return m->ReadInt(iter, &r->width) && m->ReadInt(iter, &r->height);
177}
178
179// static
180void ParamTraits<PP_Size>::Log(const param_type& p, std::string* l) {
181}
182
[email protected]43a40202010-11-12 16:25:01183// PPBFlash_DrawGlyphs_Params --------------------------------------------------
184
185// static
186void ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Write(
187 Message* m,
188 const param_type& p) {
[email protected]859a7f32011-01-15 03:44:13189 ParamTraits<PP_Instance>::Write(m, p.instance);
[email protected]43a40202010-11-12 16:25:01190 ParamTraits<PP_Resource>::Write(m, p.pp_image_data);
191 ParamTraits<pp::proxy::SerializedFontDescription>::Write(m, p.font_desc);
192 ParamTraits<uint32_t>::Write(m, p.color);
193 ParamTraits<PP_Point>::Write(m, p.position);
194 ParamTraits<PP_Rect>::Write(m, p.clip);
195 ParamTraits<float>::Write(m, p.transformation[0][0]);
196 ParamTraits<float>::Write(m, p.transformation[0][1]);
197 ParamTraits<float>::Write(m, p.transformation[0][2]);
198 ParamTraits<float>::Write(m, p.transformation[1][0]);
199 ParamTraits<float>::Write(m, p.transformation[1][1]);
200 ParamTraits<float>::Write(m, p.transformation[1][2]);
201 ParamTraits<float>::Write(m, p.transformation[2][0]);
202 ParamTraits<float>::Write(m, p.transformation[2][1]);
203 ParamTraits<float>::Write(m, p.transformation[2][2]);
204 ParamTraits<std::vector<uint16_t> >::Write(m, p.glyph_indices);
205 ParamTraits<std::vector<PP_Point> >::Write(m, p.glyph_advances);
206}
207
208// static
209bool ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Read(
210 const Message* m,
211 void** iter,
212 param_type* r) {
213 return
[email protected]859a7f32011-01-15 03:44:13214 ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
[email protected]43a40202010-11-12 16:25:01215 ParamTraits<PP_Resource>::Read(m, iter, &r->pp_image_data) &&
216 ParamTraits<pp::proxy::SerializedFontDescription>::Read(m, iter,
217 &r->font_desc) &&
218 ParamTraits<uint32_t>::Read(m, iter, &r->color) &&
219 ParamTraits<PP_Point>::Read(m, iter, &r->position) &&
220 ParamTraits<PP_Rect>::Read(m, iter, &r->clip) &&
221 ParamTraits<float>::Read(m, iter, &r->transformation[0][0]) &&
222 ParamTraits<float>::Read(m, iter, &r->transformation[0][1]) &&
223 ParamTraits<float>::Read(m, iter, &r->transformation[0][2]) &&
224 ParamTraits<float>::Read(m, iter, &r->transformation[1][0]) &&
225 ParamTraits<float>::Read(m, iter, &r->transformation[1][1]) &&
226 ParamTraits<float>::Read(m, iter, &r->transformation[1][2]) &&
227 ParamTraits<float>::Read(m, iter, &r->transformation[2][0]) &&
228 ParamTraits<float>::Read(m, iter, &r->transformation[2][1]) &&
229 ParamTraits<float>::Read(m, iter, &r->transformation[2][2]) &&
230 ParamTraits<std::vector<uint16_t> >::Read(m, iter, &r->glyph_indices) &&
231 ParamTraits<std::vector<PP_Point> >::Read(m, iter, &r->glyph_advances) &&
232 r->glyph_indices.size() == r->glyph_advances.size();
233}
234
235// static
236void ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Log(
237 const param_type& p,
238 std::string* l) {
239}
240
[email protected]799d1ab2010-11-09 17:16:28241// PPBFont_DrawTextAt_Params ---------------------------------------------------
242
243// static
244void ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Write(
245 Message* m,
246 const param_type& p) {
247 ParamTraits<PP_Resource>::Write(m, p.font);
248 ParamTraits<PP_Resource>::Write(m, p.image_data);
249 ParamTraits<PP_Bool>::Write(m, p.text_is_rtl);
250 ParamTraits<PP_Bool>::Write(m, p.override_direction);
251 ParamTraits<PP_Point>::Write(m, p.position);
252 ParamTraits<uint32_t>::Write(m, p.color);
253 ParamTraits<PP_Rect>::Write(m, p.clip);
254 ParamTraits<bool>::Write(m, p.clip_is_null);
255 ParamTraits<PP_Bool>::Write(m, p.image_data_is_opaque);
256}
257
258// static
259bool ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Read(
260 const Message* m,
261 void** iter,
262 param_type* r) {
263 return
264 ParamTraits<PP_Resource>::Read(m, iter, &r->font) &&
265 ParamTraits<PP_Resource>::Read(m, iter, &r->image_data) &&
266 ParamTraits<PP_Bool>::Read(m, iter, &r->text_is_rtl) &&
267 ParamTraits<PP_Bool>::Read(m, iter, &r->override_direction) &&
268 ParamTraits<PP_Point>::Read(m, iter, &r->position) &&
269 ParamTraits<uint32_t>::Read(m, iter, &r->color) &&
270 ParamTraits<PP_Rect>::Read(m, iter, &r->clip) &&
271 ParamTraits<bool>::Read(m, iter, &r->clip_is_null) &&
272 ParamTraits<PP_Bool>::Read(m, iter, &r->image_data_is_opaque);
273}
274
275// static
276void ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Log(
277 const param_type& p,
278 std::string* l) {
279}
280
[email protected]43a40202010-11-12 16:25:01281// SerializedDirEntry ----------------------------------------------------------
282
283// static
284void ParamTraits<pp::proxy::SerializedDirEntry>::Write(Message* m,
285 const param_type& p) {
286 ParamTraits<std::string>::Write(m, p.name);
287 ParamTraits<bool>::Write(m, p.is_dir);
288}
289
290// static
291bool ParamTraits<pp::proxy::SerializedDirEntry>::Read(const Message* m,
292 void** iter,
293 param_type* r) {
294 return ParamTraits<std::string>::Read(m, iter, &r->name) &&
295 ParamTraits<bool>::Read(m, iter, &r->is_dir);
296}
297
298// static
299void ParamTraits<pp::proxy::SerializedDirEntry>::Log(const param_type& p,
300 std::string* l) {
301}
302
[email protected]c2932f5e2010-11-03 03:22:33303// SerializedVar ---------------------------------------------------------------
304
305// static
306void ParamTraits<pp::proxy::SerializedVar>::Write(Message* m,
307 const param_type& p) {
308 p.WriteToMessage(m);
309}
310
311// static
312bool ParamTraits<pp::proxy::SerializedVar>::Read(const Message* m,
313 void** iter,
314 param_type* r) {
315 return r->ReadFromMessage(m, iter);
316}
317
318// static
319void ParamTraits<pp::proxy::SerializedVar>::Log(const param_type& p,
320 std::string* l) {
321}
322
[email protected]799d1ab2010-11-09 17:16:28323// pp::proxy::SerializedFontDescription ----------------------------------------
324
325// static
326void ParamTraits<pp::proxy::SerializedFontDescription>::Write(
327 Message* m,
328 const param_type& p) {
329 ParamTraits<pp::proxy::SerializedVar>::Write(m, p.face);
330 ParamTraits<int32_t>::Write(m, p.family);
331 ParamTraits<uint32_t>::Write(m, p.size);
332 ParamTraits<int32_t>::Write(m, p.weight);
333 ParamTraits<PP_Bool>::Write(m, p.italic);
334 ParamTraits<PP_Bool>::Write(m, p.small_caps);
335 ParamTraits<int32_t>::Write(m, p.letter_spacing);
336 ParamTraits<int32_t>::Write(m, p.word_spacing);
337}
338
339// static
340bool ParamTraits<pp::proxy::SerializedFontDescription>::Read(
341 const Message* m,
342 void** iter,
343 param_type* r) {
344 return
345 ParamTraits<pp::proxy::SerializedVar>::Read(m, iter, &r->face) &&
346 ParamTraits<int32_t>::Read(m, iter, &r->family) &&
347 ParamTraits<uint32_t>::Read(m, iter, &r->size) &&
348 ParamTraits<int32_t>::Read(m, iter, &r->weight) &&
349 ParamTraits<PP_Bool>::Read(m, iter, &r->italic) &&
350 ParamTraits<PP_Bool>::Read(m, iter, &r->small_caps) &&
351 ParamTraits<int32_t>::Read(m, iter, &r->letter_spacing) &&
352 ParamTraits<int32_t>::Read(m, iter, &r->word_spacing);
353}
354
355// static
356void ParamTraits<pp::proxy::SerializedFontDescription>::Log(
357 const param_type& p,
358 std::string* l) {
359}
360
[email protected]c2932f5e2010-11-03 03:22:33361// std::vector<SerializedVar> --------------------------------------------------
362
363void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Write(
364 Message* m,
365 const param_type& p) {
366 WriteParam(m, static_cast<int>(p.size()));
367 for (size_t i = 0; i < p.size(); i++)
368 WriteParam(m, p[i]);
369}
370
371// static
372bool ParamTraits< std::vector<pp::proxy::SerializedVar> >::Read(
373 const Message* m,
374 void** iter,
375 param_type* r) {
376 // This part is just a copy of the the default ParamTraits vector Read().
377 int size;
378 // ReadLength() checks for < 0 itself.
379 if (!m->ReadLength(iter, &size))
380 return false;
381 // Resizing beforehand is not safe, see BUG 1006367 for details.
382 if (INT_MAX / sizeof(pp::proxy::SerializedVar) <= static_cast<size_t>(size))
383 return false;
384
385 // The default vector deserializer does resize here and then we deserialize
386 // into those allocated slots. However, the implementation of vector (at
387 // least in GCC's implementation), creates a new empty object using the
388 // default constructor, and then sets the rest of the items to that empty
389 // one using the copy constructor.
390 //
391 // Since we allocate the inner class when you call the default constructor
392 // and transfer the inner class when you do operator=, the entire vector
393 // will end up referring to the same inner class. Deserializing into this
394 // will just end up overwriting the same item over and over, since all the
395 // SerializedVars will refer to the same thing.
396 //
397 // The solution is to make a new SerializedVar for each deserialized item,
398 // and then add it to the vector one at a time. Our copies are efficient so
399 // this is no big deal.
400 r->reserve(size);
401 for (int i = 0; i < size; i++) {
402 pp::proxy::SerializedVar var;
403 if (!ReadParam(m, iter, &var))
404 return false;
405 r->push_back(var);
406 }
407 return true;
408}
409
410// static
411void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Log(
412 const param_type& p,
413 std::string* l) {
414}
415
[email protected]c2932f5e2010-11-03 03:22:33416} // namespace IPC