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) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/page_state.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/referrer.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/ip_endpoint.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<GURL>::Write(Message* m, const GURL& p) { 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(p.possibly_invalid_spec().length() <= content::GetMaxURLChars()); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Beware of print-parse inconsistency which would change an invalid 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // URL into a valid one. Ideally, the message would contain this flag 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so that the read side could make the check, but performing it here 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // avoids changing the on-the-wire representation of such a fundamental 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // type as GURL. See https://crbug.com/166486 for additional work in 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this area. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!p.is_valid()) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m->WriteString(std::string()); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->WriteString(p.possibly_invalid_spec()); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) bug 684583: Add encoding for query params. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<GURL>::Read(const Message* m, PickleIterator* iter, GURL* p) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string s; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!m->ReadString(iter, &s) || s.length() > content::GetMaxURLChars()) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p = GURL(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p = GURL(s); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!s.empty() && !p->is_valid()) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *p = GURL(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<GURL>::Log(const GURL& p, std::string* l) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l->append(p.spec()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ParamTraits<url::Origin>::Write(Message* m, 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const url::Origin& p) { 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) m->WriteString(p.string()); 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ParamTraits<url::Origin>::Read(const Message* m, 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PickleIterator* iter, 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url::Origin* p) { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string s; 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!m->ReadString(iter, &s)) { 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *p = url::Origin(); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *p = url::Origin(s); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ParamTraits<url::Origin>::Log(const url::Origin& p, std::string* l) { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) l->append(p.string()); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<net::HostPortPair>::Write(Message* m, const param_type& p) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteParam(m, p.host()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteParam(m, p.port()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<net::HostPortPair>::Read(const Message* m, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickleIterator* iter, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param_type* r) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string host; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 port; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ReadParam(m, iter, &host) || !ReadParam(m, iter, &port)) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->set_host(host); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->set_port(port); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<net::HostPortPair>::Log(const param_type& p, std::string* l) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l->append(p.ToString()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ParamTraits<net::IPEndPoint>::Write(Message* m, const param_type& p) { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WriteParam(m, p.address()); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WriteParam(m, p.port()); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ParamTraits<net::IPEndPoint>::Read(const Message* m, PickleIterator* iter, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) param_type* p) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::IPAddressNumber address; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int port; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ReadParam(m, iter, &address) || !ReadParam(m, iter, &port)) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (address.size() && 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) address.size() != net::kIPv4AddressSize && 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) address.size() != net::kIPv6AddressSize) { 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = net::IPEndPoint(address, port); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ParamTraits<net::IPEndPoint>::Log(const param_type& p, std::string* l) { 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LogParam("IPEndPoint:" + p.ToString(), l); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ParamTraits<content::PageState>::Write( 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Message* m, const param_type& p) { 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WriteParam(m, p.ToEncodedData()); 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool ParamTraits<content::PageState>::Read( 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const Message* m, PickleIterator* iter, param_type* r) { 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string data; 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ReadParam(m, iter, &data)) 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *r = content::PageState::CreateFromEncodedData(data); 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ParamTraits<content::PageState>::Log( 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const param_type& p, std::string* l) { 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l->append("("); 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LogParam(p.ToEncodedData(), l); 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l->append(")"); 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace IPC 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits write methods. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_write_macros.h" 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace IPC 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits read methods. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_read_macros.h" 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h" 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace IPC 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate param traits log methods. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_log_macros.h" 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits_macros.h" 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace IPC 164