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