1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/* 2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 2010 The Android Open Source Project 3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License. 6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at 7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software 11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions and 14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * limitations under the License. 15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 17d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipackage android.drm; 18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.io.IOException; 20e6748ce31f18782b7a47a5b2eb251efd83e7b609Andreas Gampeimport java.util.Arrays; 21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.HashMap; 22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.Iterator; 23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 24d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/** 250e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * An entity class that describes the information required to send transactions 260e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * between a device and an online DRM server. The DRM framework achieves 270e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * server registration, license acquisition, and any other server-related transactions 280e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * by passing an instance of this class to {@link DrmManagerClient#processDrmInfo}. 290e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber *<p> 300e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * The caller can retrieve the {@link DrmInfo} instance by passing a {@link DrmInfoRequest} 310e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * instance to {@link DrmManagerClient#acquireDrmInfo}. 32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic class DrmInfo { 35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private byte[] mData; 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private final String mMimeType; 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private final int mInfoType; 38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // It would be used to add attributes specific to 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // DRM scheme such as account id, path or multiple path's 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private final HashMap<String, Object> mAttributes = new HashMap<String, Object>(); 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 430e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Creates a <code>DrmInfo</code> object with the given parameters. 44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 450e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param infoType The type of information. 460e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param data The trigger data. 470e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType The MIME type. 48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmInfo(int infoType, byte[] data, String mimeType) { 50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mInfoType = infoType; 51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mMimeType = mimeType; 52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mData = data; 536c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong if (!isValid()) { 546c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong final String msg = "infoType: " + infoType + "," + 556c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong "mimeType: " + mimeType + "," + 56e6748ce31f18782b7a47a5b2eb251efd83e7b609Andreas Gampe "data: " + Arrays.toString(data); 576c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong 586c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong throw new IllegalArgumentException(msg); 596c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong } 60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 630e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Creates a <code>DrmInfo</code> object with the given parameters. 64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 650e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param infoType The type of information. 660e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path The trigger data. 670e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType The MIME type. 68d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmInfo(int infoType, String path, String mimeType) { 70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mInfoType = infoType; 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mMimeType = mimeType; 72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi try { 73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mData = DrmUtils.readBytes(path); 74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } catch (IOException e) { 75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // As the given path is invalid, 76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // set mData = null, so that further processDrmInfo() 77d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // call would fail with IllegalArgumentException because of mData = null 78d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mData = null; 79d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 806c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong if (!isValid()) { 816c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong final String msg = "infoType: " + infoType + "," + 826c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong "mimeType: " + mimeType + "," + 83e6748ce31f18782b7a47a5b2eb251efd83e7b609Andreas Gampe "data: " + Arrays.toString(mData); 846c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong 856c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong throw new IllegalArgumentException(); 866c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong } 87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 88d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 900e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Adds optional information as key-value pairs to this object. To add a custom object 910e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * to the <code>DrmInfo</code> object, you must override the {@link #toString} implementation. 920e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 930e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param key Key to add. 940e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param value Value to add. 95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void put(String key, Object value) { 98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mAttributes.put(key, value); 99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 101d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 1020e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the value of a given key. 1030e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 1040e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param key The key whose value is being retrieved. 105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 1060e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The value of the key being retrieved. Returns null if the key cannot be found. 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 108d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public Object get(String key) { 109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mAttributes.get(key); 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 1130e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves an iterator object that you can use to iterate over the keys associated with 1140e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * this <code>DrmInfo</code> object. 115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 1160e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The iterator object. 117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public Iterator<String> keyIterator() { 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mAttributes.keySet().iterator(); 120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 1230e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves an iterator object that you can use to iterate over the values associated with 1240e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * this <code>DrmInfo</code> object. 125d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 1260e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The iterator object. 127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public Iterator<Object> iterator() { 129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mAttributes.values().iterator(); 130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 1330e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the trigger data associated with this object. 134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 1350e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The trigger data. 136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public byte[] getData() { 138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mData; 139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 1420e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the MIME type associated with this object. 143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 1440e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The MIME type. 145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public String getMimeType() { 147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mMimeType; 148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 1510e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the information type associated with this object. 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 1530e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The information type. 154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int getInfoType() { 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mInfoType; 157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Returns whether this instance is valid or not 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return 163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * true if valid 164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * false if invalid 165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi boolean isValid() { 167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return (null != mMimeType && !mMimeType.equals("") 168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi && null != mData && mData.length > 0 && DrmInfoRequest.isValidType(mInfoType)); 169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 172