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