1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/api/networking_private/networking_private_service_client.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/base64.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/sequenced_task_runner.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_util.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/worker_pool.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/browser_process.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/api/networking_private/networking_private_api.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/extensions/api/networking_private.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using content::BrowserThread;
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kNetworkingPrivateSequenceTokenName[] = "NetworkingPrivate";
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool GetVerificationCredentials(
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const NetworkingPrivateDelegate::VerificationProperties& properties,
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NetworkingPrivateServiceClient::CryptoVerify::Credentials* credentials) {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<std::string> data_parts;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data_parts.push_back(properties.device_ssid);
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data_parts.push_back(properties.device_serial);
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data_parts.push_back(properties.device_bssid);
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data_parts.push_back(properties.public_key);
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data_parts.push_back(properties.nonce);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  credentials->unsigned_data = JoinString(data_parts, ",");
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!base::Base64Decode(properties.signed_data, &credentials->signed_data)) {
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(ERROR) << "Failed to decode signed data: " << properties.signed_data;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  credentials->certificate = properties.certificate;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  credentials->device_bssid = properties.device_bssid;
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!base::Base64Decode(properties.public_key, &credentials->public_key)) {
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(ERROR) << "Failed to decode public key";
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Deletes WiFiService and CryptoVerify objects on worker thread.
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ShutdownServicesOnWorkerThread(
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<wifi::WiFiService> wifi_service,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<NetworkingPrivateServiceClient::CryptoVerify> crypto_verify) {
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(wifi_service.get());
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(crypto_verify.get());
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Forwards call back from VerifyAndEncryptCredentials on random thread to
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// |callback| on correct |callback_loop_proxy|.
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AfterVerifyAndEncryptCredentialsRelay(
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const NetworkingPrivateServiceClient::CryptoVerify::
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        VerifyAndEncryptCredentialsCallback& callback,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> callback_loop_proxy,
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& key_data,
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& error) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  callback_loop_proxy->PostTask(FROM_HERE,
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                base::Bind(callback, key_data, error));
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)NetworkingPrivateServiceClient::CryptoVerify::CryptoVerify() {}
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)NetworkingPrivateServiceClient::CryptoVerify::~CryptoVerify() {}
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
74116680a4aac90f2aa7413d9095a592090648e557Ben MurdochNetworkingPrivateServiceClient::CryptoVerify::Credentials::Credentials() {}
75116680a4aac90f2aa7413d9095a592090648e557Ben MurdochNetworkingPrivateServiceClient::CryptoVerify::Credentials::~Credentials() {}
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NetworkingPrivateServiceClient::NetworkingPrivateServiceClient(
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    wifi::WiFiService* wifi_service,
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CryptoVerify* crypto_verify)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : crypto_verify_(crypto_verify),
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      wifi_service_(wifi_service),
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_factory_(this) {
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetNamedSequenceToken(kNetworkingPrivateSequenceTokenName);
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_ = BrowserThread::GetBlockingPool()->
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetSequencedTaskRunnerWithShutdownBehavior(
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          sequence_token_,
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTask(
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FROM_HERE,
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::Bind(
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &WiFiService::Initialize,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Unretained(wifi_service_.get()),
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        task_runner_));
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  task_runner_->PostTask(
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FROM_HERE,
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::Bind(
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &WiFiService::SetEventObservers,
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Unretained(wifi_service_.get()),
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::MessageLoopProxy::current(),
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            &NetworkingPrivateServiceClient::OnNetworksChangedEventOnUIThread,
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            weak_factory_.GetWeakPtr()),
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            &NetworkingPrivateServiceClient::
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                OnNetworkListChangedEventOnUIThread,
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            weak_factory_.GetWeakPtr())));
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NetworkingPrivateServiceClient::~NetworkingPrivateServiceClient() {
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Verify that these objects were passed to ShutdownServicesOnWorkerThread to
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // be deleted after completion of all posted tasks.
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!wifi_service_.get());
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!crypto_verify_.get());
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NetworkingPrivateServiceClient::ServiceCallbacks::ServiceCallbacks() {}
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NetworkingPrivateServiceClient::ServiceCallbacks::~ServiceCallbacks() {}
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::Shutdown() {
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Clear callbacks map to release callbacks from UI thread.
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  callbacks_map_.Clear();
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Post ShutdownServicesOnWorkerThread task to delete services when all posted
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // tasks are done.
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTask(
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&ShutdownServicesOnWorkerThread,
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Passed(&wifi_service_),
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Passed(&crypto_verify_)));
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AddObserver(Observer* observer) {
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  network_events_observers_.AddObserver(observer);
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::RemoveObserver(Observer* observer) {
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  network_events_observers_.RemoveObserver(observer);
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetworkingPrivateServiceClient::OnNetworkChanged(
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    net::NetworkChangeNotifier::ConnectionType type) {
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&WiFiService::RequestConnectedNetworkUpdate,
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(wifi_service_.get())));
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NetworkingPrivateServiceClient::ServiceCallbacks*
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NetworkingPrivateServiceClient::AddServiceCallbacks() {
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = new ServiceCallbacks();
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service_callbacks->id = callbacks_map_.Add(service_callbacks);
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return service_callbacks;
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::RemoveServiceCallbacks(
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id) {
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  callbacks_map_.Remove(callback_id);
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// NetworkingPrivateServiceClient implementation
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::GetProperties(
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const DictionaryCallback& success_callback,
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->get_properties_callback = success_callback;
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* error = new std::string;
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue* properties_ptr = properties.get();
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTaskAndReply(
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WiFiService::GetProperties,
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(wifi_service_.get()),
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 properties_ptr,
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 error),
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterGetProperties,
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 service_callbacks->id,
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Passed(&properties),
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(error)));
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NetworkingPrivateServiceClient::GetManagedProperties(
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const DictionaryCallback& success_callback,
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->get_properties_callback = success_callback;
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string* error = new std::string;
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue* properties_ptr = properties.get();
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  task_runner_->PostTaskAndReply(
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      FROM_HERE,
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&WiFiService::GetManagedProperties,
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(wifi_service_.get()),
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 properties_ptr,
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 error),
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterGetProperties,
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 service_callbacks->id,
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Passed(&properties),
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Owned(error)));
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NetworkingPrivateServiceClient::GetState(
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const DictionaryCallback& success_callback,
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->get_properties_callback = success_callback;
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string* error = new std::string;
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue* properties_ptr = properties.get();
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  task_runner_->PostTaskAndReply(
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      FROM_HERE,
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&WiFiService::GetState,
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(wifi_service_.get()),
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 properties_ptr,
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 error),
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterGetProperties,
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 service_callbacks->id,
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Passed(&properties),
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Owned(error)));
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::SetProperties(
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::DictionaryValue> properties,
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const VoidCallback& success_callback,
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->set_properties_callback = success_callback;
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* error = new std::string;
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTaskAndReply(
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WiFiService::SetProperties,
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(wifi_service_.get()),
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Passed(&properties),
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 error),
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterSetProperties,
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 service_callbacks->id,
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(error)));
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NetworkingPrivateServiceClient::CreateNetwork(
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool shared,
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::DictionaryValue> properties,
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const StringCallback& success_callback,
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->create_network_callback = success_callback;
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string* network_guid = new std::string;
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string* error = new std::string;
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  task_runner_->PostTaskAndReply(
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      FROM_HERE,
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&WiFiService::CreateNetwork,
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(wifi_service_.get()),
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 shared,
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Passed(&properties),
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 network_guid,
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 error),
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterCreateNetwork,
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 service_callbacks->id,
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Owned(network_guid),
295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Owned(error)));
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid NetworkingPrivateServiceClient::GetNetworks(
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& network_type,
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool configured_only,
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool visible_only,
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int limit,
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const NetworkListCallback& success_callback,
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->get_visible_networks_callback = success_callback;
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::ListValue> networks(new base::ListValue);
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(stevenjb/mef): Apply filters (configured, visible, limit).
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ListValue* networks_ptr = networks.get();
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  task_runner_->PostTaskAndReply(
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE,
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&WiFiService::GetVisibleNetworks,
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(wifi_service_.get()),
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 network_type,
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 networks_ptr,
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 false),
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&NetworkingPrivateServiceClient::AfterGetVisibleNetworks,
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 weak_factory_.GetWeakPtr(),
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 service_callbacks->id,
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Passed(&networks)));
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::StartConnect(
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const VoidCallback& success_callback,
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->start_connect_callback = success_callback;
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* error = new std::string;
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTaskAndReply(
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WiFiService::StartConnect,
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(wifi_service_.get()),
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 error),
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterStartConnect,
344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 service_callbacks->id,
346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(error)));
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::StartDisconnect(
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const VoidCallback& success_callback,
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->start_disconnect_callback = success_callback;
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* error = new std::string;
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTaskAndReply(
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WiFiService::StartDisconnect,
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(wifi_service_.get()),
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 guid,
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 error),
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterStartDisconnect,
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 service_callbacks->id,
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(error)));
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::VerifyDestination(
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const VerificationProperties& verification_properties,
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const BoolCallback& success_callback,
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!crypto_verify_) {
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    failure_callback.Run(networking_private::kErrorNotSupported);
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->verify_destination_callback = success_callback;
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CryptoVerify::Credentials credentials;
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GetVerificationCredentials(verification_properties, &credentials)) {
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    failure_callback.Run(networking_private::kErrorEncryptionError);
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool* result = new bool;
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* error = new std::string;
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTaskAndReply(
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&CryptoVerify::VerifyDestination,
396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(crypto_verify_.get()),
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 credentials,
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 result,
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 error),
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterVerifyDestination,
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 service_callbacks->id,
403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(result),
404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(error)));
405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetworkingPrivateServiceClient::VerifyAndEncryptCredentials(
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const VerificationProperties& verification_properties,
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const StringCallback& success_callback,
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!crypto_verify_) {
4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    failure_callback.Run(networking_private::kErrorNotSupported);
4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
4166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->verify_and_encrypt_credentials_callback = success_callback;
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CryptoVerify::Credentials credentials;
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GetVerificationCredentials(verification_properties, &credentials)) {
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    failure_callback.Run(networking_private::kErrorEncryptionError);
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CryptoVerify::VerifyAndEncryptCredentialsCallback callback_relay(base::Bind(
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      &AfterVerifyAndEncryptCredentialsRelay,
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          &NetworkingPrivateServiceClient::AfterVerifyAndEncryptCredentials,
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          weak_factory_.GetWeakPtr(),
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          service_callbacks->id),
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::MessageLoopProxy::current()));
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE,
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         base::Bind(&CryptoVerify::VerifyAndEncryptCredentials,
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    base::Unretained(crypto_verify_.get()),
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    guid,
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    credentials,
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    callback_relay));
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::VerifyAndEncryptData(
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const VerificationProperties& verification_properties,
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& data,
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const StringCallback& success_callback,
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
4486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!crypto_verify_) {
4496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    failure_callback.Run(networking_private::kErrorNotSupported);
4506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = AddServiceCallbacks();
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->failure_callback = failure_callback;
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->verify_and_encrypt_data_callback = success_callback;
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CryptoVerify::Credentials credentials;
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GetVerificationCredentials(verification_properties, &credentials)) {
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    failure_callback.Run(networking_private::kErrorEncryptionError);
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* result = new std::string;
464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string* error = new std::string;
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  task_runner_->PostTaskAndReply(
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&CryptoVerify::VerifyAndEncryptData,
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(crypto_verify_.get()),
470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 credentials,
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 data,
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 result,
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 error),
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&NetworkingPrivateServiceClient::AfterVerifyAndEncryptData,
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 service_callbacks->id,
477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(result),
478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Owned(error)));
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid NetworkingPrivateServiceClient::SetWifiTDLSEnabledState(
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& ip_or_mac_address,
483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool enabled,
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const StringCallback& success_callback,
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  failure_callback.Run(networking_private::kErrorNotSupported);
487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid NetworkingPrivateServiceClient::GetWifiTDLSStatus(
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& ip_or_mac_address,
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const StringCallback& success_callback,
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  failure_callback.Run(networking_private::kErrorNotSupported);
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid NetworkingPrivateServiceClient::GetCaptivePortalStatus(
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& guid,
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const StringCallback& success_callback,
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const FailureCallback& failure_callback) {
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  failure_callback.Run(networking_private::kErrorNotSupported);
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<base::ListValue>
504116680a4aac90f2aa7413d9095a592090648e557Ben MurdochNetworkingPrivateServiceClient::GetEnabledNetworkTypes() {
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::ListValue> network_list;
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return network_list.Pass();
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NetworkingPrivateServiceClient::EnableNetworkType(
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& type) {
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NetworkingPrivateServiceClient::DisableNetworkType(
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& type) {
516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
519116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NetworkingPrivateServiceClient::RequestScan() {
520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  task_runner_->PostTask(
521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE,
522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&WiFiService::RequestNetworkScan,
523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(wifi_service_.get())));
524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch////////////////////////////////////////////////////////////////////////////////
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterGetProperties(
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& network_guid,
532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::DictionaryValue> properties,
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* error) {
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!error->empty()) {
537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!service_callbacks->get_properties_callback.is_null());
541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->get_properties_callback.Run(properties.Pass());
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterGetVisibleNetworks(
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::ListValue> networks) {
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!service_callbacks->get_visible_networks_callback.is_null());
552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_callbacks->get_visible_networks_callback.Run(networks.Pass());
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterSetProperties(
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* error) {
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!error->empty()) {
562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!service_callbacks->set_properties_callback.is_null());
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_callbacks->set_properties_callback.Run();
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NetworkingPrivateServiceClient::AfterCreateNetwork(
572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ServiceCallbacksID callback_id,
573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string* network_guid,
574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string* error) {
575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(service_callbacks);
577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!error->empty()) {
578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(!service_callbacks->create_network_callback.is_null());
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    service_callbacks->create_network_callback.Run(*network_guid);
583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RemoveServiceCallbacks(callback_id);
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterStartConnect(
588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* error) {
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!error->empty()) {
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!service_callbacks->start_connect_callback.is_null());
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_callbacks->start_connect_callback.Run();
598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterStartDisconnect(
603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* error) {
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!error->empty()) {
608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!service_callbacks->start_disconnect_callback.is_null());
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_callbacks->start_disconnect_callback.Run();
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterVerifyDestination(
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const bool* result,
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* error) {
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!error->empty()) {
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!service_callbacks->verify_destination_callback.is_null());
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_callbacks->verify_destination_callback.Run(*result);
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetworkingPrivateServiceClient::AfterVerifyAndEncryptCredentials(
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ServiceCallbacksID callback_id,
635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& encrypted_data,
636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& error) {
637effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(service_callbacks);
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!error.empty()) {
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(error);
643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        !service_callbacks->verify_and_encrypt_credentials_callback.is_null());
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    service_callbacks->verify_and_encrypt_credentials_callback.Run(
647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        encrypted_data);
648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RemoveServiceCallbacks(callback_id);
650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::AfterVerifyAndEncryptData(
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServiceCallbacksID callback_id,
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* result,
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string* error) {
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(service_callbacks);
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!error->empty()) {
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!service_callbacks->failure_callback.is_null());
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_callbacks->failure_callback.Run(*error);
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!service_callbacks->verify_and_encrypt_data_callback.is_null());
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_callbacks->verify_and_encrypt_data_callback.Run(*result);
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RemoveServiceCallbacks(callback_id);
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::OnNetworksChangedEventOnUIThread(
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::vector<std::string>& network_guids) {
670effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FOR_EACH_OBSERVER(Observer,
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    network_events_observers_,
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    OnNetworksChangedEvent(network_guids));
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkingPrivateServiceClient::OnNetworkListChangedEventOnUIThread(
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::vector<std::string>& network_guids) {
678effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FOR_EACH_OBSERVER(Observer,
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    network_events_observers_,
681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    OnNetworkListChangedEvent(network_guids));
682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace extensions
685