| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/system/chromeos/network/network_connect.h" | 5 #include "ash/system/chromeos/network/network_connect.h" |
| 6 | 6 |
| 7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
| 8 #include "ash/system/chromeos/network/network_observer.h" | 8 #include "ash/system/chromeos/network/network_observer.h" |
| 9 #include "ash/system/chromeos/network/network_state_notifier.h" | 9 #include "ash/system/chromeos/network/network_state_notifier.h" |
| 10 #include "ash/system/tray/system_tray_delegate.h" | 10 #include "ash/system/tray/system_tray_delegate.h" |
| 11 #include "ash/system/tray/system_tray_notifier.h" | 11 #include "ash/system/tray/system_tray_notifier.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "base/values.h" | 15 #include "base/values.h" |
| 16 #include "chromeos/network/device_state.h" |
| 17 #include "chromeos/network/network_configuration_handler.h" |
| 16 #include "chromeos/network/network_connection_handler.h" | 18 #include "chromeos/network/network_connection_handler.h" |
| 19 #include "chromeos/network/network_event_log.h" |
| 20 #include "chromeos/network/network_profile_handler.h" |
| 17 #include "chromeos/network/network_state.h" | 21 #include "chromeos/network/network_state.h" |
| 18 #include "chromeos/network/network_state_handler.h" | 22 #include "chromeos/network/network_state_handler.h" |
| 19 #include "grit/ash_strings.h" | 23 #include "grit/ash_strings.h" |
| 20 #include "third_party/cros_system_api/dbus/service_constants.h" | 24 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 21 #include "ui/base/l10n/l10n_util.h" | 25 #include "ui/base/l10n/l10n_util.h" |
| 22 | 26 |
| 27 using chromeos::DeviceState; |
| 28 using chromeos::NetworkConfigurationHandler; |
| 23 using chromeos::NetworkConnectionHandler; | 29 using chromeos::NetworkConnectionHandler; |
| 24 using chromeos::NetworkHandler; | 30 using chromeos::NetworkHandler; |
| 31 using chromeos::NetworkProfile; |
| 32 using chromeos::NetworkProfileHandler; |
| 25 using chromeos::NetworkState; | 33 using chromeos::NetworkState; |
| 26 | 34 |
| 27 namespace ash { | 35 namespace ash { |
| 28 | 36 |
| 29 namespace { | 37 namespace { |
| 30 | 38 |
| 39 bool IsDirectActivatedCarrier(const std::string& carrier) { |
| 40 if (carrier == shill::kCarrierSprint) |
| 41 return true; |
| 42 return false; |
| 43 } |
| 44 |
| 31 void OnConnectFailed(const std::string& service_path, | 45 void OnConnectFailed(const std::string& service_path, |
| 46 gfx::NativeWindow owning_window, |
| 32 const std::string& error_name, | 47 const std::string& error_name, |
| 33 scoped_ptr<base::DictionaryValue> error_data) { | 48 scoped_ptr<base::DictionaryValue> error_data) { |
| 34 VLOG(1) << "Connect Failed for " << service_path << ": " << error_name; | 49 NET_LOG_ERROR("Connect Failed: " + error_name, service_path); |
| 35 if (error_name == NetworkConnectionHandler::kErrorPassphraseRequired) { | 50 if (error_name == NetworkConnectionHandler::kErrorPassphraseRequired) { |
| 36 // TODO(stevenjb): Possibly add inline UI to handle passphrase entry here. | 51 // TODO(stevenjb): Possibly add inline UI to handle passphrase entry here. |
| 37 ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork( | 52 ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork( |
| 38 service_path); | 53 service_path); |
| 39 return; | 54 return; |
| 40 } | 55 } |
| 56 if (error_name == NetworkConnectionHandler::kErrorCertificateRequired) { |
| 57 ash::Shell::GetInstance()->system_tray_delegate()->EnrollOrConfigureNetwork( |
| 58 service_path, owning_window); |
| 59 return; |
| 60 } |
| 41 if (error_name == NetworkConnectionHandler::kErrorActivationRequired || | 61 if (error_name == NetworkConnectionHandler::kErrorActivationRequired || |
| 42 error_name == NetworkConnectionHandler::kErrorCertificateRequired || | |
| 43 error_name == NetworkConnectionHandler::kErrorConfigurationRequired || | 62 error_name == NetworkConnectionHandler::kErrorConfigurationRequired || |
| 44 error_name == NetworkConnectionHandler::kErrorAuthenticationRequired) { | 63 error_name == NetworkConnectionHandler::kErrorAuthenticationRequired) { |
| 45 ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork( | 64 ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork( |
| 46 service_path); | 65 service_path); |
| 47 return; | 66 return; |
| 48 } | 67 } |
| 49 if (error_name == NetworkConnectionHandler::kErrorConnected || | 68 if (error_name == NetworkConnectionHandler::kErrorConnected || |
| 50 error_name == NetworkConnectionHandler::kErrorConnecting) { | 69 error_name == NetworkConnectionHandler::kErrorConnecting) { |
| 51 ash::Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings( | 70 ash::Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings( |
| 52 service_path); | 71 service_path); |
| 53 return; | 72 return; |
| 54 } | 73 } |
| 55 // Shill does not always provide a helpful error. In this case, show the | 74 // Shill does not always provide a helpful error. In this case, show the |
| 56 // configuration UI and a notification. See crbug.com/217033 for an example. | 75 // configuration UI and a notification. See crbug.com/217033 for an example. |
| 57 if (error_name == NetworkConnectionHandler::kErrorConnectFailed) { | 76 if (error_name == NetworkConnectionHandler::kErrorConnectFailed) { |
| 58 ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork( | 77 ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork( |
| 59 service_path); | 78 service_path); |
| 60 } | 79 } |
| 61 ash::Shell::GetInstance()->system_tray_notifier()->network_state_notifier()-> | 80 ash::Shell::GetInstance()->system_tray_notifier()->network_state_notifier()-> |
| 62 ShowNetworkConnectError(error_name, service_path); | 81 ShowNetworkConnectError(error_name, service_path); |
| 63 } | 82 } |
| 64 | 83 |
| 65 void OnConnectSucceeded(const std::string& service_path) { | 84 void OnConnectSucceeded(const std::string& service_path) { |
| 66 VLOG(1) << "Connect Succeeded for " << service_path; | 85 NET_LOG_USER("Connect Succeeded", service_path); |
| 67 ash::Shell::GetInstance()->system_tray_notifier()->NotifyClearNetworkMessage( | 86 ash::Shell::GetInstance()->system_tray_notifier()->NotifyClearNetworkMessage( |
| 68 NetworkObserver::ERROR_CONNECT_FAILED); | 87 NetworkObserver::ERROR_CONNECT_FAILED); |
| 69 } | 88 } |
| 70 | 89 |
| 90 // If |check_error_state| is true, error state for the network is checked, |
| 91 // otherwise any current error state is ignored (e.g. for recently configured |
| 92 // networks or repeat connect attempts). |
| 93 void CallConnectToNetwork(const std::string& service_path, |
| 94 bool check_error_state, |
| 95 gfx::NativeWindow owning_window) { |
| 96 NET_LOG_USER("ConnectToNetwork", service_path); |
| 97 |
| 98 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> |
| 99 GetNetworkState(service_path); |
| 100 if (!network) { |
| 101 NET_LOG_USER("ConnectToNetwork: Not Found", service_path); |
| 102 return; |
| 103 } |
| 104 if (network->type() == flimflam::kTypeCellular && |
| 105 (network->activation_state() != flimflam::kActivationStateActivated || |
| 106 network->cellular_out_of_credits())) { |
| 107 network_connect::ActivateCellular(service_path); |
| 108 return; |
| 109 } |
| 110 |
| 111 ash::Shell::GetInstance()->system_tray_notifier()->NotifyClearNetworkMessage( |
| 112 NetworkObserver::ERROR_CONNECT_FAILED); |
| 113 NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork( |
| 114 service_path, |
| 115 base::Bind(&OnConnectSucceeded, service_path), |
| 116 base::Bind(&OnConnectFailed, service_path, owning_window), |
| 117 check_error_state); |
| 118 } |
| 119 |
| 120 void OnActivateFailed(const std::string& service_path, |
| 121 const std::string& error_name, |
| 122 scoped_ptr<base::DictionaryValue> error_data) { |
| 123 NET_LOG_ERROR("Unable to activate network", service_path); |
| 124 } |
| 125 |
| 126 void OnActivateSucceeded(const std::string& service_path) { |
| 127 NET_LOG_USER("Activation Succeeded", service_path); |
| 128 } |
| 129 |
| 130 void OnConfigureFailed(const std::string& error_name, |
| 131 scoped_ptr<base::DictionaryValue> error_data) { |
| 132 NET_LOG_ERROR("Unable to configure network", ""); |
| 133 } |
| 134 |
| 135 void OnConfigureSucceeded(const std::string& service_path) { |
| 136 NET_LOG_USER("Configure Succeeded", service_path); |
| 137 // After configuring a network, ignore any (possibly stale) error state. |
| 138 const bool check_error_state = false; |
| 139 CallConnectToNetwork(service_path, check_error_state, NULL); |
| 140 } |
| 141 |
| 142 void SetPropertiesFailed(const std::string& desc, |
| 143 const std::string& service_path, |
| 144 const std::string& config_error_name, |
| 145 scoped_ptr<base::DictionaryValue> error_data) { |
| 146 NET_LOG_ERROR(desc + ": Failed: " + config_error_name, service_path); |
| 147 } |
| 148 |
| 149 void SetPropertiesToClear(base::DictionaryValue* properties_to_set, |
| 150 std::vector<std::string>* properties_to_clear) { |
| 151 // Move empty string properties to properties_to_clear. |
| 152 for (base::DictionaryValue::Iterator iter(*properties_to_set); |
| 153 !iter.IsAtEnd(); iter.Advance()) { |
| 154 if (iter.value().GetType() == base::Value::TYPE_STRING) { |
| 155 std::string value_str; |
| 156 iter.value().GetAsString(&value_str); |
| 157 if (value_str.empty()) |
| 158 properties_to_clear->push_back(iter.key()); |
| 159 } |
| 160 } |
| 161 // Remove cleared properties from properties_to_set. |
| 162 for (std::vector<std::string>::iterator iter = properties_to_clear->begin(); |
| 163 iter != properties_to_clear->end(); ++iter) { |
| 164 properties_to_set->RemoveWithoutPathExpansion(*iter, NULL); |
| 165 } |
| 166 } |
| 167 |
| 168 void ClearPropertiesAndConnect( |
| 169 const std::string& service_path, |
| 170 const std::vector<std::string>& properties_to_clear) { |
| 171 NET_LOG_USER("ClearPropertiesAndConnect", service_path); |
| 172 // After configuring a network, ignore any (possibly stale) error state. |
| 173 const bool check_error_state = false; |
| 174 if (properties_to_clear.empty()) { |
| 175 CallConnectToNetwork(service_path, check_error_state, NULL); |
| 176 } else { |
| 177 NetworkHandler::Get()->network_configuration_handler()->ClearProperties( |
| 178 service_path, |
| 179 properties_to_clear, |
| 180 base::Bind(&CallConnectToNetwork, |
| 181 service_path, check_error_state, |
| 182 static_cast<gfx::NativeWindow>(NULL)), |
| 183 base::Bind(&SetPropertiesFailed, "ClearProperties", service_path)); |
| 184 } |
| 185 } |
| 186 |
| 71 } // namespace | 187 } // namespace |
| 72 | 188 |
| 73 namespace network_connect { | 189 namespace network_connect { |
| 74 | 190 |
| 75 void ConnectToNetwork(const std::string& service_path) { | 191 void ConnectToNetwork(const std::string& service_path, |
| 76 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> | 192 gfx::NativeWindow owning_window) { |
| 77 GetNetworkState(service_path); | 193 const bool check_error_state = true; |
| 78 if (!network) | 194 CallConnectToNetwork(service_path, check_error_state, owning_window); |
| 195 } |
| 196 |
| 197 void ActivateCellular(const std::string& service_path) { |
| 198 NET_LOG_USER("ActivateCellular", service_path); |
| 199 const DeviceState* cellular_device = |
| 200 NetworkHandler::Get()->network_state_handler()-> |
| 201 GetDeviceStateByType(flimflam::kTypeCellular); |
| 202 if (!cellular_device) { |
| 203 NET_LOG_ERROR("ActivateCellular with no Device", service_path); |
| 79 return; | 204 return; |
| 80 ash::Shell::GetInstance()->system_tray_notifier()->NotifyClearNetworkMessage( | 205 } |
| 81 NetworkObserver::ERROR_CONNECT_FAILED); | 206 if (!IsDirectActivatedCarrier(cellular_device->carrier())) { |
| 82 NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork( | 207 // For non direct activation, show the mobile setup dialog which can be |
| 208 // used to activate the network. |
| 209 ash::Shell::GetInstance()->system_tray_delegate()->ShowMobileSetup( |
| 210 service_path); |
| 211 return; |
| 212 } |
| 213 const NetworkState* cellular = |
| 214 NetworkHandler::Get()->network_state_handler()-> |
| 215 FirstNetworkByType(flimflam::kTypeCellular); |
| 216 if (!cellular) { |
| 217 NET_LOG_ERROR("ActivateCellular with no Service", service_path); |
| 218 return; |
| 219 } |
| 220 if (cellular->activation_state() == flimflam::kActivationStateActivated) { |
| 221 NET_LOG_ERROR("ActivateCellular for activated service", service_path); |
| 222 return; |
| 223 } |
| 224 |
| 225 NetworkHandler::Get()->network_connection_handler()->ActivateNetwork( |
| 83 service_path, | 226 service_path, |
| 84 base::Bind(&OnConnectSucceeded, service_path), | 227 "", // carrier |
| 85 base::Bind(&OnConnectFailed, service_path), | 228 base::Bind(&OnActivateSucceeded, service_path), |
| 86 true /* check_error_state */); | 229 base::Bind(&OnActivateFailed, service_path)); |
| 230 } |
| 231 |
| 232 void ConfigureNetworkAndConnect(const std::string& service_path, |
| 233 const base::DictionaryValue& properties) { |
| 234 NET_LOG_USER("ConfigureNetworkAndConnect", service_path); |
| 235 scoped_ptr<base::DictionaryValue> properties_to_set(properties.DeepCopy()); |
| 236 std::vector<std::string> properties_to_clear; |
| 237 SetPropertiesToClear(properties_to_set.get(), &properties_to_clear); |
| 238 if (properties_to_set->empty()) { |
| 239 ClearPropertiesAndConnect(service_path, |
| 240 properties_to_clear); |
| 241 } else { |
| 242 NetworkHandler::Get()->network_configuration_handler()->SetProperties( |
| 243 service_path, |
| 244 *properties_to_set, |
| 245 base::Bind(&ClearPropertiesAndConnect, |
| 246 service_path, |
| 247 properties_to_clear), |
| 248 base::Bind(&SetPropertiesFailed, "SetProperties", service_path)); |
| 249 } |
| 250 } |
| 251 |
| 252 void CreateConfigurationAndConnect(base::DictionaryValue* properties, |
| 253 bool shared) { |
| 254 NET_LOG_USER("CreateConfigurationAndConnect", ""); |
| 255 const NetworkProfile* profile = |
| 256 NetworkHandler::Get()->network_profile_handler()-> |
| 257 GetDefaultUserProfile(); |
| 258 if (profile) { |
| 259 properties->SetStringWithoutPathExpansion( |
| 260 flimflam::kProfileProperty, profile->path); |
| 261 } else { |
| 262 properties->SetStringWithoutPathExpansion( |
| 263 flimflam::kProfileProperty, |
| 264 NetworkProfileHandler::kSharedProfilePath); |
| 265 } |
| 266 NetworkHandler::Get()->network_configuration_handler()->CreateConfiguration( |
| 267 *properties, |
| 268 base::Bind(&OnConfigureSucceeded), |
| 269 base::Bind(&OnConfigureFailed)); |
| 87 } | 270 } |
| 88 | 271 |
| 89 string16 ErrorString(const std::string& error) { | 272 string16 ErrorString(const std::string& error) { |
| 90 if (error.empty()) | 273 if (error.empty()) |
| 91 return string16(); | 274 return string16(); |
| 92 if (error == flimflam::kErrorOutOfRange) | 275 if (error == flimflam::kErrorOutOfRange) |
| 93 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE); | 276 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE); |
| 94 if (error == flimflam::kErrorPinMissing) | 277 if (error == flimflam::kErrorPinMissing) |
| 95 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING); | 278 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING); |
| 96 if (error == flimflam::kErrorDhcpFailed) | 279 if (error == flimflam::kErrorDhcpFailed) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 if (StringToLowerASCII(error) == | 333 if (StringToLowerASCII(error) == |
| 151 StringToLowerASCII(std::string(flimflam::kUnknownString))) { | 334 StringToLowerASCII(std::string(flimflam::kUnknownString))) { |
| 152 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN); | 335 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN); |
| 153 } | 336 } |
| 154 return l10n_util::GetStringFUTF16(IDS_NETWORK_UNRECOGNIZED_ERROR, | 337 return l10n_util::GetStringFUTF16(IDS_NETWORK_UNRECOGNIZED_ERROR, |
| 155 UTF8ToUTF16(error)); | 338 UTF8ToUTF16(error)); |
| 156 } | 339 } |
| 157 | 340 |
| 158 } // network_connect | 341 } // network_connect |
| 159 } // ash | 342 } // ash |
| OLD | NEW |