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