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