Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/android/media_drm_storage_bridge.h" | 5 #include "media/base/android/media_drm_storage_bridge.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/android/callback_android.h" | 9 #include "base/android/callback_android.h" |
| 10 #include "base/android/jni_array.h" | |
| 11 #include "base/android/jni_string.h" | |
| 12 #include "base/bind.h" | |
| 10 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
| 11 #include "base/threading/thread_task_runner_handle.h" | 14 #include "base/threading/thread_task_runner_handle.h" |
| 12 #include "jni/MediaDrmStorageBridge_jni.h" | 15 #include "jni/MediaDrmStorageBridge_jni.h" |
| 16 #include "media/base/android/android_util.h" | |
| 13 | 17 |
| 18 using base::android::AttachCurrentThread; | |
| 19 using base::android::ConvertUTF8ToJavaString; | |
| 20 using base::android::JavaByteArrayToByteVector; | |
| 14 using base::android::JavaParamRef; | 21 using base::android::JavaParamRef; |
| 15 using base::android::RunCallbackAndroid; | 22 using base::android::RunCallbackAndroid; |
| 16 using base::android::ScopedJavaLocalRef; | 23 using base::android::ScopedJavaLocalRef; |
| 24 using base::android::ToJavaByteArray; | |
| 17 | 25 |
| 18 namespace media { | 26 namespace media { |
| 27 namespace { | |
| 28 void RunAndroidBoolCallback(JavaObjectPtr j_callback, bool success) { | |
| 29 RunCallbackAndroid(*j_callback, success); | |
| 30 } | |
| 31 | |
| 32 void OnSessionDataLoaded( | |
| 33 JavaObjectPtr j_callback, | |
| 34 const std::string& session_id, | |
| 35 std::unique_ptr<MediaDrmStorage::SessionData> session_data) { | |
| 36 if (!session_data) { | |
| 37 RunCallbackAndroid(*j_callback, ScopedJavaLocalRef<jobject>()); | |
| 38 return; | |
| 39 } | |
| 40 | |
| 41 JNIEnv* env = AttachCurrentThread(); | |
| 42 ScopedJavaLocalRef<jbyteArray> j_eme_id = StringToJavaBytes(env, session_id); | |
| 43 ScopedJavaLocalRef<jbyteArray> j_key_set_id = ToJavaByteArray( | |
| 44 env, session_data->key_set_id.data(), session_data->key_set_id.size()); | |
| 45 ScopedJavaLocalRef<jstring> j_mime = | |
| 46 ConvertUTF8ToJavaString(env, session_data->mime_type); | |
| 47 | |
| 48 RunCallbackAndroid(*j_callback, Java_PersistentInfo_create( | |
| 49 env, j_eme_id, j_key_set_id, j_mime)); | |
| 50 } | |
| 51 } // namespace | |
| 19 | 52 |
| 20 // static | 53 // static |
| 21 bool MediaDrmStorageBridge::RegisterMediaDrmStorageBridge(JNIEnv* env) { | 54 bool MediaDrmStorageBridge::RegisterMediaDrmStorageBridge(JNIEnv* env) { |
| 22 return RegisterNativesImpl(env); | 55 return RegisterNativesImpl(env); |
| 23 } | 56 } |
| 24 | 57 |
| 25 MediaDrmStorageBridge::MediaDrmStorageBridge() | 58 MediaDrmStorageBridge::MediaDrmStorageBridge( |
| 26 : task_runner_(base::ThreadTaskRunnerHandle::Get()), weak_factory_(this) {} | 59 const url::Origin& origin, |
| 60 OnceCreateStorageCB create_storage_cb) | |
| 61 : create_storage_cb_(std::move(create_storage_cb)), | |
| 62 origin_(origin), | |
| 63 task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
| 64 weak_factory_(this) {} | |
| 27 | 65 |
| 28 MediaDrmStorageBridge::~MediaDrmStorageBridge() = default; | 66 MediaDrmStorageBridge::~MediaDrmStorageBridge() = default; |
| 29 | 67 |
| 30 // TODO(yucliu): Implement these methods with MediaDrmStorage | |
| 31 | |
| 32 void MediaDrmStorageBridge::OnProvisioned( | 68 void MediaDrmStorageBridge::OnProvisioned( |
| 33 JNIEnv* env, | 69 JNIEnv* env, |
| 34 const JavaParamRef<jobject>& j_storage, | 70 const JavaParamRef<jobject>& j_storage, |
| 35 // Callback<Boolean> | 71 // Callback<Boolean> |
| 36 const JavaParamRef<jobject>& j_callback) { | 72 const JavaParamRef<jobject>& j_callback) { |
| 37 NOTIMPLEMENTED(); | 73 PostCancellableTask(base::BindOnce( |
| 38 | 74 &MediaDrmStorage::OnProvisioned, base::Unretained(GetStorageImpl()), |
| 39 RunCallbackAndroid(j_callback, true); | 75 base::BindOnce(&RunAndroidBoolCallback, |
| 76 base::Passed(CreateJavaObjectPtr(j_callback.obj()))))); | |
| 40 } | 77 } |
| 41 | 78 |
| 42 void MediaDrmStorageBridge::OnLoadInfo( | 79 void MediaDrmStorageBridge::OnLoadInfo( |
| 43 JNIEnv* env, | 80 JNIEnv* env, |
| 44 const JavaParamRef<jobject>& j_storage, | 81 const JavaParamRef<jobject>& j_storage, |
| 45 const JavaParamRef<jbyteArray>& j_session_id, | 82 const JavaParamRef<jbyteArray>& j_session_id, |
| 46 // Callback<PersistentInfo> | 83 // Callback<PersistentInfo> |
| 47 const JavaParamRef<jobject>& j_callback) { | 84 const JavaParamRef<jobject>& j_callback) { |
| 48 NOTIMPLEMENTED(); | 85 std::string session_id = JavaBytesToString(env, j_session_id); |
| 49 | 86 PostCancellableTask(base::BindOnce( |
| 50 RunCallbackAndroid(j_callback, ScopedJavaLocalRef<jobject>()); | 87 &MediaDrmStorage::LoadPersistentSession, |
| 88 base::Unretained(GetStorageImpl()), session_id, | |
| 89 base::BindOnce(&OnSessionDataLoaded, | |
|
xhwang
2017/04/07 05:47:35
Is it safe to call OnSessionDataLoaded() and RunAn
yucliu1
2017/04/07 18:53:10
Changed to WeakPtr<MediaDrmStorage>.
xhwang
2017/04/07 19:12:52
Right. But OnSessionDataLoaded() isn't bounded usi
yucliu1
2017/04/07 19:30:19
I think it's safe to do this. If MediaDrmStorage i
xhwang
2017/04/07 21:34:43
The problem is that OnSessionDataLoaded() is not b
| |
| 90 base::Passed(CreateJavaObjectPtr(j_callback.obj())), | |
| 91 session_id))); | |
| 51 } | 92 } |
| 52 | 93 |
| 53 void MediaDrmStorageBridge::OnSaveInfo( | 94 void MediaDrmStorageBridge::OnSaveInfo( |
| 54 JNIEnv* env, | 95 JNIEnv* env, |
| 55 const JavaParamRef<jobject>& j_storage, | 96 const JavaParamRef<jobject>& j_storage, |
| 56 const JavaParamRef<jobject>& j_persist_info, | 97 const JavaParamRef<jobject>& j_persist_info, |
| 57 // Callback<Boolean> | 98 // Callback<Boolean> |
| 58 const JavaParamRef<jobject>& j_callback) { | 99 const JavaParamRef<jobject>& j_callback) { |
| 59 NOTIMPLEMENTED(); | 100 std::vector<uint8_t> key_set_id; |
| 101 JavaByteArrayToByteVector( | |
| 102 env, Java_PersistentInfo_keySetId(env, j_persist_info.obj()).obj(), | |
| 103 &key_set_id); | |
| 60 | 104 |
| 61 RunCallbackAndroid(j_callback, false); | 105 std::string mime = ConvertJavaStringToUTF8( |
| 106 env, Java_PersistentInfo_mimeType(env, j_persist_info.obj())); | |
| 107 | |
| 108 std::string session_id = JavaBytesToString( | |
| 109 env, Java_PersistentInfo_emeId(env, j_persist_info.obj()).obj()); | |
| 110 | |
| 111 PostCancellableTask(base::BindOnce( | |
| 112 &MediaDrmStorage::SavePersistentSession, | |
| 113 base::Unretained(GetStorageImpl()), session_id, | |
| 114 MediaDrmStorage::SessionData(std::move(key_set_id), std::move(mime)), | |
| 115 base::BindOnce(&RunAndroidBoolCallback, | |
| 116 base::Passed(CreateJavaObjectPtr(j_callback.obj()))))); | |
| 62 } | 117 } |
| 63 | 118 |
| 64 void MediaDrmStorageBridge::OnClearInfo( | 119 void MediaDrmStorageBridge::OnClearInfo( |
| 65 JNIEnv* env, | 120 JNIEnv* env, |
| 66 const JavaParamRef<jobject>& j_storage, | 121 const JavaParamRef<jobject>& j_storage, |
| 67 const JavaParamRef<jbyteArray>& j_session_id, | 122 const JavaParamRef<jbyteArray>& j_session_id, |
| 68 // Callback<Boolean> | 123 // Callback<Boolean> |
| 69 const JavaParamRef<jobject>& j_callback) { | 124 const JavaParamRef<jobject>& j_callback) { |
| 70 NOTIMPLEMENTED(); | 125 PostCancellableTask(base::BindOnce( |
| 126 &MediaDrmStorage::RemovePersistentSession, | |
| 127 base::Unretained(GetStorageImpl()), JavaBytesToString(env, j_session_id), | |
| 128 base::BindOnce(&RunAndroidBoolCallback, | |
| 129 base::Passed(CreateJavaObjectPtr(j_callback.obj()))))); | |
| 130 } | |
| 71 | 131 |
| 72 RunCallbackAndroid(j_callback, false); | 132 MediaDrmStorage* MediaDrmStorageBridge::GetStorageImpl() { |
| 133 if (!impl_) { | |
| 134 DCHECK(!create_storage_cb_.is_null()); | |
|
xhwang
2017/04/07 05:47:35
nit: DCHECK(create_storage_cb);
yucliu1
2017/04/07 18:53:10
Done.
| |
| 135 impl_ = std::move(create_storage_cb_).Run(); | |
| 136 impl_->Initialize(origin_); | |
| 137 } | |
| 138 | |
| 139 return impl_.get(); | |
| 140 } | |
| 141 | |
| 142 void MediaDrmStorageBridge::PostCancellableTask(base::OnceClosure task) { | |
| 143 task_runner_->PostTask( | |
| 144 FROM_HERE, base::Bind(&MediaDrmStorageBridge::RunCancellableTask, | |
| 145 weak_factory_.GetWeakPtr(), base::Passed(&task))); | |
| 146 } | |
| 147 | |
| 148 void MediaDrmStorageBridge::RunCancellableTask(base::OnceClosure task) { | |
| 149 std::move(task).Run(); | |
|
xhwang
2017/04/07 05:47:35
What's the purpose of PostCancellableTask and Run
yucliu1
2017/04/07 18:53:09
Add SupportsWeakPtr to MediaDrmStorage, it's redun
| |
| 73 } | 150 } |
| 74 } // namespace media | 151 } // namespace media |
| OLD | NEW |