1// Copyright 2014 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 MEDIA_BASE_CDM_PROMISE_H_
6#define MEDIA_BASE_CDM_PROMISE_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/callback.h"
12#include "media/base/media_export.h"
13#include "media/base/media_keys.h"
14
15namespace media {
16
17// Interface for promises being resolved/rejected in response to various
18// session actions. These may be called synchronously or asynchronously.
19// The promise must be resolved or rejected exactly once. It is expected that
20// the caller free the promise once it is resolved/rejected.
21//
22// This is only the base class, as parameter to resolve() varies.
23class MEDIA_EXPORT CdmPromise {
24 public:
25  // A superset of media::MediaKeys::Exception for UMA reporting.
26  enum ResultCodeForUMA {
27    SUCCESS,
28    NOT_SUPPORTED_ERROR,
29    INVALID_STATE_ERROR,
30    INVALID_ACCESS_ERROR,
31    QUOTA_EXCEEDED_ERROR,
32    UNKNOWN_ERROR,
33    CLIENT_ERROR,
34    OUTPUT_ERROR,
35    NUM_RESULT_CODES
36  };
37
38  enum ResolveParameterType {
39    VOID_TYPE,
40    STRING_TYPE,
41    KEY_IDS_VECTOR_TYPE
42  };
43
44  typedef base::Callback<void(MediaKeys::Exception exception_code,
45                              uint32 system_code,
46                              const std::string& error_message)>
47      PromiseRejectedCB;
48
49  virtual ~CdmPromise();
50
51  // Used to indicate that the operation failed. |exception_code| must be
52  // specified. |system_code| is a Key System-specific value for the error
53  // that occurred, or 0 if there is no associated status code or such status
54  // codes are not supported by the Key System. |error_message| is optional.
55  virtual void reject(MediaKeys::Exception exception_code,
56                      uint32 system_code,
57                      const std::string& error_message);
58
59  ResolveParameterType GetResolveParameterType() const {
60    return parameter_type_;
61  }
62
63 protected:
64  explicit CdmPromise(ResolveParameterType parameter_type);
65  CdmPromise(ResolveParameterType parameter_type, PromiseRejectedCB reject_cb);
66
67  // If constructed with a |uma_name| (which must be the name of a
68  // CdmPromiseResult UMA), CdmPromise will report the promise result (success
69  // or rejection code).
70  CdmPromise(ResolveParameterType parameter_type,
71             PromiseRejectedCB reject_cb,
72             const std::string& uma_name);
73
74  // Called by all resolve()/reject() methods to report the UMA result if
75  // applicable, and update |is_pending_|.
76  void ReportResultToUMA(ResultCodeForUMA result);
77
78  const ResolveParameterType parameter_type_;
79  PromiseRejectedCB reject_cb_;
80
81  // Keep track of whether the promise hasn't been resolved or rejected yet.
82  bool is_pending_;
83
84  // UMA name to report result to.
85  std::string uma_name_;
86
87  DISALLOW_COPY_AND_ASSIGN(CdmPromise);
88};
89
90template <typename T>
91class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise {
92 public:
93  CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
94                     PromiseRejectedCB rejected_cb);
95  CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
96                     PromiseRejectedCB rejected_cb,
97                     const std::string& uma_name);
98  virtual void resolve(const T& result);
99
100 protected:
101  // Allow subclasses to completely override the implementation.
102  CdmPromiseTemplate();
103
104 private:
105  base::Callback<void(const T&)> resolve_cb_;
106
107  DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
108};
109
110// Specialization for no parameter to resolve().
111template <>
112class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise {
113 public:
114  CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
115                     PromiseRejectedCB rejected_cb);
116  CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
117                     PromiseRejectedCB rejected_cb,
118                     const std::string& uma_name);
119  virtual void resolve();
120
121 protected:
122  // Allow subclasses to completely override the implementation.
123  CdmPromiseTemplate();
124
125 private:
126  base::Callback<void(void)> resolve_cb_;
127
128  DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
129};
130
131}  // namespace media
132
133#endif  // MEDIA_BASE_CDM_PROMISE_H_
134