technology.cc revision 3a62e235646ec19bee71e8dbee5208282dcd13b5
1// 2// Copyright (C) 2012 The Android Open Source Project 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16 17#include "shill/technology.h" 18 19#include <set> 20#include <string> 21#include <vector> 22 23#include <base/stl_util.h> 24#include <base/strings/string_split.h> 25#if defined(__ANDROID__) 26#include <dbus/service_constants.h> 27#else 28#include <chromeos/dbus/service_constants.h> 29#endif // __ANDROID__ 30 31#include "shill/error.h" 32#include "shill/logging.h" 33 34namespace shill { 35 36using std::set; 37using std::string; 38using std::vector; 39 40const char Technology::kLoopbackName[] = "loopback"; 41const char Technology::kTunnelName[] = "tunnel"; 42const char Technology::kPPPName[] = "ppp"; 43const char Technology::kUnknownName[] = "unknown"; 44 45// static 46Technology::Identifier Technology::IdentifierFromName(const string& name) { 47 if (name == kTypeEthernet) { 48 return kEthernet; 49 } else if (name == kTypeEthernetEap) { 50 return kEthernetEap; 51 } else if (name == kTypeWifi) { 52 return kWifi; 53 } else if (name == kTypeWimax) { 54 return kWiMax; 55 } else if (name == kTypeCellular) { 56 return kCellular; 57 } else if (name == kTypeVPN) { 58 return kVPN; 59 } else if (name == kTypePPPoE) { 60 return kPPPoE; 61 } else if (name == kLoopbackName) { 62 return kLoopback; 63 } else if (name == kTunnelName) { 64 return kTunnel; 65 } else if (name == kPPPName) { 66 return kPPP; 67 } else { 68 return kUnknown; 69 } 70} 71 72// static 73string Technology::NameFromIdentifier(Technology::Identifier id) { 74 if (id == kEthernet) { 75 return kTypeEthernet; 76 } else if (id == kEthernetEap) { 77 return kTypeEthernetEap; 78 } else if (id == kWifi) { 79 return kTypeWifi; 80 } else if (id == kWiMax) { 81 return kTypeWimax; 82 } else if (id == kCellular) { 83 return kTypeCellular; 84 } else if (id == kVPN) { 85 return kTypeVPN; 86 } else if (id == kLoopback) { 87 return kLoopbackName; 88 } else if (id == kTunnel) { 89 return kTunnelName; 90 } else if (id == kPPP) { 91 return kPPPName; 92 } else if (id == kPPPoE) { 93 return kTypePPPoE; 94 } else { 95 return kUnknownName; 96 } 97} 98 99// static 100Technology::Identifier Technology::IdentifierFromStorageGroup( 101 const string& group) { 102 vector<string> group_parts = base::SplitString( 103 group, "_", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 104 if (group_parts.empty()) { 105 return kUnknown; 106 } 107 return IdentifierFromName(group_parts[0]); 108} 109 110// static 111bool Technology::GetTechnologyVectorFromString( 112 const string& technologies_string, 113 vector<Identifier>* technologies_vector, 114 Error* error) { 115 CHECK(technologies_vector); 116 CHECK(error); 117 118 vector<string> technology_parts; 119 set<Technology::Identifier> seen; 120 technologies_vector->clear(); 121 122 // Check if |technologies_string| is empty as some versions of 123 // base::SplitString return a vector with one empty string when given an 124 // empty string. 125 if (!technologies_string.empty()) { 126 technology_parts = base::SplitString( 127 technologies_string, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 128 } 129 130 for (const auto& name : technology_parts) { 131 Technology::Identifier identifier = Technology::IdentifierFromName(name); 132 133 if (identifier == Technology::kUnknown) { 134 Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments, 135 name + " is an unknown technology name"); 136 return false; 137 } 138 139 if (ContainsKey(seen, identifier)) { 140 Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments, 141 name + " is duplicated in the list"); 142 return false; 143 } 144 seen.insert(identifier); 145 technologies_vector->push_back(identifier); 146 } 147 148 return true; 149} 150 151// static 152bool Technology::IsPrimaryConnectivityTechnology(Identifier technology) { 153 return (technology == kCellular || 154 technology == kEthernet || 155 technology == kWifi || 156 technology == kWiMax || 157 technology == kPPPoE); 158} 159 160} // namespace shill 161