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