14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2010 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * See the License for the specific language governing permissions and 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package android.drm; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.IOException; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.HashMap; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Iterator; 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/** 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * An entity class that describes the information required to send transactions 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * between a device and an online DRM server. The DRM framework achieves 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * server registration, license acquisition, and any other server-related transactions 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * by passing an instance of this class to {@link DrmManagerClient#processDrmInfo}. 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *<p> 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * The caller can retrieve the {@link DrmInfo} instance by passing a {@link DrmInfoRequest} 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * instance to {@link DrmManagerClient#acquireDrmInfo}. 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)public class DrmInfo { 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private byte[] mData; 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private final String mMimeType; 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private final int mInfoType; 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // It would be used to add attributes specific to 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // DRM scheme such as account id, path or multiple path's 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private final HashMap<String, Object> mAttributes = new HashMap<String, Object>(); 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) /** 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Creates a <code>DrmInfo</code> object with the given parameters. 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @param infoType The type of information. 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @param data The trigger data. 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @param mimeType The MIME type. 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public DrmInfo(int infoType, byte[] data, String mimeType) { 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mInfoType = infoType; 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mMimeType = mimeType; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mData = data; 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!isValid()) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String msg = "infoType: " + infoType + "," + 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "mimeType: " + mimeType + "," + 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "data: " + data; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) throw new IllegalArgumentException(msg); 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Creates a <code>DrmInfo</code> object with the given parameters. 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @param infoType The type of information. 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param path The trigger data. 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param mimeType The MIME type. 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public DrmInfo(int infoType, String path, String mimeType) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mInfoType = infoType; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mMimeType = mimeType; 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) try { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mData = DrmUtils.readBytes(path); 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } catch (IOException e) { 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // As the given path is invalid, 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // set mData = null, so that further processDrmInfo() 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // call would fail with IllegalArgumentException because of mData = null 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mData = null; 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isValid()) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String msg = "infoType: " + infoType + "," + 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mimeType: " + mimeType + "," + 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "data: " + mData; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) throw new IllegalArgumentException(); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Adds optional information as key-value pairs to this object. To add a custom object 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * to the <code>DrmInfo</code> object, you must override the {@link #toString} implementation. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param key Key to add. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param value Value to add. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void put(String key, Object value) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mAttributes.put(key, value); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Retrieves the value of a given key. 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @param key The key whose value is being retrieved. 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @return The value of the key being retrieved. Returns null if the key cannot be found. 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */ 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public Object get(String key) { 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return mAttributes.get(key); 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /** 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Retrieves an iterator object that you can use to iterate over the keys associated with 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * this <code>DrmInfo</code> object. 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @return The iterator object. 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */ 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public Iterator<String> keyIterator() { 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return mAttributes.keySet().iterator(); 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /** 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieves an iterator object that you can use to iterate over the values associated with 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * this <code>DrmInfo</code> object. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return The iterator object. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Iterator<Object> iterator() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mAttributes.values().iterator(); 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieves the trigger data associated with this object. 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return The trigger data. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public byte[] getData() { 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return mData; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Retrieves the MIME type associated with this object. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The MIME type. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public String getMimeType() { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mMimeType; 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /** 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Retrieves the information type associated with this object. 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * @return The information type. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 154 public int getInfoType() { 155 return mInfoType; 156 } 157 158 /** 159 * Returns whether this instance is valid or not 160 * 161 * @return 162 * true if valid 163 * false if invalid 164 */ 165 boolean isValid() { 166 return (null != mMimeType && !mMimeType.equals("") 167 && null != mData && mData.length > 0 && DrmInfoRequest.isValidType(mInfoType)); 168 } 169} 170 171