Chromium Code Reviews| Index: media/base/cdm_promise_adapter.cc |
| diff --git a/media/base/cdm_promise_adapter.cc b/media/base/cdm_promise_adapter.cc |
| index 5c34da5d80914355eb3ed1bff22458538bad7fcb..a2c927006b4a11dc43316ecfccafefa251938df4 100644 |
| --- a/media/base/cdm_promise_adapter.cc |
| +++ b/media/base/cdm_promise_adapter.cc |
| @@ -12,6 +12,8 @@ CdmPromiseAdapter::CdmPromiseAdapter() : next_promise_id_(1) { |
| } |
| CdmPromiseAdapter::~CdmPromiseAdapter() { |
| + DCHECK(promises_.empty()); |
| + Clear(); |
| } |
| uint32_t CdmPromiseAdapter::SavePromise(scoped_ptr<CdmPromise> promise) { |
| @@ -20,11 +22,38 @@ uint32_t CdmPromiseAdapter::SavePromise(scoped_ptr<CdmPromise> promise) { |
| return promise_id; |
| } |
| -scoped_ptr<CdmPromise> CdmPromiseAdapter::TakePromise(uint32_t promise_id) { |
| - PromiseMap::iterator it = promises_.find(promise_id); |
| - if (it == promises_.end()) |
| - return nullptr; |
| - return promises_.take_and_erase(it); |
| +template <typename... T> |
| +void CdmPromiseAdapter::ResolvePromise(uint32_t promise_id, |
| + const T&... result) { |
| + scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
| + if (!promise) { |
| + NOTREACHED() << "Promise not found for " << promise_id; |
| + return; |
| + } |
| + |
| + // Sanity check the type before we do static_cast. |
| + CdmPromise::ResolveParameterType type = promise->GetResolveParameterType(); |
| + CdmPromise::ResolveParameterType expected = CdmPromiseTraits<T...>::kType; |
| + if (type != expected) { |
| + NOTREACHED() << "Promise type mismatch: " << type << " vs " << expected; |
| + return; |
| + } |
| + |
| + static_cast<CdmPromiseTemplate<T...>*>(promise.get())->resolve(result...); |
| +} |
| + |
| +void CdmPromiseAdapter::RejectPromise( |
| + uint32_t promise_id, |
| + MediaKeys::Exception exception_code, |
| + uint32 system_code, |
| + const std::string& error_message) { |
| + scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
| + if (!promise) { |
| + NOTREACHED() << "No promise found for promise_id " << promise_id; |
| + return; |
| + } |
| + |
| + promise->reject(exception_code, system_code, error_message); |
| } |
| void CdmPromiseAdapter::Clear() { |
| @@ -34,4 +63,15 @@ void CdmPromiseAdapter::Clear() { |
| promises_.clear(); |
| } |
| +scoped_ptr<CdmPromise> CdmPromiseAdapter::TakePromise(uint32_t promise_id) { |
| + PromiseMap::iterator it = promises_.find(promise_id); |
| + if (it == promises_.end()) |
| + return nullptr; |
| + return promises_.take_and_erase(it); |
| +} |
| + |
| +// Explicit instantiation of function templates. |
| +template void CdmPromiseAdapter::ResolvePromise(uint32_t); |
|
xhwang
2015/01/09 23:51:03
The template type is automatically deduced.
|
| +template void CdmPromiseAdapter::ResolvePromise(uint32_t, const std::string&); |
| + |
| } // namespace media |