10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004--2005, Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_P2P_BASE_CANDIDATE_H_
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_P2P_BASE_CANDIDATE_H_
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31b9518277716cf5081d3058d86ab7d98b78f696e8pbos@webrtc.org#include <limits.h>
32b9518277716cf5081d3058d86ab7d98b78f696e8pbos@webrtc.org#include <math.h>
33b9518277716cf5081d3058d86ab7d98b78f696e8pbos@webrtc.org
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <iomanip>
35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <sstream>
36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <string>
378a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org
38cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/constants.h"
392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/basictypes.h"
402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/socketaddress.h"
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Candidate for ICE based connection discovery.
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Candidate {
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO: Match the ordering and param list as per RFC 5245
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // candidate-attribute syntax. http://tools.ietf.org/html/rfc5245#section-15.1
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Candidate() : component_(0), priority_(0), generation_(0) {}
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Candidate(const std::string& id, int component, const std::string& protocol,
522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org            const rtc::SocketAddress& address, uint32 priority,
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            const std::string& username, const std::string& password,
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            const std::string& type, const std::string& network_name,
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            uint32 generation, const std::string& foundation)
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : id_(id), component_(component), protocol_(protocol), address_(address),
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        priority_(priority), username_(username), password_(password),
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        type_(type), network_name_(network_name), generation_(generation),
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        foundation_(foundation) {
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string & id() const { return id_; }
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_id(const std::string & id) { id_ = id; }
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int component() const { return component_; }
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_component(int component) { component_ = component; }
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string & protocol() const { return protocol_; }
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_protocol(const std::string & protocol) { protocol_ = protocol; }
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  const rtc::SocketAddress & address() const { return address_; }
722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void set_address(const rtc::SocketAddress & address) {
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    address_ = address;
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 priority() const { return priority_; }
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_priority(const uint32 priority) { priority_ = priority; }
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  void set_type_preference(uint32 type_preference) {
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//    priority_ = GetPriority(type_preference);
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  }
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Maps old preference (which was 0.0-1.0) to match priority (which
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // is 0-2^32-1) to to match RFC 5245, section 4.1.2.1.  Also see
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // https://docs.google.com/a/google.com/document/d/
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // 1iNQDiwDKMh0NQOrCqbj3DKKRT0Dn5_5UJYhmZO-t7Uc/edit
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  float preference() const {
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The preference value is clamped to two decimal precision.
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return static_cast<float>(((priority_ >> 24) * 100 / 127) / 100.0);
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_preference(float preference) {
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Limiting priority to UINT_MAX when value exceeds uint32 max.
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // This can happen for e.g. when preference = 3.
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint64 prio_val = static_cast<uint64>(preference * 127) << 24;
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    priority_ = static_cast<uint32>(
972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::_min(prio_val, static_cast<uint64>(UINT_MAX)));
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string & username() const { return username_; }
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_username(const std::string & username) { username_ = username; }
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string & password() const { return password_; }
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_password(const std::string & password) { password_ = password; }
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string & type() const { return type_; }
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_type(const std::string & type) { type_ = type; }
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string & network_name() const { return network_name_; }
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_network_name(const std::string & network_name) {
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    network_name_ = network_name;
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Candidates in a new generation replace those in the old generation.
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 generation() const { return generation_; }
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_generation(uint32 generation) { generation_ = generation; }
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string generation_str() const {
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::ostringstream ost;
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ost << generation_;
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ost.str();
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_generation_str(const std::string& str) {
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::istringstream ist(str);
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ist >> generation_;
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string& foundation() const {
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return foundation_;
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_foundation(const std::string& foundation) {
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    foundation_ = foundation;
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  const rtc::SocketAddress & related_address() const {
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return related_address_;
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_related_address(
1392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      const rtc::SocketAddress & related_address) {
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    related_address_ = related_address;
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
14258c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org  const std::string& tcptype() const { return tcptype_; }
14358c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org  void set_tcptype(const std::string& tcptype){
14458c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org    tcptype_ = tcptype;
14558c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org  }
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Determines whether this candidate is equivalent to the given one.
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsEquivalent(const Candidate& c) const {
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // We ignore the network name, since that is just debug information, and
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // the priority, since that should be the same if the rest is (and it's
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // a float so equality checking is always worrisome).
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (id_ == c.id_) &&
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (component_ == c.component_) &&
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (protocol_ == c.protocol_) &&
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (address_ == c.address_) &&
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (username_ == c.username_) &&
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (password_ == c.password_) &&
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (type_ == c.type_) &&
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (generation_ == c.generation_) &&
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (foundation_ == c.foundation_) &&
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           (related_address_ == c.related_address_);
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string ToString() const {
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ToStringInternal(false);
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string ToSensitiveString() const {
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ToStringInternal(true);
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1728a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  uint32 GetPriority(uint32 type_preference,
17388853c77c292bbaeb93f79bfe1dee6f95f70b384mallinath@webrtc.org                     int network_adapter_preference,
17488853c77c292bbaeb93f79bfe1dee6f95f70b384mallinath@webrtc.org                     int relay_preference) const {
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // RFC 5245 - 4.1.2.1.
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // priority = (2^24)*(type preference) +
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    //            (2^8)*(local preference) +
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    //            (2^0)*(256 - component ID)
1798a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org
1808a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    // |local_preference| length is 2 bytes, 0-65535 inclusive.
1818a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    // In our implemenation we will partion local_preference into
1828a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    //              0                 1
1838a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    //       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1848a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1858a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    //      |  NIC Pref     |    Addr Pref  |
1868a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1878a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    // NIC Type - Type of the network adapter e.g. 3G/Wifi/Wired.
1888a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    // Addr Pref - Address preference value as per RFC 3484.
18988853c77c292bbaeb93f79bfe1dee6f95f70b384mallinath@webrtc.org    // local preference =  (NIC Type << 8 | Addr_Pref) - relay preference.
1908a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int addr_pref = IPAddressPrecedence(address_.ipaddr());
19288853c77c292bbaeb93f79bfe1dee6f95f70b384mallinath@webrtc.org    int local_preference = ((network_adapter_preference << 8) | addr_pref) +
19388853c77c292bbaeb93f79bfe1dee6f95f70b384mallinath@webrtc.org        relay_preference;
1948a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org
1958a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    return (type_preference << 24) |
1968a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org           (local_preference << 8) |
1978a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org           (256 - component_);
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string ToStringInternal(bool sensitive) const {
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::ostringstream ost;
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string address = sensitive ? address_.ToSensitiveString() :
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      address_.ToString();
2058a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    ost << "Cand[" << foundation_ << ":" << component_ << ":"
2068a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org        << protocol_ << ":" << priority_ << ":"
2078a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org        << address << ":" << type_ << ":" << related_address_ << ":"
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        << username_ << ":" << password_ << "]";
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ost.str();
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string id_;
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int component_;
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string protocol_;
2152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::SocketAddress address_;
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 priority_;
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string username_;
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string password_;
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string type_;
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string network_name_;
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 generation_;
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string foundation_;
2232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::SocketAddress related_address_;
22458c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org  std::string tcptype_;
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_P2P_BASE_CANDIDATE_H_
230