Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5521)

Unified Diff: chromeos/network/shill_property_util.cc

Issue 23712002: Cleanup network type matching. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Generalized network type matching. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/network/shill_property_util.cc
diff --git a/chromeos/network/shill_property_util.cc b/chromeos/network/shill_property_util.cc
index 9cbd2daed63ca337473f33daca7215bde980a473..6ec3758661fded0074a61ed0e6a959ab07564b14 100644
--- a/chromeos/network/shill_property_util.cc
+++ b/chromeos/network/shill_property_util.cc
@@ -219,4 +219,149 @@ bool CopyIdentifyingProperties(const base::DictionaryValue& service_properties,
} // namespace shill_property_util
+namespace {
+
+const char kPatternDefault[] = "PatternDefault";
+const char kPatternEthernet[] = "PatternEthernet";
+const char kPatternWireless[] = "PatternWireless";
+const char kPatternMobile[] = "PatternMobile";
+const char kPatternNonVirtual[] = "PatternNonVirtual";
+
+enum NetworkTypeBitFlag {
+ kNetworkTypeNone = 0,
+ kNetworkTypeEthernet = 1 << 0,
+ kNetworkTypeWifi = 1 << 1,
+ kNetworkTypeWimax = 1 << 2,
+ kNetworkTypeBluetooth = 1 << 3,
stevenjb 2013/09/03 16:22:43 We don't handle Bluetooth anywhere in the current
pneubeck (no reviews) 2013/09/04 12:57:29 Done.
+ kNetworkTypeCellular = 1 << 4,
+ kNetworkTypeVPN = 1 << 5,
+ kNetworkTypeEthernetEap = 1 << 6
+};
+
+struct ShillToBitFlagEntry {
+ const char* shill_network_type;
+ NetworkTypeBitFlag bit_flag;
+} shill_type_to_flag[] = {
+ { flimflam::kTypeEthernet, kNetworkTypeEthernet },
+ { shill::kTypeEthernetEap, kNetworkTypeEthernetEap },
+ { flimflam::kTypeWifi, kNetworkTypeWifi },
+ { flimflam::kTypeWimax, kNetworkTypeWimax },
+ { flimflam::kTypeBluetooth, kNetworkTypeBluetooth },
+ { flimflam::kTypeCellular, kNetworkTypeCellular },
+ { flimflam::kTypeVPN, kNetworkTypeVPN }
+};
+
+NetworkTypeBitFlag ShillNetworkTypeToFlag(const std::string& shill_type) {
+ for (size_t i = 0; i < arraysize(shill_type_to_flag); ++i) {
+ if (shill_type_to_flag[i].shill_network_type == shill_type)
+ return shill_type_to_flag[i].bit_flag;
+ }
+ NOTREACHED();
+ return kNetworkTypeNone;
+}
+
+std::string FlagToShillNetworkType(const NetworkTypeBitFlag flag) {
+ for (size_t i = 0; i < arraysize(shill_type_to_flag); ++i) {
+ if (shill_type_to_flag[i].bit_flag == flag)
+ return shill_type_to_flag[i].shill_network_type;
+ }
+ NOTREACHED();
+ return std::string();
+}
+
+} // namespace
+
+// static
+NetworkTypePattern NetworkTypePattern::Default() {
+ return NetworkTypePattern(~0);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::Wireless() {
+ return NetworkTypePattern(kNetworkTypeWifi | kNetworkTypeWimax |
+ kNetworkTypeBluetooth | kNetworkTypeCellular);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::Mobile() {
+ return NetworkTypePattern(kNetworkTypeCellular | kNetworkTypeWimax);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::NonVirtual() {
+ return NetworkTypePattern(~kNetworkTypeVPN);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::Ethernet() {
+ return NetworkTypePattern(kNetworkTypeEthernet | kNetworkTypeEthernetEap);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::WiFi() {
+ return NetworkTypePattern(kNetworkTypeWifi);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::Cellular() {
+ return NetworkTypePattern(kNetworkTypeCellular);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::VPN() {
+ return NetworkTypePattern(kNetworkTypeVPN);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::Wimax() {
+ return NetworkTypePattern(kNetworkTypeWimax);
+}
+
+// static
+NetworkTypePattern NetworkTypePattern::Primitive(
+ const std::string& shill_network_type) {
+ return NetworkTypePattern(ShillNetworkTypeToFlag(shill_network_type));
+}
+
+bool NetworkTypePattern::Equals(const NetworkTypePattern& other) const {
+ return pattern_ == other.pattern_;
+}
+
+bool NetworkTypePattern::Matches(const std::string& shill_network_type) const {
+ return ContainsPattern(Primitive(shill_network_type));
+}
+
+bool NetworkTypePattern::ContainsPattern(
+ const NetworkTypePattern& subpattern) const {
+ if (Equals(subpattern))
+ return true;
+
+ return (~pattern_ & subpattern.pattern_) == 0;
stevenjb 2013/09/03 16:22:43 I don't think this is the behavior I would expect.
pneubeck (no reviews) 2013/09/04 12:57:29 Done.
+}
+
+std::string NetworkTypePattern::ToDebugString() const {
+ if (Equals(Default()))
+ return kPatternDefault;
+ if (Equals(Ethernet()))
+ return kPatternEthernet;
+ if (Equals(Wireless()))
+ return kPatternWireless;
+ if (Equals(Mobile()))
+ return kPatternMobile;
+ if (Equals(NonVirtual()))
+ return kPatternNonVirtual;
+
+ std::string str;
+ for (size_t i = 0; i < arraysize(shill_type_to_flag); ++i) {
+ if (!(pattern_ | shill_type_to_flag[i].bit_flag))
+ continue;
+ if (!str.empty())
+ str += "|";
+ str += shill_type_to_flag[i].shill_network_type;
+ }
+ return str;
+}
+
+NetworkTypePattern::NetworkTypePattern(int pattern) : pattern_(pattern) {}
+
} // namespace chromeos
« chrome/browser/extensions/api/dial/dial_service.cc ('K') | « chromeos/network/shill_property_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698