| Index: chrome/browser/extensions/api/identity/identity_mint_queue.cc
|
| diff --git a/chrome/browser/extensions/api/identity/identity_mint_queue.cc b/chrome/browser/extensions/api/identity/identity_mint_queue.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3d206df963669a6b1c15d0d161018487bf669e6f
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/api/identity/identity_mint_queue.cc
|
| @@ -0,0 +1,80 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/extensions/api/identity/identity_mint_queue.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/stl_util.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +IdentityMintRequestQueue::IdentityMintRequestQueue() {
|
| +}
|
| +
|
| +IdentityMintRequestQueue::~IdentityMintRequestQueue() {
|
| + std::map<RequestKey, RequestList>::const_iterator it;
|
| + for (it = request_queue_.begin(); it != request_queue_.end(); ++it)
|
| + DCHECK_EQ(it->second.size(), 0lu);
|
| +}
|
| +
|
| +IdentityMintRequestQueue::RequestKey::RequestKey(
|
| + IdentityMintRequestQueue::MintType type,
|
| + const std::string& extension_id,
|
| + const std::set<std::string> scopes) : type(type),
|
| + extension_id(extension_id),
|
| + scopes(scopes) {
|
| +}
|
| +
|
| +IdentityMintRequestQueue::RequestKey::~RequestKey() {
|
| +}
|
| +
|
| +bool IdentityMintRequestQueue::RequestKey::operator<(
|
| + const RequestKey& rhs) const {
|
| + if (type < rhs.type)
|
| + return true;
|
| + else if (rhs.type < type)
|
| + return false;
|
| +
|
| + if (extension_id < rhs.extension_id)
|
| + return true;
|
| + else if (rhs.extension_id < extension_id)
|
| + return false;
|
| +
|
| + return scopes < rhs.scopes;
|
| +}
|
| +
|
| +void IdentityMintRequestQueue::RequestStart(
|
| + IdentityMintRequestQueue::MintType type,
|
| + const std::string& extension_id,
|
| + const std::set<std::string> scopes,
|
| + IdentityMintRequestQueue::Request* request) {
|
| + RequestKey key(type, extension_id, scopes);
|
| + request_queue_[key].push_back(request);
|
| + // If this is the first request, start it now. RequestComplete will start
|
| + // all other requests.
|
| + if (request_queue_[key].size() == 1)
|
| + request_queue_[key].front()->StartMintToken(type);
|
| +}
|
| +
|
| +void IdentityMintRequestQueue::RequestComplete(
|
| + IdentityMintRequestQueue::MintType type,
|
| + const std::string& extension_id,
|
| + const std::set<std::string> scopes,
|
| + IdentityMintRequestQueue::Request* request) {
|
| + RequestKey key(type, extension_id, scopes);
|
| + CHECK(request_queue_[key].front() == request);
|
| + request_queue_[key].pop_front();
|
| + if (request_queue_[key].size() > 0)
|
| + request_queue_[key].front()->StartMintToken(type);
|
| +}
|
| +
|
| +bool IdentityMintRequestQueue::empty(IdentityMintRequestQueue::MintType type,
|
| + const std::string& extension_id,
|
| + const std::set<std::string> scopes) const {
|
| + RequestKey key(type, extension_id, scopes);
|
| + return !ContainsKey(request_queue_, key) ||
|
| + (request_queue_.find(key))->second.empty();
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|