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