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