1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef MEDIA_BASE_CDM_PROMISE_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define MEDIA_BASE_CDM_PROMISE_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/media_export.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/media_keys.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace media {
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Interface for promises being resolved/rejected in response to various
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// session actions. These may be called synchronously or asynchronously.
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The promise must be resolved or rejected exactly once. It is expected that
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the caller free the promise once it is resolved/rejected.
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This is only the base class, as parameter to resolve() varies.
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MEDIA_EXPORT CdmPromise {
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // A superset of media::MediaKeys::Exception for UMA reporting.
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  enum ResultCodeForUMA {
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SUCCESS,
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    NOT_SUPPORTED_ERROR,
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    INVALID_STATE_ERROR,
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    INVALID_ACCESS_ERROR,
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    QUOTA_EXCEEDED_ERROR,
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    UNKNOWN_ERROR,
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    CLIENT_ERROR,
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    OUTPUT_ERROR,
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    NUM_RESULT_CODES
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum ResolveParameterType {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VOID_TYPE,
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    STRING_TYPE,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    KEY_IDS_VECTOR_TYPE
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef base::Callback<void(MediaKeys::Exception exception_code,
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              uint32 system_code,
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              const std::string& error_message)>
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PromiseRejectedCB;
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~CdmPromise();
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Used to indicate that the operation failed. |exception_code| must be
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // specified. |system_code| is a Key System-specific value for the error
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // that occurred, or 0 if there is no associated status code or such status
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // codes are not supported by the Key System. |error_message| is optional.
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void reject(MediaKeys::Exception exception_code,
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      uint32 system_code,
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      const std::string& error_message);
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResolveParameterType GetResolveParameterType() const {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return parameter_type_;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit CdmPromise(ResolveParameterType parameter_type);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CdmPromise(ResolveParameterType parameter_type, PromiseRejectedCB reject_cb);
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // If constructed with a |uma_name| (which must be the name of a
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // CdmPromiseResult UMA), CdmPromise will report the promise result (success
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // or rejection code).
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CdmPromise(ResolveParameterType parameter_type,
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             PromiseRejectedCB reject_cb,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const std::string& uma_name);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called by all resolve()/reject() methods to report the UMA result if
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // applicable, and update |is_pending_|.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ReportResultToUMA(ResultCodeForUMA result);
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ResolveParameterType parameter_type_;
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PromiseRejectedCB reject_cb_;
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Keep track of whether the promise hasn't been resolved or rejected yet.
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool is_pending_;
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // UMA name to report result to.
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string uma_name_;
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CdmPromise);
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T>
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise {
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     PromiseRejectedCB rejected_cb);
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     PromiseRejectedCB rejected_cb,
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     const std::string& uma_name);
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void resolve(const T& result);
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected:
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Allow subclasses to completely override the implementation.
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CdmPromiseTemplate();
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::Callback<void(const T&)> resolve_cb_;
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Specialization for no parameter to resolve().
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <>
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise {
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     PromiseRejectedCB rejected_cb);
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     PromiseRejectedCB rejected_cb,
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     const std::string& uma_name);
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void resolve();
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected:
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Allow subclasses to completely override the implementation.
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CdmPromiseTemplate();
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::Callback<void(void)> resolve_cb_;
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace media
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // MEDIA_BASE_CDM_PROMISE_H_
134