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 "net/base/address_list.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/sys_addrinfo.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* NetLogAddressListCallback(const AddressList* address_list,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       NetLog::LogLevel log_level) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* list = new base::ListValue();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AddressList::const_iterator it = address_list->begin();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != address_list->end(); ++it) {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    list->Append(new base::StringValue(it->ToString()));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->Set("address_list", list);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList::AddressList() {}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList::~AddressList() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList::AddressList(const IPEndPoint& endpoint) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  push_back(endpoint);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList AddressList::CreateFromIPAddress(const IPAddressNumber& address,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             uint16 port) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddressList(IPEndPoint(address, port));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList AddressList::CreateFromIPAddressList(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPAddressList& addresses,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& canonical_name) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddressList list;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.set_canonical_name(canonical_name);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (IPAddressList::const_iterator iter = addresses.begin();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != addresses.end(); ++iter) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.push_back(IPEndPoint(*iter, 0));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList AddressList::CreateFromAddrinfo(const struct addrinfo* head) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(head);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddressList list;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (head->ai_canonname)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.set_canonical_name(std::string(head->ai_canonname));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (const struct addrinfo* ai = head; ai; ai = ai->ai_next) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPEndPoint ipe;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: Ignoring non-INET* families.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ipe.FromSockAddr(ai->ai_addr, ai->ai_addrlen))
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list.push_back(ipe);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(WARNING) << "Unknown family found in addrinfo: " << ai->ai_family;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressList AddressList::CopyWithPort(const AddressList& list, uint16 port) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddressList out;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  out.set_canonical_name(list.canonical_name());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < list.size(); ++i)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out.push_back(IPEndPoint(list[i].address(), port));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return out;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddressList::SetDefaultCanonicalName() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!empty());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_canonical_name(front().ToStringWithoutPort());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ParametersCallback AddressList::CreateNetLogCallback() const {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&NetLogAddressListCallback, this);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
96