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