1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/automation/automation_provider_observers.h" 6 7 #include "base/values.h" 8 #include "chrome/browser/automation/automation_provider.h" 9 #include "chrome/browser/chromeos/cros/cros_library.h" 10 #include "chrome/browser/chromeos/login/authentication_notification_details.h" 11 #include "content/common/notification_service.h" 12 13 using chromeos::CrosLibrary; 14 using chromeos::NetworkLibrary; 15 16 NetworkManagerInitObserver::NetworkManagerInitObserver( 17 AutomationProvider* automation) 18 : automation_(automation->AsWeakPtr()) {} 19 20 NetworkManagerInitObserver::~NetworkManagerInitObserver() { 21 CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this); 22 } 23 24 bool NetworkManagerInitObserver::Init() { 25 if (!CrosLibrary::Get()->EnsureLoaded()) { 26 // If cros library fails to load, don't wait for the network 27 // library to finish initializing, because it'll wait forever. 28 automation_->OnNetworkLibraryInit(); 29 return false; 30 } 31 32 CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this); 33 return true; 34 } 35 36 void NetworkManagerInitObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { 37 if (!obj->wifi_scanning()) { 38 automation_->OnNetworkLibraryInit(); 39 delete this; 40 } 41 } 42 43 LoginManagerObserver::LoginManagerObserver( 44 AutomationProvider* automation, 45 IPC::Message* reply_message) 46 : automation_(automation->AsWeakPtr()), 47 reply_message_(reply_message) { 48 registrar_.Add(this, NotificationType::LOGIN_USER_CHANGED, 49 NotificationService::AllSources()); 50 } 51 52 LoginManagerObserver::~LoginManagerObserver() {} 53 54 void LoginManagerObserver::Observe(NotificationType type, 55 const NotificationSource& source, 56 const NotificationDetails& details) { 57 DCHECK(type == NotificationType::LOGIN_USER_CHANGED); 58 59 if (!automation_) { 60 delete this; 61 return; 62 } 63 64 AutomationJSONReply reply(automation_, reply_message_.release()); 65 Details<AuthenticationNotificationDetails> auth_details(details); 66 if (auth_details->success()) 67 reply.SendSuccess(NULL); 68 else 69 reply.SendError("Login failure."); 70 delete this; 71 } 72 73 ScreenLockUnlockObserver::ScreenLockUnlockObserver( 74 AutomationProvider* automation, 75 IPC::Message* reply_message, 76 bool lock_screen) 77 : automation_(automation), 78 reply_message_(reply_message), 79 lock_screen_(lock_screen) { 80 registrar_.Add(this, NotificationType::SCREEN_LOCK_STATE_CHANGED, 81 NotificationService::AllSources()); 82 } 83 84 ScreenLockUnlockObserver::~ScreenLockUnlockObserver() {} 85 86 void ScreenLockUnlockObserver::Observe(NotificationType type, 87 const NotificationSource& source, 88 const NotificationDetails& details) { 89 DCHECK(type == NotificationType::SCREEN_LOCK_STATE_CHANGED); 90 AutomationJSONReply reply(automation_, reply_message_); 91 bool is_screen_locked = *Details<bool>(details).ptr(); 92 if (lock_screen_ == is_screen_locked) 93 reply.SendSuccess(NULL); 94 else 95 reply.SendError("Screen lock failure."); 96 delete this; 97 } 98 99 NetworkScanObserver::NetworkScanObserver(AutomationProvider* automation, 100 IPC::Message* reply_message) 101 : automation_(automation), reply_message_(reply_message) { 102 NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); 103 network_library->AddNetworkManagerObserver(this); 104 } 105 106 NetworkScanObserver::~NetworkScanObserver() { 107 NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); 108 network_library->RemoveNetworkManagerObserver(this); 109 } 110 111 void NetworkScanObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { 112 if (obj->wifi_scanning()) 113 return; 114 115 AutomationJSONReply(automation_, reply_message_).SendSuccess(NULL); 116 delete this; 117 } 118 119 NetworkConnectObserver::NetworkConnectObserver(AutomationProvider* automation, 120 IPC::Message* reply_message) 121 : automation_(automation), reply_message_(reply_message) { 122 NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); 123 network_library->AddNetworkManagerObserver(this); 124 } 125 126 NetworkConnectObserver::~NetworkConnectObserver() { 127 NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); 128 network_library->RemoveNetworkManagerObserver(this); 129 } 130 131 void NetworkConnectObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { 132 const chromeos::WifiNetwork* wifi = GetWifiNetwork(obj); 133 if (!wifi) { 134 // The network was not found, and we assume it no longer exists. 135 // This could be because the SSID is invalid, or the network went away. 136 scoped_ptr<DictionaryValue> return_value(new DictionaryValue); 137 return_value->SetString("error_string", "Network not found."); 138 AutomationJSONReply(automation_, reply_message_) 139 .SendSuccess(return_value.get()); 140 delete this; 141 return; 142 } 143 144 if (wifi->failed()) { 145 scoped_ptr<DictionaryValue> return_value(new DictionaryValue); 146 return_value->SetString("error_string", wifi->GetErrorString()); 147 AutomationJSONReply(automation_, reply_message_) 148 .SendSuccess(return_value.get()); 149 delete this; 150 } else if (wifi->connected()) { 151 AutomationJSONReply(automation_, reply_message_).SendSuccess(NULL); 152 delete this; 153 } 154 155 // The network is in the NetworkLibrary's list, but there's no failure or 156 // success condition, so just continue waiting for more network events. 157 } 158 159 ServicePathConnectObserver::ServicePathConnectObserver( 160 AutomationProvider* automation, IPC::Message* reply_message, 161 const std::string& service_path) 162 : NetworkConnectObserver(automation, reply_message), 163 service_path_(service_path) {} 164 165 const chromeos::WifiNetwork* ServicePathConnectObserver::GetWifiNetwork( 166 NetworkLibrary* network_library) { 167 return network_library->FindWifiNetworkByPath(service_path_); 168 } 169 170 SSIDConnectObserver::SSIDConnectObserver( 171 AutomationProvider* automation, IPC::Message* reply_message, 172 const std::string& ssid) 173 : NetworkConnectObserver(automation, reply_message), ssid_(ssid) {} 174 175 const chromeos::WifiNetwork* SSIDConnectObserver::GetWifiNetwork( 176 NetworkLibrary* network_library) { 177 const chromeos::WifiNetworkVector& wifi_networks = 178 network_library->wifi_networks(); 179 for (chromeos::WifiNetworkVector::const_iterator iter = wifi_networks.begin(); 180 iter != wifi_networks.end(); ++iter) { 181 const chromeos::WifiNetwork* wifi = *iter; 182 if (wifi->name() == ssid_) 183 return wifi; 184 } 185 return NULL; 186 } 187