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 |