1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_P2P_BASE_CANDIDATE_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_P2P_BASE_CANDIDATE_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sstream> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/socketaddress.h" 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace cricket { 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Candidate for ICE based connection discovery. 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Candidate { 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Candidate() : preference_(0), generation_(0) {} 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Candidate(const std::string& name, const std::string& protocol, 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const talk_base::SocketAddress& address, float preference, 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& username, const std::string& password, 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& type, const std::string& network_name, 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 generation) 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : name_(name), protocol_(protocol), address_(address), 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch preference_(preference), username_(username), password_(password), 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch type_(type), network_name_(network_name), generation_(generation) {} 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & name() const { return name_; } 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_name(const std::string & name) { name_ = name; } 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & protocol() const { return protocol_; } 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_protocol(const std::string & protocol) { protocol_ = protocol; } 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const talk_base::SocketAddress & address() const { return address_; } 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_address(const talk_base::SocketAddress & address) { 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch address_ = address; 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick float preference() const { return preference_; } 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_preference(const float preference) { preference_ = preference; } 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string preference_str() const { 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::ostringstream ost; 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ost << preference_; 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return ost.str(); 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_preference_str(const std::string & preference) { 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::istringstream ist(preference); 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ist >> preference_; 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & username() const { return username_; } 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_username(const std::string & username) { username_ = username; } 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & password() const { return password_; } 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_password(const std::string & password) { password_ = password; } 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & type() const { return type_; } 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_type(const std::string & type) { type_ = type; } 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & network_name() const { return network_name_; } 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_network_name(const std::string & network_name) { 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch network_name_ = network_name; 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Candidates in a new generation replace those in the old generation. 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 generation() const { return generation_; } 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_generation(uint32 generation) { generation_ = generation; } 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string generation_str() const { 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::ostringstream ost; 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ost << generation_; 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return ost.str(); 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_generation_str(const std::string& str) { 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::istringstream ist(str); 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ist >> generation_; 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Determines whether this candidate is equivalent to the given one. 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool IsEquivalent(const Candidate& c) const { 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // We ignore the network name, since that is just debug information, and 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // the preference, since that should be the same if the rest is (and it's 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // a float so equality checking is always worrisome). 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (name_ == c.name_) && 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch (protocol_ == c.protocol_) && 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch (address_ == c.address_) && 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch (username_ == c.username_) && 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch (password_ == c.password_) && 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch (type_ == c.type_) && 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch (generation_ == c.generation_); 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string ToString() const { 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::ostringstream ost; 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ost << "Cand[" << name_ << ":" << type_ << ":" << protocol_ << ":" 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch << network_name_ << ":" << address_.ToString() << ":" 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch << username_ << ":" << password_ << "]"; 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return ost.str(); 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string name_; 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string protocol_; 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::SocketAddress address_; 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float preference_; 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string username_; 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string password_; 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string type_; 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string network_name_; 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 generation_; 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace cricket 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_P2P_BASE_CANDIDATE_H_ 138