Upstream version 10.38.208.0
[platform/framework/web/crosswalk.git] / src / media / base / cdm_promise.h
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
15 namespace 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.
23 class 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   virtual ResolveParameterType GetResolveParameterType() const = 0;
60
61  protected:
62   CdmPromise();
63   CdmPromise(PromiseRejectedCB reject_cb);
64
65   // If constructed with a |uma_name| (which must be the name of a
66   // CdmPromiseResult UMA), CdmPromise will report the promise result (success
67   // or rejection code).
68   CdmPromise(PromiseRejectedCB reject_cb, const std::string& uma_name);
69
70   PromiseRejectedCB reject_cb_;
71
72   // Keep track of whether the promise hasn't been resolved or rejected yet.
73   bool is_pending_;
74
75   // UMA to report result to.
76   std::string uma_name_;
77
78   DISALLOW_COPY_AND_ASSIGN(CdmPromise);
79 };
80
81 // Specialization for no parameter to resolve().
82 template <>
83 class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise {
84  public:
85   CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
86                      PromiseRejectedCB rejected_cb);
87   CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
88                      PromiseRejectedCB rejected_cb,
89                      const std::string& uma_name);
90   virtual ~CdmPromiseTemplate();
91   virtual void resolve();
92   virtual ResolveParameterType GetResolveParameterType() const OVERRIDE;
93
94  protected:
95   // Allow subclasses to completely override the implementation.
96   CdmPromiseTemplate();
97
98  private:
99   base::Callback<void(void)> resolve_cb_;
100
101   DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
102 };
103
104 template <>
105 class MEDIA_EXPORT CdmPromiseTemplate<std::string> : public CdmPromise {
106  public:
107   CdmPromiseTemplate(base::Callback<void(const std::string&)> resolve_cb,
108                      PromiseRejectedCB rejected_cb);
109   CdmPromiseTemplate(base::Callback<void(const std::string&)> resolve_cb,
110                      PromiseRejectedCB rejected_cb,
111                      const std::string& uma_name);
112   virtual ~CdmPromiseTemplate();
113   virtual void resolve(const std::string& result);
114   virtual ResolveParameterType GetResolveParameterType() const OVERRIDE;
115
116  protected:
117   // Allow subclasses to completely override the implementation.
118   // TODO(jrummell): Remove when derived class SessionLoadedPromise
119   // (in ppapi_decryptor.cc) is no longer needed.
120   CdmPromiseTemplate();
121
122  private:
123   base::Callback<void(const std::string&)> resolve_cb_;
124
125   DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
126 };
127
128 template <>
129 class MEDIA_EXPORT CdmPromiseTemplate<KeyIdsVector> : public CdmPromise {
130  public:
131   CdmPromiseTemplate(base::Callback<void(const KeyIdsVector&)> resolve_cb,
132                      PromiseRejectedCB rejected_cb);
133   CdmPromiseTemplate(base::Callback<void(const KeyIdsVector&)> resolve_cb,
134                      PromiseRejectedCB rejected_cb,
135                      const std::string& uma_name);
136   virtual ~CdmPromiseTemplate();
137   virtual void resolve(const KeyIdsVector& result);
138   virtual ResolveParameterType GetResolveParameterType() const OVERRIDE;
139
140  private:
141   base::Callback<void(const KeyIdsVector&)> resolve_cb_;
142
143   DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
144 };
145
146 }  // namespace media
147
148 #endif  // MEDIA_BASE_CDM_PROMISE_H_