| 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/session/session_state_delegate.h" | |
| 8 #include "ash/shell.h" | |
| 9 #include "ash/system/chromeos/network/network_state_notifier.h" | 7 #include "ash/system/chromeos/network/network_state_notifier.h" |
| 10 #include "ash/system/system_notifier.h" | |
| 11 #include "ash/system/tray/system_tray_delegate.h" | |
| 12 #include "ash/system/tray/system_tray_notifier.h" | |
| 13 #include "base/bind.h" | 8 #include "base/bind.h" |
| 14 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 17 #include "base/values.h" | 12 #include "base/values.h" |
| 18 #include "chromeos/login/login_state.h" | 13 #include "chromeos/login/login_state.h" |
| 19 #include "chromeos/network/device_state.h" | 14 #include "chromeos/network/device_state.h" |
| 20 #include "chromeos/network/network_activation_handler.h" | 15 #include "chromeos/network/network_activation_handler.h" |
| 21 #include "chromeos/network/network_configuration_handler.h" | 16 #include "chromeos/network/network_configuration_handler.h" |
| 22 #include "chromeos/network/network_connection_handler.h" | 17 #include "chromeos/network/network_connection_handler.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 41 using chromeos::NetworkProfile; | 36 using chromeos::NetworkProfile; |
| 42 using chromeos::NetworkProfileHandler; | 37 using chromeos::NetworkProfileHandler; |
| 43 using chromeos::NetworkState; | 38 using chromeos::NetworkState; |
| 44 using chromeos::NetworkStateHandler; | 39 using chromeos::NetworkStateHandler; |
| 45 using chromeos::NetworkTypePattern; | 40 using chromeos::NetworkTypePattern; |
| 46 | 41 |
| 47 namespace ash { | 42 namespace ash { |
| 48 | 43 |
| 49 namespace { | 44 namespace { |
| 50 | 45 |
| 51 // TODO(stevenjb): This should be in service_constants.h | |
| 52 const char kErrorInProgress[] = "org.chromium.flimflam.Error.InProgress"; | |
| 53 | |
| 54 // Returns true for carriers that can be activated through Shill instead of | 46 // Returns true for carriers that can be activated through Shill instead of |
| 55 // through a WebUI dialog. | 47 // through a WebUI dialog. |
| 56 bool IsDirectActivatedCarrier(const std::string& carrier) { | 48 bool IsDirectActivatedCarrier(const std::string& carrier) { |
| 57 if (carrier == shill::kCarrierSprint) | 49 if (carrier == shill::kCarrierSprint) |
| 58 return true; | 50 return true; |
| 59 return false; | 51 return false; |
| 60 } | 52 } |
| 61 | 53 |
| 62 void ShowErrorNotification(const std::string& error_name, | 54 const NetworkState* GetNetworkState(const std::string& service_path) { |
| 63 const std::string& service_path) { | 55 return NetworkHandler::Get()->network_state_handler()->GetNetworkState( |
| 64 Shell::GetInstance()->system_tray_notifier()->network_state_notifier()-> | 56 service_path); |
| 65 ShowNetworkConnectError(error_name, service_path); | |
| 66 } | 57 } |
| 67 | 58 |
| 68 void HandleUnconfiguredNetwork(const std::string& service_path) { | 59 class NetworkConnectImpl : public NetworkConnect { |
| 69 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> | 60 public: |
| 70 GetNetworkState(service_path); | 61 explicit NetworkConnectImpl(Delegate* delegate); |
| 62 ~NetworkConnectImpl() override; |
| 63 |
| 64 // NetworkConnect |
| 65 void ConnectToNetwork(const std::string& service_path) override; |
| 66 void SetTechnologyEnabled(const chromeos::NetworkTypePattern& technology, |
| 67 bool enabled_state) override; |
| 68 void ActivateCellular(const std::string& service_path) override; |
| 69 void ShowMobileSetup(const std::string& service_path) override; |
| 70 void ConfigureNetworkAndConnect(const std::string& service_path, |
| 71 const base::DictionaryValue& properties, |
| 72 bool shared) override; |
| 73 void CreateConfigurationAndConnect(base::DictionaryValue* properties, |
| 74 bool shared) override; |
| 75 void CreateConfiguration(base::DictionaryValue* properties, |
| 76 bool shared) override; |
| 77 base::string16 GetErrorString(const std::string& error, |
| 78 const std::string& service_path) override; |
| 79 void ShowNetworkSettings(const std::string& service_path) override; |
| 80 |
| 81 private: |
| 82 void HandleUnconfiguredNetwork(const std::string& service_path); |
| 83 void OnConnectFailed(const std::string& service_path, |
| 84 const std::string& error_name, |
| 85 scoped_ptr<base::DictionaryValue> error_data); |
| 86 bool GetNetworkProfilePath(bool shared, std::string* profile_path); |
| 87 void OnConnectSucceeded(const std::string& service_path); |
| 88 void CallConnectToNetwork(const std::string& service_path, |
| 89 bool check_error_state); |
| 90 void OnActivateFailed(const std::string& service_path, |
| 91 const std::string& error_name, |
| 92 scoped_ptr<base::DictionaryValue> error_data); |
| 93 void OnActivateSucceeded(const std::string& service_path); |
| 94 void OnConfigureFailed(const std::string& error_name, |
| 95 scoped_ptr<base::DictionaryValue> error_data); |
| 96 void OnConfigureSucceeded(bool connect_on_configure, |
| 97 const std::string& service_path); |
| 98 void CallCreateConfiguration(base::DictionaryValue* properties, |
| 99 bool shared, |
| 100 bool connect_on_configure); |
| 101 void SetPropertiesFailed(const std::string& desc, |
| 102 const std::string& service_path, |
| 103 const std::string& config_error_name, |
| 104 scoped_ptr<base::DictionaryValue> error_data); |
| 105 void SetPropertiesToClear(base::DictionaryValue* properties_to_set, |
| 106 std::vector<std::string>* properties_to_clear); |
| 107 void ClearPropertiesAndConnect( |
| 108 const std::string& service_path, |
| 109 const std::vector<std::string>& properties_to_clear); |
| 110 void ConfigureSetProfileSucceeded( |
| 111 const std::string& service_path, |
| 112 scoped_ptr<base::DictionaryValue> properties_to_set); |
| 113 |
| 114 Delegate* delegate_; |
| 115 scoped_ptr<NetworkStateNotifier> network_state_notifier_; |
| 116 base::WeakPtrFactory<NetworkConnectImpl> weak_factory_; |
| 117 |
| 118 DISALLOW_COPY_AND_ASSIGN(NetworkConnectImpl); |
| 119 }; |
| 120 |
| 121 NetworkConnectImpl::NetworkConnectImpl(Delegate* delegate) |
| 122 : delegate_(delegate), weak_factory_(this) { |
| 123 network_state_notifier_.reset(new NetworkStateNotifier(this)); |
| 124 } |
| 125 |
| 126 NetworkConnectImpl::~NetworkConnectImpl() { |
| 127 } |
| 128 |
| 129 void NetworkConnectImpl::HandleUnconfiguredNetwork( |
| 130 const std::string& service_path) { |
| 131 const NetworkState* network = GetNetworkState(service_path); |
| 71 if (!network) { | 132 if (!network) { |
| 72 NET_LOG_ERROR("Configuring unknown network", service_path); | 133 NET_LOG_ERROR("Configuring unknown network", service_path); |
| 73 return; | 134 return; |
| 74 } | 135 } |
| 75 | 136 |
| 76 if (network->type() == shill::kTypeWifi) { | 137 if (network->type() == shill::kTypeWifi) { |
| 77 // Only show the config view for secure networks, otherwise do nothing. | 138 // Only show the config view for secure networks, otherwise do nothing. |
| 78 if (network->security() != shill::kSecurityNone) { | 139 if (network->security() != shill::kSecurityNone) { |
| 79 ash::Shell::GetInstance()->system_tray_delegate()-> | 140 delegate_->ShowNetworkConfigure(service_path); |
| 80 ShowNetworkConfigure(service_path); | |
| 81 } | 141 } |
| 82 return; | 142 return; |
| 83 } | 143 } |
| 84 | 144 |
| 85 if (network->type() == shill::kTypeWimax || | 145 if (network->type() == shill::kTypeWimax || |
| 86 network->type() == shill::kTypeVPN) { | 146 network->type() == shill::kTypeVPN) { |
| 87 ash::Shell::GetInstance()->system_tray_delegate()-> | 147 delegate_->ShowNetworkConfigure(service_path); |
| 88 ShowNetworkConfigure(service_path); | |
| 89 return; | 148 return; |
| 90 } | 149 } |
| 91 | 150 |
| 92 if (network->type() == shill::kTypeCellular) { | 151 if (network->type() == shill::kTypeCellular) { |
| 93 if (network->RequiresActivation()) { | 152 if (network->RequiresActivation()) { |
| 94 ash::network_connect::ActivateCellular(service_path); | 153 ActivateCellular(service_path); |
| 95 return; | 154 return; |
| 96 } | 155 } |
| 97 if (network->cellular_out_of_credits()) { | 156 if (network->cellular_out_of_credits()) { |
| 98 ash::network_connect::ShowMobileSetup(service_path); | 157 ShowMobileSetup(service_path); |
| 99 return; | 158 return; |
| 100 } | 159 } |
| 101 // No special configure or setup for |network|, show the settings UI. | 160 // No special configure or setup for |network|, show the settings UI. |
| 102 if (chromeos::LoginState::Get()->IsUserLoggedIn()) { | 161 if (chromeos::LoginState::Get()->IsUserLoggedIn()) { |
| 103 ash::Shell::GetInstance()->system_tray_delegate()-> | 162 delegate_->ShowNetworkSettings(service_path); |
| 104 ShowNetworkSettings(service_path); | |
| 105 } | 163 } |
| 106 return; | 164 return; |
| 107 } | 165 } |
| 108 NOTREACHED(); | 166 NOTREACHED(); |
| 109 } | 167 } |
| 110 | 168 |
| 111 // If |shared| is true, sets |profile_path| to the shared profile path. | 169 // If |shared| is true, sets |profile_path| to the shared profile path. |
| 112 // Otherwise sets |profile_path| to the user profile path if authenticated and | 170 // Otherwise sets |profile_path| to the user profile path if authenticated and |
| 113 // available. Returns 'false' if unable to set |profile_path|. | 171 // available. Returns 'false' if unable to set |profile_path|. |
| 114 bool GetNetworkProfilePath(bool shared, std::string* profile_path) { | 172 bool NetworkConnectImpl::GetNetworkProfilePath(bool shared, |
| 173 std::string* profile_path) { |
| 115 if (shared) { | 174 if (shared) { |
| 116 *profile_path = NetworkProfileHandler::GetSharedProfilePath(); | 175 *profile_path = NetworkProfileHandler::GetSharedProfilePath(); |
| 117 return true; | 176 return true; |
| 118 } | 177 } |
| 119 | 178 |
| 120 if (!chromeos::LoginState::Get()->UserHasNetworkProfile()) { | 179 if (!chromeos::LoginState::Get()->UserHasNetworkProfile()) { |
| 121 NET_LOG_ERROR("User profile specified before login", ""); | 180 NET_LOG_ERROR("User profile specified before login", ""); |
| 122 return false; | 181 return false; |
| 123 } | 182 } |
| 124 | 183 |
| 125 const NetworkProfile* profile = | 184 const NetworkProfile* profile = |
| 126 NetworkHandler::Get()->network_profile_handler()-> | 185 NetworkHandler::Get()->network_profile_handler()->GetDefaultUserProfile(); |
| 127 GetDefaultUserProfile(); | |
| 128 if (!profile) { | 186 if (!profile) { |
| 129 NET_LOG_ERROR("No user profile for unshared network configuration", ""); | 187 NET_LOG_ERROR("No user profile for unshared network configuration", ""); |
| 130 return false; | 188 return false; |
| 131 } | 189 } |
| 132 | 190 |
| 133 *profile_path = profile->path; | 191 *profile_path = profile->path; |
| 134 return true; | 192 return true; |
| 135 } | 193 } |
| 136 | 194 |
| 137 void OnConnectFailed(const std::string& service_path, | 195 void NetworkConnectImpl::OnConnectFailed( |
| 138 const std::string& error_name, | 196 const std::string& service_path, |
| 139 scoped_ptr<base::DictionaryValue> error_data) { | 197 const std::string& error_name, |
| 198 scoped_ptr<base::DictionaryValue> error_data) { |
| 140 NET_LOG_ERROR("Connect Failed: " + error_name, service_path); | 199 NET_LOG_ERROR("Connect Failed: " + error_name, service_path); |
| 141 | 200 |
| 142 if (!ash::Shell::HasInstance()) | 201 // If a new connect attempt canceled this connect, no need to notify the |
| 143 return; | 202 // user. |
| 144 | |
| 145 // If a new connect attempt canceled this connect, no need to notify the user. | |
| 146 if (error_name == NetworkConnectionHandler::kErrorConnectCanceled) | 203 if (error_name == NetworkConnectionHandler::kErrorConnectCanceled) |
| 147 return; | 204 return; |
| 148 | 205 |
| 149 if (error_name == shill::kErrorBadPassphrase || | 206 if (error_name == shill::kErrorBadPassphrase || |
| 150 error_name == NetworkConnectionHandler::kErrorPassphraseRequired || | 207 error_name == NetworkConnectionHandler::kErrorPassphraseRequired || |
| 151 error_name == NetworkConnectionHandler::kErrorConfigurationRequired || | 208 error_name == NetworkConnectionHandler::kErrorConfigurationRequired || |
| 152 error_name == NetworkConnectionHandler::kErrorAuthenticationRequired) { | 209 error_name == NetworkConnectionHandler::kErrorAuthenticationRequired) { |
| 153 HandleUnconfiguredNetwork(service_path); | 210 HandleUnconfiguredNetwork(service_path); |
| 154 return; | 211 return; |
| 155 } | 212 } |
| 156 | 213 |
| 157 if (error_name == NetworkConnectionHandler::kErrorCertificateRequired) { | 214 if (error_name == NetworkConnectionHandler::kErrorCertificateRequired) { |
| 158 if (!ash::Shell::GetInstance()->system_tray_delegate()->EnrollNetwork( | 215 if (!delegate_->ShowEnrollNetwork(service_path)) { |
| 159 service_path)) { | |
| 160 HandleUnconfiguredNetwork(service_path); | 216 HandleUnconfiguredNetwork(service_path); |
| 161 } | 217 } |
| 162 return; | 218 return; |
| 163 } | 219 } |
| 164 | 220 |
| 165 if (error_name == NetworkConnectionHandler::kErrorActivationRequired) { | 221 if (error_name == NetworkConnectionHandler::kErrorActivationRequired) { |
| 166 network_connect::ActivateCellular(service_path); | 222 ActivateCellular(service_path); |
| 167 return; | 223 return; |
| 168 } | 224 } |
| 169 | 225 |
| 170 if (error_name == NetworkConnectionHandler::kErrorConnected || | 226 if (error_name == NetworkConnectionHandler::kErrorConnected || |
| 171 error_name == NetworkConnectionHandler::kErrorConnecting) { | 227 error_name == NetworkConnectionHandler::kErrorConnecting) { |
| 172 network_connect::ShowNetworkSettings(service_path); | 228 ShowNetworkSettings(service_path); |
| 173 return; | 229 return; |
| 174 } | 230 } |
| 175 | 231 |
| 176 // ConnectFailed or unknown error; show a notification. | 232 // ConnectFailed or unknown error; show a notification. |
| 177 ShowErrorNotification(error_name, service_path); | 233 network_state_notifier_->ShowNetworkConnectError(error_name, service_path); |
| 178 | 234 |
| 179 // Only show a configure dialog if there was a ConnectFailed error and the | 235 // Only show a configure dialog if there was a ConnectFailed error. |
| 180 // screen is not locked. | 236 if (error_name != shill::kErrorConnectFailed) |
| 181 if (error_name != shill::kErrorConnectFailed || | |
| 182 Shell::GetInstance()->session_state_delegate()->IsScreenLocked()) | |
| 183 return; | 237 return; |
| 184 | 238 |
| 185 // If Shill reports an InProgress error, don't try to configure the network. | 239 // If Shill reports an InProgress error, don't try to configure the network. |
| 186 std::string dbus_error_name; | 240 std::string dbus_error_name; |
| 187 error_data.get()->GetString( | 241 error_data.get()->GetString(chromeos::network_handler::kDbusErrorName, |
| 188 chromeos::network_handler::kDbusErrorName, &dbus_error_name); | 242 &dbus_error_name); |
| 189 if (dbus_error_name == kErrorInProgress) | 243 if (dbus_error_name == shill::kErrorResultInProgress) |
| 190 return; | 244 return; |
| 191 | 245 |
| 192 HandleUnconfiguredNetwork(service_path); | 246 HandleUnconfiguredNetwork(service_path); |
| 193 } | 247 } |
| 194 | 248 |
| 195 void OnConnectSucceeded(const std::string& service_path) { | 249 void NetworkConnectImpl::OnConnectSucceeded(const std::string& service_path) { |
| 196 NET_LOG_USER("Connect Succeeded", service_path); | 250 NET_LOG_USER("Connect Succeeded", service_path); |
| 197 if (!ash::Shell::HasInstance()) | 251 network_state_notifier_->RemoveConnectNotification(); |
| 198 return; | |
| 199 message_center::MessageCenter::Get()->RemoveNotification( | |
| 200 network_connect::kNetworkConnectNotificationId, false /* not by user */); | |
| 201 } | 252 } |
| 202 | 253 |
| 203 // If |check_error_state| is true, error state for the network is checked, | 254 // If |check_error_state| is true, error state for the network is checked, |
| 204 // otherwise any current error state is ignored (e.g. for recently configured | 255 // otherwise any current error state is ignored (e.g. for recently configured |
| 205 // networks or repeat connect attempts). | 256 // networks or repeat connect attempts). |
| 206 void CallConnectToNetwork(const std::string& service_path, | 257 void NetworkConnectImpl::CallConnectToNetwork(const std::string& service_path, |
| 207 bool check_error_state) { | 258 bool check_error_state) { |
| 208 if (message_center::MessageCenter::Get()) { | 259 network_state_notifier_->RemoveConnectNotification(); |
| 209 message_center::MessageCenter::Get()->RemoveNotification( | |
| 210 network_connect::kNetworkConnectNotificationId, | |
| 211 false /* not by user */); | |
| 212 } | |
| 213 | |
| 214 NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork( | 260 NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork( |
| 215 service_path, | 261 service_path, base::Bind(&NetworkConnectImpl::OnConnectSucceeded, |
| 216 base::Bind(&OnConnectSucceeded, service_path), | 262 weak_factory_.GetWeakPtr(), service_path), |
| 217 base::Bind(&OnConnectFailed, service_path), | 263 base::Bind(&NetworkConnectImpl::OnConnectFailed, |
| 264 weak_factory_.GetWeakPtr(), service_path), |
| 218 check_error_state); | 265 check_error_state); |
| 219 } | 266 } |
| 220 | 267 |
| 221 void OnActivateFailed(const std::string& service_path, | 268 void NetworkConnectImpl::OnActivateFailed( |
| 222 const std::string& error_name, | 269 const std::string& service_path, |
| 223 scoped_ptr<base::DictionaryValue> error_data) { | 270 const std::string& error_name, |
| 271 scoped_ptr<base::DictionaryValue> error_data) { |
| 224 NET_LOG_ERROR("Unable to activate network", service_path); | 272 NET_LOG_ERROR("Unable to activate network", service_path); |
| 225 ShowErrorNotification(network_connect::kErrorActivateFailed, service_path); | 273 network_state_notifier_->ShowNetworkConnectError(kErrorActivateFailed, |
| 274 service_path); |
| 226 } | 275 } |
| 227 | 276 |
| 228 void OnActivateSucceeded(const std::string& service_path) { | 277 void NetworkConnectImpl::OnActivateSucceeded(const std::string& service_path) { |
| 229 NET_LOG_USER("Activation Succeeded", service_path); | 278 NET_LOG_USER("Activation Succeeded", service_path); |
| 230 } | 279 } |
| 231 | 280 |
| 232 void OnConfigureFailed(const std::string& error_name, | 281 void NetworkConnectImpl::OnConfigureFailed( |
| 233 scoped_ptr<base::DictionaryValue> error_data) { | 282 const std::string& error_name, |
| 283 scoped_ptr<base::DictionaryValue> error_data) { |
| 234 NET_LOG_ERROR("Unable to configure network", ""); | 284 NET_LOG_ERROR("Unable to configure network", ""); |
| 235 ShowErrorNotification(NetworkConnectionHandler::kErrorConfigureFailed, ""); | 285 network_state_notifier_->ShowNetworkConnectError( |
| 286 NetworkConnectionHandler::kErrorConfigureFailed, ""); |
| 236 } | 287 } |
| 237 | 288 |
| 238 void OnConfigureSucceeded(bool connect_on_configure, | 289 void NetworkConnectImpl::OnConfigureSucceeded(bool connect_on_configure, |
| 239 const std::string& service_path) { | 290 const std::string& service_path) { |
| 240 NET_LOG_USER("Configure Succeeded", service_path); | 291 NET_LOG_USER("Configure Succeeded", service_path); |
| 241 if (!connect_on_configure) | 292 if (!connect_on_configure) |
| 242 return; | 293 return; |
| 243 // After configuring a network, ignore any (possibly stale) error state. | 294 // After configuring a network, ignore any (possibly stale) error state. |
| 244 const bool check_error_state = false; | 295 const bool check_error_state = false; |
| 245 CallConnectToNetwork(service_path, check_error_state); | 296 CallConnectToNetwork(service_path, check_error_state); |
| 246 } | 297 } |
| 247 | 298 |
| 248 void CallCreateConfiguration(base::DictionaryValue* properties, | 299 void NetworkConnectImpl::CallCreateConfiguration( |
| 249 bool shared, | 300 base::DictionaryValue* properties, |
| 250 bool connect_on_configure) { | 301 bool shared, |
| 302 bool connect_on_configure) { |
| 251 std::string profile_path; | 303 std::string profile_path; |
| 252 if (!GetNetworkProfilePath(shared, &profile_path)) { | 304 if (!GetNetworkProfilePath(shared, &profile_path)) { |
| 253 ShowErrorNotification(NetworkConnectionHandler::kErrorConfigureFailed, ""); | 305 network_state_notifier_->ShowNetworkConnectError( |
| 306 NetworkConnectionHandler::kErrorConfigureFailed, ""); |
| 254 return; | 307 return; |
| 255 } | 308 } |
| 256 properties->SetStringWithoutPathExpansion( | 309 properties->SetStringWithoutPathExpansion(shill::kProfileProperty, |
| 257 shill::kProfileProperty, profile_path); | 310 profile_path); |
| 258 NetworkHandler::Get()->network_configuration_handler()->CreateConfiguration( | 311 NetworkHandler::Get()->network_configuration_handler()->CreateConfiguration( |
| 259 *properties, | 312 *properties, base::Bind(&NetworkConnectImpl::OnConfigureSucceeded, |
| 260 base::Bind(&OnConfigureSucceeded, connect_on_configure), | 313 weak_factory_.GetWeakPtr(), connect_on_configure), |
| 261 base::Bind(&OnConfigureFailed)); | 314 base::Bind(&NetworkConnectImpl::OnConfigureFailed, |
| 315 weak_factory_.GetWeakPtr())); |
| 262 } | 316 } |
| 263 | 317 |
| 264 void SetPropertiesFailed(const std::string& desc, | 318 void NetworkConnectImpl::SetPropertiesFailed( |
| 265 const std::string& service_path, | 319 const std::string& desc, |
| 266 const std::string& config_error_name, | 320 const std::string& service_path, |
| 267 scoped_ptr<base::DictionaryValue> error_data) { | 321 const std::string& config_error_name, |
| 322 scoped_ptr<base::DictionaryValue> error_data) { |
| 268 NET_LOG_ERROR(desc + ": Failed: " + config_error_name, service_path); | 323 NET_LOG_ERROR(desc + ": Failed: " + config_error_name, service_path); |
| 269 ShowErrorNotification( | 324 network_state_notifier_->ShowNetworkConnectError( |
| 270 NetworkConnectionHandler::kErrorConfigureFailed, service_path); | 325 NetworkConnectionHandler::kErrorConfigureFailed, service_path); |
| 271 } | 326 } |
| 272 | 327 |
| 273 void SetPropertiesToClear(base::DictionaryValue* properties_to_set, | 328 void NetworkConnectImpl::SetPropertiesToClear( |
| 274 std::vector<std::string>* properties_to_clear) { | 329 base::DictionaryValue* properties_to_set, |
| 330 std::vector<std::string>* properties_to_clear) { |
| 275 // Move empty string properties to properties_to_clear. | 331 // Move empty string properties to properties_to_clear. |
| 276 for (base::DictionaryValue::Iterator iter(*properties_to_set); | 332 for (base::DictionaryValue::Iterator iter(*properties_to_set); |
| 277 !iter.IsAtEnd(); iter.Advance()) { | 333 !iter.IsAtEnd(); iter.Advance()) { |
| 278 std::string value_str; | 334 std::string value_str; |
| 279 if (iter.value().GetAsString(&value_str) && value_str.empty()) | 335 if (iter.value().GetAsString(&value_str) && value_str.empty()) |
| 280 properties_to_clear->push_back(iter.key()); | 336 properties_to_clear->push_back(iter.key()); |
| 281 } | 337 } |
| 282 // Remove cleared properties from properties_to_set. | 338 // Remove cleared properties from properties_to_set. |
| 283 for (std::vector<std::string>::iterator iter = properties_to_clear->begin(); | 339 for (std::vector<std::string>::iterator iter = properties_to_clear->begin(); |
| 284 iter != properties_to_clear->end(); ++iter) { | 340 iter != properties_to_clear->end(); ++iter) { |
| 285 properties_to_set->RemoveWithoutPathExpansion(*iter, NULL); | 341 properties_to_set->RemoveWithoutPathExpansion(*iter, NULL); |
| 286 } | 342 } |
| 287 } | 343 } |
| 288 | 344 |
| 289 void ClearPropertiesAndConnect( | 345 void NetworkConnectImpl::ClearPropertiesAndConnect( |
| 290 const std::string& service_path, | 346 const std::string& service_path, |
| 291 const std::vector<std::string>& properties_to_clear) { | 347 const std::vector<std::string>& properties_to_clear) { |
| 292 NET_LOG_USER("ClearPropertiesAndConnect", service_path); | 348 NET_LOG_USER("ClearPropertiesAndConnect", service_path); |
| 293 // After configuring a network, ignore any (possibly stale) error state. | 349 // After configuring a network, ignore any (possibly stale) error state. |
| 294 const bool check_error_state = false; | 350 const bool check_error_state = false; |
| 295 NetworkHandler::Get()->network_configuration_handler()->ClearProperties( | 351 NetworkHandler::Get()->network_configuration_handler()->ClearProperties( |
| 296 service_path, | 352 service_path, properties_to_clear, |
| 297 properties_to_clear, | 353 base::Bind(&NetworkConnectImpl::CallConnectToNetwork, |
| 298 base::Bind(&CallConnectToNetwork, | 354 weak_factory_.GetWeakPtr(), service_path, check_error_state), |
| 299 service_path, check_error_state), | 355 base::Bind(&NetworkConnectImpl::SetPropertiesFailed, |
| 300 base::Bind(&SetPropertiesFailed, "ClearProperties", service_path)); | 356 weak_factory_.GetWeakPtr(), "ClearProperties", service_path)); |
| 301 } | 357 } |
| 302 | 358 |
| 303 void ConfigureSetProfileSucceeded( | 359 void NetworkConnectImpl::ConfigureSetProfileSucceeded( |
| 304 const std::string& service_path, | 360 const std::string& service_path, |
| 305 scoped_ptr<base::DictionaryValue> properties_to_set) { | 361 scoped_ptr<base::DictionaryValue> properties_to_set) { |
| 306 std::vector<std::string> properties_to_clear; | 362 std::vector<std::string> properties_to_clear; |
| 307 SetPropertiesToClear(properties_to_set.get(), &properties_to_clear); | 363 SetPropertiesToClear(properties_to_set.get(), &properties_to_clear); |
| 308 NetworkHandler::Get()->network_configuration_handler()->SetProperties( | 364 NetworkHandler::Get()->network_configuration_handler()->SetProperties( |
| 309 service_path, | 365 service_path, *properties_to_set, |
| 310 *properties_to_set, | 366 base::Bind(&NetworkConnectImpl::ClearPropertiesAndConnect, |
| 311 base::Bind(&ClearPropertiesAndConnect, | 367 weak_factory_.GetWeakPtr(), service_path, properties_to_clear), |
| 312 service_path, | 368 base::Bind(&NetworkConnectImpl::SetPropertiesFailed, |
| 313 properties_to_clear), | 369 weak_factory_.GetWeakPtr(), "SetProperties", service_path)); |
| 314 base::Bind(&SetPropertiesFailed, "SetProperties", service_path)); | |
| 315 } | 370 } |
| 316 | 371 |
| 317 const NetworkState* GetNetworkState(const std::string& service_path) { | 372 // Public methods |
| 318 return NetworkHandler::Get()->network_state_handler()-> | |
| 319 GetNetworkState(service_path); | |
| 320 } | |
| 321 | 373 |
| 322 } // namespace | 374 void NetworkConnectImpl::ConnectToNetwork(const std::string& service_path) { |
| 323 | |
| 324 namespace network_connect { | |
| 325 | |
| 326 const char kNetworkConnectNotificationId[] = | |
| 327 "chrome://settings/internet/connect"; | |
| 328 const char kNetworkActivateNotificationId[] = | |
| 329 "chrome://settings/internet/activate"; | |
| 330 | |
| 331 const char kErrorActivateFailed[] = "activate-failed"; | |
| 332 | |
| 333 void ConnectToNetwork(const std::string& service_path) { | |
| 334 NET_LOG_USER("ConnectToNetwork", service_path); | 375 NET_LOG_USER("ConnectToNetwork", service_path); |
| 335 const NetworkState* network = GetNetworkState(service_path); | 376 const NetworkState* network = GetNetworkState(service_path); |
| 336 if (network) { | 377 if (network) { |
| 337 if (!network->error().empty() && !network->security().empty()) { | 378 if (!network->error().empty() && !network->security().empty()) { |
| 338 NET_LOG_USER("Configure: " + network->error(), service_path); | 379 NET_LOG_USER("Configure: " + network->error(), service_path); |
| 339 // If the network is in an error state, show the configuration UI directly | 380 // If the network is in an error state, show the configuration UI |
| 340 // to avoid a spurious notification. | 381 // directly to avoid a spurious notification. |
| 341 HandleUnconfiguredNetwork(service_path); | 382 HandleUnconfiguredNetwork(service_path); |
| 342 return; | 383 return; |
| 343 } else if (network->RequiresActivation()) { | 384 } else if (network->RequiresActivation()) { |
| 344 ActivateCellular(service_path); | 385 ActivateCellular(service_path); |
| 345 return; | 386 return; |
| 346 } | 387 } |
| 347 } | 388 } |
| 348 const bool check_error_state = true; | 389 const bool check_error_state = true; |
| 349 CallConnectToNetwork(service_path, check_error_state); | 390 CallConnectToNetwork(service_path, check_error_state); |
| 350 } | 391 } |
| 351 | 392 |
| 352 void SetTechnologyEnabled(const NetworkTypePattern& technology, | 393 void NetworkConnectImpl::SetTechnologyEnabled( |
| 353 bool enabled_state) { | 394 const NetworkTypePattern& technology, |
| 354 std::string log_string = | 395 bool enabled_state) { |
| 355 base::StringPrintf("technology %s, target state: %s", | 396 std::string log_string = base::StringPrintf( |
| 356 technology.ToDebugString().c_str(), | 397 "technology %s, target state: %s", technology.ToDebugString().c_str(), |
| 357 (enabled_state ? "ENABLED" : "DISABLED")); | 398 (enabled_state ? "ENABLED" : "DISABLED")); |
| 358 NET_LOG_USER("SetTechnologyEnabled", log_string); | 399 NET_LOG_USER("SetTechnologyEnabled", log_string); |
| 359 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); | 400 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
| 360 bool enabled = handler->IsTechnologyEnabled(technology); | 401 bool enabled = handler->IsTechnologyEnabled(technology); |
| 361 if (enabled_state == enabled) { | 402 if (enabled_state == enabled) { |
| 362 NET_LOG_USER("Technology already in target state.", log_string); | 403 NET_LOG_USER("Technology already in target state.", log_string); |
| 363 return; | 404 return; |
| 364 } | 405 } |
| 365 if (enabled) { | 406 if (enabled) { |
| 366 // User requested to disable the technology. | 407 // User requested to disable the technology. |
| 367 handler->SetTechnologyEnabled( | 408 handler->SetTechnologyEnabled(technology, false, |
| 368 technology, false, chromeos::network_handler::ErrorCallback()); | 409 chromeos::network_handler::ErrorCallback()); |
| 369 return; | 410 return; |
| 370 } | 411 } |
| 371 // If we're dealing with a mobile network, then handle SIM lock here. | 412 // If we're dealing with a mobile network, then handle SIM lock here. |
| 372 // SIM locking only applies to cellular, so the code below won't execute | 413 // SIM locking only applies to cellular, so the code below won't execute |
| 373 // if |technology| has been explicitly set to WiMAX. | 414 // if |technology| has been explicitly set to WiMAX. |
| 374 if (technology.MatchesPattern(NetworkTypePattern::Mobile())) { | 415 if (technology.MatchesPattern(NetworkTypePattern::Mobile())) { |
| 375 const DeviceState* mobile = handler->GetDeviceStateByType(technology); | 416 const DeviceState* mobile = handler->GetDeviceStateByType(technology); |
| 376 if (!mobile) { | 417 if (!mobile) { |
| 377 NET_LOG_ERROR("SetTechnologyEnabled with no device", log_string); | 418 NET_LOG_ERROR("SetTechnologyEnabled with no device", log_string); |
| 378 return; | 419 return; |
| 379 } | 420 } |
| 380 // The following only applies to cellular. | 421 // The following only applies to cellular. |
| 381 if (mobile->type() == shill::kTypeCellular) { | 422 if (mobile->type() == shill::kTypeCellular) { |
| 382 if (mobile->IsSimAbsent()) { | 423 if (mobile->IsSimAbsent()) { |
| 383 // If this is true, then we have a cellular device with no SIM inserted. | 424 // If this is true, then we have a cellular device with no SIM |
| 384 // TODO(armansito): Chrome should display a notification here, prompting | 425 // inserted. TODO(armansito): Chrome should display a notification here, |
| 385 // the user to insert a SIM card and restart the device to enable | 426 // prompting the user to insert a SIM card and restart the device to |
| 386 // cellular. See crbug.com/125171. | 427 // enable cellular. See crbug.com/125171. |
| 387 NET_LOG_USER("Cannot enable cellular device without SIM.", log_string); | 428 NET_LOG_USER("Cannot enable cellular device without SIM.", log_string); |
| 388 return; | 429 return; |
| 389 } | 430 } |
| 390 if (!mobile->sim_lock_type().empty()) { | 431 if (!mobile->sim_lock_type().empty()) { |
| 391 // A SIM has been inserted, but it is locked. Let the user unlock it | 432 // A SIM has been inserted, but it is locked. Let the user unlock it |
| 392 // via the dialog. | 433 // via the dialog. |
| 393 ash::Shell::GetInstance()->system_tray_delegate()-> | 434 delegate_->ShowMobileSimDialog(); |
| 394 ShowMobileSimDialog(); | |
| 395 return; | 435 return; |
| 396 } | 436 } |
| 397 } | 437 } |
| 398 } | 438 } |
| 399 handler->SetTechnologyEnabled( | 439 handler->SetTechnologyEnabled(technology, true, |
| 400 technology, true, chromeos::network_handler::ErrorCallback()); | 440 chromeos::network_handler::ErrorCallback()); |
| 401 } | 441 } |
| 402 | 442 |
| 403 void ActivateCellular(const std::string& service_path) { | 443 void NetworkConnectImpl::ActivateCellular(const std::string& service_path) { |
| 404 NET_LOG_USER("ActivateCellular", service_path); | 444 NET_LOG_USER("ActivateCellular", service_path); |
| 405 const NetworkState* cellular = GetNetworkState(service_path); | 445 const NetworkState* cellular = GetNetworkState(service_path); |
| 406 if (!cellular || cellular->type() != shill::kTypeCellular) { | 446 if (!cellular || cellular->type() != shill::kTypeCellular) { |
| 407 NET_LOG_ERROR("ActivateCellular with no Service", service_path); | 447 NET_LOG_ERROR("ActivateCellular with no Service", service_path); |
| 408 return; | 448 return; |
| 409 } | 449 } |
| 410 const DeviceState* cellular_device = | 450 const DeviceState* cellular_device = |
| 411 NetworkHandler::Get()->network_state_handler()-> | 451 NetworkHandler::Get()->network_state_handler()->GetDeviceState( |
| 412 GetDeviceState(cellular->device_path()); | 452 cellular->device_path()); |
| 413 if (!cellular_device) { | 453 if (!cellular_device) { |
| 414 NET_LOG_ERROR("ActivateCellular with no Device", service_path); | 454 NET_LOG_ERROR("ActivateCellular with no Device", service_path); |
| 415 return; | 455 return; |
| 416 } | 456 } |
| 417 if (!IsDirectActivatedCarrier(cellular_device->carrier())) { | 457 if (!IsDirectActivatedCarrier(cellular_device->carrier())) { |
| 418 // For non direct activation, show the mobile setup dialog which can be | 458 // For non direct activation, show the mobile setup dialog which can be |
| 419 // used to activate the network. | 459 // used to activate the network. |
| 420 ShowMobileSetup(service_path); | 460 ShowMobileSetup(service_path); |
| 421 return; | 461 return; |
| 422 } | 462 } |
| 423 if (cellular->activation_state() == shill::kActivationStateActivated) { | 463 if (cellular->activation_state() == shill::kActivationStateActivated) { |
| 424 NET_LOG_ERROR("ActivateCellular for activated service", service_path); | 464 NET_LOG_ERROR("ActivateCellular for activated service", service_path); |
| 425 return; | 465 return; |
| 426 } | 466 } |
| 427 | 467 |
| 428 NetworkHandler::Get()->network_activation_handler()->Activate( | 468 NetworkHandler::Get()->network_activation_handler()->Activate( |
| 429 service_path, | 469 service_path, |
| 430 "", // carrier | 470 "", // carrier |
| 431 base::Bind(&OnActivateSucceeded, service_path), | 471 base::Bind(&NetworkConnectImpl::OnActivateSucceeded, |
| 432 base::Bind(&OnActivateFailed, service_path)); | 472 weak_factory_.GetWeakPtr(), service_path), |
| 473 base::Bind(&NetworkConnectImpl::OnActivateFailed, |
| 474 weak_factory_.GetWeakPtr(), service_path)); |
| 433 } | 475 } |
| 434 | 476 |
| 435 void ShowMobileSetup(const std::string& service_path) { | 477 void NetworkConnectImpl::ShowMobileSetup(const std::string& service_path) { |
| 436 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); | 478 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
| 437 const NetworkState* cellular = handler->GetNetworkState(service_path); | 479 const NetworkState* cellular = handler->GetNetworkState(service_path); |
| 438 if (!cellular || cellular->type() != shill::kTypeCellular) { | 480 if (!cellular || cellular->type() != shill::kTypeCellular) { |
| 439 NET_LOG_ERROR("ShowMobileSetup without Cellular network", service_path); | 481 NET_LOG_ERROR("ShowMobileSetup without Cellular network", service_path); |
| 440 return; | 482 return; |
| 441 } | 483 } |
| 442 if (cellular->activation_state() != shill::kActivationStateActivated && | 484 if (cellular->activation_state() != shill::kActivationStateActivated && |
| 443 cellular->activation_type() == shill::kActivationTypeNonCellular && | 485 cellular->activation_type() == shill::kActivationTypeNonCellular && |
| 444 !handler->DefaultNetwork()) { | 486 !handler->DefaultNetwork()) { |
| 445 message_center::MessageCenter::Get()->AddNotification( | 487 network_state_notifier_->ShowMobileActivationError(service_path); |
| 446 message_center::Notification::CreateSystemNotification( | |
| 447 kNetworkActivateNotificationId, | |
| 448 l10n_util::GetStringUTF16(IDS_NETWORK_ACTIVATION_ERROR_TITLE), | |
| 449 l10n_util::GetStringFUTF16(IDS_NETWORK_ACTIVATION_NEEDS_CONNECTION, | |
| 450 base::UTF8ToUTF16(cellular->name())), | |
| 451 ui::ResourceBundle::GetSharedInstance().GetImageNamed( | |
| 452 IDR_AURA_UBER_TRAY_CELLULAR_NETWORK_FAILED), | |
| 453 ash::system_notifier::kNotifierNetworkError, | |
| 454 base::Bind(&ash::network_connect::ShowNetworkSettings, | |
| 455 service_path))); | |
| 456 return; | 488 return; |
| 457 } | 489 } |
| 458 ash::Shell::GetInstance()->system_tray_delegate()->ShowMobileSetupDialog( | 490 delegate_->ShowMobileSetupDialog(service_path); |
| 459 service_path); | |
| 460 } | 491 } |
| 461 | 492 |
| 462 void ConfigureNetworkAndConnect(const std::string& service_path, | 493 void NetworkConnectImpl::ConfigureNetworkAndConnect( |
| 463 const base::DictionaryValue& properties, | 494 const std::string& service_path, |
| 464 bool shared) { | 495 const base::DictionaryValue& properties, |
| 496 bool shared) { |
| 465 NET_LOG_USER("ConfigureNetworkAndConnect", service_path); | 497 NET_LOG_USER("ConfigureNetworkAndConnect", service_path); |
| 466 | 498 |
| 467 scoped_ptr<base::DictionaryValue> properties_to_set(properties.DeepCopy()); | 499 scoped_ptr<base::DictionaryValue> properties_to_set(properties.DeepCopy()); |
| 468 | 500 |
| 469 std::string profile_path; | 501 std::string profile_path; |
| 470 if (!GetNetworkProfilePath(shared, &profile_path)) { | 502 if (!GetNetworkProfilePath(shared, &profile_path)) { |
| 471 ShowErrorNotification( | 503 network_state_notifier_->ShowNetworkConnectError( |
| 472 NetworkConnectionHandler::kErrorConfigureFailed, service_path); | 504 NetworkConnectionHandler::kErrorConfigureFailed, service_path); |
| 473 return; | 505 return; |
| 474 } | 506 } |
| 475 NetworkHandler::Get()->network_configuration_handler()->SetNetworkProfile( | 507 NetworkHandler::Get()->network_configuration_handler()->SetNetworkProfile( |
| 476 service_path, profile_path, | 508 service_path, profile_path, |
| 477 base::Bind(&ConfigureSetProfileSucceeded, | 509 base::Bind(&NetworkConnectImpl::ConfigureSetProfileSucceeded, |
| 478 service_path, base::Passed(&properties_to_set)), | 510 weak_factory_.GetWeakPtr(), service_path, |
| 479 base::Bind(&SetPropertiesFailed, | 511 base::Passed(&properties_to_set)), |
| 480 "SetProfile: " + profile_path, service_path)); | 512 base::Bind(&NetworkConnectImpl::SetPropertiesFailed, |
| 513 weak_factory_.GetWeakPtr(), "SetProfile: " + profile_path, |
| 514 service_path)); |
| 481 } | 515 } |
| 482 | 516 |
| 483 void CreateConfigurationAndConnect(base::DictionaryValue* properties, | 517 void NetworkConnectImpl::CreateConfigurationAndConnect( |
| 484 bool shared) { | 518 base::DictionaryValue* properties, |
| 519 bool shared) { |
| 485 NET_LOG_USER("CreateConfigurationAndConnect", ""); | 520 NET_LOG_USER("CreateConfigurationAndConnect", ""); |
| 486 CallCreateConfiguration(properties, shared, true /* connect_on_configure */); | 521 CallCreateConfiguration(properties, shared, true /* connect_on_configure */); |
| 487 } | 522 } |
| 488 | 523 |
| 489 void CreateConfiguration(base::DictionaryValue* properties, bool shared) { | 524 void NetworkConnectImpl::CreateConfiguration(base::DictionaryValue* properties, |
| 525 bool shared) { |
| 490 NET_LOG_USER("CreateConfiguration", ""); | 526 NET_LOG_USER("CreateConfiguration", ""); |
| 491 CallCreateConfiguration(properties, shared, false /* connect_on_configure */); | 527 CallCreateConfiguration(properties, shared, false /* connect_on_configure */); |
| 492 } | 528 } |
| 493 | 529 |
| 494 base::string16 ErrorString(const std::string& error, | 530 base::string16 NetworkConnectImpl::GetErrorString( |
| 495 const std::string& service_path) { | 531 const std::string& error, |
| 532 const std::string& service_path) { |
| 496 if (error.empty()) | 533 if (error.empty()) |
| 497 return base::string16(); | 534 return base::string16(); |
| 498 if (error == shill::kErrorOutOfRange) | 535 if (error == shill::kErrorOutOfRange) |
| 499 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE); | 536 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE); |
| 500 if (error == shill::kErrorPinMissing) | 537 if (error == shill::kErrorPinMissing) |
| 501 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING); | 538 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING); |
| 502 if (error == shill::kErrorDhcpFailed) | 539 if (error == shill::kErrorDhcpFailed) |
| 503 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_DHCP_FAILED); | 540 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_DHCP_FAILED); |
| 504 if (error == shill::kErrorConnectFailed) | 541 if (error == shill::kErrorConnectFailed) |
| 505 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_CONNECT_FAILED); | 542 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_CONNECT_FAILED); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 } | 603 } |
| 567 | 604 |
| 568 if (base::StringToLowerASCII(error) == | 605 if (base::StringToLowerASCII(error) == |
| 569 base::StringToLowerASCII(std::string(shill::kUnknownString))) { | 606 base::StringToLowerASCII(std::string(shill::kUnknownString))) { |
| 570 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN); | 607 return l10n_util::GetStringUTF16(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN); |
| 571 } | 608 } |
| 572 return l10n_util::GetStringFUTF16(IDS_NETWORK_UNRECOGNIZED_ERROR, | 609 return l10n_util::GetStringFUTF16(IDS_NETWORK_UNRECOGNIZED_ERROR, |
| 573 base::UTF8ToUTF16(error)); | 610 base::UTF8ToUTF16(error)); |
| 574 } | 611 } |
| 575 | 612 |
| 576 void ShowNetworkSettings(const std::string& service_path) { | 613 void NetworkConnectImpl::ShowNetworkSettings(const std::string& service_path) { |
| 577 if (!ash::Shell::HasInstance()) | 614 delegate_->ShowNetworkSettings(service_path); |
| 578 return; | |
| 579 ash::Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings( | |
| 580 service_path); | |
| 581 } | 615 } |
| 582 | 616 |
| 583 } // network_connect | 617 } // namespace |
| 618 |
| 619 const char NetworkConnect::kErrorActivateFailed[] = "activate-failed"; |
| 620 |
| 621 static NetworkConnect* g_network_connect = NULL; |
| 622 |
| 623 // static |
| 624 void NetworkConnect::Initialize(Delegate* delegate) { |
| 625 CHECK(g_network_connect == NULL); |
| 626 g_network_connect = new NetworkConnectImpl(delegate); |
| 627 } |
| 628 |
| 629 // static |
| 630 void NetworkConnect::Shutdown() { |
| 631 CHECK(g_network_connect); |
| 632 delete g_network_connect; |
| 633 g_network_connect = NULL; |
| 634 } |
| 635 |
| 636 // static |
| 637 NetworkConnect* NetworkConnect::Get() { |
| 638 CHECK(g_network_connect); |
| 639 return g_network_connect; |
| 640 } |
| 641 |
| 642 NetworkConnect::NetworkConnect() { |
| 643 } |
| 644 |
| 645 NetworkConnect::~NetworkConnect() { |
| 646 } |
| 647 |
| 584 } // ash | 648 } // ash |
| OLD | NEW |