Index: ppapi/proxy/ppapi_param_traits.cc |
=================================================================== |
--- ppapi/proxy/ppapi_param_traits.cc (revision 0) |
+++ ppapi/proxy/ppapi_param_traits.cc (revision 0) |
@@ -0,0 +1,190 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ppapi/proxy/ppapi_param_traits.h" |
+ |
+#include <string.h> // For memcpy |
+ |
+#include "ppapi/proxy/serialized_var.h" |
+ |
+namespace IPC { |
+ |
+// static |
+void ParamTraits<PP_InputEvent>::Write(Message* m, const param_type& p) { |
+ // PP_InputEvent is just POD so we can just memcpy it. |
+ m->WriteData(reinterpret_cast<const char*>(&p), sizeof(PP_InputEvent)); |
+} |
+ |
+// static |
+bool ParamTraits<PP_InputEvent>::Read(const Message* m, |
+ void** iter, |
+ param_type* r) { |
+ const char* data; |
+ int data_size; |
+ if (!m->ReadData(iter, &data, &data_size)) |
+ return false; |
+ memcpy(r, data, sizeof(PP_InputEvent)); |
+ return true; |
+} |
+ |
+// static |
+void ParamTraits<PP_InputEvent>::Log(const param_type& p, std::string* l) { |
+} |
+ |
+// PP_ObjectProperty ----------------------------------------------------------- |
+ |
+// static |
+void ParamTraits<PP_ObjectProperty>::Write(Message* m, const param_type& p) { |
+ // FIXME(brettw); |
+} |
+ |
+// static |
+bool ParamTraits<PP_ObjectProperty>::Read(const Message* m, |
+ void** iter, |
+ param_type* r) { |
+ // FIXME(brettw); |
+ return true; |
+} |
+ |
+// static |
+void ParamTraits<PP_ObjectProperty>::Log(const param_type& p, std::string* l) { |
+} |
+ |
+// PP_Point -------------------------------------------------------------------- |
+ |
+// static |
+void ParamTraits<PP_Point>::Write(Message* m, const param_type& p) { |
+ m->WriteInt(p.x); |
+ m->WriteInt(p.y); |
+} |
+ |
+// static |
+bool ParamTraits<PP_Point>::Read(const Message* m, void** iter, param_type* r) { |
+ return m->ReadInt(iter, &r->x) && !m->ReadInt(iter, &r->y); |
+} |
+ |
+// static |
+void ParamTraits<PP_Point>::Log(const param_type& p, std::string* l) { |
+} |
+ |
+// PP_Rect --------------------------------------------------------------------- |
+ |
+// static |
+void ParamTraits<PP_Rect>::Write(Message* m, const param_type& p) { |
+ m->WriteInt(p.point.x); |
+ m->WriteInt(p.point.y); |
+ m->WriteInt(p.size.width); |
+ m->WriteInt(p.size.height); |
+} |
+ |
+// static |
+bool ParamTraits<PP_Rect>::Read(const Message* m, |
+ void** iter, |
+ param_type* r) { |
+ if (!m->ReadInt(iter, &r->point.x) || |
+ !m->ReadInt(iter, &r->point.y) || |
+ !m->ReadInt(iter, &r->size.width) || |
+ !m->ReadInt(iter, &r->size.height)) |
+ return false; |
+ return true; |
+} |
+ |
+// static |
+void ParamTraits<PP_Rect>::Log(const param_type& p, std::string* l) { |
+} |
+ |
+// PP_Size --------------------------------------------------------------------- |
+ |
+// static |
+void ParamTraits<PP_Size>::Write(Message* m, const param_type& p) { |
+ m->WriteInt(p.width); |
+ m->WriteInt(p.height); |
+} |
+ |
+// static |
+bool ParamTraits<PP_Size>::Read(const Message* m, void** iter, param_type* r) { |
+ return m->ReadInt(iter, &r->width) && m->ReadInt(iter, &r->height); |
+} |
+ |
+// static |
+void ParamTraits<PP_Size>::Log(const param_type& p, std::string* l) { |
+} |
+ |
+// SerializedVar --------------------------------------------------------------- |
+ |
+// static |
+void ParamTraits<pp::proxy::SerializedVar>::Write(Message* m, |
+ const param_type& p) { |
+ p.WriteToMessage(m); |
+} |
+ |
+// static |
+bool ParamTraits<pp::proxy::SerializedVar>::Read(const Message* m, |
+ void** iter, |
+ param_type* r) { |
+ return r->ReadFromMessage(m, iter); |
+} |
+ |
+// static |
+void ParamTraits<pp::proxy::SerializedVar>::Log(const param_type& p, |
+ std::string* l) { |
+} |
+ |
+// std::vector<SerializedVar> -------------------------------------------------- |
+ |
+void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Write( |
+ Message* m, |
+ const param_type& p) { |
+ WriteParam(m, static_cast<int>(p.size())); |
+ for (size_t i = 0; i < p.size(); i++) |
+ WriteParam(m, p[i]); |
+} |
+ |
+// static |
+bool ParamTraits< std::vector<pp::proxy::SerializedVar> >::Read( |
+ const Message* m, |
+ void** iter, |
+ param_type* r) { |
+ // This part is just a copy of the the default ParamTraits vector Read(). |
+ int size; |
+ // ReadLength() checks for < 0 itself. |
+ if (!m->ReadLength(iter, &size)) |
+ return false; |
+ // Resizing beforehand is not safe, see BUG 1006367 for details. |
+ if (INT_MAX / sizeof(pp::proxy::SerializedVar) <= static_cast<size_t>(size)) |
+ return false; |
+ |
+ // The default vector deserializer does resize here and then we deserialize |
+ // into those allocated slots. However, the implementation of vector (at |
+ // least in GCC's implementation), creates a new empty object using the |
+ // default constructor, and then sets the rest of the items to that empty |
+ // one using the copy constructor. |
+ // |
+ // Since we allocate the inner class when you call the default constructor |
+ // and transfer the inner class when you do operator=, the entire vector |
+ // will end up referring to the same inner class. Deserializing into this |
+ // will just end up overwriting the same item over and over, since all the |
+ // SerializedVars will refer to the same thing. |
+ // |
+ // The solution is to make a new SerializedVar for each deserialized item, |
+ // and then add it to the vector one at a time. Our copies are efficient so |
+ // this is no big deal. |
+ r->reserve(size); |
+ for (int i = 0; i < size; i++) { |
+ pp::proxy::SerializedVar var; |
+ if (!ReadParam(m, iter, &var)) |
+ return false; |
+ r->push_back(var); |
+ } |
+ return true; |
+} |
+ |
+// static |
+void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Log( |
+ const param_type& p, |
+ std::string* l) { |
+} |
+ |
+ |
+} // namespace IPC |
Property changes on: ppapi/proxy/ppapi_param_traits.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |