1// Copyright 2014 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/local_discovery/wifi/credential_getter_win.h"
6
7#include "chrome/common/extensions/chrome_utility_extensions_messages.h"
8#include "content/public/browser/browser_thread.h"
9#include "content/public/browser/utility_process_host.h"
10
11namespace local_discovery {
12
13namespace wifi {
14
15CredentialGetterWin::CredentialGetterWin() {
16}
17
18CredentialGetterWin::~CredentialGetterWin() {
19}
20
21void CredentialGetterWin::StartGetCredentials(
22    const std::string& network_guid,
23    const CredentialsCallback& callback) {
24  callback_ = callback;
25  callback_runner_ = base::MessageLoopProxy::current();
26  content::BrowserThread::PostTask(
27      content::BrowserThread::IO,
28      FROM_HERE,
29      base::Bind(&CredentialGetterWin::StartOnIOThread, this, network_guid));
30}
31
32void CredentialGetterWin::StartOnIOThread(const std::string& network_guid) {
33  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
34  content::UtilityProcessHost* host = content::UtilityProcessHost::Create(
35      this, base::MessageLoopProxy::current());
36  host->ElevatePrivileges();
37  host->Send(new ChromeUtilityHostMsg_GetWiFiCredentials(network_guid));
38}
39
40bool CredentialGetterWin::OnMessageReceived(const IPC::Message& message) {
41  bool handled = true;
42  IPC_BEGIN_MESSAGE_MAP(CredentialGetterWin, message)
43  IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GotWiFiCredentials, OnGotCredentials)
44  IPC_MESSAGE_UNHANDLED(handled = false)
45  IPC_END_MESSAGE_MAP()
46  return handled;
47}
48
49void CredentialGetterWin::OnProcessCrashed(int exit_code) {
50  PostCallback(false, "");
51}
52
53void CredentialGetterWin::OnProcessLaunchFailed() {
54  PostCallback(false, "");
55}
56
57void CredentialGetterWin::OnGotCredentials(const std::string& key_data,
58                                           bool success) {
59  PostCallback(success, key_data);
60}
61
62void CredentialGetterWin::PostCallback(bool success,
63                                       const std::string& key_data) {
64  callback_runner_->PostTask(FROM_HERE,
65                             base::Bind(callback_, success, key_data));
66}
67
68}  // namespace wifi
69}  // namespace local_discovery
70