13473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi/*
23473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * Copyright (C) 2010 The Android Open Source Project
33473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi *
43473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * Licensed under the Apache License, Version 2.0 (the "License");
53473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * you may not use this file except in compliance with the License.
63473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * You may obtain a copy of the License at
73473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi *
83473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi *      http://www.apache.org/licenses/LICENSE-2.0
93473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi *
103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * Unless required by applicable law or agreed to in writing, software
113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * distributed under the License is distributed on an "AS IS" BASIS,
123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * See the License for the specific language governing permissions and
143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * limitations under the License.
153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi */
163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#ifndef __DRM_METADATA_H__
183473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#define __DRM_METADATA_H__
193473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
203473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include "drm_framework_common.h"
213473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
223473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aiminamespace android {
233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
243473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi/**
253473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * This is an utility class which contains the constraints information.
263473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi *
273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * As a result of DrmManagerClient::getMetadata(const String8*)
283473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi * an instance of DrmMetadata would be returned.
293473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi */
303473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimiclass DrmMetadata {
313473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimipublic:
323473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    /**
333473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi     * Iterator for key
343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi     */
353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    class KeyIterator {
363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        friend class DrmMetadata;
373473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    private:
383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        KeyIterator(DrmMetadata* drmMetadata) : mDrmMetadata(drmMetadata), mIndex(0) {}
393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
403473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    public:
413473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        KeyIterator(const KeyIterator& keyIterator);
423473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        KeyIterator& operator=(const KeyIterator& keyIterator);
433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        virtual ~KeyIterator() {}
443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    public:
463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        bool hasNext();
473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const String8& next();
483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    private:
503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata* mDrmMetadata;
513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        unsigned int mIndex;
523473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    };
533473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
543473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    /**
553473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi     * Iterator for constraints
563473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi     */
573473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    class Iterator {
583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        friend class DrmMetadata;
593473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    private:
603473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        Iterator(DrmMetadata* drmMetadata) : mDrmMetadata(drmMetadata), mIndex(0) {}
613473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
623473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    public:
633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        Iterator(const Iterator& iterator);
643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        Iterator& operator=(const Iterator& iterator);
653473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        virtual ~Iterator() {}
663473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
673473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    public:
683473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        bool hasNext();
693473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        String8 next();
703473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
713473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    private:
723473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata* mDrmMetadata;
733473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        unsigned int mIndex;
743473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    };
753473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
763473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimipublic:
773473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata() {}
783473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    virtual ~DrmMetadata() {
793473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata::KeyIterator keyIt = this->keyIterator();
803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        while (keyIt.hasNext()) {
823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            String8 key = keyIt.next();
833473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const char* value = this->getAsByteArray(&key);
843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            if (NULL != value) {
853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                delete[] value;
863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                value = NULL;
873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        mMetadataMap.clear();
903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimipublic:
933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    int getCount(void) const;
943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    status_t put(const String8* key, const char* value);
953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    String8 get(const String8& key) const;
963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    const char* getAsByteArray(const String8* key) const;
973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    KeyIterator keyIterator();
983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    Iterator iterator();
993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimiprivate:
1013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    const char* getValue(const String8* key) const;
1023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimiprivate:
1043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    typedef KeyedVector<String8, const char*> DrmMetadataMap;
1053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadataMap mMetadataMap;
1063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi};
1073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi};
1093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#endif /* __DRM_METADATA_H__ */
1113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
112