127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#ifndef __DRM_INFO_H__
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define __DRM_INFO_H__
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "drm_framework_common.h"
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshinamespace android {
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/**
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * This is an utility class in which necessary information required to transact
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * between device and online DRM server is described. DRM Framework achieves
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * server registration, license acquisition and any other server related transaction
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * by passing an instance of this class to DrmManagerClient::processDrmInfo(const DrmInfo*).
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * The Caller can retrieve the DrmInfo instance by using
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * DrmManagerClient::acquireDrmInfo(const DrmInfoRequest*) by passing DrmInfoRequest instance.
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmInfo {
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Constructor for DrmInfo
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] infoType Type of information
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] drmBuffer Trigger data
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] mimeType MIME type
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo(int infoType, const DrmBuffer& drmBuffer, const String8& mimeType);
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Destructor for DrmInfo
4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    virtual ~DrmInfo() {}
4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Iterator for key
5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    class KeyIterator {
5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        friend class DrmInfo;
5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
588c0164ca98bcc76f3656fb1078033bffd4a387deChih-Hung Hsieh        explicit KeyIterator(const DrmInfo* drmInfo)
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            : mDrmInfo(const_cast <DrmInfo*> (drmInfo)), mIndex(0) {}
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        KeyIterator(const KeyIterator& keyIterator);
6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        KeyIterator& operator=(const KeyIterator& keyIterator);
6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        virtual ~KeyIterator() {}
6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool hasNext();
6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8& next();
6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* mDrmInfo;
7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        unsigned int mIndex;
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    };
7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Iterator
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    class Iterator {
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        friend class DrmInfo;
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
828c0164ca98bcc76f3656fb1078033bffd4a387deChih-Hung Hsieh        explicit Iterator(const DrmInfo* drmInfo)
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            : mDrmInfo(const_cast <DrmInfo*> (drmInfo)), mIndex(0) {}
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Iterator(const Iterator& iterator);
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Iterator& operator=(const Iterator& iterator);
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        virtual ~Iterator() {}
8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool hasNext();
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        String8& next();
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* mDrmInfo;
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        unsigned int mIndex;
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    };
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns information type associated with this instance
10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Information type
10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int getInfoType(void) const;
10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns MIME type associated with this instance
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return MIME type
11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 getMimeType(void) const;
11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns the trigger data associated with this instance
11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Trigger data
11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer& getData(void) const;
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns the number of attributes contained in this instance
12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Number of attributes
12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int getCount(void) const;
12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Adds optional information as <key, value> pair to this instance
13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] key Key to add
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] value Value to add
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Returns the error code
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t put(const String8& key, const String8& value);
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Retrieves the value of given key
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param key Key whose value to be retrieved
14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return The value
14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 get(const String8& key) const;
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns KeyIterator object to walk through the keys associated with this instance
14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return KeyIterator object
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    KeyIterator keyIterator() const;
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns Iterator object to walk through the values associated with this instance
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Iterator object
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Iterator iterator() const;
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns index of the given key
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return index
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int indexOfKey(const String8& key) const;
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprotected:
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int mInfoType;
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmBuffer mData;
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 mMimeType;
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    KeyedVector<String8, String8> mAttributes;
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#endif /* __DRM_INFO_H__ */
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
177