android_drm_DrmManagerClient.cpp revision dc549d60f98d809f626c99de614960409a847054
1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/* 2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 2010 The Android Open Source Project 3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License. 6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at 7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software 11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions and 14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * limitations under the License. 15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 17dc549d60f98d809f626c99de614960409a847054Takeshi Aimi//#define LOG_NDEBUG 0 18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#define LOG_TAG "DrmManager-JNI" 19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <utils/Log.h> 20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <jni.h> 22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <JNIHelp.h> 23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <android_runtime/AndroidRuntime.h> 24d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfo.h> 26d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmRights.h> 27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfoEvent.h> 28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfoStatus.h> 29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfoRequest.h> 30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmSupportInfo.h> 31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmConstraints.h> 32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmConvertedStatus.h> 33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/drm_framework_common.h> 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <DrmManagerClientImpl.h> 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiusing namespace android; 38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/** 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Utility class used to extract the value from the provided java object. 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * May need to add some utility function to create java object. 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass Utility { 44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic: 45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static String8 getStringValue(JNIEnv* env, jobject object, const char* fieldName); 46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static char* getByteArrayValue( 48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject object, const char* fieldName, int* dataLength); 49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static char* getByteArrayValue( 51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jbyteArray byteArray, int* dataLength); 52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static String8 getStringValue(JNIEnv* env, jstring string); 54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static int getIntValue(JNIEnv* env, jobject object, const char* fieldName); 56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 Utility::getStringValue(JNIEnv* env, jobject object, const char* fieldName) { 59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 dataString(""); 60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* Look for the instance field with the name fieldName */ 62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldID 63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetFieldID(env->GetObjectClass(object), fieldName , "Ljava/lang/String;"); 64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != fieldID) { 66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring valueString = (jstring) env->GetObjectField(object, fieldID); 67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 68d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != valueString && valueString != env->NewStringUTF("")) { 69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* bytes = const_cast< char* > (env->GetStringUTFChars(valueString, NULL)); 70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const int length = strlen(bytes) + 1; 72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char *data = new char[length]; 73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi strncpy(data, bytes, length); 74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataString = String8(data); 75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->ReleaseStringUTFChars(valueString, bytes); 77d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] data; data = NULL; 78d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 79dc549d60f98d809f626c99de614960409a847054Takeshi Aimi LOGV("Failed to retrieve the data from the field %s", fieldName); 80d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 81d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return dataString; 83d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 Utility::getStringValue(JNIEnv* env, jstring string) { 86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 dataString(""); 87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 88d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != string && string != env->NewStringUTF("")) { 89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* bytes = const_cast< char* > (env->GetStringUTFChars(string, NULL)); 90d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 91d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const int length = strlen(bytes) + 1; 92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char *data = new char[length]; 93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi strncpy(data, bytes, length); 94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataString = String8(data); 95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->ReleaseStringUTFChars(string, bytes); 97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] data; data = NULL; 98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return dataString; 100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 101d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 102d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshichar* Utility::getByteArrayValue( 103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject object, const char* fieldName, int* dataLength) { 104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* data = NULL; 105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *dataLength = 0; 106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldID = env->GetFieldID(env->GetObjectClass(object), fieldName , "[B"); 108d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != fieldID) { 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray byteArray = (jbyteArray) env->GetObjectField(object, fieldID); 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != byteArray) { 112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint length = env->GetArrayLength(byteArray); 113d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *dataLength = length; 115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < *dataLength) { 116d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi data = new char[length]; 117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetByteArrayRegion(byteArray, (jint)0, length, (jbyte *) data); 118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return data; 122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 123d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 124d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshichar* Utility::getByteArrayValue(JNIEnv* env, jbyteArray byteArray, int* dataLength) { 125d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* data = NULL; 126d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != byteArray) { 127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint length = env->GetArrayLength(byteArray); 128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *dataLength = length; 130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < *dataLength) { 131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi data = new char[length]; 132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetByteArrayRegion(byteArray, (jint)0, length, (jbyte *) data); 133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return data; 136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint Utility::getIntValue(JNIEnv* env, jobject object, const char* fieldName) { 139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldID; 140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int intValue = -1; 141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* Get a reference to obj’s class */ 143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->GetObjectClass(object); 144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* Look for the instance field with the name fieldName */ 145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi fieldID = env->GetFieldID(clazz, fieldName , "I"); 146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != fieldID) { 148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi intValue = (int) env->GetIntField(object, fieldID); 149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return intValue; 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass JNIOnInfoListener : public DrmManagerClient::OnInfoListener { 155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic: 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIOnInfoListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi virtual ~JNIOnInfoListener(); 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi void onInfo(const DrmInfoEvent& event); 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiprivate: 162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIOnInfoListener(); 163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass mClass; 164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject mObject; 165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiJNIOnInfoListener::JNIOnInfoListener(JNIEnv* env, jobject thiz, jobject weak_thiz) { 168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->GetObjectClass(thiz); 169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (clazz == NULL) { 171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGE("Can't find android/drm/DrmManagerClient"); 172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jniThrowException(env, "java/lang/Exception", NULL); 173d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return; 174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 175d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mClass = (jclass)env->NewGlobalRef(clazz); 176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mObject = env->NewGlobalRef(weak_thiz); 177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiJNIOnInfoListener::~JNIOnInfoListener() { 180d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv *env = AndroidRuntime::getJNIEnv(); 181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->DeleteGlobalRef(mObject); 182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->DeleteGlobalRef(mClass); 183d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshivoid JNIOnInfoListener::onInfo(const DrmInfoEvent& event) { 186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint uniqueId = event.getUniqueId(); 187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint type = event.getType(); 188d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv *env = AndroidRuntime::getJNIEnv(); 189d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring message = env->NewStringUTF(event.getMessage().string()); 190d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().string()); 191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 192d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallStaticVoidMethod( 193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mClass, 194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetStaticMethodID(mClass, "notify", "(Ljava/lang/Object;IILjava/lang/String;)V"), 195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mObject, uniqueId, type, message); 196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 197d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 198d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic Mutex sLock; 199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic sp<DrmManagerClientImpl> setDrmManagerClientImpl( 201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, const sp<DrmManagerClientImpl>& client) { 202d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex::Autolock l(sLock); 203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmManagerClient"); 204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldId = env->GetFieldID(clazz, "mNativeContext", "I"); 205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 206d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<DrmManagerClientImpl> old = (DrmManagerClientImpl*)env->GetIntField(thiz, fieldId); 207d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (client.get()) { 208d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi client->incStrong(thiz); 209d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 210d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (old != 0) { 211d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi old->decStrong(thiz); 212d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 213d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetIntField(thiz, fieldId, (int)client.get()); 214d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return old; 215d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 216d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 217d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic sp<DrmManagerClientImpl> getDrmManagerClientImpl(JNIEnv* env, jobject thiz) { 218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex::Autolock l(sLock); 219d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmManagerClient"); 220d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldId = env->GetFieldID(clazz, "mNativeContext", "I"); 221d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 222d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManagerClientImpl* const client = (DrmManagerClientImpl*)env->GetIntField(thiz, fieldId); 223d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return sp<DrmManagerClientImpl>(client); 224d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 225d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 226dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_loadPlugIns( 227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jobject weak_thiz) { 228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("load plugins - Enter"); 229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 230d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<DrmManagerClientImpl> drmManager = DrmManagerClientImpl::create(&uniqueId); 231d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 232d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // Set the listener to DrmManager 233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<DrmManagerClient::OnInfoListener> listener = new JNIOnInfoListener(env, thiz, weak_thiz); 234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmManager->setOnInfoListener(uniqueId, listener); 235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi setDrmManagerClientImpl(env, thiz, drmManager); 237d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 238d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("load plugins - Exit"); 239dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmManagerClientImpl(env, thiz)->loadPlugIns(uniqueId); 240d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 241d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 242dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_unloadPlugIns(JNIEnv* env, jobject thiz, jint uniqueId) { 243d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("unload plugins - Enter"); 244d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<DrmManagerClientImpl> client = getDrmManagerClientImpl(env, thiz); 245dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 246d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManagerClientImpl::remove(uniqueId); 247dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = client->unloadPlugIns(uniqueId); 248dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR == result) { 249dc549d60f98d809f626c99de614960409a847054Takeshi Aimi client->setOnInfoListener(uniqueId, NULL); 250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 251dc549d60f98d809f626c99de614960409a847054Takeshi Aimi sp<DrmManagerClientImpl> oldClient = setDrmManagerClientImpl(env, thiz, NULL); 252dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (oldClient != NULL) { 253dc549d60f98d809f626c99de614960409a847054Takeshi Aimi oldClient->setOnInfoListener(uniqueId, NULL); 254dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 255d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("unload plugins - Exit"); 257dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 260d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_getConstraintsFromContent( 261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring jpath, jint usage) { 262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("GetConstraints - Enter"); 263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 264d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 pathString = Utility::getStringValue(env, jpath); 265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConstraints* pConstraints 266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz)->getConstraints(uniqueId, &pathString, usage); 267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/content/ContentValues"); 269d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject constraints = NULL; 270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pConstraints) { 272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // Get the constructor id 273d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId = env->GetMethodID(localRef, "<init>", "()V"); 274d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // create the java DrmConstraints object 275d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constraints = env->NewObject(localRef, constructorId); 276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 277d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConstraints::KeyIterator keyIt = pConstraints->keyIterator(); 278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (keyIt.hasNext()) { 280d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 key = keyIt.next(); 281d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 282d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // insert the entry<constraintKey, constraintValue> to newly created java object 283d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (DrmConstraints::EXTENDED_METADATA == key) { 284d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const char* value = pConstraints->getAsByteArray(&key); 285d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != value) { 286d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = env->NewByteArray(strlen(value)); 287d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion(dataArray, 0, strlen(value), (jbyte*)value); 288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 289d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constraints, env->GetMethodID(localRef, "put", "(Ljava/lang/String;[B)V"), 290d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(key.string()), dataArray); 291d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 293d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = pConstraints->get(key); 294d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 295d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constraints, 296d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(localRef, "put", "(Ljava/lang/String;Ljava/lang/String;)V"), 297d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(key.string()), env->NewStringUTF(value.string())); 298d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 299d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 300d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 301d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 302d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pConstraints; pConstraints = NULL; 303d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("GetConstraints - Exit"); 304d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return constraints; 305d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 306d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 307d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobjectArray android_drm_DrmManagerClient_getAllSupportInfo( 308d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId) { 309d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("GetAllSupportInfo - Enter"); 310d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 311d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 312d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = 0; 313d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi getDrmManagerClientImpl(env, thiz)->getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 314d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 315d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmSupportInfo"); 316d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 317d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobjectArray array = (jobjectArray)env->NewObjectArray(length, clazz, NULL); 318d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 319d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < length; i++) { 320d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo info = drmSupportInfoArray[i]; 321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 322d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmSupportInfo = env->NewObject(clazz, env->GetMethodID(clazz, "<init>", "()V")); 323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 324d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID addMimeTypeId 325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(clazz, "addMimeType", "(Ljava/lang/String;)V"); 326d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID addFileSuffixId 327d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(clazz, "addFileSuffix", "(Ljava/lang/String;)V"); 328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 329d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 330d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmSupportInfo, env->GetMethodID(clazz, "setDescription", "(Ljava/lang/String;)V"), 331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(info.getDescription().string())); 332d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 333d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo::MimeTypeIterator iterator = info.getMimeTypeIterator(); 334d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (iterator.hasNext()) { 335d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = iterator.next(); 336d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod(drmSupportInfo, addMimeTypeId, env->NewStringUTF(value.string())); 337d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 338d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 339d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo::FileSuffixIterator it = info.getFileSuffixIterator(); 340d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (it.hasNext()) { 341d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = it.next(); 342d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 343d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmSupportInfo, addFileSuffixId, env->NewStringUTF(value.string())); 344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 345d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetObjectArrayElement(array, i, drmSupportInfo); 347d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 348d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 349d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 350d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("GetAllSupportInfo - Exit"); 351d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return array; 352d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 354d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic void android_drm_DrmManagerClient_installDrmEngine( 355d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring engineFilePath) { 356d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("installDrmEngine - Enter"); 357d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi //getDrmManagerClient(env, thiz) 358d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // ->installDrmEngine(uniqueId, Utility::getStringValue(env, engineFilePath)); 359d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("installDrmEngine - Exit"); 360d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 361d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 362dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_saveRights( 363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, 364d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmRights, jstring rightsPath, jstring contentPath) { 365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("saveRights - Enter"); 366dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = DRM_ERROR_UNKNOWN; 367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int dataLength = 0; 368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* mData = Utility::getByteArrayValue(env, drmRights, "mData", &dataLength); 369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 370d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != mData) { 371d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmRights rights(DrmBuffer(mData, dataLength), 372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, drmRights, "mMimeType"), 373d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, drmRights, "mAccountId"), 374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, drmRights, "mSubscriptionId")); 375dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = getDrmManagerClientImpl(env, thiz) 376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->saveRights(uniqueId, rights, Utility::getStringValue(env, rightsPath), 377d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, contentPath)); 378d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 379d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 380d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete mData; mData = NULL; 381d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("saveRights - Exit"); 382dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 383d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 385d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jboolean android_drm_DrmManagerClient_canHandle( 386d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path, jstring mimeType) { 387d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("canHandle - Enter"); 388d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jboolean result 389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 390d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->canHandle(uniqueId, Utility::getStringValue(env, path), 391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, mimeType)); 392d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("canHandle - Exit"); 393d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 394d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 396d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_processDrmInfo( 397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jobject drmInfoObject) { 398d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("processDrmInfo - Enter"); 399d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int dataLength = 0; 400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 mMimeType = Utility::getStringValue(env, drmInfoObject, "mMimeType"); 401d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* mData = Utility::getByteArrayValue(env, drmInfoObject, "mData", &dataLength); 402d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int mInfoType = Utility::getIntValue(env, drmInfoObject, "mInfoType"); 403d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 404d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmBuffer buffer(mData, dataLength); 405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo drmInfo(mInfoType, buffer, mMimeType); 406d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 407d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmInfo"); 408d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject keyIterator 409d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->CallObjectMethod(drmInfoObject, 410d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "keyIterator", "()Ljava/util/Iterator;")); 411d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 412d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID hasNextId = env->GetMethodID(env->FindClass("java/util/Iterator"), "hasNext", "()Z"); 413d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 414d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (env->CallBooleanMethod(keyIterator, hasNextId)) { 415d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring key = (jstring) env->CallObjectMethod(keyIterator, 416d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(env->FindClass("java/util/Iterator"), 417d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "next", "()Ljava/lang/Object;")); 418d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 419d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject valueObject = env->CallObjectMethod(drmInfoObject, 420d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "get", "(Ljava/lang/String;)Ljava/lang/Object;"), key); 421d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 422d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring valString = NULL; 423d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != valueObject) { 424d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi valString = (jstring) env->CallObjectMethod(valueObject, 425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(env->FindClass("java/lang/Object"), 426d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "toString", "()Ljava/lang/String;")); 427d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 428d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 keyString = Utility::getStringValue(env, key); 430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 valueString = Utility::getStringValue(env, valString); 431dc549d60f98d809f626c99de614960409a847054Takeshi Aimi LOGV("Key: %s | Value: %s", keyString.string(), valueString.string()); 432d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 433d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfo.put(keyString, valueString); 434d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 435d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 436d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfoStatus* pDrmInfoStatus 437d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz)->processDrmInfo(uniqueId, &drmInfo); 438d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 439d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmInfoStatus"); 440d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmInfoStatus = NULL; 441d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 442d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pDrmInfoStatus) { 443d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int statusCode = pDrmInfoStatus->statusCode; 444d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 445d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = NULL; 446d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmInfoStatus->drmBuffer) { 447d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmInfoStatus->drmBuffer->length; 448d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray = env->NewByteArray(length); 449d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion( 450d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray, 0, length, (jbyte*) pDrmInfoStatus->drmBuffer->data); 451d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 452d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmInfoStatus->drmBuffer->data; 453d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmInfoStatus->drmBuffer; pDrmInfoStatus->drmBuffer = NULL; 454d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 455d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/ProcessedData"); 456d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId 457d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(clazz, "<init>", "([BLjava/lang/String;Ljava/lang/String;)V"); 458d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject processedData = env->NewObject(clazz, constructorId, dataArray, 459d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF((drmInfo.get(DrmInfoRequest::ACCOUNT_ID)).string()), 460d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF((drmInfo.get(DrmInfoRequest::SUBSCRIPTION_ID)).string())); 461d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 462d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constructorId 463d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(localRef, 464d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "<init>", "(ILandroid/drm/ProcessedData;Ljava/lang/String;)V"); 465d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 466d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfoStatus = env->NewObject(localRef, constructorId, statusCode, processedData, 467d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(pDrmInfoStatus->mimeType.string())); 468d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 469d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 470d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete mData; mData = NULL; 471d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmInfoStatus; pDrmInfoStatus = NULL; 472d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 473d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("processDrmInfo - Exit"); 474d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmInfoStatus; 475d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 476d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 477d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_acquireDrmInfo( 478d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jobject drmInfoRequest) { 479d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("acquireDrmInfo Enter"); 480d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 mMimeType = Utility::getStringValue(env, drmInfoRequest, "mMimeType"); 481d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int mInfoType = Utility::getIntValue(env, drmInfoRequest, "mInfoType"); 482d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 483d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfoRequest drmInfoReq(mInfoType, mMimeType); 484d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 485d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmInfoRequest"); 486d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject keyIterator 487d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->CallObjectMethod(drmInfoRequest, 488d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "keyIterator", "()Ljava/util/Iterator;")); 489d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 490d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID hasNextId = env->GetMethodID(env->FindClass("java/util/Iterator"), "hasNext", "()Z"); 491d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 492d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (env->CallBooleanMethod(keyIterator, hasNextId)) { 493d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring key 494d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = (jstring) env->CallObjectMethod(keyIterator, 495d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(env->FindClass("java/util/Iterator"), 496d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "next", "()Ljava/lang/Object;")); 497d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 498d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring value = (jstring) env->CallObjectMethod(drmInfoRequest, 499d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "get", "(Ljava/lang/String;)Ljava/lang/Object;"), key); 500d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 501d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 keyString = Utility::getStringValue(env, key); 502d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 valueString = Utility::getStringValue(env, value); 503dc549d60f98d809f626c99de614960409a847054Takeshi Aimi LOGV("Key: %s | Value: %s", keyString.string(), valueString.string()); 504d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 505d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfoReq.put(keyString, valueString); 506d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 507d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 508d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo* pDrmInfo = getDrmManagerClientImpl(env, thiz)->acquireDrmInfo(uniqueId, &drmInfoReq); 509d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 510d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmInfoObject = NULL; 511d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 512d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmInfo) { 513d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmInfo"); 514d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 515d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef) { 516d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmInfo->getData().length; 517d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 518d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = env->NewByteArray(length); 519d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion(dataArray, 0, length, (jbyte*)pDrmInfo->getData().data); 520d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 521d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfoObject 522d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->NewObject(localRef, 523d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(localRef, "<init>", "(I[BLjava/lang/String;)V"), 524d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mInfoType, dataArray, env->NewStringUTF(pDrmInfo->getMimeType().string())); 525d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 526d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo::KeyIterator it = pDrmInfo->keyIterator(); 527d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID putMethodId 528d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(localRef, "put", "(Ljava/lang/String;Ljava/lang/Object;)V"); 529d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 530d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (it.hasNext()) { 531d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 key = it.next(); 532d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = pDrmInfo->get(key); 533d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 534d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod(drmInfoObject, putMethodId, 535d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(key.string()), env->NewStringUTF(value.string())); 536d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 537d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 538d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmInfo->getData().data; 539d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 540d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 541d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmInfo; pDrmInfo = NULL; 542d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 543d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("acquireDrmInfo Exit"); 544d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmInfoObject; 545d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 546d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 547d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jint android_drm_DrmManagerClient_getDrmObjectType( 548d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path, jstring mimeType) { 549d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("getDrmObjectType Enter"); 550d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int drmObjectType 551d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 552d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->getDrmObjectType(uniqueId, Utility::getStringValue(env, path), 553d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, mimeType)); 554d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("getDrmObjectType Exit"); 555d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmObjectType; 556d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 557d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 558d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jstring android_drm_DrmManagerClient_getOriginalMimeType( 559d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path) { 560d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("getOriginalMimeType Enter"); 561d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 mimeType 562d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 563d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->getOriginalMimeType(uniqueId, Utility::getStringValue(env, path)); 564d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("getOriginalMimeType Exit"); 565d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return env->NewStringUTF(mimeType.string()); 566d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 567d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 568d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jint android_drm_DrmManagerClient_checkRightsStatus( 569d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path, int action) { 570d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("getOriginalMimeType Enter"); 571d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int rightsStatus 572d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 573d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->checkRightsStatus(uniqueId, Utility::getStringValue(env, path), action); 574d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("getOriginalMimeType Exit"); 575d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rightsStatus; 576d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 577d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 578dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_removeRights( 579d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path) { 580dc549d60f98d809f626c99de614960409a847054Takeshi Aimi LOGV("removeRights"); 581dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmManagerClientImpl(env, thiz) 582dc549d60f98d809f626c99de614960409a847054Takeshi Aimi ->removeRights(uniqueId, Utility::getStringValue(env, path)); 583d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 584d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 585dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_removeAllRights( 586d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId) { 587dc549d60f98d809f626c99de614960409a847054Takeshi Aimi LOGV("removeAllRights"); 588dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmManagerClientImpl(env, thiz)->removeAllRights(uniqueId); 589d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 590d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 591d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jint android_drm_DrmManagerClient_openConvertSession( 592d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring mimeType) { 593d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("openConvertSession Enter"); 594d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int convertId 595d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 596d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->openConvertSession(uniqueId, Utility::getStringValue(env, mimeType)); 597d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("openConvertSession Exit"); 598d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return convertId; 599d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 600d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 601d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_convertData( 602d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jint convertId, jbyteArray inputData) { 603d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("convertData Enter"); 604d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 605d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int dataLength = 0; 606d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* mData = Utility::getByteArrayValue(env, inputData, &dataLength); 607d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmBuffer buffer(mData, dataLength); 608d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 609d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus* pDrmConvertedStatus 610d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz)->convertData(uniqueId, convertId, &buffer); 611d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 612d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmConvertedStatus"); 613d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 614d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmConvertedStatus = NULL; 615d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 616d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pDrmConvertedStatus) { 617d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int statusCode = pDrmConvertedStatus->statusCode; 618d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 619d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = NULL; 620d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmConvertedStatus->convertedData) { 621d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmConvertedStatus->convertedData->length; 622d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray = env->NewByteArray(length); 623d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion(dataArray, 0, length, 624d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (jbyte*) pDrmConvertedStatus->convertedData->data); 625d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 626d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmConvertedStatus->convertedData->data; 627d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmConvertedStatus->convertedData; pDrmConvertedStatus->convertedData = NULL; 628d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 629d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId = env->GetMethodID(localRef, "<init>", "(I[BI)V"); 630d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus 631d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->NewObject(localRef, constructorId, 632d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi statusCode, dataArray, pDrmConvertedStatus->offset); 633d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 634d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 635d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete mData; mData = NULL; 636d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmConvertedStatus; pDrmConvertedStatus = NULL; 637d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 638d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("convertData - Exit"); 639d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 640d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 641d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 642d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_closeConvertSession( 643d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, int uniqueId, jint convertId) { 644d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 645d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("closeConvertSession Enter"); 646d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 647d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus* pDrmConvertedStatus 648d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz)->closeConvertSession(uniqueId, convertId); 649d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 650d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmConvertedStatus"); 651d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 652d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmConvertedStatus = NULL; 653d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 654d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pDrmConvertedStatus) { 655d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int statusCode = pDrmConvertedStatus->statusCode; 656d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 657d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = NULL; 658d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmConvertedStatus->convertedData) { 659d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmConvertedStatus->convertedData->length; 660d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray = env->NewByteArray(length); 661d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion( 662d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray, 0, length, (jbyte*) pDrmConvertedStatus->convertedData->data); 663d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 664d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmConvertedStatus->convertedData->data; 665d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmConvertedStatus->convertedData; pDrmConvertedStatus->convertedData = NULL; 666d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 667d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId = env->GetMethodID(localRef, "<init>", "(I[BI)V"); 668d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus 669d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->NewObject(localRef, constructorId, 670d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi statusCode, dataArray, pDrmConvertedStatus->offset); 671d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 672d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 673d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmConvertedStatus; pDrmConvertedStatus = NULL; 674d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 675d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi LOGV("closeConvertSession - Exit"); 676d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 677d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 678d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 679d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic JNINativeMethod nativeMethods[] = { 680d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 681dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_loadPlugIns", "(ILjava/lang/Object;)I", 682d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_loadPlugIns}, 683d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 684dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_unloadPlugIns", "(I)I", 685d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_unloadPlugIns}, 686d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 687d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getConstraints", "(ILjava/lang/String;I)Landroid/content/ContentValues;", 688d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getConstraintsFromContent}, 689d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 690d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getAllSupportInfo", "(I)[Landroid/drm/DrmSupportInfo;", 691d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getAllSupportInfo}, 692d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 693d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_installDrmEngine", "(ILjava/lang/String;)V", 694d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_installDrmEngine}, 695d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 696d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_canHandle", "(ILjava/lang/String;Ljava/lang/String;)Z", 697d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_canHandle}, 698d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 699d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_processDrmInfo", "(ILandroid/drm/DrmInfo;)Landroid/drm/DrmInfoStatus;", 700d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_processDrmInfo}, 701d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 702d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_acquireDrmInfo", "(ILandroid/drm/DrmInfoRequest;)Landroid/drm/DrmInfo;", 703d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_acquireDrmInfo}, 704d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 705dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_saveRights", "(ILandroid/drm/DrmRights;Ljava/lang/String;Ljava/lang/String;)I", 706d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_saveRights}, 707d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 708d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getDrmObjectType", "(ILjava/lang/String;Ljava/lang/String;)I", 709d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getDrmObjectType}, 710d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 711d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getOriginalMimeType", "(ILjava/lang/String;)Ljava/lang/String;", 712d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getOriginalMimeType}, 713d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 714d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_checkRightsStatus", "(ILjava/lang/String;I)I", 715d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_checkRightsStatus}, 716d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 717dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_removeRights", "(ILjava/lang/String;)I", 718d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_removeRights}, 719d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 720dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_removeAllRights", "(I)I", 721d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_removeAllRights}, 722d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 723d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_openConvertSession", "(ILjava/lang/String;)I", 724d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_openConvertSession}, 725d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 726d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_convertData", "(II[B)Landroid/drm/DrmConvertedStatus;", 727d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_convertData}, 728d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 729d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_closeConvertSession", "(II)Landroid/drm/DrmConvertedStatus;", 730d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_closeConvertSession}, 731d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 732d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 733d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic int registerNativeMethods(JNIEnv* env) { 734d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int result = -1; 735d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 736d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* look up the class */ 737d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmManagerClient"); 738d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 739d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != clazz) { 740d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (env->RegisterNatives(clazz, nativeMethods, sizeof(nativeMethods) 741d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi / sizeof(nativeMethods[0])) == JNI_OK) { 742d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = 0; 743d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 744d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 745d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 746d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 747d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 748d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshijint JNI_OnLoad(JavaVM* vm, void* reserved) { 749d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env = NULL; 750d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint result = -1; 751d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 752d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) { 753d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != env && registerNativeMethods(env) == 0) { 754d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = JNI_VERSION_1_4; 755d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 756d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 757d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 758d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 759d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 760