1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/base/address_list.h" 6 7#include "base/bind.h" 8#include "base/logging.h" 9#include "base/values.h" 10#include "net/base/net_util.h" 11#include "net/base/sys_addrinfo.h" 12 13namespace net { 14 15namespace { 16 17base::Value* NetLogAddressListCallback(const AddressList* address_list, 18 NetLog::LogLevel log_level) { 19 base::DictionaryValue* dict = new base::DictionaryValue(); 20 base::ListValue* list = new base::ListValue(); 21 22 for (AddressList::const_iterator it = address_list->begin(); 23 it != address_list->end(); ++it) { 24 list->Append(new base::StringValue(it->ToString())); 25 } 26 27 dict->Set("address_list", list); 28 return dict; 29} 30 31} // namespace 32 33AddressList::AddressList() {} 34 35AddressList::~AddressList() {} 36 37AddressList::AddressList(const IPEndPoint& endpoint) { 38 push_back(endpoint); 39} 40 41// static 42AddressList AddressList::CreateFromIPAddress(const IPAddressNumber& address, 43 uint16 port) { 44 return AddressList(IPEndPoint(address, port)); 45} 46 47// static 48AddressList AddressList::CreateFromIPAddressList( 49 const IPAddressList& addresses, 50 const std::string& canonical_name) { 51 AddressList list; 52 list.set_canonical_name(canonical_name); 53 for (IPAddressList::const_iterator iter = addresses.begin(); 54 iter != addresses.end(); ++iter) { 55 list.push_back(IPEndPoint(*iter, 0)); 56 } 57 return list; 58} 59 60// static 61AddressList AddressList::CreateFromAddrinfo(const struct addrinfo* head) { 62 DCHECK(head); 63 AddressList list; 64 if (head->ai_canonname) 65 list.set_canonical_name(std::string(head->ai_canonname)); 66 for (const struct addrinfo* ai = head; ai; ai = ai->ai_next) { 67 IPEndPoint ipe; 68 // NOTE: Ignoring non-INET* families. 69 if (ipe.FromSockAddr(ai->ai_addr, ai->ai_addrlen)) 70 list.push_back(ipe); 71 else 72 DLOG(WARNING) << "Unknown family found in addrinfo: " << ai->ai_family; 73 } 74 return list; 75} 76 77// static 78AddressList AddressList::CopyWithPort(const AddressList& list, uint16 port) { 79 AddressList out; 80 out.set_canonical_name(list.canonical_name()); 81 for (size_t i = 0; i < list.size(); ++i) 82 out.push_back(IPEndPoint(list[i].address(), port)); 83 return out; 84} 85 86void AddressList::SetDefaultCanonicalName() { 87 DCHECK(!empty()); 88 set_canonical_name(front().ToStringWithoutPort()); 89} 90 91NetLog::ParametersCallback AddressList::CreateNetLogCallback() const { 92 return base::Bind(&NetLogAddressListCallback, this); 93} 94 95} // namespace net 96