1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_BASE_CDM_PROMISE_H_ 6 #define MEDIA_BASE_CDM_PROMISE_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/callback.h" 12 #include "media/base/media_export.h" 13 #include "media/base/media_keys.h" 14 15 namespace media { 16 17 // Interface for promises being resolved/rejected in response to various 18 // session actions. These may be called synchronously or asynchronously. 19 // The promise must be resolved or rejected exactly once. It is expected that 20 // the caller free the promise once it is resolved/rejected. 21 // 22 // This is only the base class, as parameter to resolve() varies. 23 class MEDIA_EXPORT CdmPromise { 24 public: 25 typedef base::Callback<void(MediaKeys::Exception exception_code, 26 uint32 system_code, 27 const std::string& error_message)> 28 PromiseRejectedCB; 29 30 virtual ~CdmPromise(); 31 32 // Used to indicate that the operation failed. |exception_code| must be 33 // specified. |system_code| is a Key System-specific value for the error 34 // that occurred, or 0 if there is no associated status code or such status 35 // codes are not supported by the Key System. |error_message| is optional. 36 virtual void reject(MediaKeys::Exception exception_code, 37 uint32 system_code, 38 const std::string& error_message); 39 40 protected: 41 CdmPromise(); 42 CdmPromise(PromiseRejectedCB reject_cb); 43 44 PromiseRejectedCB reject_cb_; 45 46 // Keep track of whether the promise hasn't been resolved or rejected yet. 47 bool is_pending_; 48 49 DISALLOW_COPY_AND_ASSIGN(CdmPromise); 50 }; 51 52 template <typename T> 53 class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise { 54 public: 55 CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb, 56 PromiseRejectedCB rejected_cb); 57 virtual ~CdmPromiseTemplate(); 58 virtual void resolve(const T& result); 59 60 private: 61 base::Callback<void(const T&)> resolve_cb_; 62 63 DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); 64 }; 65 66 // Specialization for no parameter to resolve(). 67 template <> 68 class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise { 69 public: 70 CdmPromiseTemplate(base::Callback<void(void)> resolve_cb, 71 PromiseRejectedCB rejected_cb); 72 virtual ~CdmPromiseTemplate(); 73 virtual void resolve(); 74 75 protected: 76 // Allow subclasses to completely override the implementation. 77 CdmPromiseTemplate(); 78 79 private: 80 base::Callback<void(void)> resolve_cb_; 81 82 DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); 83 }; 84 85 } // namespace media 86 87 #endif // MEDIA_BASE_CDM_PROMISE_H_ 88