// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_NQE_NETWORK_ID_H_ #define NET_NQE_NETWORK_ID_H_ #include #include #include "base/strings/string_number_conversions.h" #include "net/base/net_export.h" #include "net/base/network_change_notifier.h" namespace { const char kValueSeparator[] = ","; // Parses |connection_type_string| as a NetworkChangeNotifier::ConnectionType. // |connection_type_string| must contain the // NetworkChangeNotifier::ConnectionType enum as an interger. net::NetworkChangeNotifier::ConnectionType ConvertStringToConnectionType( const std::string& connection_type_string) { int connection_type_int = static_cast(net::NetworkChangeNotifier::CONNECTION_UNKNOWN); bool connection_type_available = base::StringToInt(connection_type_string, &connection_type_int); if (!connection_type_available || connection_type_int < 0 || connection_type_int > static_cast(net::NetworkChangeNotifier::CONNECTION_LAST)) { DCHECK(false); return net::NetworkChangeNotifier::CONNECTION_UNKNOWN; } return static_cast( connection_type_int); } } // namespace namespace net { namespace nqe { namespace internal { // NetworkID is used to uniquely identify a network. // For the purpose of network quality estimation and caching, a network is // uniquely identified by a combination of |type| and // |id|. This approach is unable to distinguish networks with // same name (e.g., different Wi-Fi networks with same SSID). // This is a protected member to expose it to tests. struct NET_EXPORT_PRIVATE NetworkID { static NetworkID FromString(const std::string& network_id) { size_t separator_index = network_id.find(kValueSeparator); DCHECK_NE(std::string::npos, separator_index); if (separator_index == std::string::npos) { return NetworkID(NetworkChangeNotifier::CONNECTION_UNKNOWN, std::string()); } return NetworkID( ConvertStringToConnectionType(network_id.substr(separator_index + 1)), network_id.substr(0, separator_index)); } NetworkID(NetworkChangeNotifier::ConnectionType type, const std::string& id) : type(type), id(id) {} NetworkID(const NetworkID& other) : type(other.type), id(other.id) {} ~NetworkID() {} bool operator==(const NetworkID& other) const { return type == other.type && id == other.id; } bool operator!=(const NetworkID& other) const { return !operator==(other); } NetworkID& operator=(const NetworkID& other) { type = other.type; id = other.id; return *this; } // Overloaded to support ordered collections. bool operator<(const NetworkID& other) const { return std::tie(type, id) < std::tie(other.type, other.id); } std::string ToString() const { return id + kValueSeparator + base::IntToString(static_cast(type)); } // Connection type of the network. NetworkChangeNotifier::ConnectionType type; // Name of this network. This is set to: // - Wi-Fi SSID if the device is connected to a Wi-Fi access point and the // SSID name is available, or // - MCC/MNC code of the cellular carrier if the device is connected to a // cellular network, or // - "Ethernet" in case the device is connected to ethernet. // - An empty string in all other cases or if the network name is not // exposed by platform APIs. std::string id; }; } // namespace internal } // namespace nqe } // namespace net #endif // NET_NQE_NETWORK_ID_H_