1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/signed_settings_helper.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <vector>
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/lazy_instance.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/signed_settings.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/device_management_backend.pb.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos {
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass OpContext {
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class Delegate {
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void OnOpCreated(OpContext* context) = 0;
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void OnOpStarted(OpContext* context) = 0;
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void OnOpCompleted(OpContext* context) = 0;
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~OpContext() {}
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Creates and execute op.
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Execute() {
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    CreateOp();
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    CHECK(op_.get());
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (delegate_)
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      delegate_->OnOpCreated(this);
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Note that the context could be released when op_->Execute() returns.
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // So keep a local copy of delegate and executing flag to use after
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the call.
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Delegate* delegate = delegate_;
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    executing_ = true;
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    op_->Execute();
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (delegate)
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      delegate->OnOpStarted(this);
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Cancels the callback.
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void CancelCallback() {
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    callback_ = NULL;
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Cancels the callback and cancels the op if it is not executing.
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Cancel() {
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    CancelCallback();
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!executing_)
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      OnOpCompleted();
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Accessors.
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettings* op() const {
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return op_.get();
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Callback* callback() const {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return callback_;
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void set_delegate(Delegate* delegate) {
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    delegate_ = delegate;
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected:
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  OpContext(SignedSettingsHelper::Callback* callback,
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            Delegate* delegate)
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : executing_(false),
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        delegate_(delegate),
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        callback_(callback) {
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Creates the op to execute.
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void CreateOp() = 0;
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Callback on op completion.
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpCompleted() {
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (delegate_)
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      delegate_->OnOpCompleted(this);
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    delete this;
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool executing_;
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Delegate* delegate_;
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<SignedSettings> op_;
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Callback* callback_;
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass WhitelistOpContext : public SignedSettings::Delegate<bool>,
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           public OpContext {
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  enum Type {
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    CHECK,
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ADD,
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    REMOVE,
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WhitelistOpContext(Type type,
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     const std::string& email,
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     SignedSettingsHelper::Callback* callback,
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     OpContext::Delegate* delegate)
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : OpContext(callback, delegate),
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        type_(type),
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        email_(email) {
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // chromeos::SignedSettings::Delegate implementation
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnSettingsOpCompleted(SignedSettings::ReturnCode code,
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     bool value) OVERRIDE {
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (callback_) {
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      switch (type_) {
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        case CHECK:
12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          callback_->OnCheckWhitelistCompleted(code, email_);
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          break;
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        case ADD:
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          callback_->OnWhitelistCompleted(code, email_);
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          break;
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        case REMOVE:
13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          callback_->OnUnwhitelistCompleted(code, email_);
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          break;
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        default:
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          LOG(ERROR) << "Unknown WhitelistOpContext type " << type_;
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          break;
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnOpCompleted();
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected:
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // OpContext implemenetation
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CreateOp() OVERRIDE {
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    switch (type_) {
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      case CHECK:
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        op_ = SignedSettings::CreateCheckWhitelistOp(email_, this);
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        break;
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      case ADD:
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        op_ = SignedSettings::CreateWhitelistOp(email_, true, this);
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        break;
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      case REMOVE:
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        op_ = SignedSettings::CreateWhitelistOp(email_, false, this);
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        break;
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      default:
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        LOG(ERROR) << "Unknown WhitelistOpContext type " << type_;
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        break;
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Type type_;
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string email_;
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(WhitelistOpContext);
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass StorePropertyOpContext : public SignedSettings::Delegate<bool>,
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                               public OpContext {
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  StorePropertyOpContext(const std::string& name,
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         const std::string& value,
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         SignedSettingsHelper::Callback* callback,
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         OpContext::Delegate* delegate)
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : OpContext(callback, delegate),
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        name_(name),
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        value_(value) {
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // chromeos::SignedSettings::Delegate implementation
18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnSettingsOpCompleted(SignedSettings::ReturnCode code,
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     bool unused) OVERRIDE {
18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    VLOG(2) << "OnSettingsOpCompleted, code = " << code;
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (callback_)
18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      callback_->OnStorePropertyCompleted(code, name_, value_);
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnOpCompleted();
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected:
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // OpContext implemenetation
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CreateOp() OVERRIDE {
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    op_ = SignedSettings::CreateStorePropertyOp(name_, value_, this);
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string name_;
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string value_;
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(StorePropertyOpContext);
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass RetrievePropertyOpContext
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : public SignedSettings::Delegate<std::string>,
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      public OpContext {
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  RetrievePropertyOpContext(const std::string& name,
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                            SignedSettingsHelper::Callback* callback,
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            OpContext::Delegate* delegate)
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : OpContext(callback, delegate),
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        name_(name) {
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // chromeos::SignedSettings::Delegate implementation
21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnSettingsOpCompleted(SignedSettings::ReturnCode code,
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     std::string value) OVERRIDE {
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (callback_)
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      callback_->OnRetrievePropertyCompleted(code, name_, value);
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnOpCompleted();
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected:
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // OpContext implemenetation
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CreateOp() OVERRIDE {
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    op_ = SignedSettings::CreateRetrievePropertyOp(name_, this);
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string name_;
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(RetrievePropertyOpContext);
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass StorePolicyOpContext : public SignedSettings::Delegate<bool>,
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             public OpContext {
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  StorePolicyOpContext(const em::PolicyFetchResponse& policy,
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       SignedSettingsHelper::Callback* callback,
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       OpContext::Delegate* delegate)
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : OpContext(callback, delegate),
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        policy_(policy) {
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // chromeos::SignedSettings::Delegate implementation
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnSettingsOpCompleted(SignedSettings::ReturnCode code,
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     bool unused) OVERRIDE {
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(2) << "OnSettingsOpCompleted, code = " << code;
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (callback_)
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      callback_->OnStorePolicyCompleted(code);
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    OnOpCompleted();
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // OpContext implementation
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CreateOp() OVERRIDE {
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    op_ = SignedSettings::CreateStorePolicyOp(&policy_, this);
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse policy_;
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(StorePolicyOpContext);
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass RetrievePolicyOpContext
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : public SignedSettings::Delegate<const em::PolicyFetchResponse&>,
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      public OpContext {
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RetrievePolicyOpContext(SignedSettingsHelper::Callback* callback,
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          OpContext::Delegate* delegate)
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : OpContext(callback, delegate) {
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // chromeos::SignedSettings::Delegate implementation
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnSettingsOpCompleted(
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::ReturnCode code,
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const em::PolicyFetchResponse& policy) OVERRIDE {
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (callback_)
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      callback_->OnRetrievePolicyCompleted(code, policy);
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    OnOpCompleted();
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // OpContext implementation
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CreateOp() OVERRIDE {
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    op_ = SignedSettings::CreateRetrievePolicyOp(this);
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(RetrievePolicyOpContext);
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SignedSettingsHelperImpl : public SignedSettingsHelper,
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 public OpContext::Delegate {
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // SignedSettingsHelper implementation
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void StartCheckWhitelistOp(const std::string& email,
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     Callback* callback) OVERRIDE;
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void StartWhitelistOp(const std::string& email,
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                bool add_to_whitelist,
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                Callback* callback) OVERRIDE;
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void StartStorePropertyOp(const std::string& name,
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    const std::string& value,
305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    Callback* callback) OVERRIDE;
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void StartRetrieveProperty(const std::string& name,
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     Callback* callback) OVERRIDE;
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartStorePolicyOp(const em::PolicyFetchResponse& policy,
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  Callback* callback) OVERRIDE;
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartRetrievePolicyOp(Callback* callback) OVERRIDE;
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CancelCallback(Callback* callback) OVERRIDE;
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // OpContext::Delegate implementation
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpCreated(OpContext* context);
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpStarted(OpContext* context);
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpCompleted(OpContext* context);
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelperImpl();
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~SignedSettingsHelperImpl();
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddOpContext(OpContext* context);
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void ClearAll();
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<OpContext*> pending_contexts_;
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
32721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  friend struct base::DefaultLazyInstanceTraits<SignedSettingsHelperImpl>;
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SignedSettingsHelperImpl);
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic base::LazyInstance<SignedSettingsHelperImpl>
33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    g_signed_settings_helper_impl(base::LINKER_INITIALIZED);
33321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSignedSettingsHelperImpl::SignedSettingsHelperImpl() {
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSignedSettingsHelperImpl::~SignedSettingsHelperImpl() {
338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!pending_contexts_.empty()) {
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(WARNING) << "SignedSettingsHelperImpl shutdown with pending ops, "
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 << "changes will be lost.";
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ClearAll();
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::StartCheckWhitelistOp(
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string&email,
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SignedSettingsHelper::Callback* callback) {
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddOpContext(new WhitelistOpContext(
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      WhitelistOpContext::CHECK,
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      email,
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      callback,
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      this));
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::StartWhitelistOp(
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string&email,
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool add_to_whitelist,
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SignedSettingsHelper::Callback* callback) {
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddOpContext(new WhitelistOpContext(
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      add_to_whitelist ? WhitelistOpContext::ADD : WhitelistOpContext::REMOVE,
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      email,
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      callback,
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      this));
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::StartStorePropertyOp(
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& name,
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& value,
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SignedSettingsHelper::Callback* callback) {
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddOpContext(new StorePropertyOpContext(
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      name,
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      value,
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      callback,
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      this));
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::StartRetrieveProperty(
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& name,
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SignedSettingsHelper::Callback* callback) {
380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddOpContext(new RetrievePropertyOpContext(
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      name,
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      callback,
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      this));
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SignedSettingsHelperImpl::StartStorePolicyOp(
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const em::PolicyFetchResponse& policy,
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SignedSettingsHelper::Callback* callback) {
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AddOpContext(new StorePolicyOpContext(policy, callback, this));
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SignedSettingsHelperImpl::StartRetrievePolicyOp(
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SignedSettingsHelper::Callback* callback) {
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AddOpContext(new RetrievePolicyOpContext(callback, this));
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::CancelCallback(
398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SignedSettingsHelper::Callback* callback) {
399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (size_t i = 0; i < pending_contexts_.size(); ++i) {
402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (pending_contexts_[i]->callback() == callback) {
403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pending_contexts_[i]->CancelCallback();
404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::AddOpContext(OpContext* context) {
409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  CHECK(context);
411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_contexts_.push_back(context);
413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (pending_contexts_.size() == 1)
414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    context->Execute();
415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::ClearAll() {
418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (size_t i = 0; i < pending_contexts_.size(); ++i) {
419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pending_contexts_[i]->set_delegate(NULL);
420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pending_contexts_[i]->Cancel();
421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_contexts_.clear();
423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::OnOpCreated(OpContext* context) {
426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (test_delegate_)
427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    test_delegate_->OnOpCreated(context->op());
428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::OnOpStarted(OpContext* context) {
431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (test_delegate_)
434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    test_delegate_->OnOpStarted(context->op());
435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SignedSettingsHelperImpl::OnOpCompleted(OpContext* context) {
438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(pending_contexts_.front() == context);
440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_contexts_.erase(pending_contexts_.begin());
442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!pending_contexts_.empty())
443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pending_contexts_.front()->Execute();
444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (test_delegate_)
446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    test_delegate_->OnOpCompleted(context->op());
447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSignedSettingsHelper* SignedSettingsHelper::Get() {
45021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return g_signed_settings_helper_impl.Pointer();
451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace chromeos
454