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