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 Projectpackage android.drm.mobile1; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.*; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides interfaces to access the DRM raw content. 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DrmRawContent { 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The "application/vnd.oma.drm.message" mime type. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DRM_MIMETYPE_MESSAGE_STRING = "application/vnd.oma.drm.message"; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The "application/vnd.oma.drm.content" mime type. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DRM_MIMETYPE_CONTENT_STRING = "application/vnd.oma.drm.content"; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The DRM delivery type: Forward-Lock 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DRM_FORWARD_LOCK = 1; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The DRM delivery type: Combined Delivery 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DRM_COMBINED_DELIVERY = 2; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The DRM delivery type: Separate Delivery 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DRM_SEPARATE_DELIVERY = 3; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The DRM delivery type: Separate Delivery in DRM message 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DRM_SEPARATE_DELIVERY_DM = 4; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The DRM media content length is unknown currently 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DRM_UNKNOWN_DATA_LEN = -1; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The id of "application/vnd.oma.drm.message" mime type. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DRM_MIMETYPE_MESSAGE = 1; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The id of "application/vnd.oma.drm.content" mime type. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DRM_MIMETYPE_CONTENT = 2; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Successful operation. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int JNI_DRM_SUCCESS = 0; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * General failure. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int JNI_DRM_FAILURE = -1; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates the end of the DRM content is reached. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int JNI_DRM_EOF = -2; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The media content length is unknown from native method 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int JNI_DRM_UNKNOWN_DATA_LEN = -3; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The member to save the original InputStream data. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BufferedInputStream inData; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The member to save the original InputStream data length. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int inDataLen; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The unique id to this DRM content. It will be initialized 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in constructor by native method. And it will not be changed 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after initialization. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int id; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The rights issuer address of this DRM object. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String rightsIssuer; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The media content type of this DRM object. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mediaType; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The delivery method type of this DRM object. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int rawType; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a DrmRawContent object. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param inRawdata object of DRM raw data stream. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param len the length of raw data can be read. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mimeTypeStr the mime type of the DRM content. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DrmRawContent(InputStream inRawdata, int len, String mimeTypeStr) throws DrmException, IOException { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mimeType; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = -1; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inData = new BufferedInputStream(inRawdata, 1024); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inDataLen = len; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_MIMETYPE_MESSAGE_STRING.equals(mimeTypeStr)) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = DRM_MIMETYPE_MESSAGE; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (DRM_MIMETYPE_CONTENT_STRING.equals(mimeTypeStr)) 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mimeType = DRM_MIMETYPE_CONTENT; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("mimeType must be DRM_MIMETYPE_MESSAGE or DRM_MIMETYPE_CONTENT"); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len <= 0) 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("len must be > 0"); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* call native method to initialize this DRM content */ 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = nativeConstructDrmContent(inData, inDataLen, mimeType); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == id) 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new DrmException("nativeConstructDrmContent() returned JNI_DRM_FAILURE"); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* init the rights issuer field. */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightsIssuer = nativeGetRightsAddress(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* init the raw content type. */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rawType = nativeGetDeliveryMethod(); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == rawType) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new DrmException("nativeGetDeliveryMethod() returned JNI_DRM_FAILURE"); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* init the media content type. */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaType = nativeGetContentType(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (null == mediaType) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new DrmException("nativeGetContentType() returned null"); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get rights address from raw Seperate Delivery content. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the string of the rights issuer address, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or null if no rights issuer. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getRightsAddress() { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rightsIssuer; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the type of the raw DRM content. 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return one of the following delivery type of this DRM content: 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_FORWARD_LOCK 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_COMBINED_DELIVERY 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_SEPARATE_DELIVERY 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_SEPARATE_DELIVERY_DM 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRawType() { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rawType; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get one InputStream object to read decrypted content. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rights the rights object contain decrypted key. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the InputStream object of decrypted media content. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputStream getContentInputStream(DrmRights rights) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (null == rights) 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new DrmInputStream(rights); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the type of the decrypted media content. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the decrypted media content type of this DRM content. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getContentType() { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mediaType; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the length of the decrypted media content. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rights the rights object contain decrypted key. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the length of the decrypted media content. 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_UNKNOWN_DATA_LEN if the length is unknown currently. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getContentLength(DrmRights rights) throws DrmException { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Because currently the media object associate with rights object 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been handled in native logic, so here it is not need to deal 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the rights. But for the apps, it is mandatory for user to get 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the rights object before get the media content length. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (null == rights) 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mediaLen = nativeGetContentLength(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == mediaLen) 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new DrmException("nativeGetContentLength() returned JNI_DRM_FAILURE"); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_UNKNOWN_DATA_LEN == mediaLen) 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DRM_UNKNOWN_DATA_LEN; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mediaLen; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provide a InputStream to the DRM media content. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class DrmInputStream extends InputStream 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The flag to indicate whether this stream is closed or not. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean isClosed; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The offset of this DRM content to be reset. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int offset; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A byte of data to be readed. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private byte[] b; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a DrmInputStream instance. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DrmInputStream(DrmRights rights) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Because currently the media object associate with rights object 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been handled in native logic, so here it is not need to deal 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the rights. But for the apps, it is mandatory for user to get 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the rights object before get the media content data. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isClosed = false; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset = 0; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b = new byte[1]; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#available() 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int available() throws IOException { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* call native method to get this DRM decrypted media content length */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = nativeGetContentLength(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == len) 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if the length is unknown, just return 0 for available value */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_UNKNOWN_DATA_LEN == len) 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int availableLen = len - offset; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (availableLen < 0) 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException(); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return availableLen; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#read() 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read() throws IOException { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = read(b, 0, 1); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == res) 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b[0] & 0xff; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#read(byte) 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read(byte[] b) throws IOException { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return read(b, 0, b.length); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#read(byte, int, int) 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read(byte[] b, int off, int len) throws IOException { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (null == b) 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (off < 0 || len < 0 || off + len > b.length) 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (true == isClosed) 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == len) 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = nativeReadContent(b, off, len, offset); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (JNI_DRM_FAILURE == len) 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (JNI_DRM_EOF == len) 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset += len; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return len; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#markSupported() 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean markSupported() { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#mark(int) 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void mark(int readlimit) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#reset() 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() throws IOException { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#skip() 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long skip(long n) throws IOException { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Non-javadoc 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see java.io.InputStream#close() 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isClosed = true; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native method: construct a DRM content according the mime type. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data input DRM content data to be parsed. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param len the length of the data. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mimeType the mime type of this DRM content. the value of this field includes: 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_MIMETYPE_MESSAGE 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_MIMETYPE_CONTENT 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return #the id of the DRM content if succeed. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #JNI_DRM_FAILURE if fail. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int nativeConstructDrmContent(InputStream data, int len, int mimeType); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native method: get this DRM content rights issuer. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the address of rights issuer if in case of separate delivery. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null if not separete delivery, or otherwise. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native String nativeGetRightsAddress(); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native method: get this DRM content delivery type. 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the delivery method, the value may be one of the following: 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_FORWARD_LOCK 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_COMBINED_DELIVERY 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_SEPARATE_DELIVERY 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #DRM_SEPARATE_DELIVERY_DM 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #JNI_DRM_FAILURE if fail. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int nativeGetDeliveryMethod(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native method: get a piece of media content data. 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param buf the buffer to save DRM media content data. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bufOff the offset of the buffer to start to save data. 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param len the number of byte to read. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mediaOff the offset of the media content data to start to read. 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the length of the media content data has been read. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #JNI_DRM_EOF if reach to end of the media content. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #JNI_DRM_FAILURE if fail. 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int nativeReadContent(byte[] buf, int bufOff, int len, int mediaOff); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native method: get this DRM content type. 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the decrypted media content type. 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null if fail. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native String nativeGetContentType(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native method: get this DRM decrypted media content length. 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the length of decrypted media content. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #JNI_DRM_FAILURE if fail. 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #JNI_DRM_UNKNOWN_DATA_LEN if the length is unknown currently. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int nativeGetContentLength(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The finalizer of the DRMRawContent. Do some cleanup. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected native void finalize(); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the shared library to link the native methods. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.loadLibrary("drm1_jni"); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (UnsatisfiedLinkError ule) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("WARNING: Could not load libdrm1_jni.so"); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 465