Home | History | Annotate | Download | only in mobile1
      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      */
     70     protected DrmRightsManager() {
     71     }
     72 
     73     /**
     74      * Get the DrmRightsManager instance.
     75      *
     76      * @return the instance of DrmRightsManager.
     77      */
     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      */
     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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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