19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @file drm1_jni.c 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This file implement the Java Native Interface 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for supporting OMA DRM 1.0 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni/drm1_jni.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <objmng/svc_drm.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "log.h" 2715dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes#include "JNIHelp.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MS_PER_SECOND 1000 /* Milliseconds per second */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MS_PER_MINUTE 60 * MS_PER_SECOND /* Milliseconds per minute */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MS_PER_HOUR 60 * MS_PER_MINUTE /* Milliseconds per hour */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MS_PER_DAY 24 * MS_PER_HOUR /* Milliseconds per day */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SECONDS_PER_MINUTE 60 /* Seconds per minute*/ 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SECONDS_PER_HOUR 60 * SECONDS_PER_MINUTE /* Seconds per hour */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SECONDS_PER_DAY 24 * SECONDS_PER_HOUR /* Seconds per day */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define DAY_PER_MONTH 30 /* Days per month */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define DAY_PER_YEAR 365 /* Days per year */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** Nonzero if 'y' is a leap year, else zero. */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define leap(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** Number of leap years from 1970 to 'y' (not including 'y' itself). */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define nleap(y) (((y) - 1969) / 4 - ((y) - 1901) / 100 + ((y) - 1601) / 400) 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** Accumulated number of days from 01-Jan up to start of current month. */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int32_t ydays[] = { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define int64_const(s) (s) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define int64_add(dst, s1, s2) ((void)((dst) = (s1) + (s2))) 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define int64_mul(dst, s1, s2) ((void)((dst) = (int64_t)(s1) * (int64_t)(s2))) 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * DRM data structure 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct _DrmData { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The id of the DRM content. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The pointer of JNI interface. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The pointer of DRM raw content InputStream object. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject* pInData; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The len of the InputStream object. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The next DRM data. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct _DrmData *next; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} DrmData; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** The table to hold all the DRM data. */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic DrmData *drmTable = NULL; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allocate a new item of DrmData. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \return a pointer to a DrmData item if allocate successfully, 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return NULL 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic DrmData * newItem(void) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData *d = (DrmData *)malloc(sizeof(DrmData)); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != NULL) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d->id = -1; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d->next = NULL; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return d; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Free the memory of the specified DrmData item <code>d</code>. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param d - a pointer to DrmData 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void freeItem(DrmData *d) 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(d != NULL); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project free(d); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Insert a DrmData item with given <code>name</code> into the head of 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DrmData list. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d - the pointer of the JNI interface 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pInData - the pointer of the DRM content InputStream object. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return <code>JNI_DRM_SUCCESS</code> if insert successfully, otherwise 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return <code>JNI_DRM_FAILURE</code> 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t addItem(DrmData* d) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == d) 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == drmTable) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmTable = d; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d->next = drmTable; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmTable = d; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the item from the DrmData list by the specified <code> 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * id</code>. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p - the pointer of the DRM content InputStream object. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a pointer to the DrmData item if find it successfuly, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return NULL 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic DrmData * getItem(int32_t id) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData *d; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == drmTable) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (d = drmTable; d != NULL; d = d->next) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == d->id) 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return d; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the specified DrmData item <code>d</code>. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p - the pointer of the DRM content InputStream object. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return <code>JNI_DRM_SUCCESS</code> if remove successfuly, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return <code>JNI_DRM_FAILURE</code> 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t removeItem(int32_t id) 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData *curItem, *preItem, *dstItem; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == drmTable) 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preItem = NULL; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (curItem = drmTable; curItem != NULL; curItem = curItem->next) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == curItem->id) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curItem == drmTable) 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmTable = curItem->next; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preItem->next = curItem->next; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project freeItem(curItem); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preItem = curItem; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t getInputStreamDataLength(int32_t handle) 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject* pInputStream; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData* p; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass cls; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mid; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = (DrmData *)handle; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == p) 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env = p->env; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pInputStream = p->pInData; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = p->len; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == env || p->len <= 0 || NULL == pInputStream) 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* check the original InputStream is available or not */ 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cls = (*env)->GetObjectClass(env, *pInputStream); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mid = (*env)->GetMethodID(env, cls, "available", "()I"); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, cls); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == mid) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 > (*env)->CallIntMethod(env, *pInputStream, mid)) 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return len; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t readInputStreamData(int32_t handle, uint8_t* buf, int32_t bufLen) 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject* pInputStream; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData* p; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass cls; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mid; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray tmp; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tmpLen; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* pNativeBuf; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = (DrmData *)handle; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == p || NULL == buf || bufLen <- 0) 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env = p->env; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pInputStream = p->pInData; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = p->len; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == env || p->len <= 0 || NULL == pInputStream) 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cls = (*env)->GetObjectClass(env, *pInputStream); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mid = (*env)->GetMethodID(env, cls, "read", "([BII)I"); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp = (*env)->NewByteArray(env, bufLen); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bufLen = (*env)->CallIntMethod(env, *pInputStream, mid, tmp, 0, bufLen); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, cls); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == bufLen) 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pNativeBuf = (*env)->GetByteArrayElements(env, tmp, NULL); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(buf, pNativeBuf, bufLen); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseByteArrayElements(env, tmp, pNativeBuf, 0); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, tmp); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bufLen; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const T_DRM_Rights_Info_Node *searchRightsObject(const jbyte* roId, const T_DRM_Rights_Info_Node* pRightsList) 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const T_DRM_Rights_Info_Node *pTmp; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == roId || NULL == pRightsList) 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pTmp = pRightsList; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NULL != pTmp) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(0 == strcmp((char *)roId, (char *)pTmp->roInfo.roId)) 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pTmp = pTmp->next; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pTmp; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the difference in seconds between the given GMT time 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and 1970-01-01 00:00:00 GMT. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param year the year (since 1970) 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param month the month (1 - 12) 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param day the day (1 - 31) 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param hour the hour (0 - 23) 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param minute the minute (0 - 59) 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \param second the second (0 - 59) 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * \return the difference in seconds between the given GMT time 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and 1970-01-01 00:00:00 GMT. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int64_t mkgmtime( 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t year, uint32_t month, uint32_t day, 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t hour, uint32_t minute, uint32_t second) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t result; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FIXME: It does not check whether the specified days 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is valid based on the specified months. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(year >= 1970 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && month > 0 && month <= 12 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && day > 0 && day <= 31 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && hour < 24 && minute < 60 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && second < 60); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Set 'day' to the number of days into the year. */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day += ydays[month - 1] + (month > 2 && leap (year)) - 1; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Now calculate 'day' to the number of days since Jan 1, 1970. */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day = day + 365 * (year - 1970) + nleap(year); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_mul(result, int64_const(day), int64_const(SECONDS_PER_DAY)); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_add(result, result, int64_const( 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SECONDS_PER_HOUR * hour + SECONDS_PER_MINUTE * minute + second)); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compute the milliseconds by the specified <code>date</code> 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and <code>time</code>. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param date - the specified date, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>date = year * 10000 + month * 100 + day</code> 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param time - the specified time, 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>time = hour * 10000 + minute * 100 + second</code> 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the related milliseconds 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int64_t computeTime(int32_t date, int32_t time) 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t year, month, day, hour, minute, second; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = date / 10000; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = (date / 100) % 100; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day = date % 100; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hour = time / 10000; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minute = (time / 100) % 100; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project second = time % 100; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Adjust the invalid parameters. */ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (year < 1970) year = 1970; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (month < 1) month = 1; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (month > 12) month = 12; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (day < 1) day = 1; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (day > 31) day = 31; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hour < 0) hour = 0; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hour > 23) hour = 23; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (minute < 0) minute = 0; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (minute > 59) minute = 59; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (second < 0) second = 0; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (second > 59) second = 59; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mkgmtime(year, month, day, hour, minute, second) * 1000; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compute the milliseconds by the specified <code>date</code> 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and <code>time</code>. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that here we always treat 1 year as 365 days and 1 month as 30 days 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is not precise. But it should not be a problem since OMA DRM 2.0 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * already restricts the interval representation to be day-based, 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * i.e. there will not be an interval with year or month any more in the 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * future. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param date - the specified date, 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>date = year * 10000 + month * 100 + day</code> 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param time - the specified time, 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>time = hour * 10000 + minute * 100 + second</code> 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the related milliseconds 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int64_t computeInterval(int32_t date, int32_t time) 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t year, month, day, hour, minute, second; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t milliseconds; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = date / 10000; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = (date / 100) % 100; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day = date % 100; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hour = time / 10000; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minute = (time / 100) % 100; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project second = time % 100; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* milliseconds = ((((year * 365 + month * 30 + day) * 24 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * + hour) * 60 + minute) * 60 + second) * 1000; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_mul(milliseconds, 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_const(year * DAY_PER_YEAR + month * DAY_PER_MONTH + day), 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_const(MS_PER_DAY)); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_add(milliseconds, milliseconds, 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_const(hour * MS_PER_HOUR + minute * MS_PER_MINUTE + 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project second * MS_PER_SECOND)); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return milliseconds; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint getObjectIntField(JNIEnv * env, jobject obj, const char *name, jint * value) 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, obj); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, name, "I"); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, clazz); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = (*env)->GetIntField(env, obj, field); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint setObjectIntField(JNIEnv * env, jobject obj, const char *name, jint value) 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, obj); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, name, "I"); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, clazz); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->SetIntField(env, obj, field, value); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint setObjectLongField(JNIEnv * env, jobject obj, const char *name, jlong value) 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, obj); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, name, "J"); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, clazz); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->SetLongField(env, obj, field, value); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint setConstraintFields(JNIEnv * env, jobject constraint, T_DRM_Constraint_Info * pConstraint) 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if no this permission */ 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pConstraint->indicator == (uint8_t)DRM_NO_RIGHTS) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setObjectIntField(env, constraint, "count", 0)) 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* set count field */ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pConstraint->indicator & DRM_COUNT_CONSTRAINT) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setObjectIntField(env, constraint, "count", pConstraint->count)) 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* set start time field */ 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pConstraint->indicator & DRM_START_TIME_CONSTRAINT) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t startTime; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startTime = computeTime(pConstraint->startDate, pConstraint->startTime); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setObjectLongField(env, constraint, "startDate", startTime)) 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* set end time field */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pConstraint->indicator & DRM_END_TIME_CONSTRAINT) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t endTime; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project endTime = computeTime(pConstraint->endDate, pConstraint->endTime); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setObjectLongField(env, constraint, "endDate", endTime)) 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* set interval field */ 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pConstraint->indicator & DRM_INTERVAL_CONSTRAINT) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t interval; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interval = computeInterval(pConstraint->intervalDate, pConstraint->intervalTime); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setObjectLongField(env, constraint, "interval", interval)) 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint setRightsFields(JNIEnv * env, jobject rights, T_DRM_Rights_Info* pRoInfo) 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint index; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, rights); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* set roId field */ 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;"); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, clazz); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = (*env)->NewStringUTF(env, (char *)pRoInfo->roId); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == str) 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->SetObjectField(env, rights, field, str); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, str); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_nativeConstructDrmContent 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent, jobject data, jint len, jint mimeType) 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Input_Data inData; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData* drmInData; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mimeType) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_MIMETYPE_MESSAGE: 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = TYPE_DRM_MESSAGE; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_MIMETYPE_CONTENT: 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = TYPE_DRM_CONTENT; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData = newItem(); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == drmInData) 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->env = env; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->pInData = &data; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->len = len; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == addItem(drmInData)) 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.inputHandle = (int32_t)drmInData; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.mimeType = mimeType; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.getInputDataLength = getInputStreamDataLength; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.readInputData = readInputStreamData; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = SVC_drm_openSession(inData); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id < 0) 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->id = id; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return id; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jstring JNICALL 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_nativeGetRightsAddress 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent) 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t rightsIssuer[256] = {0}; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str = NULL; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_SUCCESS == SVC_drm_getRightsIssuer(id, rightsIssuer)) 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = (*env)->NewStringUTF(env, (char *)rightsIssuer); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_nativeGetDeliveryMethod 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent) 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t res; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = SVC_drm_getDeliveryMethod(id); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (res) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FORWARD_LOCK: 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FORWARD_LOCK; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case COMBINED_DELIVERY: 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_COMBINED_DELIVERY; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SEPARATE_DELIVERY: 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SEPARATE_DELIVERY; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SEPARATE_DELIVERY_FL: 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SEPARATE_DELIVERY_DM; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_nativeReadContent 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent, jbyteArray buf, jint bufOff, jint len, jint mediaOff) 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte *nativeBuf; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass cls; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mid; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData* p; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject inputStream; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buf) { 66315dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes jniThrowNullPointerException(env, "b == null"); 66415dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes return JNI_DRM_FAILURE; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len < 0 || bufOff < 0 || len + bufOff > (*env)->GetArrayLength(env, buf)) { 66815dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL); 66915dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes return JNI_DRM_FAILURE; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mediaOff < 0 || len == 0) 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = getItem(id); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == p) 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cls = (*env)->GetObjectClass(env, rawContent); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == cls) 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, cls, "inData", "Ljava/io/BufferedInputStream;"); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, cls); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputStream = (*env)->GetObjectField(env, rawContent, field); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->env = env; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->pInData = &inputStream; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeBuf = (*env)->GetByteArrayElements(env, buf, NULL); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = SVC_drm_getContent(id, mediaOff, (uint8_t *)nativeBuf + bufOff, len); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseByteArrayElements(env, buf, nativeBuf, 0); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_MEDIA_EOF == len) 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_EOF; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len <= 0) 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return len; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jstring JNICALL 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_nativeGetContentType 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent) 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t contentType[64] = {0}; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str = NULL; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_SUCCESS == SVC_drm_getContentType(id, contentType)) 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = (*env)->NewStringUTF(env, (char *)contentType); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_nativeGetContentLength 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent) 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = SVC_drm_getContentLength(id); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_UNKNOWN_DATA_LEN == len) 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_UNKNOWN_DATA_LEN; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 > len) 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return len; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT void JNICALL 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRawContent_finalize 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rawContent) 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeItem(id); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_closeSession(id); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRights_nativeGetConstraintInfo 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rights, jint permission, jobject constraint) 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *nativeStr; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info_Node *pRightsList; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info_Node *pCurNode; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Constraint_Info *pConstraint; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, rights); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;"); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, clazz); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = (*env)->GetObjectField(env, rights, field); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeStr = (uint8_t *)(*env)->GetStringUTFChars(env, str, NULL); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == nativeStr) 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* this means forward-lock rights */ 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp((char *)nativeStr, "ForwardLock")) { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_FAILURE == SVC_drm_viewAllRights(&pRightsList)) { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pCurNode = searchRightsObject((jbyte *)nativeStr, pRightsList); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == pCurNode) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_freeRightsInfoList(pRightsList); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (permission) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_PLAY: 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(pCurNode->roInfo.playRights); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_DISPLAY: 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(pCurNode->roInfo.displayRights); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_EXECUTE: 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(pCurNode->roInfo.executeRights); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_PRINT: 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(pCurNode->roInfo.printRights); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_freeRightsInfoList(pRightsList); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* set constraint field */ 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setConstraintFields(env, constraint, pConstraint)) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_freeRightsInfoList(pRightsList); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_freeRightsInfoList(pRightsList); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRights_nativeConsumeRights 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rights, jint permission) 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *nativeStr; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (permission) { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_PLAY: 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = DRM_PERMISSION_PLAY; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_DISPLAY: 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = DRM_PERMISSION_DISPLAY; 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_EXECUTE: 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = DRM_PERMISSION_EXECUTE; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_PERMISSION_PRINT: 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = DRM_PERMISSION_PRINT; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, rights); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;"); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->DeleteLocalRef(env, clazz); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = (*env)->GetObjectField(env, rights, field); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeStr = (uint8_t *)(*env)->GetStringUTFChars(env, str, NULL); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == nativeStr) 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp("ForwardLock", (char *)nativeStr)) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_SUCCESS != SVC_drm_updateRights(nativeStr, permission)) { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRightsManager_nativeInstallDrmRights 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rightsManager, jobject data, jint len, jint mimeType, jobject rights) 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Input_Data inData; 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmData* drmInData; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass cls; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mid; 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info rightsInfo; 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mimeType) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_MIMETYPE_RIGHTS_XML: 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = TYPE_DRM_RIGHTS_XML; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_MIMETYPE_RIGHTS_WBXML: 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = TYPE_DRM_RIGHTS_WBXML; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case JNI_DRM_MIMETYPE_MESSAGE: 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = TYPE_DRM_MESSAGE; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData = newItem(); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == drmInData) 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->env = env; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->pInData = &data; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drmInData->len = len; 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.inputHandle = (int32_t)drmInData; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.mimeType = mimeType; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.getInputDataLength = getInputStreamDataLength; 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData.readInputData = readInputStreamData; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&rightsInfo, 0, sizeof(T_DRM_Rights_Info)); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_FAILURE == SVC_drm_installRights(inData, &rightsInfo)) 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project freeItem(drmInData); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return setRightsFields(env, rights, &rightsInfo); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRightsManager_nativeQueryRights 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rightsManager, jobject rawContent, jobject rights) 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id; 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info rightsInfo; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&rightsInfo, 0, sizeof(T_DRM_Rights_Info)); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_SUCCESS != SVC_drm_getRightsInfo(id, &rightsInfo)) 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return setRightsFields(env, rights, &rightsInfo); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRightsManager_nativeGetNumOfRights 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rightsManager) 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info_Node *pRightsList; 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info_Node *pCurNode; 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t num = 0; 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_FAILURE == SVC_drm_viewAllRights(&pRightsList)) 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pCurNode = pRightsList; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pCurNode != NULL) { 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project num++; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pCurNode = pCurNode->next; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_freeRightsInfoList(pRightsList); 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return num; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRightsManager_nativeGetRightsList 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rightsManager, jobjectArray rightsArray, jint num) 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info_Node *pRightsList; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Info_Node *pCurNode; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t index; 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_FAILURE == SVC_drm_viewAllRights(&pRightsList)) 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pCurNode = pRightsList; 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (index = 0; NULL != pCurNode; index++) { 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject rights = (*env)->GetObjectArrayElement(env, rightsArray, index); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == rights) 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == setRightsFields(env, rights, &(pCurNode->roInfo))) 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->SetObjectArrayElement(env, rightsArray, index, rights); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pCurNode = pCurNode->next; 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SVC_drm_freeRightsInfoList(pRightsList); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* native interface */ 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIEXPORT jint JNICALL 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJava_android_drm_mobile1_DrmRightsManager_nativeDeleteRights 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (JNIEnv * env, jobject rightsManager, jobject rights) 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID field; 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str; 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *nativeStr; 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->GetObjectClass(env, rights); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == clazz) 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;"); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == field) 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = (*env)->GetObjectField(env, rights, field); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeStr = (uint8_t *)(*env)->GetStringUTFChars(env, str, NULL); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == nativeStr) 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp("ForwardLock", (char *)nativeStr)) 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_SUCCESS != SVC_drm_deleteRights(nativeStr)) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_FAILURE; 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_DRM_SUCCESS; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Table of methods associated with the DrmRawContent class. 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDrmRawContentMethods[] = { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeConstructDrmContent", "(Ljava/io/InputStream;II)I", 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_nativeConstructDrmContent}, 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetRightsAddress", "()Ljava/lang/String;", 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetRightsAddress}, 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetDeliveryMethod", "()I", 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetDeliveryMethod}, 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeReadContent", "([BIII)I", 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_nativeReadContent}, 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetContentType", "()Ljava/lang/String;", 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetContentType}, 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetContentLength", "()I", 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetContentLength}, 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"finalize", "()V", 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRawContent_finalize}, 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Table of methods associated with the DrmRights class. 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDrmRightsMethods[] = { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetConstraintInfo", "(ILandroid/drm/mobile1/DrmConstraintInfo;)I", 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRights_nativeGetConstraintInfo}, 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeConsumeRights", "(I)I", 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRights_nativeConsumeRights}, 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Table of methods associated with the DrmRightsManager class. 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gDrmRightsManagerMethods[] = { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeInstallDrmRights", "(Ljava/io/InputStream;IILandroid/drm/mobile1/DrmRights;)I", 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRightsManager_nativeInstallDrmRights}, 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeQueryRights", "(Landroid/drm/mobile1/DrmRawContent;Landroid/drm/mobile1/DrmRights;)I", 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRightsManager_nativeQueryRights}, 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetNumOfRights", "()I", 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRightsManager_nativeGetNumOfRights}, 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetRightsList", "([Landroid/drm/mobile1/DrmRights;I)I", 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRightsManager_nativeGetRightsList}, 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeDeleteRights", "(Landroid/drm/mobile1/DrmRights;)I", 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)Java_android_drm_mobile1_DrmRightsManager_nativeDeleteRights}, 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register several native methods for one class. 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int registerNativeMethods(JNIEnv* env, const char* className, 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNINativeMethod* gMethods, int numMethods) 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = (*env)->FindClass(env, className); 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register native methods for all classes we know about. 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int registerNatives(JNIEnv* env) 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!registerNativeMethods(env, "android/drm/mobile1/DrmRawContent", 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDrmRawContentMethods, sizeof(gDrmRawContentMethods) / sizeof(gDrmRawContentMethods[0]))) 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!registerNativeMethods(env, "android/drm/mobile1/DrmRights", 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDrmRightsMethods, sizeof(gDrmRightsMethods) / sizeof(gDrmRightsMethods[0]))) 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!registerNativeMethods(env, "android/drm/mobile1/DrmRightsManager", 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDrmRightsManagerMethods, sizeof(gDrmRightsManagerMethods) / sizeof(gDrmRightsManagerMethods[0]))) 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint JNI_OnLoad(JavaVM* vm, void* reserved) 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = NULL; 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint result = -1; 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Entering JNI_OnLoad\n"); 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(env != NULL); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!registerNatives(env)) 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* success -- return valid version number */ 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = JNI_VERSION_1_4; 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Leaving JNI_OnLoad (result=0x%x)\n", result); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1167