android_drm_DrmManagerClient.cpp revision 0889fdae87abd9ec78a6c1d00c2771acfa4e4d34
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 18c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi#define LOG_TAG "android_drm_DrmManagerClient" 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> 32dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi#include <drm/DrmMetadata.h> 33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmConvertedStatus.h> 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/drm_framework_common.h> 35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <DrmManagerClientImpl.h> 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiusing namespace android; 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/** 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Utility class used to extract the value from the provided java object. 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * May need to add some utility function to create java object. 43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass Utility { 45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic: 46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static String8 getStringValue(JNIEnv* env, jobject object, const char* fieldName); 47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static char* getByteArrayValue( 49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject object, const char* fieldName, int* dataLength); 50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static char* getByteArrayValue( 52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jbyteArray byteArray, int* dataLength); 53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static String8 getStringValue(JNIEnv* env, jstring string); 55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static int getIntValue(JNIEnv* env, jobject object, const char* fieldName); 57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 Utility::getStringValue(JNIEnv* env, jobject object, const char* fieldName) { 60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* Look for the instance field with the name fieldName */ 61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldID 62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetFieldID(env->GetObjectClass(object), fieldName , "Ljava/lang/String;"); 63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != fieldID) { 65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring valueString = (jstring) env->GetObjectField(object, fieldID); 66f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong return Utility::getStringValue(env, valueString); 67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 68f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong 69f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong String8 dataString(""); 70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return dataString; 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 Utility::getStringValue(JNIEnv* env, jstring string) { 74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 dataString(""); 75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != string && string != env->NewStringUTF("")) { 77d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* bytes = const_cast< char* > (env->GetStringUTFChars(string, NULL)); 78d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 79d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const int length = strlen(bytes) + 1; 80d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char *data = new char[length]; 81d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi strncpy(data, bytes, length); 82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataString = String8(data); 83d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->ReleaseStringUTFChars(string, bytes); 85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] data; data = NULL; 86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return dataString; 88d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 90d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshichar* Utility::getByteArrayValue( 91d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject object, const char* fieldName, int* dataLength) { 92f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong 93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *dataLength = 0; 94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldID = env->GetFieldID(env->GetObjectClass(object), fieldName , "[B"); 96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != fieldID) { 98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray byteArray = (jbyteArray) env->GetObjectField(object, fieldID); 99f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong return Utility::getByteArrayValue(env, byteArray, dataLength); 100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 101f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong return NULL; 102d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshichar* Utility::getByteArrayValue(JNIEnv* env, jbyteArray byteArray, int* dataLength) { 105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* data = NULL; 106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != byteArray) { 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint length = env->GetArrayLength(byteArray); 108d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *dataLength = length; 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < *dataLength) { 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi data = new char[length]; 112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetByteArrayRegion(byteArray, (jint)0, length, (jbyte *) data); 113d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return data; 116d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint Utility::getIntValue(JNIEnv* env, jobject object, const char* fieldName) { 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldID; 120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int intValue = -1; 121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* Get a reference to obj’s class */ 123d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->GetObjectClass(object); 124d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* Look for the instance field with the name fieldName */ 125d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi fieldID = env->GetFieldID(clazz, fieldName , "I"); 126d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != fieldID) { 128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi intValue = (int) env->GetIntField(object, fieldID); 129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return intValue; 132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass JNIOnInfoListener : public DrmManagerClient::OnInfoListener { 135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic: 136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIOnInfoListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi virtual ~JNIOnInfoListener(); 139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi void onInfo(const DrmInfoEvent& event); 140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiprivate: 142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIOnInfoListener(); 143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass mClass; 144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject mObject; 145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiJNIOnInfoListener::JNIOnInfoListener(JNIEnv* env, jobject thiz, jobject weak_thiz) { 148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->GetObjectClass(thiz); 149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (clazz == NULL) { 151c6aacce37191e1cc79cfeba13b39899f59c68c3bSteve Block ALOGE("Can't find android/drm/DrmManagerClient"); 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jniThrowException(env, "java/lang/Exception", NULL); 153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return; 154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mClass = (jclass)env->NewGlobalRef(clazz); 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mObject = env->NewGlobalRef(weak_thiz); 157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiJNIOnInfoListener::~JNIOnInfoListener() { 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv *env = AndroidRuntime::getJNIEnv(); 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->DeleteGlobalRef(mObject); 162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->DeleteGlobalRef(mClass); 163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshivoid JNIOnInfoListener::onInfo(const DrmInfoEvent& event) { 166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint uniqueId = event.getUniqueId(); 167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint type = event.getType(); 168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv *env = AndroidRuntime::getJNIEnv(); 169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring message = env->NewStringUTF(event.getMessage().string()); 17006ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().string()); 171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallStaticVoidMethod( 173d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mClass, 174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetStaticMethodID(mClass, "notify", "(Ljava/lang/Object;IILjava/lang/String;)V"), 175d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mObject, uniqueId, type, message); 176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic Mutex sLock; 179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 180d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic sp<DrmManagerClientImpl> setDrmManagerClientImpl( 181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, const sp<DrmManagerClientImpl>& client) { 182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex::Autolock l(sLock); 183d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmManagerClient"); 184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldId = env->GetFieldID(clazz, "mNativeContext", "I"); 185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<DrmManagerClientImpl> old = (DrmManagerClientImpl*)env->GetIntField(thiz, fieldId); 187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (client.get()) { 188d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi client->incStrong(thiz); 189d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 190d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (old != 0) { 191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi old->decStrong(thiz); 192d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetIntField(thiz, fieldId, (int)client.get()); 194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return old; 195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 197d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic sp<DrmManagerClientImpl> getDrmManagerClientImpl(JNIEnv* env, jobject thiz) { 198d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex::Autolock l(sLock); 199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmManagerClient"); 200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jfieldID fieldId = env->GetFieldID(clazz, "mNativeContext", "I"); 201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 202d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManagerClientImpl* const client = (DrmManagerClientImpl*)env->GetIntField(thiz, fieldId); 203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return sp<DrmManagerClientImpl>(client); 204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 206a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wangstatic jint android_drm_DrmManagerClient_initialize( 2076225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi JNIEnv* env, jobject thiz) { 20806ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("initialize - Enter"); 209d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 210a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang int uniqueId = 0; 211a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang sp<DrmManagerClientImpl> drmManager = DrmManagerClientImpl::create(&uniqueId, false); 212c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi drmManager->addClient(uniqueId); 213d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 214d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi setDrmManagerClientImpl(env, thiz, drmManager); 21506ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("initialize - Exit"); 216a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang return uniqueId; 217d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 2196225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashistatic void android_drm_DrmManagerClient_setListeners( 2206225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi JNIEnv* env, jobject thiz, jint uniqueId, jobject weak_thiz) { 2216225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi ALOGV("setListeners - Enter"); 2226225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi 2236225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi // Set the listener to DrmManager 2246225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi sp<DrmManagerClient::OnInfoListener> listener = new JNIOnInfoListener(env, thiz, weak_thiz); 2256225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi getDrmManagerClientImpl(env, thiz)->setOnInfoListener(uniqueId, listener); 2266225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi 2276225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi ALOGV("setListeners - Exit"); 2286225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi} 2296225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi 2306225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashistatic void android_drm_DrmManagerClient_release( 2316225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi JNIEnv* env, jobject thiz, jint uniqueId) { 2326225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi ALOGV("release - Enter"); 233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManagerClientImpl::remove(uniqueId); 234c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi getDrmManagerClientImpl(env, thiz)->setOnInfoListener(uniqueId, NULL); 235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 236c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi sp<DrmManagerClientImpl> oldClient = setDrmManagerClientImpl(env, thiz, NULL); 237c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (oldClient != NULL) { 238c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi oldClient->setOnInfoListener(uniqueId, NULL); 239c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi oldClient->removeClient(uniqueId); 240d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 2416225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi ALOGV("release - Exit"); 242d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 243d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 244d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_getConstraintsFromContent( 245d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring jpath, jint usage) { 24606ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("GetConstraints - Enter"); 247d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 248d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 pathString = Utility::getStringValue(env, jpath); 249d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConstraints* pConstraints 250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz)->getConstraints(uniqueId, &pathString, usage); 251d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 252d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/content/ContentValues"); 253d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject constraints = NULL; 254d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 255d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pConstraints) { 256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // Get the constructor id 257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId = env->GetMethodID(localRef, "<init>", "()V"); 258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // create the java DrmConstraints object 259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constraints = env->NewObject(localRef, constructorId); 260d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConstraints::KeyIterator keyIt = pConstraints->keyIterator(); 262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (keyIt.hasNext()) { 264d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 key = keyIt.next(); 265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // insert the entry<constraintKey, constraintValue> to newly created java object 267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (DrmConstraints::EXTENDED_METADATA == key) { 268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const char* value = pConstraints->getAsByteArray(&key); 269d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != value) { 270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = env->NewByteArray(strlen(value)); 271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion(dataArray, 0, strlen(value), (jbyte*)value); 272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 273d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constraints, env->GetMethodID(localRef, "put", "(Ljava/lang/String;[B)V"), 274d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(key.string()), dataArray); 275d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 277d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = pConstraints->get(key); 278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constraints, 280d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(localRef, "put", "(Ljava/lang/String;Ljava/lang/String;)V"), 281d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(key.string()), env->NewStringUTF(value.string())); 282d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 283d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 284d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 285d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 286d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pConstraints; pConstraints = NULL; 28706ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("GetConstraints - Exit"); 288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return constraints; 289d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 290d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 291dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimistatic jobject android_drm_DrmManagerClient_getMetadataFromContent( 292dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi JNIEnv* env, jobject thiz, jint uniqueId, jstring jpath) { 29306ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("GetMetadata - Enter"); 294dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi const String8 pathString = Utility::getStringValue(env, jpath); 295dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi DrmMetadata* pMetadata = 296dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi getDrmManagerClientImpl(env, thiz)->getMetadata(uniqueId, &pathString); 297dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 298dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi jobject metadata = NULL; 299dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 300dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi jclass localRef = NULL; 301dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi localRef = env->FindClass("android/content/ContentValues"); 302dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (NULL != localRef && NULL != pMetadata) { 303dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi // Get the constructor id 304dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi jmethodID constructorId = NULL; 305dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi constructorId = env->GetMethodID(localRef, "<init>", "()V"); 306dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (NULL != constructorId) { 307dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi // create the java DrmMetadata object 308dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi metadata = env->NewObject(localRef, constructorId); 309dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (NULL != metadata) { 310dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi DrmMetadata::KeyIterator keyIt = pMetadata->keyIterator(); 311dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi while (keyIt.hasNext()) { 312dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi String8 key = keyIt.next(); 313dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi // insert the entry<constraintKey, constraintValue> 314dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi // to newly created java object 315dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi String8 value = pMetadata->get(key); 316dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi env->CallVoidMethod(metadata, env->GetMethodID(localRef, "put", 317dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi "(Ljava/lang/String;Ljava/lang/String;)V"), 318dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi env->NewStringUTF(key.string()), env->NewStringUTF(value.string())); 319dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 320dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 321dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 322dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 323dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi delete pMetadata; pMetadata = NULL; 32406ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("GetMetadata - Exit"); 325dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return metadata; 326dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi} 327dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobjectArray android_drm_DrmManagerClient_getAllSupportInfo( 329d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId) { 33006ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("GetAllSupportInfo - Enter"); 331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 332d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 333d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = 0; 334d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi getDrmManagerClientImpl(env, thiz)->getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 335d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 336d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmSupportInfo"); 337d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 338d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobjectArray array = (jobjectArray)env->NewObjectArray(length, clazz, NULL); 339d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 340d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < length; i++) { 341d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo info = drmSupportInfoArray[i]; 342d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 343d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmSupportInfo = env->NewObject(clazz, env->GetMethodID(clazz, "<init>", "()V")); 344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 345d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID addMimeTypeId 346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(clazz, "addMimeType", "(Ljava/lang/String;)V"); 347d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID addFileSuffixId 348d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(clazz, "addFileSuffix", "(Ljava/lang/String;)V"); 349d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 350d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 351d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmSupportInfo, env->GetMethodID(clazz, "setDescription", "(Ljava/lang/String;)V"), 352d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(info.getDescription().string())); 353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 354d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo::MimeTypeIterator iterator = info.getMimeTypeIterator(); 355d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (iterator.hasNext()) { 356d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = iterator.next(); 357d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod(drmSupportInfo, addMimeTypeId, env->NewStringUTF(value.string())); 358d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 359d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 360d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo::FileSuffixIterator it = info.getFileSuffixIterator(); 361d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (it.hasNext()) { 362d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = it.next(); 363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod( 364d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmSupportInfo, addFileSuffixId, env->NewStringUTF(value.string())); 365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 366d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetObjectArrayElement(array, i, drmSupportInfo); 368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 370d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 37106ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("GetAllSupportInfo - Exit"); 372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return array; 373d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 375d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic void android_drm_DrmManagerClient_installDrmEngine( 376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring engineFilePath) { 37706ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("installDrmEngine - Enter"); 378d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi //getDrmManagerClient(env, thiz) 379d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // ->installDrmEngine(uniqueId, Utility::getStringValue(env, engineFilePath)); 38006ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("installDrmEngine - Exit"); 381d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 382d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 383dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_saveRights( 384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, 385d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmRights, jstring rightsPath, jstring contentPath) { 38606ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("saveRights - Enter"); 387dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = DRM_ERROR_UNKNOWN; 388d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int dataLength = 0; 389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* mData = Utility::getByteArrayValue(env, drmRights, "mData", &dataLength); 390d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != mData) { 392d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmRights rights(DrmBuffer(mData, dataLength), 393d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, drmRights, "mMimeType"), 394d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, drmRights, "mAccountId"), 395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, drmRights, "mSubscriptionId")); 396dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = getDrmManagerClientImpl(env, thiz) 397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->saveRights(uniqueId, rights, Utility::getStringValue(env, rightsPath), 398d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, contentPath)); 399d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 401f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong delete[] mData; mData = NULL; 40206ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("saveRights - Exit"); 403dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 404d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 406d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jboolean android_drm_DrmManagerClient_canHandle( 407d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path, jstring mimeType) { 40806ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("canHandle - Enter"); 409d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jboolean result 410d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 411d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->canHandle(uniqueId, Utility::getStringValue(env, path), 412d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, mimeType)); 41306ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("canHandle - Exit"); 414d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 415d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 416d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 417d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_processDrmInfo( 418d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jobject drmInfoObject) { 41906ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("processDrmInfo - Enter"); 420d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int dataLength = 0; 421d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 mMimeType = Utility::getStringValue(env, drmInfoObject, "mMimeType"); 422d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi char* mData = Utility::getByteArrayValue(env, drmInfoObject, "mData", &dataLength); 423d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int mInfoType = Utility::getIntValue(env, drmInfoObject, "mInfoType"); 424d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmBuffer buffer(mData, dataLength); 426d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo drmInfo(mInfoType, buffer, mMimeType); 427d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 428d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmInfo"); 429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject keyIterator 430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->CallObjectMethod(drmInfoObject, 431d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "keyIterator", "()Ljava/util/Iterator;")); 432d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 433d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID hasNextId = env->GetMethodID(env->FindClass("java/util/Iterator"), "hasNext", "()Z"); 434d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 435d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (env->CallBooleanMethod(keyIterator, hasNextId)) { 436d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring key = (jstring) env->CallObjectMethod(keyIterator, 437d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(env->FindClass("java/util/Iterator"), 438d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "next", "()Ljava/lang/Object;")); 439d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 440d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject valueObject = env->CallObjectMethod(drmInfoObject, 441d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "get", "(Ljava/lang/String;)Ljava/lang/Object;"), key); 442d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 443d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring valString = NULL; 444d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != valueObject) { 445d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi valString = (jstring) env->CallObjectMethod(valueObject, 446d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(env->FindClass("java/lang/Object"), 447d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "toString", "()Ljava/lang/String;")); 448d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 449d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 450d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 keyString = Utility::getStringValue(env, key); 451d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 valueString = Utility::getStringValue(env, valString); 45206ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("Key: %s | Value: %s", keyString.string(), valueString.string()); 453d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 454d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfo.put(keyString, valueString); 455d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 456d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 457d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfoStatus* pDrmInfoStatus 458d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz)->processDrmInfo(uniqueId, &drmInfo); 459d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 460d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmInfoStatus"); 461d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmInfoStatus = NULL; 462d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 463d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pDrmInfoStatus) { 464d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int statusCode = pDrmInfoStatus->statusCode; 465c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi int infoType = pDrmInfoStatus->infoType; 466d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 467d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = NULL; 468d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmInfoStatus->drmBuffer) { 469d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmInfoStatus->drmBuffer->length; 470d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray = env->NewByteArray(length); 471d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion( 472d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray, 0, length, (jbyte*) pDrmInfoStatus->drmBuffer->data); 473d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 474d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmInfoStatus->drmBuffer->data; 475d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmInfoStatus->drmBuffer; pDrmInfoStatus->drmBuffer = NULL; 476d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 477d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/ProcessedData"); 478d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId 479d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(clazz, "<init>", "([BLjava/lang/String;Ljava/lang/String;)V"); 480d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject processedData = env->NewObject(clazz, constructorId, dataArray, 481d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF((drmInfo.get(DrmInfoRequest::ACCOUNT_ID)).string()), 482d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF((drmInfo.get(DrmInfoRequest::SUBSCRIPTION_ID)).string())); 483d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 484d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi constructorId 485d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(localRef, 486c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi "<init>", "(IILandroid/drm/ProcessedData;Ljava/lang/String;)V"); 487d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 488c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi drmInfoStatus = env->NewObject(localRef, constructorId, statusCode, infoType, 489c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi processedData, env->NewStringUTF(pDrmInfoStatus->mimeType.string())); 490d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 491d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 492f16a2724e08d59c09c95d0fc0db09cfbe67f6141James Dong delete[] mData; mData = NULL; 493d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmInfoStatus; pDrmInfoStatus = NULL; 494d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 49506ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("processDrmInfo - Exit"); 496d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmInfoStatus; 497d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 498d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 499d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jobject android_drm_DrmManagerClient_acquireDrmInfo( 500d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jobject drmInfoRequest) { 50106ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("acquireDrmInfo Enter"); 502d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 mMimeType = Utility::getStringValue(env, drmInfoRequest, "mMimeType"); 503d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int mInfoType = Utility::getIntValue(env, drmInfoRequest, "mInfoType"); 504d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 505d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfoRequest drmInfoReq(mInfoType, mMimeType); 506d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 507d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmInfoRequest"); 508d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject keyIterator 509d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->CallObjectMethod(drmInfoRequest, 510d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "keyIterator", "()Ljava/util/Iterator;")); 511d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 512d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID hasNextId = env->GetMethodID(env->FindClass("java/util/Iterator"), "hasNext", "()Z"); 513d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 514d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (env->CallBooleanMethod(keyIterator, hasNextId)) { 515d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring key 516d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = (jstring) env->CallObjectMethod(keyIterator, 517d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(env->FindClass("java/util/Iterator"), 518d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "next", "()Ljava/lang/Object;")); 519d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 520d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jstring value = (jstring) env->CallObjectMethod(drmInfoRequest, 521d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(clazz, "get", "(Ljava/lang/String;)Ljava/lang/Object;"), key); 522d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 523d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 keyString = Utility::getStringValue(env, key); 524d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 valueString = Utility::getStringValue(env, value); 52506ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("Key: %s | Value: %s", keyString.string(), valueString.string()); 526d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 527d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfoReq.put(keyString, valueString); 528d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 529d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 530d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo* pDrmInfo = getDrmManagerClientImpl(env, thiz)->acquireDrmInfo(uniqueId, &drmInfoReq); 531d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 532d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmInfoObject = NULL; 533d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 534d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmInfo) { 535d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmInfo"); 536d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 537d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef) { 538d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmInfo->getData().length; 539d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 540d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = env->NewByteArray(length); 541d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->SetByteArrayRegion(dataArray, 0, length, (jbyte*)pDrmInfo->getData().data); 542d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 543d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmInfoObject 544d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->NewObject(localRef, 545d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->GetMethodID(localRef, "<init>", "(I[BLjava/lang/String;)V"), 546d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mInfoType, dataArray, env->NewStringUTF(pDrmInfo->getMimeType().string())); 547d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 548d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo::KeyIterator it = pDrmInfo->keyIterator(); 549d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID putMethodId 550d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->GetMethodID(localRef, "put", "(Ljava/lang/String;Ljava/lang/Object;)V"); 551d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 552d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi while (it.hasNext()) { 553d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 key = it.next(); 554d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 value = pDrmInfo->get(key); 555d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 556d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->CallVoidMethod(drmInfoObject, putMethodId, 557d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi env->NewStringUTF(key.string()), env->NewStringUTF(value.string())); 558d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 559d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 560d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmInfo->getData().data; 561d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 562d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 563d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmInfo; pDrmInfo = NULL; 564d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 56506ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("acquireDrmInfo Exit"); 566d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmInfoObject; 567d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 568d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 569d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jint android_drm_DrmManagerClient_getDrmObjectType( 570d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path, jstring mimeType) { 57106ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("getDrmObjectType Enter"); 572d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int drmObjectType 573d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 574d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->getDrmObjectType(uniqueId, Utility::getStringValue(env, path), 575d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Utility::getStringValue(env, mimeType)); 57606ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("getDrmObjectType Exit"); 577d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmObjectType; 578d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 579d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 580d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jstring android_drm_DrmManagerClient_getOriginalMimeType( 5810889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong JNIEnv* env, jobject thiz, jint uniqueId, jstring path, jobject fileDescriptor) { 58206ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("getOriginalMimeType Enter"); 5830889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong 5840889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong int fd = (fileDescriptor == NULL) 5850889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong ? -1 5860889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong : jniGetFDFromFileDescriptor(env, fileDescriptor); 5870889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong 588d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 mimeType 589d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 5900889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong ->getOriginalMimeType(uniqueId, 5910889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong Utility::getStringValue(env, path), fd); 59206ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("getOriginalMimeType Exit"); 593d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return env->NewStringUTF(mimeType.string()); 594d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 595d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 596d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jint android_drm_DrmManagerClient_checkRightsStatus( 597d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path, int action) { 5980889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong ALOGV("checkRightsStatus Enter"); 599d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int rightsStatus 600d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 601d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->checkRightsStatus(uniqueId, Utility::getStringValue(env, path), action); 6020889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong ALOGV("checkRightsStatus Exit"); 603d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rightsStatus; 604d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 605d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 606dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_removeRights( 607d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring path) { 60806ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("removeRights"); 609dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmManagerClientImpl(env, thiz) 610dc549d60f98d809f626c99de614960409a847054Takeshi Aimi ->removeRights(uniqueId, Utility::getStringValue(env, path)); 611d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 612d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 613dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatic jint android_drm_DrmManagerClient_removeAllRights( 614d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId) { 61506ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("removeAllRights"); 616dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmManagerClientImpl(env, thiz)->removeAllRights(uniqueId); 617d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 618d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 619d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic jint android_drm_DrmManagerClient_openConvertSession( 620d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env, jobject thiz, jint uniqueId, jstring mimeType) { 62106ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("openConvertSession Enter"); 622d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int convertId 623d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = getDrmManagerClientImpl(env, thiz) 624d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ->openConvertSession(uniqueId, Utility::getStringValue(env, mimeType)); 62506ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("openConvertSession Exit"); 626d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return convertId; 627d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 628d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6299864b25bd8ac2c68f290817ac5fe73077e130b45James Dongstatic jobject GetConvertedStatus(JNIEnv* env, DrmConvertedStatus* pDrmConvertedStatus) { 6309864b25bd8ac2c68f290817ac5fe73077e130b45James Dong ALOGV("GetConvertedStatus - Enter"); 631d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass localRef = env->FindClass("android/drm/DrmConvertedStatus"); 632d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 633d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jobject drmConvertedStatus = NULL; 634d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 635d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != localRef && NULL != pDrmConvertedStatus) { 636d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int statusCode = pDrmConvertedStatus->statusCode; 637d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 638d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jbyteArray dataArray = NULL; 639d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != pDrmConvertedStatus->convertedData) { 640d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int length = pDrmConvertedStatus->convertedData->length; 641d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi dataArray = env->NewByteArray(length); 6429864b25bd8ac2c68f290817ac5fe73077e130b45James Dong env->SetByteArrayRegion( 6439864b25bd8ac2c68f290817ac5fe73077e130b45James Dong dataArray, 0, length, (jbyte*) pDrmConvertedStatus->convertedData->data); 644d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 645d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete [] pDrmConvertedStatus->convertedData->data; 646d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmConvertedStatus->convertedData; pDrmConvertedStatus->convertedData = NULL; 647d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 648d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jmethodID constructorId = env->GetMethodID(localRef, "<init>", "(I[BI)V"); 649d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus 650d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi = env->NewObject(localRef, constructorId, 651d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi statusCode, dataArray, pDrmConvertedStatus->offset); 652d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 653d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 654d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete pDrmConvertedStatus; pDrmConvertedStatus = NULL; 655d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6569864b25bd8ac2c68f290817ac5fe73077e130b45James Dong ALOGV("GetConvertedStatus - Exit"); 657d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 658d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 659d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6609864b25bd8ac2c68f290817ac5fe73077e130b45James Dongstatic jobject android_drm_DrmManagerClient_convertData( 6619864b25bd8ac2c68f290817ac5fe73077e130b45James Dong JNIEnv* env, jobject thiz, jint uniqueId, jint convertId, jbyteArray inputData) { 6629864b25bd8ac2c68f290817ac5fe73077e130b45James Dong ALOGV("convertData Enter"); 663d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6649864b25bd8ac2c68f290817ac5fe73077e130b45James Dong int dataLength = 0; 6659864b25bd8ac2c68f290817ac5fe73077e130b45James Dong char* mData = Utility::getByteArrayValue(env, inputData, &dataLength); 6669864b25bd8ac2c68f290817ac5fe73077e130b45James Dong const DrmBuffer buffer(mData, dataLength); 667d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 668d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus* pDrmConvertedStatus 6699864b25bd8ac2c68f290817ac5fe73077e130b45James Dong = getDrmManagerClientImpl(env, thiz)->convertData(uniqueId, convertId, &buffer); 6709864b25bd8ac2c68f290817ac5fe73077e130b45James Dong jobject status = GetConvertedStatus(env, pDrmConvertedStatus); 671d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6729864b25bd8ac2c68f290817ac5fe73077e130b45James Dong delete[] mData; 6739864b25bd8ac2c68f290817ac5fe73077e130b45James Dong mData = NULL; 674d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6759864b25bd8ac2c68f290817ac5fe73077e130b45James Dong ALOGV("convertData - Exit"); 6769864b25bd8ac2c68f290817ac5fe73077e130b45James Dong return status; 6779864b25bd8ac2c68f290817ac5fe73077e130b45James Dong} 678d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6799864b25bd8ac2c68f290817ac5fe73077e130b45James Dongstatic jobject android_drm_DrmManagerClient_closeConvertSession( 6809864b25bd8ac2c68f290817ac5fe73077e130b45James Dong JNIEnv* env, jobject thiz, int uniqueId, jint convertId) { 681d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6829864b25bd8ac2c68f290817ac5fe73077e130b45James Dong ALOGV("closeConvertSession Enter"); 683d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6849864b25bd8ac2c68f290817ac5fe73077e130b45James Dong DrmConvertedStatus* pDrmConvertedStatus 6859864b25bd8ac2c68f290817ac5fe73077e130b45James Dong = getDrmManagerClientImpl(env, thiz)->closeConvertSession(uniqueId, convertId); 6869864b25bd8ac2c68f290817ac5fe73077e130b45James Dong jobject status = GetConvertedStatus(env, pDrmConvertedStatus); 687d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 68806ade6ae1bd015e8b8ad0685847911213c93cc5bSteve Block ALOGV("closeConvertSession - Exit"); 6899864b25bd8ac2c68f290817ac5fe73077e130b45James Dong return status; 690d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 691d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 692d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic JNINativeMethod nativeMethods[] = { 693d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6946225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi {"_initialize", "()I", 695c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi (void*)android_drm_DrmManagerClient_initialize}, 696d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 6976225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi {"_setListeners", "(ILjava/lang/Object;)V", 6986225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi (void*)android_drm_DrmManagerClient_setListeners}, 6996225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi 7006225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi {"_release", "(I)V", 7016225df010365d00b1d0f3b1ca13f18cea537c8e3Kei Takahashi (void*)android_drm_DrmManagerClient_release}, 702d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 703d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getConstraints", "(ILjava/lang/String;I)Landroid/content/ContentValues;", 704d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getConstraintsFromContent}, 705d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 706dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi {"_getMetadata", "(ILjava/lang/String;)Landroid/content/ContentValues;", 707dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi (void*)android_drm_DrmManagerClient_getMetadataFromContent}, 708dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 709d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getAllSupportInfo", "(I)[Landroid/drm/DrmSupportInfo;", 710d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getAllSupportInfo}, 711d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 712d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_installDrmEngine", "(ILjava/lang/String;)V", 713d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_installDrmEngine}, 714d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 715d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_canHandle", "(ILjava/lang/String;Ljava/lang/String;)Z", 716d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_canHandle}, 717d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 718d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_processDrmInfo", "(ILandroid/drm/DrmInfo;)Landroid/drm/DrmInfoStatus;", 719d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_processDrmInfo}, 720d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 721d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_acquireDrmInfo", "(ILandroid/drm/DrmInfoRequest;)Landroid/drm/DrmInfo;", 722d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_acquireDrmInfo}, 723d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 724dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_saveRights", "(ILandroid/drm/DrmRights;Ljava/lang/String;Ljava/lang/String;)I", 725d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_saveRights}, 726d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 727d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_getDrmObjectType", "(ILjava/lang/String;Ljava/lang/String;)I", 728d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getDrmObjectType}, 729d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 7300889fdae87abd9ec78a6c1d00c2771acfa4e4d34James Dong {"_getOriginalMimeType", "(ILjava/lang/String;Ljava/io/FileDescriptor;)Ljava/lang/String;", 731d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_getOriginalMimeType}, 732d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 733d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_checkRightsStatus", "(ILjava/lang/String;I)I", 734d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_checkRightsStatus}, 735d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 736dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_removeRights", "(ILjava/lang/String;)I", 737d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_removeRights}, 738d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 739dc549d60f98d809f626c99de614960409a847054Takeshi Aimi {"_removeAllRights", "(I)I", 740d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_removeAllRights}, 741d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 742d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_openConvertSession", "(ILjava/lang/String;)I", 743d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_openConvertSession}, 744d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 745d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_convertData", "(II[B)Landroid/drm/DrmConvertedStatus;", 746d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_convertData}, 747d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 748d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi {"_closeConvertSession", "(II)Landroid/drm/DrmConvertedStatus;", 749d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (void*)android_drm_DrmManagerClient_closeConvertSession}, 750d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 751d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 752d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatic int registerNativeMethods(JNIEnv* env) { 753d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int result = -1; 754d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 755d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* look up the class */ 756d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jclass clazz = env->FindClass("android/drm/DrmManagerClient"); 757d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 758d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != clazz) { 759d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (env->RegisterNatives(clazz, nativeMethods, sizeof(nativeMethods) 760d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi / sizeof(nativeMethods[0])) == JNI_OK) { 761d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = 0; 762d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 763d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 764d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 765d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 766d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 767d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshijint JNI_OnLoad(JavaVM* vm, void* reserved) { 768d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi JNIEnv* env = NULL; 769d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi jint result = -1; 770d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 771d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) { 772d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != env && registerNativeMethods(env) == 0) { 773d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = JNI_VERSION_1_4; 774d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 775d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 776d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 777d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 778d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 779