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 // A superset of media::MediaKeys::Exception for UMA reporting. 26 enum ResultCodeForUMA { 27 SUCCESS, 28 NOT_SUPPORTED_ERROR, 29 INVALID_STATE_ERROR, 30 INVALID_ACCESS_ERROR, 31 QUOTA_EXCEEDED_ERROR, 32 UNKNOWN_ERROR, 33 CLIENT_ERROR, 34 OUTPUT_ERROR, 35 NUM_RESULT_CODES 36 }; 37 38 enum ResolveParameterType { 39 VOID_TYPE, 40 STRING_TYPE, 41 KEY_IDS_VECTOR_TYPE 42 }; 43 44 typedef base::Callback<void(MediaKeys::Exception exception_code, 45 uint32 system_code, 46 const std::string& error_message)> 47 PromiseRejectedCB; 48 49 virtual ~CdmPromise(); 50 51 // Used to indicate that the operation failed. |exception_code| must be 52 // specified. |system_code| is a Key System-specific value for the error 53 // that occurred, or 0 if there is no associated status code or such status 54 // codes are not supported by the Key System. |error_message| is optional. 55 virtual void reject(MediaKeys::Exception exception_code, 56 uint32 system_code, 57 const std::string& error_message); 58 59 ResolveParameterType GetResolveParameterType() const { 60 return parameter_type_; 61 } 62 63 protected: 64 explicit CdmPromise(ResolveParameterType parameter_type); 65 CdmPromise(ResolveParameterType parameter_type, PromiseRejectedCB reject_cb); 66 67 // If constructed with a |uma_name| (which must be the name of a 68 // CdmPromiseResult UMA), CdmPromise will report the promise result (success 69 // or rejection code). 70 CdmPromise(ResolveParameterType parameter_type, 71 PromiseRejectedCB reject_cb, 72 const std::string& uma_name); 73 74 // Called by all resolve()/reject() methods to report the UMA result if 75 // applicable, and update |is_pending_|. 76 void ReportResultToUMA(ResultCodeForUMA result); 77 78 const ResolveParameterType parameter_type_; 79 PromiseRejectedCB reject_cb_; 80 81 // Keep track of whether the promise hasn't been resolved or rejected yet. 82 bool is_pending_; 83 84 // UMA name to report result to. 85 std::string uma_name_; 86 87 DISALLOW_COPY_AND_ASSIGN(CdmPromise); 88 }; 89 90 template <typename T> 91 class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise { 92 public: 93 CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb, 94 PromiseRejectedCB rejected_cb); 95 CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb, 96 PromiseRejectedCB rejected_cb, 97 const std::string& uma_name); 98 virtual void resolve(const T& result); 99 100 protected: 101 // Allow subclasses to completely override the implementation. 102 CdmPromiseTemplate(); 103 104 private: 105 base::Callback<void(const T&)> resolve_cb_; 106 107 DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); 108 }; 109 110 // Specialization for no parameter to resolve(). 111 template <> 112 class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise { 113 public: 114 CdmPromiseTemplate(base::Callback<void(void)> resolve_cb, 115 PromiseRejectedCB rejected_cb); 116 CdmPromiseTemplate(base::Callback<void(void)> resolve_cb, 117 PromiseRejectedCB rejected_cb, 118 const std::string& uma_name); 119 virtual void resolve(); 120 121 protected: 122 // Allow subclasses to completely override the implementation. 123 CdmPromiseTemplate(); 124 125 private: 126 base::Callback<void(void)> resolve_cb_; 127 128 DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); 129 }; 130 131 } // namespace media 132 133 #endif // MEDIA_BASE_CDM_PROMISE_H_ 134