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