common_param_traits.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/ip_endpoint.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_f.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SkBitmap_Data {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The configuration for the bitmap (bits per pixel, etc).
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap::Config fConfig;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The width of the bitmap in pixels.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 fWidth;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The height of the bitmap in pixels.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 fHeight;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitSkBitmapDataForTransfer(const SkBitmap& bitmap) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fConfig = bitmap.config();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fWidth = bitmap.width();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fHeight = bitmap.height();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether |bitmap| successfully initialized.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InitSkBitmapFromData(SkBitmap* bitmap, const char* pixels,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t total_pixels) const {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (total_pixels) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bitmap->setConfig(fConfig, fWidth, fHeight, 0);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!bitmap->allocPixels())
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (total_pixels != bitmap->getSize())
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(bitmap->getPixels(), pixels, total_pixels);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<GURL>::Write(Message* m, const GURL& p) {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(p.possibly_invalid_spec().length() <= content::GetMaxURLChars());
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Beware of print-parse inconsistency which would change an invalid
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // URL into a valid one. Ideally, the message would contain this flag
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so that the read side could make the check, but performing it here
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // avoids changing the on-the-wire representation of such a fundamental
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // type as GURL. See https://crbug.com/166486 for additional work in
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this area.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!p.is_valid()) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m->WriteString(std::string());
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteString(p.possibly_invalid_spec());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) bug 684583: Add encoding for query params.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<GURL>::Read(const Message* m, PickleIterator* iter, GURL* p) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string s;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!m->ReadString(iter, &s) || s.length() > content::GetMaxURLChars()) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *p = GURL();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *p = GURL(s);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!s.empty() && !p->is_valid()) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *p = GURL();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<GURL>::Log(const GURL& p, std::string* l) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(p.spec());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<net::HostPortPair>::Write(Message* m, const param_type& p) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.host());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.port());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<net::HostPortPair>::Read(const Message* m,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          PickleIterator* iter,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          param_type* r) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &host) || !ReadParam(m, iter, &port))
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_host(host);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_port(port);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<net::HostPortPair>::Log(const param_type& p, std::string* l) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(p.ToString());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ParamTraits<net::IPEndPoint>::Write(Message* m, const param_type& p) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WriteParam(m, p.address());
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WriteParam(m, p.port());
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ParamTraits<net::IPEndPoint>::Read(const Message* m, PickleIterator* iter,
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        param_type* p) {
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::IPAddressNumber address;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int port;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!ReadParam(m, iter, &address) || !ReadParam(m, iter, &port))
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *p = net::IPEndPoint(address, port);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ParamTraits<net::IPEndPoint>::Log(const param_type& p, std::string* l) {
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LogParam("IPEndPoint:" + p.ToString(), l);
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ParamTraits<content::PageState>::Write(
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Message* m, const param_type& p) {
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WriteParam(m, p.ToEncodedData());
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool ParamTraits<content::PageState>::Read(
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string data;
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!ReadParam(m, iter, &data))
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  *r = content::PageState::CreateFromEncodedData(data);
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ParamTraits<content::PageState>::Log(
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const param_type& p, std::string* l) {
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l->append("(");
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LogParam(p.ToEncodedData(), l);
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l->append(")");
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Point>::Write(Message* m, const gfx::Point& p) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteInt(p.x());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteInt(p.y());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Point>::Read(const Message* m, PickleIterator* iter,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   gfx::Point* r) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x, y;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadInt(iter, &x) ||
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !m->ReadInt(iter, &y))
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_x(x);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r->set_y(y);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Point>::Log(const gfx::Point& p, std::string* l) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d)", p.x(), p.y()));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::PointF>::Write(Message* m, const gfx::PointF& v) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParamTraits<float>::Write(m, v.x());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParamTraits<float>::Write(m, v.y());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::PointF>::Read(const Message* m,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      PickleIterator* iter,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::PointF* r) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float x, y;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ParamTraits<float>::Read(m, iter, &x) ||
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ParamTraits<float>::Read(m, iter, &y))
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  r->set_x(x);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  r->set_y(y);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::PointF>::Log(const gfx::PointF& v, std::string* l) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Size>::Write(Message* m, const gfx::Size& p) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_GE(p.width(), 0);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_GE(p.height(), 0);
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int values[2] = { p.width(), p.height() };
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(int) * 2);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Size>::Read(const Message* m,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PickleIterator* iter,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  gfx::Size* r) {
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 2))
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int* values = reinterpret_cast<const int*>(char_values);
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (values[0] < 0 || values[1] < 0)
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_width(values[0]);
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_height(values[1]);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::string* l) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d)", p.width(), p.height()));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::SizeF>::Write(Message* m, const gfx::SizeF& p) {
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float values[2] = { p.width(), p.height() };
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(float) * 2);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::SizeF>::Read(const Message* m,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PickleIterator* iter,
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                   gfx::SizeF* r) {
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 2))
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const float* values = reinterpret_cast<const float*>(char_values);
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_width(values[0]);
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_height(values[1]);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::SizeF>::Log(const gfx::SizeF& p, std::string* l) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(base::StringPrintf("(%f, %f)", p.width(), p.height()));
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ParamTraits<gfx::Vector2d>::Write(Message* m, const gfx::Vector2d& p) {
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int values[2] = { p.x(), p.y() };
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(int) * 2);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Vector2d>::Read(const Message* m,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      PickleIterator* iter,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      gfx::Vector2d* r) {
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 2))
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int* values = reinterpret_cast<const int*>(char_values);
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_x(values[0]);
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_y(values[1]);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Vector2d>::Log(const gfx::Vector2d& v, std::string* l) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d)", v.x(), v.y()));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ParamTraits<gfx::Vector2dF>::Write(Message* m, const gfx::Vector2dF& p) {
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float values[2] = { p.x(), p.y() };
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(float) * 2);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::Vector2dF>::Read(const Message* m,
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      PickleIterator* iter,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Vector2dF* r) {
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 2))
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const float* values = reinterpret_cast<const float*>(char_values);
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_x(values[0]);
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->set_y(values[1]);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::Vector2dF>::Log(const gfx::Vector2dF& v, std::string* l) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Rect>::Write(Message* m, const gfx::Rect& p) {
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int values[4] = { p.x(), p.y(), p.width(), p.height() };
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(int) * 4);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::Rect>::Read(const Message* m,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PickleIterator* iter,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  gfx::Rect* r) {
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 4))
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int* values = reinterpret_cast<const int*>(char_values);
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (values[2] < 0 || values[3] < 0)
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->SetRect(values[0], values[1], values[2], values[3]);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::Rect>::Log(const gfx::Rect& p, std::string* l) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%d, %d, %d, %d)", p.x(), p.y(),
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               p.width(), p.height()));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::RectF>::Write(Message* m, const gfx::RectF& p) {
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float values[4] = { p.x(), p.y(), p.width(), p.height() };
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&values, sizeof(float) * 4);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<gfx::RectF>::Read(const Message* m,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   PickleIterator* iter,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   gfx::RectF* r) {
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* char_values;
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 4))
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const float* values = reinterpret_cast<const float*>(char_values);
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->SetRect(values[0], values[1], values[2], values[3]);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<gfx::RectF>::Log(const gfx::RectF& p, std::string* l) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(base::StringPrintf("(%f, %f, %f, %f)", p.x(), p.y(),
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               p.width(), p.height()));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<SkBitmap>::Write(Message* m, const SkBitmap& p) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t fixed_size = sizeof(SkBitmap_Data);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap_Data bmp_data;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bmp_data.InitSkBitmapDataForTransfer(p);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteData(reinterpret_cast<const char*>(&bmp_data),
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               static_cast<int>(fixed_size));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t pixel_size = p.getSize();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkAutoLockPixels p_lock(p);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m->WriteData(reinterpret_cast<const char*>(p.getPixels()),
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               static_cast<int>(pixel_size));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<SkBitmap>::Read(const Message* m,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 PickleIterator* iter,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 SkBitmap* r) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* fixed_data;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fixed_data_size = 0;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadData(iter, &fixed_data, &fixed_data_size) ||
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (fixed_data_size <= 0)) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fixed_data_size != sizeof(SkBitmap_Data))
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;  // Message is malformed.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* variable_data;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int variable_data_size = 0;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!m->ReadData(iter, &variable_data, &variable_data_size) ||
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (variable_data_size < 0)) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkBitmap_Data* bmp_data =
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const SkBitmap_Data*>(fixed_data);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bmp_data->InitSkBitmapFromData(r, variable_data, variable_data_size);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append("<SkBitmap>");
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits write methods.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_write_macros.h"
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h"
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits read methods.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_read_macros.h"
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h"
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits log methods.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_log_macros.h"
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h"
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
388