common_param_traits.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/page_state.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/referrer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_f.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SkBitmap_Data {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The configuration for the bitmap (bits per pixel, etc).
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap::Config fConfig;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The width of the bitmap in pixels.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 fWidth;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The height of the bitmap in pixels.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 fHeight;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitSkBitmapDataForTransfer(const SkBitmap& bitmap) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fConfig = bitmap.config();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fWidth = bitmap.width();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fHeight = bitmap.height();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether |bitmap| successfully initialized.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InitSkBitmapFromData(SkBitmap* bitmap, const char* pixels,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t total_pixels) const {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (total_pixels) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bitmap->setConfig(fConfig, fWidth, fHeight, 0);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!bitmap->allocPixels())
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (total_pixels != bitmap->getSize())
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(bitmap->getPixels(), pixels, total_pixels);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<GURL>::Write(Message* m, const GURL& p) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(p.possibly_invalid_spec().length() <= content::kMaxURLChars);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Beware of print-parse inconsistency which would change an invalid
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // URL into a valid one. Ideally, the message would contain this flag
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so that the read side could make the check, but performing it here
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // avoids changing the on-the-wire representation of such a fundamental
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // type as GURL. See https://crbug.com/166486 for additional work in
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this area.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!p.is_valid()) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m->WriteString(std::string());
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteString(p.possibly_invalid_spec());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) bug 684583: Add encoding for query params.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<GURL>::Read(const Message* m, PickleIterator* iter, GURL* p) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string s;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadString(iter, &s) || s.length() > content::kMaxURLChars) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *p = GURL();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *p = GURL(s);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!s.empty() && !p->is_valid()) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *p = GURL();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<GURL>::Log(const GURL& p, std::string* l) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(p.spec());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<net::HostPortPair>::Write(Message* m, const param_type& p) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.host());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.port());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<net::HostPortPair>::Read(const Message* m,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          PickleIterator* iter,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          param_type* r) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &host) || !ReadParam(m, iter, &port))
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_host(host);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_port(port);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<net::HostPortPair>::Log(const param_type& p, std::string* l) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(p.ToString());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ParamTraits<content::PageState>::Write(
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Message* m, const param_type& p) {
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WriteParam(m, p.ToEncodedData());
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool ParamTraits<content::PageState>::Read(
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string data;
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!ReadParam(m, iter, &data))
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  *r = content::PageState::CreateFromEncodedData(data);
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ParamTraits<content::PageState>::Log(
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const param_type& p, std::string* l) {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l->append("(");
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LogParam(p.ToEncodedData(), l);
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l->append(")");
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<content::Referrer>::Write(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message* m, const param_type& p) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.url);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.policy);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<content::Referrer>::Read(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ReadParam(m, iter, &r->url) && ReadParam(m, iter, &r->policy);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<content::Referrer>::Log(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append("(");
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(p.url, l);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(",");
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(p.policy, l);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(")");
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Point>::Write(Message* m, const gfx::Point& p) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteInt(p.x());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteInt(p.y());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Point>::Read(const Message* m, PickleIterator* iter,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   gfx::Point* r) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x, y;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadInt(iter, &x) ||
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !m->ReadInt(iter, &y))
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_x(x);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_y(y);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Point>::Log(const gfx::Point& p, std::string* l) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d)", p.x(), p.y()));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::PointF>::Write(Message* m, const gfx::PointF& v) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParamTraits<float>::Write(m, v.x());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParamTraits<float>::Write(m, v.y());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::PointF>::Read(const Message* m,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      PickleIterator* iter,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::PointF* r) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float x, y;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ParamTraits<float>::Read(m, iter, &x) ||
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ParamTraits<float>::Read(m, iter, &y))
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  r->set_x(x);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  r->set_y(y);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::PointF>::Log(const gfx::PointF& v, std::string* l) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Size>::Write(Message* m, const gfx::Size& p) {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_GE(p.width(), 0);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_GE(p.height(), 0);
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int values[2] = { p.width(), p.height() };
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(int) * 2);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Size>::Read(const Message* m,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PickleIterator* iter,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  gfx::Size* r) {
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 2))
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int* values = reinterpret_cast<const int*>(char_values);
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (values[0] < 0 || values[1] < 0)
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_width(values[0]);
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_height(values[1]);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::string* l) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d)", p.width(), p.height()));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::SizeF>::Write(Message* m, const gfx::SizeF& p) {
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float values[2] = { p.width(), p.height() };
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(float) * 2);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::SizeF>::Read(const Message* m,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PickleIterator* iter,
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                   gfx::SizeF* r) {
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 2))
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const float* values = reinterpret_cast<const float*>(char_values);
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_width(values[0]);
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_height(values[1]);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::SizeF>::Log(const gfx::SizeF& p, std::string* l) {
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(base::StringPrintf("(%f, %f)", p.width(), p.height()));
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ParamTraits<gfx::Vector2d>::Write(Message* m, const gfx::Vector2d& p) {
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int values[2] = { p.x(), p.y() };
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(int) * 2);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Vector2d>::Read(const Message* m,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      PickleIterator* iter,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      gfx::Vector2d* r) {
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 2))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int* values = reinterpret_cast<const int*>(char_values);
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_x(values[0]);
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_y(values[1]);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Vector2d>::Log(const gfx::Vector2d& v, std::string* l) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d)", v.x(), v.y()));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ParamTraits<gfx::Vector2dF>::Write(Message* m, const gfx::Vector2dF& p) {
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float values[2] = { p.x(), p.y() };
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(float) * 2);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::Vector2dF>::Read(const Message* m,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      PickleIterator* iter,
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Vector2dF* r) {
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 2))
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const float* values = reinterpret_cast<const float*>(char_values);
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_x(values[0]);
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_y(values[1]);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::Vector2dF>::Log(const gfx::Vector2dF& v, std::string* l) {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Rect>::Write(Message* m, const gfx::Rect& p) {
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int values[4] = { p.x(), p.y(), p.width(), p.height() };
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(int) * 4);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Rect>::Read(const Message* m,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PickleIterator* iter,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  gfx::Rect* r) {
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 4))
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int* values = reinterpret_cast<const int*>(char_values);
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (values[2] < 0 || values[3] < 0)
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->SetRect(values[0], values[1], values[2], values[3]);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Rect>::Log(const gfx::Rect& p, std::string* l) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d, %d, %d)", p.x(), p.y(),
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               p.width(), p.height()));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::RectF>::Write(Message* m, const gfx::RectF& p) {
3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float values[4] = { p.x(), p.y(), p.width(), p.height() };
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(float) * 4);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::RectF>::Read(const Message* m,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   PickleIterator* iter,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   gfx::RectF* r) {
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 4))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const float* values = reinterpret_cast<const float*>(char_values);
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->SetRect(values[0], values[1], values[2], values[3]);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::RectF>::Log(const gfx::RectF& p, std::string* l) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%f, %f, %f, %f)", p.x(), p.y(),
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               p.width(), p.height()));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<SkBitmap>::Write(Message* m, const SkBitmap& p) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t fixed_size = sizeof(SkBitmap_Data);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap_Data bmp_data;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bmp_data.InitSkBitmapDataForTransfer(p);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteData(reinterpret_cast<const char*>(&bmp_data),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               static_cast<int>(fixed_size));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t pixel_size = p.getSize();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkAutoLockPixels p_lock(p);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteData(reinterpret_cast<const char*>(p.getPixels()),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               static_cast<int>(pixel_size));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<SkBitmap>::Read(const Message* m,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 PickleIterator* iter,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 SkBitmap* r) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* fixed_data;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fixed_data_size = 0;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadData(iter, &fixed_data, &fixed_data_size) ||
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (fixed_data_size <= 0)) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fixed_data_size != sizeof(SkBitmap_Data))
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;  // Message is malformed.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* variable_data;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int variable_data_size = 0;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadData(iter, &variable_data, &variable_data_size) ||
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (variable_data_size < 0)) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkBitmap_Data* bmp_data =
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const SkBitmap_Data*>(fixed_data);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bmp_data->InitSkBitmapFromData(r, variable_data, variable_data_size);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append("<SkBitmap>");
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits write methods.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_write_macros.h"
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h"
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits read methods.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_read_macros.h"
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h"
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits log methods.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_log_macros.h"
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h"
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
387