diff options
author | jrummell <jrummell@chromium.org> | 2014-09-22 17:49:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-23 00:49:23 +0000 |
commit | d2fa738da06c08fe136dedc2212e76174de94772 (patch) | |
tree | 24e71c51593446a470081f4efa4432d4c57cd177 /media/base/cdm_promise.cc | |
parent | 032174589b8ff1a6ee7a0643b9490aa9c17b4703 (diff) | |
download | chromium_src-d2fa738da06c08fe136dedc2212e76174de94772.zip chromium_src-d2fa738da06c08fe136dedc2212e76174de94772.tar.gz chromium_src-d2fa738da06c08fe136dedc2212e76174de94772.tar.bz2 |
CdmPromise to use CdmPromiseTraits so specializations not needed
Due to GetResolveParameterType(), the template was specialized for all
the cases used. Adding CdmPromiseTraits so that the specializations
are not needed, and the type set in the constructor appropriately.
BUG=358271
TEST=existing EME tests still pass
Review URL: https://codereview.chromium.org/567123002
Cr-Commit-Position: refs/heads/master@{#296112}
Diffstat (limited to 'media/base/cdm_promise.cc')
-rw-r--r-- | media/base/cdm_promise.cc | 170 |
1 files changed, 77 insertions, 93 deletions
diff --git a/media/base/cdm_promise.cc b/media/base/cdm_promise.cc index 74ff8bc..e10776d 100644 --- a/media/base/cdm_promise.cc +++ b/media/base/cdm_promise.cc @@ -10,17 +10,46 @@ namespace media { -CdmPromise::CdmPromise() : is_pending_(true) { -} - -CdmPromise::CdmPromise(PromiseRejectedCB reject_cb) - : reject_cb_(reject_cb), is_pending_(true) { +template <typename T> +struct CdmPromiseTraits {}; + +template <> +struct CdmPromiseTraits<void> { + static const CdmPromise::ResolveParameterType kType = CdmPromise::VOID_TYPE; +}; + +template <> +struct CdmPromiseTraits<std::string> { + static const CdmPromise::ResolveParameterType kType = CdmPromise::STRING_TYPE; +}; + +template <> +struct CdmPromiseTraits<KeyIdsVector> { + static const CdmPromise::ResolveParameterType kType = + CdmPromise::KEY_IDS_VECTOR_TYPE; +}; + +CdmPromise::CdmPromise(ResolveParameterType parameter_type) + : parameter_type_(parameter_type), is_pending_(true) { +} + +CdmPromise::CdmPromise(ResolveParameterType parameter_type, + PromiseRejectedCB reject_cb) + : parameter_type_(parameter_type), + reject_cb_(reject_cb), + is_pending_(true) { DCHECK(!reject_cb_.is_null()); } -CdmPromise::CdmPromise(PromiseRejectedCB reject_cb, const std::string& uma_name) - : reject_cb_(reject_cb), is_pending_(true), uma_name_(uma_name) { +CdmPromise::CdmPromise(ResolveParameterType parameter_type, + PromiseRejectedCB reject_cb, + const std::string& uma_name) + : parameter_type_(parameter_type), + reject_cb_(reject_cb), + is_pending_(true), + uma_name_(uma_name) { DCHECK(!reject_cb_.is_null()); + DCHECK(!uma_name_.empty()); } CdmPromise::~CdmPromise() { @@ -52,125 +81,80 @@ static CdmPromise::ResultCodeForUMA ConvertExceptionToUMAResult( void CdmPromise::reject(MediaKeys::Exception exception_code, uint32 system_code, const std::string& error_message) { - DCHECK(is_pending_); - is_pending_ = false; - if (!uma_name_.empty()) { - ResultCodeForUMA result_code = ConvertExceptionToUMAResult(exception_code); - base::LinearHistogram::FactoryGet( - uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1, - base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result_code); - } + ReportResultToUMA(ConvertExceptionToUMAResult(exception_code)); reject_cb_.Run(exception_code, system_code, error_message); } -CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb, - PromiseRejectedCB reject_cb) - : CdmPromise(reject_cb), resolve_cb_(resolve_cb) { - DCHECK(!resolve_cb_.is_null()); -} - -CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb, - PromiseRejectedCB reject_cb, - const std::string& uma_name) - : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) { - DCHECK(!resolve_cb_.is_null()); - DCHECK(!uma_name_.empty()); -} - -CdmPromiseTemplate<void>::CdmPromiseTemplate() { -} - -CdmPromiseTemplate<void>::~CdmPromiseTemplate() { - DCHECK(!is_pending_); -} - -void CdmPromiseTemplate<void>::resolve() { +void CdmPromise::ReportResultToUMA(ResultCodeForUMA result) { DCHECK(is_pending_); is_pending_ = false; if (!uma_name_.empty()) { base::LinearHistogram::FactoryGet( - uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1, - base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS); + uma_name_, + 1, + NUM_RESULT_CODES, + NUM_RESULT_CODES + 1, + base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result); } - resolve_cb_.Run(); -} - -CdmPromise::ResolveParameterType -CdmPromiseTemplate<void>::GetResolveParameterType() const { - return VOID_TYPE; } -CdmPromiseTemplate<std::string>::CdmPromiseTemplate( - base::Callback<void(const std::string&)> resolve_cb, +template <typename T> +CdmPromiseTemplate<T>::CdmPromiseTemplate( + base::Callback<void(const T&)> resolve_cb, PromiseRejectedCB reject_cb) - : CdmPromise(reject_cb), resolve_cb_(resolve_cb) { + : CdmPromise(CdmPromiseTraits<T>::kType, reject_cb), + resolve_cb_(resolve_cb) { DCHECK(!resolve_cb_.is_null()); } -CdmPromiseTemplate<std::string>::CdmPromiseTemplate( - base::Callback<void(const std::string&)> resolve_cb, +template <typename T> +CdmPromiseTemplate<T>::CdmPromiseTemplate( + base::Callback<void(const T&)> resolve_cb, PromiseRejectedCB reject_cb, const std::string& uma_name) - : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) { + : CdmPromise(CdmPromiseTraits<T>::kType, reject_cb, uma_name), + resolve_cb_(resolve_cb) { DCHECK(!resolve_cb_.is_null()); } -CdmPromiseTemplate<std::string>::CdmPromiseTemplate() { +template <typename T> +CdmPromiseTemplate<T>::CdmPromiseTemplate() + : CdmPromise(CdmPromiseTraits<T>::kType) { } -CdmPromiseTemplate<std::string>::~CdmPromiseTemplate() { - DCHECK(!is_pending_); -} - -void CdmPromiseTemplate<std::string>::resolve(const std::string& result) { - DCHECK(is_pending_); - is_pending_ = false; - if (!uma_name_.empty()) { - base::LinearHistogram::FactoryGet( - uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1, - base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS); - } +template <typename T> +void CdmPromiseTemplate<T>::resolve(const T& result) { + ReportResultToUMA(SUCCESS); resolve_cb_.Run(result); } -CdmPromise::ResolveParameterType -CdmPromiseTemplate<std::string>::GetResolveParameterType() const { - return STRING_TYPE; -} - -CdmPromiseTemplate<KeyIdsVector>::CdmPromiseTemplate( - base::Callback<void(const KeyIdsVector&)> resolve_cb, - PromiseRejectedCB reject_cb) - : CdmPromise(reject_cb), resolve_cb_(resolve_cb) { +CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb, + PromiseRejectedCB reject_cb) + : CdmPromise(CdmPromiseTraits<void>::kType, reject_cb), + resolve_cb_(resolve_cb) { DCHECK(!resolve_cb_.is_null()); } -CdmPromiseTemplate<KeyIdsVector>::CdmPromiseTemplate( - base::Callback<void(const KeyIdsVector&)> resolve_cb, - PromiseRejectedCB reject_cb, - const std::string& uma_name) - : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) { +CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb, + PromiseRejectedCB reject_cb, + const std::string& uma_name) + : CdmPromise(CdmPromiseTraits<void>::kType, reject_cb, uma_name), + resolve_cb_(resolve_cb) { DCHECK(!resolve_cb_.is_null()); + DCHECK(!uma_name_.empty()); } -CdmPromiseTemplate<KeyIdsVector>::~CdmPromiseTemplate() { - DCHECK(!is_pending_); +CdmPromiseTemplate<void>::CdmPromiseTemplate() + : CdmPromise(CdmPromiseTraits<void>::kType) { } -void CdmPromiseTemplate<KeyIdsVector>::resolve(const KeyIdsVector& result) { - DCHECK(is_pending_); - is_pending_ = false; - if (!uma_name_.empty()) { - base::LinearHistogram::FactoryGet( - uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1, - base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS); - } - resolve_cb_.Run(result); +void CdmPromiseTemplate<void>::resolve() { + ReportResultToUMA(SUCCESS); + resolve_cb_.Run(); } -CdmPromise::ResolveParameterType -CdmPromiseTemplate<KeyIdsVector>::GetResolveParameterType() const { - return KEY_IDS_VECTOR_TYPE; -} +// Explicit template instantiation for the Promises needed. +template class MEDIA_EXPORT CdmPromiseTemplate<std::string>; +template class MEDIA_EXPORT CdmPromiseTemplate<KeyIdsVector>; } // namespace media |