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