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