1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.drm.mobile1; 18 19 import java.io.*; 20 import java.util.*; 21 22 /** 23 * This class provides interfaces to access the DRM right manager. 24 */ 25 public class DrmRightsManager { 26 /** 27 * The "application/vnd.oma.drm.rights+xml" mime type. 28 */ 29 public static final String DRM_MIMETYPE_RIGHTS_XML_STRING = "application/vnd.oma.drm.rights+xml"; 30 31 /** 32 * The "application/vnd.oma.drm.rights+wbxml" mime type. 33 */ 34 public static final String DRM_MIMETYPE_RIGHTS_WBXML_STRING = "application/vnd.oma.drm.rights+wbxml"; 35 36 /** 37 * The id of "application/vnd.oma.drm.rights+xml" mime type. 38 */ 39 private static final int DRM_MIMETYPE_RIGHTS_XML = 3; 40 41 /** 42 * The id of "application/vnd.oma.drm.rights+wbxml" mime type. 43 */ 44 private static final int DRM_MIMETYPE_RIGHTS_WBXML = 4; 45 46 /** 47 * The id of "application/vnd.oma.drm.message" mime type. 48 */ 49 private static final int DRM_MIMETYPE_MESSAGE = 1; 50 51 /** 52 * Successful operation. 53 */ 54 private static final int JNI_DRM_SUCCESS = 0; 55 56 /** 57 * General failure. 58 */ 59 private static final int JNI_DRM_FAILURE = -1; 60 61 /** 62 * The instance of the rights manager. 63 */ 64 private static DrmRightsManager singleton = null; 65 66 67 /** 68 * Construct a DrmRightsManager 69 */ DrmRightsManager()70 protected DrmRightsManager() { 71 } 72 73 /** 74 * Get the DrmRightsManager instance. 75 * 76 * @return the instance of DrmRightsManager. 77 */ getInstance()78 public static synchronized DrmRightsManager getInstance() { 79 if (singleton == null) { 80 singleton = new DrmRightsManager(); 81 } 82 83 return singleton; 84 } 85 86 /** 87 * Install one DRM rights and return one instance of DrmRights. 88 * 89 * @param rightsData raw rights data. 90 * @param mimeTypeStr the mime type of the rights object. 91 * 92 * @return the instance of the installed DrmRights. 93 */ installRights(InputStream rightsData, int len, String mimeTypeStr)94 public synchronized DrmRights installRights(InputStream rightsData, int len, String mimeTypeStr) throws DrmException, IOException { 95 int mimeType = 0; 96 97 if (DRM_MIMETYPE_RIGHTS_XML_STRING.equals(mimeTypeStr)) 98 mimeType = DRM_MIMETYPE_RIGHTS_XML; 99 else if (DRM_MIMETYPE_RIGHTS_WBXML_STRING.equals(mimeTypeStr)) 100 mimeType = DRM_MIMETYPE_RIGHTS_WBXML; 101 else if (DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING.equals(mimeTypeStr)) 102 mimeType = DRM_MIMETYPE_MESSAGE; 103 else 104 throw new IllegalArgumentException("mimeType must be DRM_MIMETYPE_RIGHTS_XML or DRM_MIMETYPE_RIGHTS_WBXML or DRM_MIMETYPE_MESSAGE"); 105 106 if (len <= 0) 107 return null; 108 109 DrmRights rights = new DrmRights(); 110 111 /* call native method to install this rights object. */ 112 int res = nativeInstallDrmRights(rightsData, len, mimeType, rights); 113 114 if (JNI_DRM_FAILURE == res) 115 throw new DrmException("nativeInstallDrmRights() returned JNI_DRM_FAILURE"); 116 117 return rights; 118 } 119 120 /** 121 * Query DRM rights of specified DRM raw content. 122 * 123 * @param content raw content object. 124 * 125 * @return the instance of DrmRights, or null if there is no rights. 126 */ queryRights(DrmRawContent content)127 public synchronized DrmRights queryRights(DrmRawContent content) { 128 DrmRights rights = new DrmRights(); 129 130 /* call native method to query the rights */ 131 int res = nativeQueryRights(content, rights); 132 133 if (JNI_DRM_FAILURE == res) 134 return null; 135 136 return rights; 137 } 138 139 /** 140 * Get the list of all DRM rights saved in local client. 141 * 142 * @return the list of all the rights object. 143 */ getRightsList()144 public synchronized List getRightsList() { 145 List rightsList = new ArrayList(); 146 147 /* call native method to get how many rights object in current agent */ 148 int num = nativeGetNumOfRights(); 149 150 if (JNI_DRM_FAILURE == num) 151 return null; 152 153 if (num > 0) { 154 DrmRights[] rightsArray = new DrmRights[num]; 155 int i; 156 157 for (i = 0; i < num; i++) 158 rightsArray[i] = new DrmRights(); 159 160 /* call native method to get all the rights information */ 161 num = nativeGetRightsList(rightsArray, num); 162 163 if (JNI_DRM_FAILURE == num) 164 return null; 165 166 /* add all rights informations to ArrayList */ 167 for (i = 0; i < num; i++) 168 rightsList.add(rightsArray[i]); 169 } 170 171 return rightsList; 172 } 173 174 /** 175 * Delete the specified DRM rights object. 176 * 177 * @param rights the specified rights object to be deleted. 178 */ deleteRights(DrmRights rights)179 public synchronized void deleteRights(DrmRights rights) { 180 /* call native method to delete the specified rights object */ 181 int res = nativeDeleteRights(rights); 182 183 if (JNI_DRM_FAILURE == res) 184 return; 185 } 186 187 188 /** 189 * native method: install rights object to local client. 190 * 191 * @param data input DRM rights object data to be installed. 192 * @param len the length of the data. 193 * @param mimeType the mime type of this DRM rights object. the value of this field includes: 194 * #DRM_MIMETYPE_RIGHTS_XML 195 * #DRM_MIMETYPE_RIGHTS_WBXML 196 * @parma rights the instance of DRMRights to be filled. 197 * 198 * @return #JNI_DRM_SUCCESS if succeed. 199 * #JNI_DRM_FAILURE if fail. 200 */ nativeInstallDrmRights(InputStream data, int len, int mimeType, DrmRights rights)201 private native int nativeInstallDrmRights(InputStream data, int len, int mimeType, DrmRights rights); 202 203 /** 204 * native method: query the given DRM content's rights object. 205 * 206 * @param content the given DRM content. 207 * @param rights the instance of rights to set if have. 208 * 209 * @return #JNI_DRM_SUCCESS if succeed. 210 * #JNI_DRM_FAILURE if fail. 211 */ nativeQueryRights(DrmRawContent content, DrmRights rights)212 private native int nativeQueryRights(DrmRawContent content, DrmRights rights); 213 214 /** 215 * native method: get how many rights object in current DRM agent. 216 * 217 * @return the number of the rights object. 218 * #JNI_DRM_FAILURE if fail. 219 */ nativeGetNumOfRights()220 private native int nativeGetNumOfRights(); 221 222 /** 223 * native method: get all the rights object in current local agent. 224 * 225 * @param rights the array instance of rights object. 226 * @param numRights how many rights can be saved. 227 * 228 * @return the number of the rights object has been gotten. 229 * #JNI_DRM_FAILURE if fail. 230 */ nativeGetRightsList(DrmRights[] rights, int numRights)231 private native int nativeGetRightsList(DrmRights[] rights, int numRights); 232 233 /** 234 * native method: delete a specified rights object. 235 * 236 * @param rights the specified rights object to be deleted. 237 * 238 * @return #JNI_DRM_SUCCESS if succeed. 239 * #JNI_DRM_FAILURE if fail. 240 */ nativeDeleteRights(DrmRights rights)241 private native int nativeDeleteRights(DrmRights rights); 242 243 244 /** 245 * Load the shared library to link the native methods. 246 */ 247 static { 248 try { 249 System.loadLibrary("drm1_jni"); 250 } 251 catch (UnsatisfiedLinkError ule) { 252 System.err.println("WARNING: Could not load libdrm1_jni.so"); 253 } 254 } 255 } 256