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)#include "media/base/cdm_promise.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/logging.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/metrics/histogram.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace media {
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitemplate <typename T>
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct CdmPromiseTraits {};
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitemplate <>
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct CdmPromiseTraits<void> {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const CdmPromise::ResolveParameterType kType = CdmPromise::VOID_TYPE;
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitemplate <>
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct CdmPromiseTraits<std::string> {
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const CdmPromise::ResolveParameterType kType = CdmPromise::STRING_TYPE;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitemplate <>
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct CdmPromiseTraits<KeyIdsVector> {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const CdmPromise::ResolveParameterType kType =
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CdmPromise::KEY_IDS_VECTOR_TYPE;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCdmPromise::CdmPromise(ResolveParameterType parameter_type)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : parameter_type_(parameter_type), is_pending_(true) {
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCdmPromise::CdmPromise(ResolveParameterType parameter_type,
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       PromiseRejectedCB reject_cb)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : parameter_type_(parameter_type),
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reject_cb_(reject_cb),
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      is_pending_(true) {
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!reject_cb_.is_null());
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCdmPromise::CdmPromise(ResolveParameterType parameter_type,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       PromiseRejectedCB reject_cb,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const std::string& uma_name)
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : parameter_type_(parameter_type),
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reject_cb_(reject_cb),
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      is_pending_(true),
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      uma_name_(uma_name) {
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(!reject_cb_.is_null());
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!uma_name_.empty());
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)CdmPromise::~CdmPromise() {
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!is_pending_);
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static CdmPromise::ResultCodeForUMA ConvertExceptionToUMAResult(
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MediaKeys::Exception exception_code) {
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (exception_code) {
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::NOT_SUPPORTED_ERROR:
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::NOT_SUPPORTED_ERROR;
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::INVALID_STATE_ERROR:
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::INVALID_STATE_ERROR;
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::INVALID_ACCESS_ERROR:
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::INVALID_ACCESS_ERROR;
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::QUOTA_EXCEEDED_ERROR:
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::QUOTA_EXCEEDED_ERROR;
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::UNKNOWN_ERROR:
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::UNKNOWN_ERROR;
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::CLIENT_ERROR:
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::CLIENT_ERROR;
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case MediaKeys::OUTPUT_ERROR:
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return CdmPromise::OUTPUT_ERROR;
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTREACHED();
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return CdmPromise::UNKNOWN_ERROR;
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmPromise::reject(MediaKeys::Exception exception_code,
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        uint32 system_code,
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        const std::string& error_message) {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReportResultToUMA(ConvertExceptionToUMAResult(exception_code));
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  reject_cb_.Run(exception_code, system_code, error_message);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmPromise::ReportResultToUMA(ResultCodeForUMA result) {
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(is_pending_);
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  is_pending_ = false;
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!uma_name_.empty()) {
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::LinearHistogram::FactoryGet(
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        uma_name_,
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        1,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NUM_RESULT_CODES,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NUM_RESULT_CODES + 1,
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result);
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T>
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)CdmPromiseTemplate<T>::CdmPromiseTemplate(
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::Callback<void(const T&)> resolve_cb,
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PromiseRejectedCB reject_cb)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CdmPromise(CdmPromiseTraits<T>::kType, reject_cb),
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resolve_cb_(resolve_cb) {
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!resolve_cb_.is_null());
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T>
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CdmPromiseTemplate<T>::CdmPromiseTemplate(
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::Callback<void(const T&)> resolve_cb,
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    PromiseRejectedCB reject_cb,
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::string& uma_name)
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CdmPromise(CdmPromiseTraits<T>::kType, reject_cb, uma_name),
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resolve_cb_(resolve_cb) {
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(!resolve_cb_.is_null());
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)template <typename T>
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCdmPromiseTemplate<T>::CdmPromiseTemplate()
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CdmPromise(CdmPromiseTraits<T>::kType) {
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T>
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmPromiseTemplate<T>::resolve(const T& result) {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReportResultToUMA(SUCCESS);
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  resolve_cb_.Run(result);
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                             PromiseRejectedCB reject_cb)
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CdmPromise(CdmPromiseTraits<void>::kType, reject_cb),
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resolve_cb_(resolve_cb) {
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!resolve_cb_.is_null());
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                             PromiseRejectedCB reject_cb,
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                             const std::string& uma_name)
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CdmPromise(CdmPromiseTraits<void>::kType, reject_cb, uma_name),
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resolve_cb_(resolve_cb) {
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(!resolve_cb_.is_null());
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(!uma_name_.empty());
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCdmPromiseTemplate<void>::CdmPromiseTemplate()
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CdmPromise(CdmPromiseTraits<void>::kType) {
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmPromiseTemplate<void>::resolve() {
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReportResultToUMA(SUCCESS);
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  resolve_cb_.Run();
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Explicit template instantiation for the Promises needed.
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template class MEDIA_EXPORT CdmPromiseTemplate<std::string>;
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)template class MEDIA_EXPORT CdmPromiseTemplate<KeyIdsVector>;
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace media
161