media_drm_credential_manager.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1// Copyright 2013 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#include "content/browser/media/android/media_drm_credential_manager.h" 6 7#include "base/android/jni_android.h" 8#include "base/android/scoped_java_ref.h" 9#include "base/bind.h" 10#include "base/callback_helpers.h" 11#include "jni/MediaDrmCredentialManager_jni.h" 12#include "media/base/android/media_drm_bridge.h" 13#include "url/gurl.h" 14 15using base::android::ScopedJavaGlobalRef; 16 17namespace { 18 19void MediaDrmCredentialManagerCallback( 20 const ScopedJavaGlobalRef<jobject>& j_media_drm_credential_manager_callback, 21 bool succeeded) { 22 JNIEnv* env = base::android::AttachCurrentThread(); 23 content::Java_MediaDrmCredentialManagerCallback_onCredentialResetFinished( 24 env, j_media_drm_credential_manager_callback.obj(), succeeded); 25} 26 27} // namespace 28 29namespace content { 30 31// TODO(qinmin): Move the UUID definition to some common places. 32static const uint8 kWidevineUuid[16] = { 33 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, 34 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED }; 35 36MediaDrmCredentialManager::MediaDrmCredentialManager() {}; 37 38MediaDrmCredentialManager::~MediaDrmCredentialManager() {}; 39 40// static 41MediaDrmCredentialManager* MediaDrmCredentialManager::GetInstance() { 42 return Singleton<MediaDrmCredentialManager>::get(); 43} 44 45void MediaDrmCredentialManager::ResetCredentials( 46 const ResetCredentialsCB& callback) { 47 // Ignore reset request if one is already in progress. 48 if (!reset_credentials_cb_.is_null()) 49 return; 50 51 reset_credentials_cb_ = callback; 52 53 // First reset the L3 credential. 54 if (!ResetCredentialsInternal("L3")) { 55 // TODO(qinmin): We should post a task instead. 56 base::ResetAndReturn(&reset_credentials_cb_).Run(false); 57 } 58} 59 60// static 61void ResetCredentials( 62 JNIEnv* env, 63 jclass clazz, 64 jobject j_media_drm_credential_manager_callback) { 65 MediaDrmCredentialManager* media_drm_credential_manager = 66 MediaDrmCredentialManager::GetInstance(); 67 68 ScopedJavaGlobalRef<jobject> j_scoped_media_drm_credential_manager_callback; 69 j_scoped_media_drm_credential_manager_callback.Reset( 70 env, j_media_drm_credential_manager_callback); 71 72 MediaDrmCredentialManager::ResetCredentialsCB callback_runner = 73 base::Bind(&MediaDrmCredentialManagerCallback, 74 j_scoped_media_drm_credential_manager_callback); 75 76 media_drm_credential_manager->ResetCredentials(callback_runner); 77} 78 79void MediaDrmCredentialManager::OnResetCredentialsCompleted( 80 const std::string& security_level, bool success) { 81 if (security_level == "L3" && success) { 82 if (ResetCredentialsInternal("L1")) 83 return; 84 success = false; 85 } 86 87 base::ResetAndReturn(&reset_credentials_cb_).Run(success); 88 media_drm_bridge_.reset(); 89} 90 91bool MediaDrmCredentialManager::ResetCredentialsInternal( 92 const std::string& security_level) { 93 std::vector<uint8> uuid(kWidevineUuid, kWidevineUuid + 16); 94 media_drm_bridge_ = media::MediaDrmBridge::Create( 95 0, uuid, GURL(), security_level, NULL); 96 if (!media_drm_bridge_) 97 return false; 98 media_drm_bridge_->ResetDeviceCredentials( 99 base::Bind(&MediaDrmCredentialManager::OnResetCredentialsCompleted, 100 base::Unretained(this), security_level)); 101 return true; 102} 103 104// static 105bool MediaDrmCredentialManager::RegisterMediaDrmCredentialManager(JNIEnv* env) { 106 return RegisterNativesImpl(env); 107} 108 109} // namespace content 110