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