android_media_MediaDrm.cpp revision 7cda491321b9bd2e8faf956824312ea6a30e6457
18a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker/* 28a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * Copyright 2013, The Android Open Source Project 38a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * 48a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 58a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * you may not use this file except in compliance with the License. 68a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * You may obtain a copy of the License at 78a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * 88a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 98a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * 108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * Unless required by applicable law or agreed to in writing, software 118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * See the License for the specific language governing permissions and 148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker * limitations under the License. 158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker */ 168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker//#define LOG_NDEBUG 0 188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#define LOG_TAG "MediaDrm-JNI" 198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include <utils/Log.h> 208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include "android_media_MediaDrm.h" 228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include "android_runtime/AndroidRuntime.h" 2454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker#include "android_os_Parcel.h" 258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include "jni.h" 268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include "JNIHelp.h" 278a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include <binder/IServiceManager.h> 2954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker#include <binder/Parcel.h> 308a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include <media/IDrm.h> 318a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include <media/IMediaPlayerService.h> 328a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 33f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker#include <media/stagefright/MediaErrors.h> 348a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkernamespace android { 368a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#define FIND_CLASS(var, className) \ 388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker var = env->FindClass(className); \ 398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker LOG_FATAL_IF(! var, "Unable to find class " className); 408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 418a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 428a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 438a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker LOG_FATAL_IF(! var, "Unable to find field " fieldName); 448a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 458a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker#define GET_METHOD_ID(var, clazz, fieldName, fieldDescriptor) \ 468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker var = env->GetMethodID(clazz, fieldName, fieldDescriptor); \ 478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker LOG_FATAL_IF(! var, "Unable to find method " fieldName); 488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker#define GET_STATIC_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 5054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker var = env->GetStaticFieldID(clazz, fieldName, fieldDescriptor); \ 5154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker LOG_FATAL_IF(! var, "Unable to find field " fieldName); 5254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 5354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker#define GET_STATIC_METHOD_ID(var, clazz, fieldName, fieldDescriptor) \ 5454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker var = env->GetStaticMethodID(clazz, fieldName, fieldDescriptor); \ 5554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker LOG_FATAL_IF(! var, "Unable to find static method " fieldName); 5654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 5754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct RequestFields { 598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jfieldID data; 608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jfieldID defaultUrl; 618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct ArrayListFields { 648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID init; 658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID add; 668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct HashmapFields { 698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID init; 708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID get; 718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID put; 728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID entrySet; 738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct SetFields { 768a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID iterator; 778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 798a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct IteratorFields { 808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID next; 818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID hasNext; 828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct EntryFields { 858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID getKey; 868a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jmethodID getValue; 878a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkerstruct EventTypes { 9017b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kEventProvisionRequired; 9117b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kEventKeyRequired; 9217b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kEventKeyExpired; 9317b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kEventVendorDefined; 9454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker} gEventTypes; 9554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 9617b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinkerstruct KeyTypes { 9717b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kKeyTypeStreaming; 9817b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kKeyTypeOffline; 9917b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jint kKeyTypeRelease; 10017b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker} gKeyTypes; 10117b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker 1028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstruct fields_t { 1038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jfieldID context; 10454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jmethodID post_event; 10516b8cffb2893c10c35788191847500004da466d1Jeff Tinker RequestFields keyRequest; 1068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker RequestFields provisionRequest; 1078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker ArrayListFields arraylist; 1088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker HashmapFields hashmap; 1098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker SetFields set; 1108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker IteratorFields iterator; 1118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker EntryFields entry; 1128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 1138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic fields_t gFields; 1158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 11654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker// ---------------------------------------------------------------------------- 11754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker// ref-counted object for callbacks 11854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkerclass JNIDrmListener: public DrmListener 11954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker{ 12054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkerpublic: 12154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker JNIDrmListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 12254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker ~JNIDrmListener(); 12354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker virtual void notify(DrmPlugin::EventType eventType, int extra, const Parcel *obj = NULL); 12454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkerprivate: 12554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker JNIDrmListener(); 12654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jclass mClass; // Reference to MediaDrm class 12754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jobject mObject; // Weak ref to MediaDrm Java object to call on 12854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker}; 12954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 13054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff TinkerJNIDrmListener::JNIDrmListener(JNIEnv* env, jobject thiz, jobject weak_thiz) 13154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker{ 13254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker // Hold onto the MediaDrm class for use in calling the static method 13354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker // that posts events to the application thread. 13454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jclass clazz = env->GetObjectClass(thiz); 13554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (clazz == NULL) { 13654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker ALOGE("Can't find android/media/MediaDrm"); 137eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/Exception", 138eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "Can't find android/media/MediaDrm"); 13954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker return; 14054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 14154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker mClass = (jclass)env->NewGlobalRef(clazz); 14254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 14354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker // We use a weak reference so the MediaDrm object can be garbage collected. 14454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker // The reference is only used as a proxy for callbacks. 14554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker mObject = env->NewGlobalRef(weak_thiz); 14654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker} 14754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 14854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff TinkerJNIDrmListener::~JNIDrmListener() 14954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker{ 15054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker // remove global references 15154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker JNIEnv *env = AndroidRuntime::getJNIEnv(); 15254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker env->DeleteGlobalRef(mObject); 15354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker env->DeleteGlobalRef(mClass); 15454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker} 15554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 15654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkervoid JNIDrmListener::notify(DrmPlugin::EventType eventType, int extra, 15754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker const Parcel *obj) 15854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker{ 15954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jint jeventType; 16054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 16154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker // translate DrmPlugin event types into their java equivalents 16254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker switch(eventType) { 16354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker case DrmPlugin::kDrmPluginEventProvisionRequired: 16454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jeventType = gEventTypes.kEventProvisionRequired; 16554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker break; 16654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker case DrmPlugin::kDrmPluginEventKeyNeeded: 16754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jeventType = gEventTypes.kEventKeyRequired; 16854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker break; 16954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker case DrmPlugin::kDrmPluginEventKeyExpired: 17054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jeventType = gEventTypes.kEventKeyExpired; 17154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker break; 17254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker case DrmPlugin::kDrmPluginEventVendorDefined: 17354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jeventType = gEventTypes.kEventVendorDefined; 17454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker break; 17554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker default: 17654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker ALOGE("Invalid event DrmPlugin::EventType %d, ignored", (int)eventType); 17754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker return; 17854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 17954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 18054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker JNIEnv *env = AndroidRuntime::getJNIEnv(); 18154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (obj && obj->dataSize() > 0) { 18254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jobject jParcel = createJavaParcelObject(env); 18354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (jParcel != NULL) { 18454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker Parcel* nativeParcel = parcelForJavaObject(env, jParcel); 18554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker nativeParcel->setData(obj->data(), obj->dataSize()); 18654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker env->CallStaticVoidMethod(mClass, gFields.post_event, mObject, 18754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jeventType, extra, jParcel); 18854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 18954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 19054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 19154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (env->ExceptionCheck()) { 19254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker ALOGW("An exception occurred while notifying an event."); 19354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker LOGW_EX(env); 19454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker env->ExceptionClear(); 19554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 19654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker} 19754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 19854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 1998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic bool throwExceptionAsNecessary( 2008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, status_t err, const char *msg = NULL) { 2018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 202f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker const char *drmMessage = NULL; 203f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker 204f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker switch(err) { 205f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_UNKNOWN: 206f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "General DRM error"; 207f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 208f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_NO_LICENSE: 209f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "No license"; 210f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 211f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_LICENSE_EXPIRED: 212f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "License expired"; 213f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 214f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_SESSION_NOT_OPENED: 215f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "Session not opened"; 216f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 217f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED: 218f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "Not initialized"; 219f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 220f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_DECRYPT: 221f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "Decrypt error"; 222f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 223f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_CANNOT_HANDLE: 224f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "Unsupported scheme or data format"; 225f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 226f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker case ERROR_DRM_TAMPER_DETECTED: 227f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = "Invalid state"; 228f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 229f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker default: 230f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker break; 231f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker } 232f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker 233f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker String8 vendorMessage; 234f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker if (err >= ERROR_DRM_VENDOR_MIN && err <= ERROR_DRM_VENDOR_MAX) { 235f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker vendorMessage.format("DRM vendor-defined error: %d", err); 236f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker drmMessage = vendorMessage.string(); 237f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker } 238f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker 2398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (err == BAD_VALUE) { 2408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", msg); 2418a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return true; 2421d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker } else if (err == ERROR_DRM_NOT_PROVISIONED) { 2431d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker jniThrowException(env, "android/media/NotProvisionedException", msg); 2441d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker return true; 2453ed38266c1647c6219ae5ad89cb3f867cf66caaaJeff Tinker } else if (err == ERROR_DRM_RESOURCE_BUSY) { 2463ed38266c1647c6219ae5ad89cb3f867cf66caaaJeff Tinker jniThrowException(env, "android/media/ResourceBusyException", msg); 2473ed38266c1647c6219ae5ad89cb3f867cf66caaaJeff Tinker return true; 2481d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker } else if (err == ERROR_DRM_DEVICE_REVOKED) { 2491d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker jniThrowException(env, "android/media/DeniedByServerException", msg); 2501d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker return true; 2518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } else if (err != OK) { 252f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker String8 errbuf; 253f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker if (drmMessage != NULL) { 254f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker if (msg == NULL) { 255f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker msg = drmMessage; 256f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker } else { 257f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker errbuf.format("%s: %s", msg, drmMessage); 258f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker msg = errbuf.string(); 259f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker } 260f7568b5ee96b3d80721c76ab3d47f1368a99bf98Jeff Tinker } 2611d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker ALOGE("Illegal state exception: %s", msg); 2628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", msg); 2638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return true; 2648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 2658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return false; 2668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 2678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic sp<IDrm> GetDrm(JNIEnv *env, jobject thiz) { 2698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JDrm *jdrm = (JDrm *)env->GetIntField(thiz, gFields.context); 2708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return jdrm ? jdrm->getDrm() : NULL; 2718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 2728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff TinkerJDrm::JDrm( 2748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, const uint8_t uuid[16]) { 2758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker mObject = env->NewWeakGlobalRef(thiz); 2768a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker mDrm = MakeDrm(uuid); 27754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (mDrm != NULL) { 27854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker mDrm->setListener(this); 27954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 2808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 2818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff TinkerJDrm::~JDrm() { 2838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker mDrm.clear(); 2848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env = AndroidRuntime::getJNIEnv(); 2868a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2878a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteWeakGlobalRef(mObject); 2888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker mObject = NULL; 2898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 2908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker// static 2928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkersp<IDrm> JDrm::MakeDrm() { 2938a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IServiceManager> sm = defaultServiceManager(); 2948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2958a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IBinder> binder = 2968a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sm->getService(String16("media.player")); 2978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 2988a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IMediaPlayerService> service = 2998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker interface_cast<IMediaPlayerService>(binder); 3008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (service == NULL) { 3028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 3038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3048a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = service->makeDrm(); 3068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL || (drm->initCheck() != OK && drm->initCheck() != NO_INIT)) { 3088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 3098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return drm; 3128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 3138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker// static 3158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkersp<IDrm> JDrm::MakeDrm(const uint8_t uuid[16]) { 3168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = MakeDrm(); 3178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 3198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 3208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->createPlugin(uuid); 3238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (err != OK) { 3258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 3268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3278a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return drm; 3298a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 3308a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 33154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkerstatus_t JDrm::setListener(const sp<DrmListener>& listener) { 33254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker Mutex::Autolock lock(mLock); 33354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker mListener = listener; 33454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker return OK; 33554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker} 33654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 33754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinkervoid JDrm::notify(DrmPlugin::EventType eventType, int extra, const Parcel *obj) { 33854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker sp<DrmListener> listener; 33954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker mLock.lock(); 34054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker listener = mListener; 34154cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker mLock.unlock(); 34254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 34354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (listener != NULL) { 34454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker Mutex::Autolock lock(mNotifyLock); 34554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker listener->notify(eventType, extra, obj); 34654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 34754cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker} 34854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 34954cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 3508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker// static 3517cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinkerbool JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 3528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = MakeDrm(); 3538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 3558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return false; 3568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3587cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker return drm->isCryptoSchemeSupported(uuid, mimeType); 3598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 3608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatus_t JDrm::initCheck() const { 3628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return mDrm == NULL ? NO_INIT : OK; 3638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 3648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker// JNI conversion utilities 3668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic Vector<uint8_t> JByteArrayToVector(JNIEnv *env, jbyteArray const &byteArray) { 3678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> vector; 3688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker size_t length = env->GetArrayLength(byteArray); 3698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker vector.insertAt((size_t)0, length); 3708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->GetByteArrayRegion(byteArray, 0, length, (jbyte *)vector.editArray()); 3718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return vector; 3728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 3738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jbyteArray VectorToJByteArray(JNIEnv *env, Vector<uint8_t> const &vector) { 3758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker size_t length = vector.size(); 3768a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jbyteArray result = env->NewByteArray(length); 3778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (result != NULL) { 3788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->SetByteArrayRegion(result, 0, length, (jbyte *)vector.array()); 3798a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return result; 3818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 3828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 3838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic String8 JStringToString8(JNIEnv *env, jstring const &jstr) { 3848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 result; 3858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 38654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker const char *s = env->GetStringUTFChars(jstr, NULL); 3878a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (s) { 3888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker result = s; 3898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->ReleaseStringUTFChars(jstr, s); 3908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 3918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return result; 3928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 39316b8cffb2893c10c35788191847500004da466d1Jeff Tinker 3948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker/* 3958a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker import java.util.HashMap; 3968a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker import java.util.Set; 3978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker import java.Map.Entry; 3988a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker import jav.util.Iterator; 3998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker HashMap<k, v> hm; 4018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Set<Entry<k, v> > s = hm.entrySet(); 4028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Iterator i = s.iterator(); 4038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Entry e = s.next(); 4048a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker*/ 4058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic KeyedVector<String8, String8> HashMapToKeyedVector(JNIEnv *env, jobject &hashMap) { 4078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jclass clazz; 4088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/lang/String"); 4098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker KeyedVector<String8, String8> keyedVector; 4108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject entrySet = env->CallObjectMethod(hashMap, gFields.hashmap.entrySet); 4128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (entrySet) { 4138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject iterator = env->CallObjectMethod(entrySet, gFields.set.iterator); 4148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (iterator) { 4158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jboolean hasNext = env->CallBooleanMethod(iterator, gFields.iterator.hasNext); 4168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker while (hasNext) { 4178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject entry = env->CallObjectMethod(iterator, gFields.iterator.next); 4188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (entry) { 4198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject obj = env->CallObjectMethod(entry, gFields.entry.getKey); 4208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!env->IsInstanceOf(obj, clazz)) { 421eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 422eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "HashMap key is not a String"); 4238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jstring jkey = static_cast<jstring>(obj); 4258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker obj = env->CallObjectMethod(entry, gFields.entry.getValue); 4278a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!env->IsInstanceOf(obj, clazz)) { 428eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 429eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "HashMap value is not a String"); 4308a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4318a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jstring jvalue = static_cast<jstring>(obj); 4328a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4338a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 key = JStringToString8(env, jkey); 4348a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 value = JStringToString8(env, jvalue); 4358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker keyedVector.add(key, value); 4368a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(jkey); 4388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(jvalue); 4398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker hasNext = env->CallBooleanMethod(iterator, gFields.iterator.hasNext); 4408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4418a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(entry); 4428a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4438a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(iterator); 4448a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4458a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(entrySet); 4468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return keyedVector; 4488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 4498a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jobject KeyedVectorToHashMap (JNIEnv *env, KeyedVector<String8, String8> const &map) { 4518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jclass clazz; 4528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/HashMap"); 4538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject hashMap = env->NewObject(clazz, gFields.hashmap.init); 4548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker for (size_t i = 0; i < map.size(); ++i) { 4558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jstring jkey = env->NewStringUTF(map.keyAt(i).string()); 4568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jstring jvalue = env->NewStringUTF(map.valueAt(i).string()); 4578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->CallObjectMethod(hashMap, gFields.hashmap.put, jkey, jvalue); 4588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(jkey); 4598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(jvalue); 4608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return hashMap; 4628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 4638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jobject ListOfVectorsToArrayListOfByteArray(JNIEnv *env, 4658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker List<Vector<uint8_t> > list) { 4668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jclass clazz; 4678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/ArrayList"); 4688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject arrayList = env->NewObject(clazz, gFields.arraylist.init); 4698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker List<Vector<uint8_t> >::iterator iter = list.begin(); 4708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker while (iter != list.end()) { 4718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jbyteArray byteArray = VectorToJByteArray(env, *iter); 4728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->CallBooleanMethod(arrayList, gFields.arraylist.add, byteArray); 4738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->DeleteLocalRef(byteArray); 4748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker iter++; 4758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4768a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return arrayList; 4788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 4798a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} // namespace android 4818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerusing namespace android; 4838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic sp<JDrm> setDrm( 4858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, const sp<JDrm> &drm) { 4868a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<JDrm> old = (JDrm *)env->GetIntField(thiz, gFields.context); 4878a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm != NULL) { 4888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker drm->incStrong(thiz); 4898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (old != NULL) { 4918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker old->decStrong(thiz); 4928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 4938a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->SetIntField(thiz, gFields.context, (int)drm.get()); 4948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4958a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return old; 4968a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 4978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 4988a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic bool CheckSession(JNIEnv *env, const sp<IDrm> &drm, jbyteArray const &jsessionId) 4998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker{ 5008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 501eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", "MediaDrm obj is null"); 5028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return false; 5038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 5048a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jsessionId == NULL) { 506eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", "sessionId is null"); 5078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return false; 5088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 5098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return true; 5108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 5118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_release(JNIEnv *env, jobject thiz) { 51354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker sp<JDrm> drm = setDrm(env, thiz, NULL); 51454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker if (drm != NULL) { 51554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker drm->setListener(NULL); 51654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker } 5178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 5188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_native_init(JNIEnv *env) { 5208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jclass clazz; 5218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "android/media/MediaDrm"); 5228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_FIELD_ID(gFields.context, clazz, "mNativeContext", "I"); 52354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker GET_STATIC_METHOD_ID(gFields.post_event, clazz, "postEventFromNative", 52454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker "(Ljava/lang/Object;IILjava/lang/Object;)V"); 52554cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker 52654cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker jfieldID field; 527e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_STATIC_FIELD_ID(field, clazz, "EVENT_PROVISION_REQUIRED", "I"); 52854cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker gEventTypes.kEventProvisionRequired = env->GetStaticIntField(clazz, field); 529e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_STATIC_FIELD_ID(field, clazz, "EVENT_KEY_REQUIRED", "I"); 53054cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker gEventTypes.kEventKeyRequired = env->GetStaticIntField(clazz, field); 531e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_STATIC_FIELD_ID(field, clazz, "EVENT_KEY_EXPIRED", "I"); 53254cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker gEventTypes.kEventKeyExpired = env->GetStaticIntField(clazz, field); 533e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_STATIC_FIELD_ID(field, clazz, "EVENT_VENDOR_DEFINED", "I"); 53454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker gEventTypes.kEventVendorDefined = env->GetStaticIntField(clazz, field); 5358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 53617b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_STREAMING", "I"); 53717b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker gKeyTypes.kKeyTypeStreaming = env->GetStaticIntField(clazz, field); 53817b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_OFFLINE", "I"); 53917b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker gKeyTypes.kKeyTypeOffline = env->GetStaticIntField(clazz, field); 54017b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_RELEASE", "I"); 54117b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker gKeyTypes.kKeyTypeRelease = env->GetStaticIntField(clazz, field); 54217b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker 54316b8cffb2893c10c35788191847500004da466d1Jeff Tinker FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest"); 544e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_FIELD_ID(gFields.keyRequest.data, clazz, "mData", "[B"); 545e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_FIELD_ID(gFields.keyRequest.defaultUrl, clazz, "mDefaultUrl", "Ljava/lang/String;"); 5468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "android/media/MediaDrm$ProvisionRequest"); 548e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_FIELD_ID(gFields.provisionRequest.data, clazz, "mData", "[B"); 549e1c76bebef41d362369627ed0c06ea9a01c6bddbJeff Tinker GET_FIELD_ID(gFields.provisionRequest.defaultUrl, clazz, "mDefaultUrl", "Ljava/lang/String;"); 5508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/ArrayList"); 5528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.arraylist.init, clazz, "<init>", "()V"); 5538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.arraylist.add, clazz, "add", "(Ljava/lang/Object;)Z"); 5548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/HashMap"); 5568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.hashmap.init, clazz, "<init>", "()V"); 5578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.hashmap.get, clazz, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); 5588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.hashmap.put, clazz, "put", 5598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); 5608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.hashmap.entrySet, clazz, "entrySet", "()Ljava/util/Set;"); 5618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/Set"); 5638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.set.iterator, clazz, "iterator", "()Ljava/util/Iterator;"); 5648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/Iterator"); 5668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.iterator.next, clazz, "next", "()Ljava/lang/Object;"); 5678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.iterator.hasNext, clazz, "hasNext", "()Z"); 5688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "java/util/Map$Entry"); 5708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.entry.getKey, clazz, "getKey", "()Ljava/lang/Object;"); 5718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker GET_METHOD_ID(gFields.entry.getValue, clazz, "getValue", "()Ljava/lang/Object;"); 5728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 5738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_native_setup( 5758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, 5768a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject weak_this, jbyteArray uuidObj) { 5778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (uuidObj == NULL) { 579eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", "uuid is null"); 5808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 5818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 5828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> uuid = JByteArrayToVector(env, uuidObj); 5848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (uuid.size() != 16) { 586eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 587eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "invalid UUID size, expected 16 bytes"); 5888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 5898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 5908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<JDrm> drm = new JDrm(env, thiz, uuid.array()); 5928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5938a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->initCheck(); 5948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 5958a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (err != OK) { 5968a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jniThrowException( 5978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env, 5981d7c218ba23185c58ae27f59e4ec6b8526b2d04aJeff Tinker "android/media/UnsupportedSchemeException", 5998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker "Failed to instantiate drm object."); 6008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 6018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 60354cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker sp<JNIDrmListener> listener = new JNIDrmListener(env, thiz, weak_this); 60454cfbd6dc28334119c33b6a77779bfe244c71e69Jeff Tinker drm->setListener(listener); 6058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker setDrm(env, thiz, drm); 6068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 6078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_native_finalize( 6098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz) { 6108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker android_media_MediaDrm_release(env, thiz); 6118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 6128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jboolean android_media_MediaDrm_isCryptoSchemeSupportedNative( 6147cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray uuidObj, jstring jmimeType) { 6158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (uuidObj == NULL) { 6178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return false; 6198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> uuid = JByteArrayToVector(env, uuidObj); 6228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (uuid.size() != 16) { 6248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jniThrowException( 6258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env, 6268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker "java/lang/IllegalArgumentException", 627eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "invalid UUID size, expected 16 bytes"); 6288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return false; 6298a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6308a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6317cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker String8 mimeType; 6327cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker if (jmimeType != NULL) { 6337cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker mimeType = JStringToString8(env, jmimeType); 6347cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker } 6357cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker 6367cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker return JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType); 6378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 6388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jbyteArray android_media_MediaDrm_openSession( 6408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz) { 6418a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 6428a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6438a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 644eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 645eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 6468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 6478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6498a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> sessionId; 6508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->openSession(sessionId); 6518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to open session")) { 6538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 6548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return VectorToJByteArray(env, sessionId); 6578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 6588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_closeSession( 6608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jsessionId) { 6618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 6628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 6648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 6658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 6688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->closeSession(sessionId); 6708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to close session"); 6728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 6738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 67416b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jobject android_media_MediaDrm_getKeyRequest( 6758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jsessionId, jbyteArray jinitData, 67616b8cffb2893c10c35788191847500004da466d1Jeff Tinker jstring jmimeType, jint jkeyType, jobject joptParams) { 6778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 6788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6798a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 6808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 6818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 6848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> initData; 6868a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jinitData != NULL) { 6878a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker initData = JByteArrayToVector(env, jinitData); 6888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 6908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 mimeType; 6918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jmimeType != NULL) { 6928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker mimeType = JStringToString8(env, jmimeType); 6938a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 6948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 69517b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker DrmPlugin::KeyType keyType; 69617b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker if (jkeyType == gKeyTypes.kKeyTypeStreaming) { 69717b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker keyType = DrmPlugin::kKeyType_Streaming; 69817b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker } else if (jkeyType == gKeyTypes.kKeyTypeOffline) { 69917b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker keyType = DrmPlugin::kKeyType_Offline; 70017b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker } else if (jkeyType == gKeyTypes.kKeyTypeRelease) { 70117b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker keyType = DrmPlugin::kKeyType_Release; 70217b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker } else { 70317b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 70417b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker "invalid keyType"); 70517b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker return NULL; 70617b8922785987afa002fb5f081781f056e3ca1c7Jeff Tinker } 7078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker KeyedVector<String8, String8> optParams; 7098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (joptParams != NULL) { 7108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker optParams = HashMapToKeyedVector(env, joptParams); 7118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 7128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> request; 7148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 defaultUrl; 7158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 71616b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->getKeyRequest(sessionId, initData, mimeType, 71716b8cffb2893c10c35788191847500004da466d1Jeff Tinker keyType, optParams, request, defaultUrl); 7188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 71916b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to get key request")) { 7208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 7218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 7228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker // Fill out return obj 7248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jclass clazz; 72516b8cffb2893c10c35788191847500004da466d1Jeff Tinker FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest"); 7268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 72716b8cffb2893c10c35788191847500004da466d1Jeff Tinker jobject keyObj = NULL; 7288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7298a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (clazz) { 73016b8cffb2893c10c35788191847500004da466d1Jeff Tinker keyObj = env->AllocObject(clazz); 7318a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jbyteArray jrequest = VectorToJByteArray(env, request); 73216b8cffb2893c10c35788191847500004da466d1Jeff Tinker env->SetObjectField(keyObj, gFields.keyRequest.data, jrequest); 7338a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7348a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jstring jdefaultUrl = env->NewStringUTF(defaultUrl.string()); 73516b8cffb2893c10c35788191847500004da466d1Jeff Tinker env->SetObjectField(keyObj, gFields.keyRequest.defaultUrl, jdefaultUrl); 7368a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 7378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 73816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return keyObj; 7398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 7408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 74116b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jbyteArray android_media_MediaDrm_provideKeyResponse( 7428a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jsessionId, jbyteArray jresponse) { 7438a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 7448a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7458a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 74616b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 7478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 7488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7498a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 7508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jresponse == NULL) { 752eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 753eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "key response is null"); 75416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 7558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 7568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> response(JByteArrayToVector(env, jresponse)); 75716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keySetId; 7588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 75916b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->provideKeyResponse(sessionId, response, keySetId); 7608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7618117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to handle key response")) { 7628117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker return NULL; 7638117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker } 76416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return VectorToJByteArray(env, keySetId); 7658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 7668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 76716b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic void android_media_MediaDrm_removeKeys( 76816b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jkeysetId) { 76916b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 77016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 77116b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jkeysetId == NULL) { 772eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 773eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "keySetId is null"); 77416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return; 77516b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 77616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 77716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keySetId(JByteArrayToVector(env, jkeysetId)); 77816b8cffb2893c10c35788191847500004da466d1Jeff Tinker 77916b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->removeKeys(keySetId); 78016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 78116b8cffb2893c10c35788191847500004da466d1Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to remove keys"); 78216b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 78316b8cffb2893c10c35788191847500004da466d1Jeff Tinker 78416b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic void android_media_MediaDrm_restoreKeys( 78516b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jsessionId, 78616b8cffb2893c10c35788191847500004da466d1Jeff Tinker jbyteArray jkeysetId) { 78716b8cffb2893c10c35788191847500004da466d1Jeff Tinker 7888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 7898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 7908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 7918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 7928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 7938a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 79416b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jkeysetId == NULL) { 79516b8cffb2893c10c35788191847500004da466d1Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 79616b8cffb2893c10c35788191847500004da466d1Jeff Tinker return; 79716b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 79816b8cffb2893c10c35788191847500004da466d1Jeff Tinker 7998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 80016b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keySetId(JByteArrayToVector(env, jkeysetId)); 8018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 80216b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->restoreKeys(sessionId, keySetId); 8038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 80416b8cffb2893c10c35788191847500004da466d1Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to restore keys"); 8058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 8068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 80716b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jobject android_media_MediaDrm_queryKeyStatus( 8088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jsessionId) { 8098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 8108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 8128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 8138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 8158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker KeyedVector<String8, String8> infoMap; 8178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 81816b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->queryKeyStatus(sessionId, infoMap); 8198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 82016b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to query key status")) { 8218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 8228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return KeyedVectorToHashMap(env, infoMap); 8258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 8268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8278a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jobject android_media_MediaDrm_getProvisionRequest( 8288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz) { 8298a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 8308a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8318a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 832eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 833eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 8348a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 8358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8368a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> request; 8388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 defaultUrl; 8398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->getProvisionRequest(request, defaultUrl); 8418a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8428a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to get provision request")) { 8438a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 8448a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8458a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker // Fill out return obj 8478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jclass clazz; 8488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker FIND_CLASS(clazz, "android/media/MediaDrm$ProvisionRequest"); 8498a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jobject provisionObj = NULL; 8518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (clazz) { 8538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker provisionObj = env->AllocObject(clazz); 8548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jbyteArray jrequest = VectorToJByteArray(env, request); 8558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->SetObjectField(provisionObj, gFields.provisionRequest.data, jrequest); 8568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker jstring jdefaultUrl = env->NewStringUTF(defaultUrl.string()); 8588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker env->SetObjectField(provisionObj, gFields.provisionRequest.defaultUrl, jdefaultUrl); 8598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return provisionObj; 8628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 8638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_provideProvisionResponse( 8658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jresponse) { 8668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 8678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 869eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 870eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 8718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 8728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jresponse == NULL) { 875eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 876eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "provision response is null"); 8778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 8788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8798a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> response(JByteArrayToVector(env, jresponse)); 8818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->provideProvisionResponse(response); 8838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to handle provision response"); 8858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 8868a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8878a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jobject android_media_MediaDrm_getSecureStops( 8888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz) { 8898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 8908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 892eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 893eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 8948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 8958a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 8968a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker List<Vector<uint8_t> > secureStops; 8988a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 8998a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->getSecureStops(secureStops); 9008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to get secure stops")) { 9028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9048a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return ListOfVectorsToArrayListOfByteArray(env, secureStops); 9068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 9078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_releaseSecureStops( 9098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jbyteArray jssRelease) { 9108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 9118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 913eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 914eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 9158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 9168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> ssRelease(JByteArrayToVector(env, jssRelease)); 9198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->releaseSecureStops(ssRelease); 9218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to release secure stops"); 9238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 9248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jstring android_media_MediaDrm_getPropertyString( 9268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jstring jname) { 9278a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 9288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9298a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 930eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 931eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 9328a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9338a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9348a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jname == NULL) { 936eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 937eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "property name String is null"); 9388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9418a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 name = JStringToString8(env, jname); 9428a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 value; 9438a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9448a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->getPropertyString(name, value); 9458a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to get property")) { 9478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9498a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return env->NewStringUTF(value.string()); 9518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 9528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic jbyteArray android_media_MediaDrm_getPropertyByteArray( 9548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jstring jname) { 9558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 9568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 958eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 959eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 9608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (jname == NULL) { 964eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 965eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "property name String is null"); 9668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9688a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9698a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 name = JStringToString8(env, jname); 9708a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> value; 9718a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9728a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->getPropertyByteArray(name, value); 9738a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9748a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to get property")) { 9758a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return NULL; 9768a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9778a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9788a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return VectorToJByteArray(env, value); 9798a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 9808a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9818a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_setPropertyString( 9828a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jstring jname, jstring jvalue) { 9838a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 9848a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 9858a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 986eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 987eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 9888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 9898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 9908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 991eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker if (jname == NULL) { 992eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 993eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "property name String is null"); 994eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker return; 995eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker } 996eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker 997eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker if (jvalue == NULL) { 998eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 999eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "property value String is null"); 10008a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 10018a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 10028a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10038a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 name = JStringToString8(env, jname); 10048a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 value = JStringToString8(env, jvalue); 10058a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10068a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->setPropertyString(name, value); 10078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to set property"); 10098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 10108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic void android_media_MediaDrm_setPropertyByteArray( 10128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker JNIEnv *env, jobject thiz, jstring jname, jbyteArray jvalue) { 10138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker sp<IDrm> drm = GetDrm(env, thiz); 10148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (drm == NULL) { 1016eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalStateException", 1017eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "MediaDrm obj is null"); 10188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 10198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 10208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1021eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker if (jname == NULL) { 1022eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1023eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "property name String is null"); 1024eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker return; 1025eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker } 1026eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker 1027eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker if (jvalue == NULL) { 1028eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1029eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "property value byte array is null"); 10308a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return; 10318a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 10328a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10338a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker String8 name = JStringToString8(env, jname); 10348a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker Vector<uint8_t> value = JByteArrayToVector(env, jvalue); 10358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10368a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker status_t err = drm->setPropertyByteArray(name, value); 10378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 10388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to set property"); 10398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 10408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 104116b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic void android_media_MediaDrm_setCipherAlgorithmNative( 104216b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jobject jdrm, jbyteArray jsessionId, 104316b8cffb2893c10c35788191847500004da466d1Jeff Tinker jstring jalgorithm) { 104416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 104516b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, jdrm); 104616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 104716b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 104816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return; 104916b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 105016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 105116b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jalgorithm == NULL) { 1052eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1053eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "algorithm String is null"); 105416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return; 105516b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 105616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 105716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 105816b8cffb2893c10c35788191847500004da466d1Jeff Tinker String8 algorithm = JStringToString8(env, jalgorithm); 105916b8cffb2893c10c35788191847500004da466d1Jeff Tinker 106016b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->setCipherAlgorithm(sessionId, algorithm); 106116b8cffb2893c10c35788191847500004da466d1Jeff Tinker 106216b8cffb2893c10c35788191847500004da466d1Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to set cipher algorithm"); 106316b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 106416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 106516b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic void android_media_MediaDrm_setMacAlgorithmNative( 106616b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jobject jdrm, jbyteArray jsessionId, 106716b8cffb2893c10c35788191847500004da466d1Jeff Tinker jstring jalgorithm) { 106816b8cffb2893c10c35788191847500004da466d1Jeff Tinker 106916b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, jdrm); 107016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 107116b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 107216b8cffb2893c10c35788191847500004da466d1Jeff Tinker return; 107316b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 107416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 107516b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jalgorithm == NULL) { 1076eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1077eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "algorithm String is null"); 107816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return; 107916b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 108016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 108116b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 108216b8cffb2893c10c35788191847500004da466d1Jeff Tinker String8 algorithm = JStringToString8(env, jalgorithm); 108316b8cffb2893c10c35788191847500004da466d1Jeff Tinker 108416b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->setMacAlgorithm(sessionId, algorithm); 108516b8cffb2893c10c35788191847500004da466d1Jeff Tinker 108616b8cffb2893c10c35788191847500004da466d1Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to set mac algorithm"); 108716b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 108816b8cffb2893c10c35788191847500004da466d1Jeff Tinker 108916b8cffb2893c10c35788191847500004da466d1Jeff Tinker 109016b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jbyteArray android_media_MediaDrm_encryptNative( 109116b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jobject jdrm, jbyteArray jsessionId, 109216b8cffb2893c10c35788191847500004da466d1Jeff Tinker jbyteArray jkeyId, jbyteArray jinput, jbyteArray jiv) { 109316b8cffb2893c10c35788191847500004da466d1Jeff Tinker 109416b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, jdrm); 109516b8cffb2893c10c35788191847500004da466d1Jeff Tinker 109616b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 109716b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 109816b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 109916b8cffb2893c10c35788191847500004da466d1Jeff Tinker 110016b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jkeyId == NULL || jinput == NULL || jiv == NULL) { 1101eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1102eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "required argument is null"); 110316b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 110416b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 110516b8cffb2893c10c35788191847500004da466d1Jeff Tinker 110616b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 110716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keyId(JByteArrayToVector(env, jkeyId)); 110816b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> input(JByteArrayToVector(env, jinput)); 110916b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> iv(JByteArrayToVector(env, jiv)); 111016b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> output; 111116b8cffb2893c10c35788191847500004da466d1Jeff Tinker 111216b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->encrypt(sessionId, keyId, input, iv, output); 111316b8cffb2893c10c35788191847500004da466d1Jeff Tinker 11148117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to encrypt")) { 11158117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker return NULL; 11168117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker } 111716b8cffb2893c10c35788191847500004da466d1Jeff Tinker 111816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return VectorToJByteArray(env, output); 111916b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 112016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 112116b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jbyteArray android_media_MediaDrm_decryptNative( 112216b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jobject jdrm, jbyteArray jsessionId, 112316b8cffb2893c10c35788191847500004da466d1Jeff Tinker jbyteArray jkeyId, jbyteArray jinput, jbyteArray jiv) { 112416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 112516b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, jdrm); 112616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 112716b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 112816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 112916b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 113016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 113116b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jkeyId == NULL || jinput == NULL || jiv == NULL) { 1132eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1133eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "required argument is null"); 113416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 113516b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 113616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 113716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 113816b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keyId(JByteArrayToVector(env, jkeyId)); 113916b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> input(JByteArrayToVector(env, jinput)); 114016b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> iv(JByteArrayToVector(env, jiv)); 114116b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> output; 114216b8cffb2893c10c35788191847500004da466d1Jeff Tinker 114316b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->decrypt(sessionId, keyId, input, iv, output); 11448117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to decrypt")) { 11458117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker return NULL; 11468117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker } 114716b8cffb2893c10c35788191847500004da466d1Jeff Tinker 114816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return VectorToJByteArray(env, output); 114916b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 115016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 115116b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jbyteArray android_media_MediaDrm_signNative( 115216b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jobject jdrm, jbyteArray jsessionId, 115316b8cffb2893c10c35788191847500004da466d1Jeff Tinker jbyteArray jkeyId, jbyteArray jmessage) { 115416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 115516b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, jdrm); 115616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 115716b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 115816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 115916b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 116016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 116116b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jkeyId == NULL || jmessage == NULL) { 1162eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1163eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "required argument is null"); 116416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return NULL; 116516b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 116616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 116716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 116816b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keyId(JByteArrayToVector(env, jkeyId)); 116916b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> message(JByteArrayToVector(env, jmessage)); 117016b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> signature; 117116b8cffb2893c10c35788191847500004da466d1Jeff Tinker 117216b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->sign(sessionId, keyId, message, signature); 117316b8cffb2893c10c35788191847500004da466d1Jeff Tinker 11748117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker if (throwExceptionAsNecessary(env, err, "Failed to sign")) { 11758117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker return NULL; 11768117d8f7023f8981bc4b2651efed5b28104d83d3Jeff Tinker } 117716b8cffb2893c10c35788191847500004da466d1Jeff Tinker 117816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return VectorToJByteArray(env, signature); 117916b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 118016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 118116b8cffb2893c10c35788191847500004da466d1Jeff Tinkerstatic jboolean android_media_MediaDrm_verifyNative( 118216b8cffb2893c10c35788191847500004da466d1Jeff Tinker JNIEnv *env, jobject thiz, jobject jdrm, jbyteArray jsessionId, 118316b8cffb2893c10c35788191847500004da466d1Jeff Tinker jbyteArray jkeyId, jbyteArray jmessage, jbyteArray jsignature) { 118416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 118516b8cffb2893c10c35788191847500004da466d1Jeff Tinker sp<IDrm> drm = GetDrm(env, jdrm); 118616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 118716b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (!CheckSession(env, drm, jsessionId)) { 118816b8cffb2893c10c35788191847500004da466d1Jeff Tinker return false; 118916b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 119016b8cffb2893c10c35788191847500004da466d1Jeff Tinker 119116b8cffb2893c10c35788191847500004da466d1Jeff Tinker if (jkeyId == NULL || jmessage == NULL || jsignature == NULL) { 1192eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker jniThrowException(env, "java/lang/IllegalArgumentException", 1193eada5376d9c34f77bd3ba86a2ea674e3bde5e961Jeff Tinker "required argument is null"); 119416b8cffb2893c10c35788191847500004da466d1Jeff Tinker return false; 119516b8cffb2893c10c35788191847500004da466d1Jeff Tinker } 119616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 119716b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId)); 119816b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> keyId(JByteArrayToVector(env, jkeyId)); 119916b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> message(JByteArrayToVector(env, jmessage)); 120016b8cffb2893c10c35788191847500004da466d1Jeff Tinker Vector<uint8_t> signature(JByteArrayToVector(env, jsignature)); 120116b8cffb2893c10c35788191847500004da466d1Jeff Tinker bool match; 120216b8cffb2893c10c35788191847500004da466d1Jeff Tinker 120316b8cffb2893c10c35788191847500004da466d1Jeff Tinker status_t err = drm->verify(sessionId, keyId, message, signature, match); 120416b8cffb2893c10c35788191847500004da466d1Jeff Tinker 120516b8cffb2893c10c35788191847500004da466d1Jeff Tinker throwExceptionAsNecessary(env, err, "Failed to verify"); 120616b8cffb2893c10c35788191847500004da466d1Jeff Tinker return match; 120716b8cffb2893c10c35788191847500004da466d1Jeff Tinker} 120816b8cffb2893c10c35788191847500004da466d1Jeff Tinker 12098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerstatic JNINativeMethod gMethods[] = { 12118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "release", "()V", (void *)android_media_MediaDrm_release }, 12128a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "native_init", "()V", (void *)android_media_MediaDrm_native_init }, 12138a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12148a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "native_setup", "(Ljava/lang/Object;[B)V", 12158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_native_setup }, 12168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "native_finalize", "()V", 12188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_native_finalize }, 12198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12207cda491321b9bd2e8faf956824312ea6a30e6457Jeff Tinker { "isCryptoSchemeSupportedNative", "([BLjava/lang/String;)Z", 12218a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_isCryptoSchemeSupportedNative }, 12228a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12238a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "openSession", "()[B", 12248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_openSession }, 12258a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12268a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "closeSession", "([B)V", 12278a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_closeSession }, 12288a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 122916b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "getKeyRequest", "([B[BLjava/lang/String;ILjava/util/HashMap;)" 123016b8cffb2893c10c35788191847500004da466d1Jeff Tinker "Landroid/media/MediaDrm$KeyRequest;", 123116b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_getKeyRequest }, 12328a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 123316b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "provideKeyResponse", "([B[B)[B", 123416b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_provideKeyResponse }, 12358a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 123616b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "removeKeys", "([B)V", 123716b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_removeKeys }, 12388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 123916b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "restoreKeys", "([B[B)V", 124016b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_restoreKeys }, 124116b8cffb2893c10c35788191847500004da466d1Jeff Tinker 124216b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "queryKeyStatus", "([B)Ljava/util/HashMap;", 124316b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_queryKeyStatus }, 12448a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12458a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "getProvisionRequest", "()Landroid/media/MediaDrm$ProvisionRequest;", 12468a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_getProvisionRequest }, 12478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12488a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "provideProvisionResponse", "([B)V", 12498a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_provideProvisionResponse }, 12508a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12518a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "getSecureStops", "()Ljava/util/List;", 12528a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_getSecureStops }, 12538a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12548a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "releaseSecureStops", "([B)V", 12558a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_releaseSecureStops }, 12568a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12578a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "getPropertyString", "(Ljava/lang/String;)Ljava/lang/String;", 12588a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_getPropertyString }, 12598a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "getPropertyByteArray", "(Ljava/lang/String;)[B", 12618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_getPropertyByteArray }, 12628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "setPropertyString", "(Ljava/lang/String;Ljava/lang/String;)V", 12648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_setPropertyString }, 12658a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12668a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker { "setPropertyByteArray", "(Ljava/lang/String;[B)V", 12678a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker (void *)android_media_MediaDrm_setPropertyByteArray }, 126816b8cffb2893c10c35788191847500004da466d1Jeff Tinker 126916b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "setCipherAlgorithmNative", 127016b8cffb2893c10c35788191847500004da466d1Jeff Tinker "(Landroid/media/MediaDrm;[BLjava/lang/String;)V", 127116b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_setCipherAlgorithmNative }, 127216b8cffb2893c10c35788191847500004da466d1Jeff Tinker 127316b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "setMacAlgorithmNative", 127416b8cffb2893c10c35788191847500004da466d1Jeff Tinker "(Landroid/media/MediaDrm;[BLjava/lang/String;)V", 127516b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_setMacAlgorithmNative }, 127616b8cffb2893c10c35788191847500004da466d1Jeff Tinker 127716b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "encryptNative", "(Landroid/media/MediaDrm;[B[B[B[B)[B", 127816b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_encryptNative }, 127916b8cffb2893c10c35788191847500004da466d1Jeff Tinker 128016b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "decryptNative", "(Landroid/media/MediaDrm;[B[B[B[B)[B", 128116b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_decryptNative }, 128216b8cffb2893c10c35788191847500004da466d1Jeff Tinker 128316b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "signNative", "(Landroid/media/MediaDrm;[B[B[B)[B", 128416b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_signNative }, 128516b8cffb2893c10c35788191847500004da466d1Jeff Tinker 128616b8cffb2893c10c35788191847500004da466d1Jeff Tinker { "verifyNative", "(Landroid/media/MediaDrm;[B[B[B[B)Z", 128716b8cffb2893c10c35788191847500004da466d1Jeff Tinker (void *)android_media_MediaDrm_verifyNative }, 12888a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker}; 12898a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 12908a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerint register_android_media_Drm(JNIEnv *env) { 12918a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker return AndroidRuntime::registerNativeMethods(env, 12928a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker "android/media/MediaDrm", gMethods, NELEM(gMethods)); 12938a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker} 12948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1295