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_CONSTRAINTS_H__
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define __DRM_CONSTRAINTS_H__
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "drm_framework_common.h"
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshinamespace android {
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/**
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * This is an utility class which contains the constraints information.
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * As a result of DrmManagerClient::getConstraints(const String8*, const int)
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * an instance of DrmConstraints would be returned.
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmConstraints {
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The following variables are replica of android.drm.DrmStore.ConstraintsColumns
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Any changes should also be incorporated with Java Layer as well
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The max repeat count
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static const String8 MAX_REPEAT_COUNT;
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The remaining repeat count
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static const String8 REMAINING_REPEAT_COUNT;
4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The time before which the protected file can not be played/viewed
4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static const String8 LICENSE_START_TIME;
5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The time after which the protected file can not be played/viewed
5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static const String8 LICENSE_EXPIRY_TIME;
5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The available time for license
5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static const String8 LICENSE_AVAILABLE_TIME;
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * The data stream for extended metadata
6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static const String8 EXTENDED_METADATA;
6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Iterator for key
6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    class KeyIterator {
7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        friend class DrmConstraints;
7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        KeyIterator(DrmConstraints* drmConstraints)
7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            : mDrmConstraints(drmConstraints), mIndex(0) {}
7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        KeyIterator(const KeyIterator& keyIterator);
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        KeyIterator& operator=(const KeyIterator& keyIterator);
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        virtual ~KeyIterator() {}
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool hasNext();
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8& next();
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConstraints* mDrmConstraints;
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        unsigned int mIndex;
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    };
8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Iterator for constraints
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    class Iterator {
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        friend class DrmConstraints;
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Iterator(DrmConstraints* drmConstraints)
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            : mDrmConstraints(drmConstraints), mIndex(0) {}
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Iterator(const Iterator& iterator);
10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Iterator& operator=(const Iterator& iterator);
10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        virtual ~Iterator() {}
10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    public:
10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool hasNext();
10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        String8 next();
10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    private:
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConstraints* mDrmConstraints;
11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        unsigned int mIndex;
11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    };
11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints() {}
11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    virtual ~DrmConstraints() {
11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConstraints::KeyIterator keyIt = this->keyIterator();
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        while (keyIt.hasNext()) {
11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            String8 key = keyIt.next();
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const char* value = this->getAsByteArray(&key);
12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (NULL != value) {
12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    delete[] value;
12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    value = NULL;
12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        mConstraintMap.clear();
12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns the number of constraints contained in this instance
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Number of constraints
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int getCount(void) const;
13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Adds constraint information as <key, value> pair to this instance
13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] key Key to add
14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param[in] value Value to add
14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t put(const String8* key, const char* value);
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Retrieves the value of given key
14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param key Key whose value to be retrieved
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return The value
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 get(const String8& key) const;
15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     /**
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Retrieves the value as byte array of given key
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @param key Key whose value to be retrieved as byte array
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return The byte array value
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const char* getAsByteArray(const String8* key) const;
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns KeyIterator object to walk through the keys associated with this instance
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return KeyIterator object
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    KeyIterator keyIterator();
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    /**
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * Returns Iterator object to walk through the values associated with this instance
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     *
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     * @return Iterator object
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi     */
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Iterator iterator();
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate:
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const char* getValue(const String8* key) const;
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate:
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    typedef KeyedVector<String8, const char*> DrmConstraintsMap;
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraintsMap mConstraintMap;
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#endif /* __DRM_CONSTRAINTS_H__ */
18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
184