13ee760ad6caff189c8b38e50d5d74d3babe1c1c
[platform/framework/web/crosswalk.git] / src / media / base / cdm_promise.cc
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 #include "media/base/cdm_promise.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/metrics/histogram.h"
10
11 namespace media {
12
13 CdmPromise::CdmPromise() : is_pending_(true) {
14 }
15
16 CdmPromise::CdmPromise(PromiseRejectedCB reject_cb)
17     : reject_cb_(reject_cb), is_pending_(true) {
18   DCHECK(!reject_cb_.is_null());
19 }
20
21 CdmPromise::CdmPromise(PromiseRejectedCB reject_cb, const std::string& uma_name)
22     : reject_cb_(reject_cb), is_pending_(true), uma_name_(uma_name) {
23   DCHECK(!reject_cb_.is_null());
24 }
25
26 CdmPromise::~CdmPromise() {
27   DCHECK(!is_pending_);
28 }
29
30 static CdmPromise::ResultCodeForUMA ConvertExceptionToUMAResult(
31     MediaKeys::Exception exception_code) {
32   switch (exception_code) {
33     case MediaKeys::NOT_SUPPORTED_ERROR:
34       return CdmPromise::NOT_SUPPORTED_ERROR;
35     case MediaKeys::INVALID_STATE_ERROR:
36       return CdmPromise::INVALID_STATE_ERROR;
37     case MediaKeys::INVALID_ACCESS_ERROR:
38       return CdmPromise::INVALID_ACCESS_ERROR;
39     case MediaKeys::QUOTA_EXCEEDED_ERROR:
40       return CdmPromise::QUOTA_EXCEEDED_ERROR;
41     case MediaKeys::UNKNOWN_ERROR:
42       return CdmPromise::UNKNOWN_ERROR;
43     case MediaKeys::CLIENT_ERROR:
44       return CdmPromise::CLIENT_ERROR;
45     case MediaKeys::OUTPUT_ERROR:
46       return CdmPromise::OUTPUT_ERROR;
47   }
48   NOTREACHED();
49   return CdmPromise::UNKNOWN_ERROR;
50 }
51
52 void CdmPromise::reject(MediaKeys::Exception exception_code,
53                         uint32 system_code,
54                         const std::string& error_message) {
55   DCHECK(is_pending_);
56   is_pending_ = false;
57   if (!uma_name_.empty()) {
58     ResultCodeForUMA result_code = ConvertExceptionToUMAResult(exception_code);
59     base::LinearHistogram::FactoryGet(
60         uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
61         base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result_code);
62   }
63   reject_cb_.Run(exception_code, system_code, error_message);
64 }
65
66 template <typename T>
67 CdmPromiseTemplate<T>::CdmPromiseTemplate(
68     base::Callback<void(const T&)> resolve_cb,
69     PromiseRejectedCB reject_cb)
70     : CdmPromise(reject_cb), resolve_cb_(resolve_cb) {
71   DCHECK(!resolve_cb_.is_null());
72 }
73
74 template <typename T>
75 CdmPromiseTemplate<T>::CdmPromiseTemplate(
76     base::Callback<void(const T&)> resolve_cb,
77     PromiseRejectedCB reject_cb,
78     const std::string& uma_name)
79     : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) {
80   DCHECK(!resolve_cb_.is_null());
81 }
82
83 template <typename T>
84 CdmPromiseTemplate<T>::CdmPromiseTemplate() {
85 }
86
87 template <typename T>
88 CdmPromiseTemplate<T>::~CdmPromiseTemplate() {
89   DCHECK(!is_pending_);
90 }
91
92 template <typename T>
93 void CdmPromiseTemplate<T>::resolve(const T& result) {
94   DCHECK(is_pending_);
95   is_pending_ = false;
96   if (!uma_name_.empty()) {
97     base::LinearHistogram::FactoryGet(
98         uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
99         base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS);
100   }
101   resolve_cb_.Run(result);
102 }
103
104 CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
105                                              PromiseRejectedCB reject_cb)
106     : CdmPromise(reject_cb), resolve_cb_(resolve_cb) {
107   DCHECK(!resolve_cb_.is_null());
108 }
109
110 CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
111                                              PromiseRejectedCB reject_cb,
112                                              const std::string& uma_name)
113     : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) {
114   DCHECK(!resolve_cb_.is_null());
115   DCHECK(!uma_name_.empty());
116 }
117
118 CdmPromiseTemplate<void>::CdmPromiseTemplate() {
119 }
120
121 CdmPromiseTemplate<void>::~CdmPromiseTemplate() {
122   DCHECK(!is_pending_);
123 }
124
125 void CdmPromiseTemplate<void>::resolve() {
126   DCHECK(is_pending_);
127   is_pending_ = false;
128   if (!uma_name_.empty()) {
129     base::LinearHistogram::FactoryGet(
130         uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
131         base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS);
132   }
133   resolve_cb_.Run();
134 }
135
136 // Explicit template instantiation for the Promises needed.
137 template class MEDIA_EXPORT CdmPromiseTemplate<std::string>;
138 template class MEDIA_EXPORT CdmPromiseTemplate<KeyIdsVector>;
139
140 }  // namespace media