// 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;
}