| // Copyright (c) 2011 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. |
| |
| #include "chrome/browser/automation/automation_provider_observers.h" |
| |
| #include "base/values.h" |
| #include "chrome/browser/automation/automation_provider.h" |
| #include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "chrome/browser/chromeos/login/authentication_notification_details.h" |
| #include "content/common/notification_service.h" |
| |
| using chromeos::CrosLibrary; |
| using chromeos::NetworkLibrary; |
| |
| NetworkManagerInitObserver::NetworkManagerInitObserver( |
| AutomationProvider* automation) |
| : automation_(automation->AsWeakPtr()) {} |
| |
| NetworkManagerInitObserver::~NetworkManagerInitObserver() { |
| CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this); |
| } |
| |
| bool NetworkManagerInitObserver::Init() { |
| if (!CrosLibrary::Get()->EnsureLoaded()) { |
| // If cros library fails to load, don't wait for the network |
| // library to finish initializing, because it'll wait forever. |
| automation_->OnNetworkLibraryInit(); |
| return false; |
| } |
| |
| CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this); |
| return true; |
| } |
| |
| void NetworkManagerInitObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { |
| if (!obj->wifi_scanning()) { |
| automation_->OnNetworkLibraryInit(); |
| delete this; |
| } |
| } |
| |
| LoginManagerObserver::LoginManagerObserver( |
| AutomationProvider* automation, |
| IPC::Message* reply_message) |
| : automation_(automation->AsWeakPtr()), |
| reply_message_(reply_message) { |
| registrar_.Add(this, NotificationType::LOGIN_USER_CHANGED, |
| NotificationService::AllSources()); |
| } |
| |
| LoginManagerObserver::~LoginManagerObserver() {} |
| |
| void LoginManagerObserver::Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) { |
| DCHECK(type == NotificationType::LOGIN_USER_CHANGED); |
| |
| if (!automation_) { |
| delete this; |
| return; |
| } |
| |
| AutomationJSONReply reply(automation_, reply_message_.release()); |
| Details<AuthenticationNotificationDetails> auth_details(details); |
| if (auth_details->success()) |
| reply.SendSuccess(NULL); |
| else |
| reply.SendError("Login failure."); |
| delete this; |
| } |
| |
| ScreenLockUnlockObserver::ScreenLockUnlockObserver( |
| AutomationProvider* automation, |
| IPC::Message* reply_message, |
| bool lock_screen) |
| : automation_(automation), |
| reply_message_(reply_message), |
| lock_screen_(lock_screen) { |
| registrar_.Add(this, NotificationType::SCREEN_LOCK_STATE_CHANGED, |
| NotificationService::AllSources()); |
| } |
| |
| ScreenLockUnlockObserver::~ScreenLockUnlockObserver() {} |
| |
| void ScreenLockUnlockObserver::Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) { |
| DCHECK(type == NotificationType::SCREEN_LOCK_STATE_CHANGED); |
| AutomationJSONReply reply(automation_, reply_message_); |
| bool is_screen_locked = *Details<bool>(details).ptr(); |
| if (lock_screen_ == is_screen_locked) |
| reply.SendSuccess(NULL); |
| else |
| reply.SendError("Screen lock failure."); |
| delete this; |
| } |
| |
| NetworkScanObserver::NetworkScanObserver(AutomationProvider* automation, |
| IPC::Message* reply_message) |
| : automation_(automation), reply_message_(reply_message) { |
| NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); |
| network_library->AddNetworkManagerObserver(this); |
| } |
| |
| NetworkScanObserver::~NetworkScanObserver() { |
| NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); |
| network_library->RemoveNetworkManagerObserver(this); |
| } |
| |
| void NetworkScanObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { |
| if (obj->wifi_scanning()) |
| return; |
| |
| AutomationJSONReply(automation_, reply_message_).SendSuccess(NULL); |
| delete this; |
| } |
| |
| NetworkConnectObserver::NetworkConnectObserver(AutomationProvider* automation, |
| IPC::Message* reply_message) |
| : automation_(automation), reply_message_(reply_message) { |
| NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); |
| network_library->AddNetworkManagerObserver(this); |
| } |
| |
| NetworkConnectObserver::~NetworkConnectObserver() { |
| NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); |
| network_library->RemoveNetworkManagerObserver(this); |
| } |
| |
| void NetworkConnectObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { |
| const chromeos::WifiNetwork* wifi = GetWifiNetwork(obj); |
| if (!wifi) { |
| // The network was not found, and we assume it no longer exists. |
| // This could be because the SSID is invalid, or the network went away. |
| scoped_ptr<DictionaryValue> return_value(new DictionaryValue); |
| return_value->SetString("error_string", "Network not found."); |
| AutomationJSONReply(automation_, reply_message_) |
| .SendSuccess(return_value.get()); |
| delete this; |
| return; |
| } |
| |
| if (wifi->failed()) { |
| scoped_ptr<DictionaryValue> return_value(new DictionaryValue); |
| return_value->SetString("error_string", wifi->GetErrorString()); |
| AutomationJSONReply(automation_, reply_message_) |
| .SendSuccess(return_value.get()); |
| delete this; |
| } else if (wifi->connected()) { |
| AutomationJSONReply(automation_, reply_message_).SendSuccess(NULL); |
| delete this; |
| } |
| |
| // The network is in the NetworkLibrary's list, but there's no failure or |
| // success condition, so just continue waiting for more network events. |
| } |
| |
| ServicePathConnectObserver::ServicePathConnectObserver( |
| AutomationProvider* automation, IPC::Message* reply_message, |
| const std::string& service_path) |
| : NetworkConnectObserver(automation, reply_message), |
| service_path_(service_path) {} |
| |
| const chromeos::WifiNetwork* ServicePathConnectObserver::GetWifiNetwork( |
| NetworkLibrary* network_library) { |
| return network_library->FindWifiNetworkByPath(service_path_); |
| } |
| |
| SSIDConnectObserver::SSIDConnectObserver( |
| AutomationProvider* automation, IPC::Message* reply_message, |
| const std::string& ssid) |
| : NetworkConnectObserver(automation, reply_message), ssid_(ssid) {} |
| |
| const chromeos::WifiNetwork* SSIDConnectObserver::GetWifiNetwork( |
| NetworkLibrary* network_library) { |
| const chromeos::WifiNetworkVector& wifi_networks = |
| network_library->wifi_networks(); |
| for (chromeos::WifiNetworkVector::const_iterator iter = wifi_networks.begin(); |
| iter != wifi_networks.end(); ++iter) { |
| const chromeos::WifiNetwork* wifi = *iter; |
| if (wifi->name() == ssid_) |
| return wifi; |
| } |
| return NULL; |
| } |