| 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..774a082922697c8de158b1fd451de4077515acdb 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,17 @@ 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 MEDIA_EXPORT void CdmPromiseAdapter::ResolvePromise(uint32_t);
|
| +template MEDIA_EXPORT void CdmPromiseAdapter::ResolvePromise(
|
| + uint32_t,
|
| + const std::string&);
|
| +
|
| } // namespace media
|
|
|