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