172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/automation/testing_automation_provider.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/automation/automation_provider_json.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/automation/automation_provider_observers.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/network_library.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/power_library.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/cros/screen_lock_library.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/update_library.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/login/existing_user_controller.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/screen_locker.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/proxy_cros_settings_provider.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing chromeos::CrosLibrary;
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing chromeos::NetworkLibrary;
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing chromeos::UserManager;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing chromeos::UpdateLibrary;
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool EnsureCrosLibraryLoaded(AutomationProvider* provider,
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             IPC::Message* reply_message) {
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!CrosLibrary::Get()->EnsureLoaded()) {
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(provider, reply_message).SendError(
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "Could not load cros library.");
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenDictionaryValue* GetNetworkInfoDict(const chromeos::Network* network) {
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DictionaryValue* item = new DictionaryValue;
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  item->SetString("name", network->name());
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  item->SetString("device_path", network->device_path());
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  item->SetString("ip_address", network->ip_address());
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  item->SetString("status", network->GetStateString());
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return item;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenValue* GetProxySetting(const std::string& setting_name) {
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::ProxyCrosSettingsProvider settings_provider;
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string setting_path = "cros.session.proxy.";
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  setting_path.append(setting_name);
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (setting_name == "ignorelist") {
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Value* value;
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (settings_provider.Get(setting_path, &value))
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value;
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Value* setting;
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (settings_provider.Get(setting_path, &setting)) {
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DictionaryValue* setting_dict = static_cast<DictionaryValue*>(setting);
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Value* value;
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bool found = setting_dict->Remove("value", &value);
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      delete setting;
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (found)
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return value;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return NULL;
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* UpdateStatusToString(chromeos::UpdateStatusOperation status) {
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (status) {
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_IDLE:
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "idle";
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_CHECKING_FOR_UPDATE:
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "checking for update";
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_UPDATE_AVAILABLE:
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "update available";
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_DOWNLOADING:
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "downloading";
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_VERIFYING:
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "verifying";
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_FINALIZING:
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "finalizing";
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_UPDATED_NEED_REBOOT:
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "updated need reboot";
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::UPDATE_STATUS_REPORTING_ERROR_EVENT:
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "reporting error event";
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "unknown";
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid GetReleaseTrackCallback(void* user_data, const char* track) {
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply* reply = static_cast<AutomationJSONReply*>(user_data);
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (track == NULL) {
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply->SendError("Unable to get release track.");
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delete reply;
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetString("release_track", track);
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateLibrary* update_library = CrosLibrary::Get()->GetUpdateLibrary();
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const UpdateLibrary::Status& status = update_library->status();
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::UpdateStatusOperation update_status = status.status;
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetString("status", UpdateStatusToString(update_status));
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (update_status == chromeos::UPDATE_STATUS_DOWNLOADING)
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetDouble("download_progress", status.download_progress);
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (status.last_checked_time > 0)
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetInteger("last_checked_time", status.last_checked_time);
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (status.new_size > 0)
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetInteger("new_size", status.new_size);
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply->SendSuccess(return_value.get());
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delete reply;
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid UpdateCheckCallback(void* user_data, chromeos::UpdateResult result,
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const char* error_msg) {
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply* reply = static_cast<AutomationJSONReply*>(user_data);
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (result == chromeos::UPDATE_RESULT_SUCCESS)
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply->SendSuccess(NULL);
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply->SendError(error_msg);
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delete reply;
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetLoginInfo(DictionaryValue* args,
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             IPC::Message* reply_message) {
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const UserManager* user_manager = UserManager::Get();
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!user_manager)
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("No user manager!");
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const chromeos::ScreenLocker* screen_locker =
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      chromeos::ScreenLocker::default_screen_locker();
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetBoolean("is_owner", user_manager->current_user_is_owner());
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetBoolean("is_logged_in", user_manager->user_is_logged_in());
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetBoolean("is_screen_locked", screen_locker);
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (user_manager->user_is_logged_in()) {
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetBoolean("is_guest", user_manager->IsLoggedInAsGuest());
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetString("email", user_manager->logged_in_user().email());
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(return_value.get());
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Logging in as guest will cause session_manager to restart Chrome with new
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// flags. If you used EnableChromeTesting, you will have to call it again.
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TestingAutomationProvider::LoginAsGuest(DictionaryValue* args,
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                             IPC::Message* reply_message) {
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  chromeos::ExistingUserController* controller =
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      chromeos::ExistingUserController::current_controller();
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Set up an observer (it will delete itself).
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new LoginManagerObserver(this, reply_message);
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller->LoginAsGuest();
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TestingAutomationProvider::Login(DictionaryValue* args,
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      IPC::Message* reply_message) {
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string username, password;
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetString("username", &username) ||
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      !args->GetString("password", &password)) {
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "Invalid or missing args.");
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  chromeos::ExistingUserController* controller =
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      chromeos::ExistingUserController::current_controller();
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Set up an observer (it will delete itself).
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new LoginManagerObserver(this, reply_message);
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller->Login(username, password);
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::LockScreen(DictionaryValue* args,
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                           IPC::Message* reply_message) {
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new ScreenLockUnlockObserver(this, reply_message, true);
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CrosLibrary::Get()->GetScreenLockLibrary()->
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NotifyScreenLockRequested();
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::UnlockScreen(DictionaryValue* args,
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                             IPC::Message* reply_message) {
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new ScreenLockUnlockObserver(this, reply_message, false);
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CrosLibrary::Get()->GetScreenLockLibrary()->
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NotifyScreenUnlockRequested();
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Signing out could have undesirable side effects: session_manager is
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// killed, so its children, including chrome and the window manager, will
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// also be killed. Anything owned by chronos will probably be killed.
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SignoutInScreenLocker(
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::ScreenLocker* screen_locker =
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      chromeos::ScreenLocker::default_screen_locker();
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!screen_locker) {
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError(
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "No default screen locker. Are you sure the screen is locked?");
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Send success before stopping session because if we're a child of
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // session manager then we'll die when the session is stopped.
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(NULL);
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  screen_locker->Signout();
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetBatteryInfo(DictionaryValue* args,
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               IPC::Message* reply_message) {
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::PowerLibrary* power_library = CrosLibrary::Get()->GetPowerLibrary();
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetBoolean("battery_is_present",
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           power_library->battery_is_present());
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetBoolean("line_power_on", power_library->line_power_on());
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (power_library->battery_is_present()) {
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetBoolean("battery_fully_charged",
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             power_library->battery_fully_charged());
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetDouble("battery_percentage",
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            power_library->battery_percentage());
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (power_library->line_power_on()) {
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int time = power_library->battery_time_to_full().InSeconds();
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (time > 0 || power_library->battery_fully_charged())
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return_value->SetInteger("battery_time_to_full", time);
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int time = power_library->battery_time_to_empty().InSeconds();
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (time > 0)
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return_value->SetInteger("battery_time_to_empty", time);
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetNetworkInfo(DictionaryValue* args,
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               IPC::Message* reply_message) {
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // IP address.
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return_value->SetString("ip_address", network_library->IPAddress());
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Currently connected networks.
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (network_library->ethernet_network())
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetString(
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "connected_ethernet",
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_library->ethernet_network()->service_path());
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (network_library->wifi_network())
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetString("connected_wifi",
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            network_library->wifi_network()->service_path());
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (network_library->cellular_network())
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->SetString(
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "connected_cellular",
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_library->cellular_network()->service_path());
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Ethernet network.
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ethernet_available = network_library->ethernet_available();
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ethernet_enabled = network_library->ethernet_enabled();
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (ethernet_available && ethernet_enabled) {
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const chromeos::EthernetNetwork* ethernet_network =
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_library->ethernet_network();
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (ethernet_network) {
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DictionaryValue* items = new DictionaryValue;
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DictionaryValue* item = GetNetworkInfoDict(ethernet_network);
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      items->Set(ethernet_network->service_path(), item);
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return_value->Set("ethernet_networks", items);
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Wi-fi networks.
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool wifi_available = network_library->wifi_available();
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool wifi_enabled = network_library->wifi_enabled();
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (wifi_available && wifi_enabled) {
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const chromeos::WifiNetworkVector& wifi_networks =
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_library->wifi_networks();
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* items = new DictionaryValue;
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (chromeos::WifiNetworkVector::const_iterator iter =
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         wifi_networks.begin(); iter != wifi_networks.end(); ++iter) {
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const chromeos::WifiNetwork* wifi = *iter;
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DictionaryValue* item = GetNetworkInfoDict(wifi);
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetInteger("strength", wifi->strength());
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetBoolean("encrypted", wifi->encrypted());
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("encryption", wifi->GetEncryptionString());
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      items->Set(wifi->service_path(), item);
303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->Set("wifi_networks", items);
305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Cellular networks.
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool cellular_available = network_library->cellular_available();
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool cellular_enabled = network_library->cellular_enabled();
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (cellular_available && cellular_enabled) {
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const chromeos::CellularNetworkVector& cellular_networks =
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_library->cellular_networks();
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* items = new DictionaryValue;
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (size_t i = 0; i < cellular_networks.size(); ++i) {
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DictionaryValue* item = GetNetworkInfoDict(cellular_networks[i]);
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetInteger("strength", cellular_networks[i]->strength());
317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("operator_name", cellular_networks[i]->operator_name());
318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("operator_code", cellular_networks[i]->operator_code());
319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("payment_url", cellular_networks[i]->payment_url());
320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("usage_url", cellular_networks[i]->usage_url());
321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("network_technology",
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      cellular_networks[i]->GetNetworkTechnologyString());
323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("connectivity_state",
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      cellular_networks[i]->GetConnectivityStateString());
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("activation_state",
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      cellular_networks[i]->GetActivationStateString());
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      item->SetString("roaming_state",
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      cellular_networks[i]->GetRoamingStateString());
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      items->Set(cellular_networks[i]->service_path(), item);
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return_value->Set("cellular_networks", items);
332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::NetworkScan(DictionaryValue* args,
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            IPC::Message* reply_message) {
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  network_library->RequestNetworkScan();
344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set up an observer (it will delete itself).
346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new NetworkScanObserver(this, reply_message);
347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetProxySettings(DictionaryValue* args,
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                 IPC::Message* reply_message) {
351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const char* settings[] = { "pacurl", "singlehttp", "singlehttpport",
352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             "httpurl", "httpport", "httpsurl", "httpsport",
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             "type", "single", "ftpurl", "ftpport",
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             "socks", "socksport", "ignorelist" };
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::ProxyCrosSettingsProvider settings_provider;
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < arraysize(settings); ++i) {
360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Value* setting = GetProxySetting(settings[i]);
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (setting)
362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return_value->Set(settings[i], setting);
363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SetProxySettings(DictionaryValue* args,
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                IPC::Message* reply_message) {
370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string key;
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Value* value;
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("key", &key) || !args->Get("value", &value)) {
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("Invalid or missing args.");
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string setting_path = "cros.session.proxy.";
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  setting_path.append(key);
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ProxyCrosSettingsProvider will own the Value* passed to Set().
382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::ProxyCrosSettingsProvider().Set(setting_path, value->DeepCopy());
383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(NULL);
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::ConnectToWifiNetwork(
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string service_path, password, identity, certpath;
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("service_path", &service_path) ||
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("password", &password) ||
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("identity", &identity) ||
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("certpath", &certpath)) {
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("Invalid or missing args.");
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::WifiNetwork* wifi =
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_library->FindWifiNetworkByPath(service_path);
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!wifi) {
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("No network found with specified service path.");
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!password.empty())
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetPassphrase(password);
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!identity.empty())
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetIdentity(identity);
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!certpath.empty())
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetCertPath(certpath);
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set up an observer (it will delete itself).
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new ServicePathConnectObserver(this, reply_message, service_path);
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  network_library->ConnectToWifiNetwork(wifi);
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  network_library->RequestNetworkScan();
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::ConnectToHiddenWifiNetwork(
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!CrosLibrary::Get()->EnsureLoaded()) {
425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Could not load cros library.");
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string ssid, security, password, identity, certpath;
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("ssid", &ssid) ||
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("security", &security) ||
433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("password", &password) ||
434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("identity", &identity) ||
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !args->GetString("certpath", &certpath)) {
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Invalid or missing args.");
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::map<std::string, chromeos::ConnectionSecurity> connection_security_map;
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  connection_security_map["SECURITY_NONE"] = chromeos::SECURITY_NONE;
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  connection_security_map["SECURITY_WEP"] = chromeos::SECURITY_WEP;
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  connection_security_map["SECURITY_WPA"] = chromeos::SECURITY_WPA;
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  connection_security_map["SECURITY_RSN"] = chromeos::SECURITY_RSN;
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  connection_security_map["SECURITY_8021X"] = chromeos::SECURITY_8021X;
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (connection_security_map.find(security) == connection_security_map.end()) {
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Unknown security type.");
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chromeos::ConnectionSecurity connection_security =
454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      connection_security_map[security];
455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set up an observer (it will delete itself).
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new SSIDConnectObserver(this, reply_message, ssid);
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  network_library->ConnectToWifiNetwork(connection_security, ssid, password,
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        identity, certpath);
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::DisconnectFromWifiNetwork(
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const chromeos::WifiNetwork* wifi = network_library->wifi_network();
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!wifi) {
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("Not connected to any wifi network.");
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  network_library->DisconnectFromNetwork(wifi);
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(NULL);
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetUpdateInfo(DictionaryValue* args,
483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                              IPC::Message* reply_message) {
484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateLibrary* update_library = CrosLibrary::Get()->GetUpdateLibrary();
488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply* reply = new AutomationJSONReply(this, reply_message);
489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  update_library->GetReleaseTrack(GetReleaseTrackCallback, reply);
490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::UpdateCheck(
493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateLibrary* update_library = CrosLibrary::Get()->GetUpdateLibrary();
499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply* reply = new AutomationJSONReply(this, reply_message);
500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  update_library->RequestUpdateCheck(UpdateCheckCallback, reply);
501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SetReleaseTrack(DictionaryValue* args,
504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                IPC::Message* reply_message) {
505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLibraryLoaded(this, reply_message))
506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string track;
510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("track", &track)) {
511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("Invalid or missing args.");
512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateLibrary* update_library = CrosLibrary::Get()->GetUpdateLibrary();
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  update_library->SetReleaseTrack(track);
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(NULL);
518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
519