1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef MEDIA_BASE_CDM_PROMISE_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define MEDIA_BASE_CDM_PROMISE_H_ 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/media_export.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/media_keys.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace media { 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Interface for promises being resolved/rejected in response to various 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// session actions. These may be called synchronously or asynchronously. 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The promise must be resolved or rejected exactly once. It is expected that 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the caller free the promise once it is resolved/rejected. 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This is only the base class, as parameter to resolve() varies. 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MEDIA_EXPORT CdmPromise { 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // A superset of media::MediaKeys::Exception for UMA reporting. 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) enum ResultCodeForUMA { 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SUCCESS, 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NOT_SUPPORTED_ERROR, 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) INVALID_STATE_ERROR, 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) INVALID_ACCESS_ERROR, 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) QUOTA_EXCEEDED_ERROR, 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UNKNOWN_ERROR, 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CLIENT_ERROR, 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OUTPUT_ERROR, 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NUM_RESULT_CODES 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) }; 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum ResolveParameterType { 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VOID_TYPE, 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_TYPE, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KEY_IDS_VECTOR_TYPE 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef base::Callback<void(MediaKeys::Exception exception_code, 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message)> 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PromiseRejectedCB; 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~CdmPromise(); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Used to indicate that the operation failed. |exception_code| must be 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // specified. |system_code| is a Key System-specific value for the error 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // that occurred, or 0 if there is no associated status code or such status 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // codes are not supported by the Key System. |error_message| is optional. 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void reject(MediaKeys::Exception exception_code, 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResolveParameterType GetResolveParameterType() const { 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return parameter_type_; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit CdmPromise(ResolveParameterType parameter_type); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CdmPromise(ResolveParameterType parameter_type, PromiseRejectedCB reject_cb); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // If constructed with a |uma_name| (which must be the name of a 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // CdmPromiseResult UMA), CdmPromise will report the promise result (success 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // or rejection code). 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CdmPromise(ResolveParameterType parameter_type, 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PromiseRejectedCB reject_cb, 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& uma_name); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called by all resolve()/reject() methods to report the UMA result if 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // applicable, and update |is_pending_|. 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ReportResultToUMA(ResultCodeForUMA result); 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResolveParameterType parameter_type_; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PromiseRejectedCB reject_cb_; 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Keep track of whether the promise hasn't been resolved or rejected yet. 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_pending_; 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // UMA name to report result to. 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string uma_name_; 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CdmPromise); 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T> 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise { 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb, 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PromiseRejectedCB rejected_cb); 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb, 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PromiseRejectedCB rejected_cb, 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string& uma_name); 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void resolve(const T& result); 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Allow subclasses to completely override the implementation. 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CdmPromiseTemplate(); 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Callback<void(const T&)> resolve_cb_; 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Specialization for no parameter to resolve(). 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <> 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise { 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CdmPromiseTemplate(base::Callback<void(void)> resolve_cb, 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PromiseRejectedCB rejected_cb); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CdmPromiseTemplate(base::Callback<void(void)> resolve_cb, 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PromiseRejectedCB rejected_cb, 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string& uma_name); 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void resolve(); 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Allow subclasses to completely override the implementation. 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CdmPromiseTemplate(); 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Callback<void(void)> resolve_cb_; 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace media 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // MEDIA_BASE_CDM_PROMISE_H_ 134