15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ssl/default_channel_id_store.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_loop.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/metrics/histogram.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/net_errors.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace net {
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// --------------------------------------------------------------------------
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Task
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass DefaultChannelIDStore::Task {
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~Task();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the task and invokes the client callback on the thread that
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // originally constructed the task.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Run(DefaultChannelIDStore* store) = 0;
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InvokeCallback(base::Closure callback) const;
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::Task::~Task() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DefaultChannelIDStore::Task::InvokeCallback(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Closure callback) const {
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!callback.is_null())
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback.Run();
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// --------------------------------------------------------------------------
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// GetChannelIDTask
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultChannelIDStore::GetChannelIDTask
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : public DefaultChannelIDStore::Task {
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetChannelIDTask(const std::string& server_identifier,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const GetChannelIDCallback& callback);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GetChannelIDTask();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Run(DefaultChannelIDStore* store) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_identifier_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetChannelIDCallback callback_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::GetChannelIDTask::GetChannelIDTask(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_identifier,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GetChannelIDCallback& callback)
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : server_identifier_(server_identifier),
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      callback_(callback) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DefaultChannelIDStore::GetChannelIDTask::~GetChannelIDTask() {
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultChannelIDStore::GetChannelIDTask::Run(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DefaultChannelIDStore* store) {
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Time expiration_time;
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string private_key_result;
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string cert_result;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int err = store->GetChannelID(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      server_identifier_, &expiration_time, &private_key_result,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &cert_result, GetChannelIDCallback());
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(err != ERR_IO_PENDING);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InvokeCallback(base::Bind(callback_, err, server_identifier_,
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            expiration_time, private_key_result, cert_result));
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------------------------------------
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SetChannelIDTask
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultChannelIDStore::SetChannelIDTask
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DefaultChannelIDStore::Task {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetChannelIDTask(const std::string& server_identifier,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Time creation_time,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Time expiration_time,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& private_key,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& cert);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SetChannelIDTask();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Run(DefaultChannelIDStore* store) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_identifier_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time creation_time_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time expiration_time_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string private_key_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cert_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::SetChannelIDTask::SetChannelIDTask(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_identifier,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time creation_time,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time expiration_time,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& private_key,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& cert)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : server_identifier_(server_identifier),
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      creation_time_(creation_time),
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      expiration_time_(expiration_time),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      private_key_(private_key),
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cert_(cert) {
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
110116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDefaultChannelIDStore::SetChannelIDTask::~SetChannelIDTask() {
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DefaultChannelIDStore::SetChannelIDTask::Run(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DefaultChannelIDStore* store) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store->SyncSetChannelID(server_identifier_, creation_time_,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          expiration_time_, private_key_, cert_);
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------------------------------------
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DeleteChannelIDTask
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultChannelIDStore::DeleteChannelIDTask
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DefaultChannelIDStore::Task {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteChannelIDTask(const std::string& server_identifier,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const base::Closure& callback);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DeleteChannelIDTask();
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void Run(DefaultChannelIDStore* store) OVERRIDE;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_identifier_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure callback_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::DeleteChannelIDTask::
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteChannelIDTask(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& server_identifier,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const base::Closure& callback)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : server_identifier_(server_identifier),
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          callback_(callback) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::DeleteChannelIDTask::
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~DeleteChannelIDTask() {
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::DeleteChannelIDTask::Run(
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DefaultChannelIDStore* store) {
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  store->SyncDeleteChannelID(server_identifier_);
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InvokeCallback(callback_);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// --------------------------------------------------------------------------
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DeleteAllCreatedBetweenTask
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultChannelIDStore::DeleteAllCreatedBetweenTask
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DefaultChannelIDStore::Task {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteAllCreatedBetweenTask(base::Time delete_begin,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              base::Time delete_end,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const base::Closure& callback);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DeleteAllCreatedBetweenTask();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Run(DefaultChannelIDStore* store) OVERRIDE;
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::Time delete_begin_;
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::Time delete_end_;
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::Closure callback_;
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochDefaultChannelIDStore::DeleteAllCreatedBetweenTask::
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DeleteAllCreatedBetweenTask(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Time delete_begin,
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Time delete_end,
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const base::Closure& callback)
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        : delete_begin_(delete_begin),
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          delete_end_(delete_end),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          callback_(callback) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::DeleteAllCreatedBetweenTask::
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~DeleteAllCreatedBetweenTask() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::DeleteAllCreatedBetweenTask::Run(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DefaultChannelIDStore* store) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store->SyncDeleteAllCreatedBetween(delete_begin_, delete_end_);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InvokeCallback(callback_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------------------------------------
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetAllChannelIDsTask
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultChannelIDStore::GetAllChannelIDsTask
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DefaultChannelIDStore::Task {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit GetAllChannelIDsTask(const GetChannelIDListCallback& callback);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GetAllChannelIDsTask();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Run(DefaultChannelIDStore* store) OVERRIDE;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_identifier_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetChannelIDListCallback callback_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::GetAllChannelIDsTask::
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    GetAllChannelIDsTask(const GetChannelIDListCallback& callback)
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        : callback_(callback) {
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
210effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochDefaultChannelIDStore::GetAllChannelIDsTask::
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ~GetAllChannelIDsTask() {
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid DefaultChannelIDStore::GetAllChannelIDsTask::Run(
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DefaultChannelIDStore* store) {
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ChannelIDList cert_list;
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  store->SyncGetAllChannelIDs(&cert_list);
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  InvokeCallback(base::Bind(callback_, cert_list));
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// --------------------------------------------------------------------------
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// DefaultChannelIDStore
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::DefaultChannelIDStore(
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PersistentStore* store)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : initialized_(false),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_(false),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store_(store),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_(this) {}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int DefaultChannelIDStore::GetChannelID(
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& server_identifier,
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::Time* expiration_time,
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::string* private_key_result,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string* cert_result,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GetChannelIDCallback& callback) {
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(CalledOnValidThread());
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InitIfNecessary();
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!loaded_) {
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EnqueueTask(scoped_ptr<Task>(
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new GetChannelIDTask(server_identifier, callback)));
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return ERR_IO_PENDING;
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ChannelIDMap::iterator it = channel_ids_.find(server_identifier);
248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (it == channel_ids_.end())
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return ERR_FILE_NOT_FOUND;
251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ChannelID* channel_id = it->second;
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *expiration_time = channel_id->expiration_time();
254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *private_key_result = channel_id->private_key();
255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *cert_result = channel_id->cert();
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return OK;
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DefaultChannelIDStore::SetChannelID(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_identifier,
262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::Time creation_time,
263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::Time expiration_time,
264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const std::string& private_key,
265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const std::string& cert) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOrEnqueueTask(scoped_ptr<Task>(new SetChannelIDTask(
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      server_identifier, creation_time, expiration_time, private_key,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cert)));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DefaultChannelIDStore::DeleteChannelID(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_identifier,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& callback) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOrEnqueueTask(scoped_ptr<Task>(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DeleteChannelIDTask(server_identifier, callback)));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::DeleteAllCreatedBetween(
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time delete_begin,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time delete_end,
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::Closure& callback) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOrEnqueueTask(scoped_ptr<Task>(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DeleteAllCreatedBetweenTask(delete_begin, delete_end, callback)));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::DeleteAll(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& callback) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteAllCreatedBetween(base::Time(), base::Time(), callback);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DefaultChannelIDStore::GetAllChannelIDs(
29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const GetChannelIDListCallback& callback) {
29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  RunOrEnqueueTask(scoped_ptr<Task>(new GetAllChannelIDsTask(callback)));
29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DefaultChannelIDStore::GetChannelIDCount() {
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(CalledOnValidThread());
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return channel_ids_.size();
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DefaultChannelIDStore::SetForceKeepSessionState() {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitIfNecessary();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (store_.get())
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    store_->SetForceKeepSessionState();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::~DefaultChannelIDStore() {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteAllInMemory();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::DeleteAllInMemory() {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ChannelIDMap::iterator it = channel_ids_.begin();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != channel_ids_.end(); ++it) {
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete it->second;
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel_ids_.clear();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::InitStore() {
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CalledOnValidThread());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(store_.get()) << "Store must exist to initialize";
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!loaded_);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->Load(base::Bind(&DefaultChannelIDStore::OnLoaded,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          weak_ptr_factory_.GetWeakPtr()));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::OnLoaded(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ScopedVector<ChannelID> > channel_ids) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (std::vector<ChannelID*>::const_iterator it = channel_ids->begin();
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       it != channel_ids->end(); ++it) {
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK(channel_ids_.find((*it)->server_identifier()) ==
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch           channel_ids_.end());
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    channel_ids_[(*it)->server_identifier()] = *it;
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  channel_ids->weak_clear();
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  loaded_ = true;
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta wait_time;
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!waiting_tasks_.empty())
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    wait_time = base::TimeTicks::Now() - waiting_tasks_start_time_;
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DVLOG(1) << "Task delay " << wait_time.InMilliseconds();
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.TaskMaxWaitTime",
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             wait_time,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             base::TimeDelta::FromMilliseconds(1),
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             base::TimeDelta::FromMinutes(1),
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             50);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS_100("DomainBoundCerts.TaskWaitCount",
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           waiting_tasks_.size());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ScopedVector<Task>::iterator i = waiting_tasks_.begin();
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       i != waiting_tasks_.end(); ++i)
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    (*i)->Run(this);
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  waiting_tasks_.clear();
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::SyncSetChannelID(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_identifier,
368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::Time creation_time,
369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::Time expiration_time,
370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const std::string& private_key,
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const std::string& cert) {
372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(CalledOnValidThread());
373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(loaded_);
374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  InternalDeleteChannelID(server_identifier);
376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  InternalInsertChannelID(
377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      server_identifier,
378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new ChannelID(
379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          server_identifier, creation_time, expiration_time, private_key,
380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          cert));
381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid DefaultChannelIDStore::SyncDeleteChannelID(
384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const std::string& server_identifier) {
385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(CalledOnValidThread());
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(loaded_);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InternalDeleteChannelID(server_identifier);
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DefaultChannelIDStore::SyncDeleteAllCreatedBetween(
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::Time delete_begin,
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Time delete_end) {
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(CalledOnValidThread());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(loaded_);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ChannelIDMap::iterator it = channel_ids_.begin();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != channel_ids_.end();) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChannelIDMap::iterator cur = it;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++it;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChannelID* channel_id = cur->second;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((delete_begin.is_null() ||
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         channel_id->creation_time() >= delete_begin) &&
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (delete_end.is_null() || channel_id->creation_time() < delete_end)) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (store_.get())
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        store_->DeleteChannelID(*channel_id);
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete channel_id;
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      channel_ids_.erase(cur);
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::SyncGetAllChannelIDs(
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ChannelIDList* channel_id_list) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(loaded_);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ChannelIDMap::iterator it = channel_ids_.begin();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != channel_ids_.end(); ++it)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_id_list->push_back(*it->second);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::EnqueueTask(scoped_ptr<Task> task) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!loaded_);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (waiting_tasks_.empty())
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_tasks_start_time_ = base::TimeTicks::Now();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_tasks_.push_back(task.release());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultChannelIDStore::RunOrEnqueueTask(scoped_ptr<Task> task) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitIfNecessary();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!loaded_) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnqueueTask(task.Pass());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task->Run(this);
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DefaultChannelIDStore::InternalDeleteChannelID(
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& server_identifier) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(loaded_);
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChannelIDMap::iterator it = channel_ids_.find(server_identifier);
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (it == channel_ids_.end())
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;  // There is nothing to delete.
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChannelID* channel_id = it->second;
4500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (store_.get())
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    store_->DeleteChannelID(*channel_id);
45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  channel_ids_.erase(it);
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  delete channel_id;
45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DefaultChannelIDStore::InternalInsertChannelID(
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& server_identifier,
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ChannelID* channel_id) {
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(loaded_);
4610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (store_.get())
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    store_->AddChannelID(*channel_id);
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  channel_ids_[server_identifier] = channel_id;
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::PersistentStore::PersistentStore() {}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultChannelIDStore::PersistentStore::~PersistentStore() {}
470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace net
472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch