1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_MINT_QUEUE_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_MINT_QUEUE_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <list>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set>
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/extension_token_key.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// getAuthToken requests are serialized to avoid excessive traffic to
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// GAIA and to consolidate UI pop-ups. IdentityMintRequestQueue
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// maitains a set of queues, one for each RequestKey.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The queue calls StartMintToken on each Request when it reaches the
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// head of the line.
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The queue does not own Requests. Request pointers must be valid
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// until they are removed from the queue with RequestComplete or
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// RequestCancel.
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class IdentityMintRequestQueue {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum MintType {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MINT_TYPE_NONINTERACTIVE,
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MINT_TYPE_INTERACTIVE
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IdentityMintRequestQueue();
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~IdentityMintRequestQueue();
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class Request {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~Request() {}
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void StartMintToken(IdentityMintRequestQueue::MintType type) = 0;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Adds a request to the queue specified by the token key.
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RequestStart(IdentityMintRequestQueue::MintType type,
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const ExtensionTokenKey& key,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    IdentityMintRequestQueue::Request* request);
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Removes a request from the queue specified by the token key.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RequestComplete(IdentityMintRequestQueue::MintType type,
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       const ExtensionTokenKey& key,
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       IdentityMintRequestQueue::Request* request);
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Cancels a request. OK to call if |request| is not queued.
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Does *not* start a new request, even if the canceled request is at
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // the head of the queue.
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void RequestCancel(const ExtensionTokenKey& key,
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                     IdentityMintRequestQueue::Request* request);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool empty(IdentityMintRequestQueue::MintType type,
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)             const ExtensionTokenKey& key);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  typedef std::list<IdentityMintRequestQueue::Request*> RequestQueue;
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  typedef std::map<const ExtensionTokenKey, RequestQueue> RequestQueueMap;
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RequestQueueMap& GetRequestQueueMap(IdentityMintRequestQueue::MintType type);
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunRequest(IdentityMintRequestQueue::MintType type,
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  RequestQueue& request_queue);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RequestQueueMap interactive_request_queue_map_;
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RequestQueueMap noninteractive_request_queue_map_;
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace extensions
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_MINT_QUEUE_H_
74